Skip to content

Commit 5360e25

Browse files
authored
Fix total runner limit (#11)
The Github API has pagination limited to 30 results per page, added pagination support to return the full runners list. Thanks @PaulLesur
1 parent 2745ae5 commit 5360e25

3 files changed

Lines changed: 60 additions & 24 deletions

File tree

deploy/helm-chart/prometheus-org-runner-exporter/Chart.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ description: A Helm chart for Kubernetes
44

55
type: application
66

7-
version: 0.1.6
7+
version: 0.1.7
88

99
# This is the version number of the application being deployed. This version number should be
1010
# incremented each time you make changes to the application. Versions are not expected to
1111
# follow Semantic Versioning. They should reflect the version the application is using.
12-
appVersion: 0.1.6
12+
appVersion: 0.1.7

deploy/helm-chart/prometheus-org-runner-exporter/values.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
image:
44
repository: tchelovilar/github-org-runner-exporter
55
pullPolicy: IfNotPresent
6-
tag: "0.1.6"
6+
tag: "0.1.7"
77

88

99
nameOverride: ""

runner_exporter/runner_exporter.py

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -155,36 +155,72 @@ def export_runner_busy(self, runner: dict, agg_labels: str):
155155
).set(idle)
156156

157157

158+
class githubApi:
159+
def __init__(self, github_token, github_owner, logger) -> None:
160+
self.metric_runner_api_ratelimit = Gauge(
161+
"github_runner_api_remain_rate_limit",
162+
"Github Api remaining requests rate limit (per hour)",
163+
["org"],
164+
)
165+
166+
self.headers = {"Authorization": f"token {github_token}"}
167+
self.github_owner = github_owner
168+
169+
self.logger = logger
170+
171+
def list_runners(self) -> list:
172+
runners_list = []
173+
174+
per_page = 100
175+
url = f"https://api.github.com/orgs/{self.github_owner}/actions/runners?per_page={per_page}"
176+
177+
while True:
178+
try:
179+
self.logger.debug(f"Sending the api request for {url}")
180+
result = requests.get(url, headers=self.headers)
181+
182+
if result.headers:
183+
remaining_requests = result.headers.get("X-RateLimit-Remaining")
184+
logger.debug(f"Remaining requests: {remaining_requests}")
185+
self.metric_runner_api_ratelimit.labels(self.github_owner).set(
186+
int(remaining_requests)
187+
)
188+
189+
if not result.ok:
190+
logger.error(
191+
f"Api request returned error: {result.reason} {result.text}"
192+
)
193+
return []
194+
195+
api_result = result.json()
196+
runners_list += api_result["runners"]
197+
198+
if "next" in result.links.keys():
199+
url = result.links["next"]["url"]
200+
else:
201+
break
202+
except Exception as error:
203+
logger.error(f"Exception: {error}")
204+
return []
205+
206+
return runners_list
207+
208+
158209
def main():
159210

160211
# Start prometheus metrics
161212
logger.info("Starting metrics server")
162213
start_http_server(8000)
163214

164-
metric_runner_api_ratelimit = Gauge(
165-
"github_runner_api_remain_rate_limit",
166-
"Github Api remaining requests rate limit (per hour)",
167-
["org"],
168-
)
169-
170215
runner_exports = runnerExports()
171216

217+
github = githubApi(PRIVATE_GITHUB_TOKEN, OWNER, logger)
218+
172219
while True:
173-
headers = {"Authorization": f"token {PRIVATE_GITHUB_TOKEN}"}
174-
url = f"https://api.github.com/orgs/{OWNER}/actions/runners"
175-
logger.debug(f"Sending the api request for /orgs/{OWNER}/actions/runners")
176-
result = requests.get(url, headers=headers)
177-
178-
if result.headers:
179-
value = result.headers.get("X-RateLimit-Remaining")
180-
logger.debug(f"Remaining requests: {value}")
181-
metric_runner_api_ratelimit.labels(OWNER).set(int(value))
182-
183-
if result.ok:
184-
runner_list = result.json()
185-
runner_exports.export_metrics(runner_list["runners"])
186-
else:
187-
logger.error(f"Api request returned error: {result.reason} {result.text}")
220+
runners_list = github.list_runners()
221+
222+
if runners_list:
223+
runner_exports.export_metrics(runners_list)
188224

189225
sleep(REFRESH_INTERVAL)
190226

0 commit comments

Comments
 (0)