@@ -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+
158209def 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