Skip to content

Commit 2210309

Browse files
committed
feat: Add support to enable backoff when rate limited by the Github API
Signed-off-by: andrewhibbert <[email protected]>
1 parent 70ae11e commit 2210309

File tree

2 files changed

+14
-7
lines changed

2 files changed

+14
-7
lines changed

pkg/scalers/github_runner_scaler.go

+13-7
Original file line numberDiff line numberDiff line change
@@ -596,15 +596,22 @@ func (s *githubRunnerScaler) getRepositories(ctx context.Context) ([]string, err
596596
}
597597

598598
func (s *githubRunnerScaler) getRateLimit(header http.Header) RateLimit {
599-
retryAfterTime := time.Now()
599+
var retryAfterTime time.Time
600600

601601
remaining, _ := strconv.Atoi(header.Get("X-RateLimit-Remaining"))
602602
reset, _ := strconv.ParseInt(header.Get("X-RateLimit-Reset"), 10, 64)
603603
resetTime := time.Unix(reset, 0)
604604

605-
if header.Get("retry-after") != "" {
606-
retryAfter, _ := strconv.Atoi(header.Get("retry-after"))
607-
retryAfterTime = time.Now().Add(time.Duration(retryAfter) * time.Second)
605+
if retryAfterStr := header.Get("Retry-After"); retryAfterStr != "" {
606+
if retrySeconds, err := strconv.Atoi(retryAfterStr); err == nil {
607+
retryAfterTime = time.Now().Add(time.Duration(retrySeconds) * time.Second)
608+
}
609+
}
610+
611+
if retryAfterTime.IsZero() {
612+
s.logger.V(1).Info(fmt.Sprintf("Github API rate limit: Remaining: %d, ResetTime: %s", remaining, resetTime))
613+
} else {
614+
s.logger.V(1).Info(fmt.Sprintf("Github API rate limit: Remaining: %d, ResetTime: %s, Retry-After: %s", remaining, resetTime, retryAfterTime))
608615
}
609616

610617
return RateLimit{
@@ -646,7 +653,6 @@ func (s *githubRunnerScaler) getGithubRequest(ctx context.Context, url string, m
646653

647654
if r.Header.Get("X-RateLimit-Remaining") != "" {
648655
s.rateLimit = s.getRateLimit(r.Header)
649-
s.logger.V(0).Info(fmt.Sprintf("GitHub API rate limits: remaining %d, retry after %s, reset time %s", s.rateLimit.Remaining, s.rateLimit.RetryAfterTime, s.rateLimit.ResetTime))
650656
}
651657

652658
if r.StatusCode != 200 {
@@ -822,13 +828,13 @@ func (s *githubRunnerScaler) GetWorkflowQueueLength(ctx context.Context) (int64,
822828
func (s *githubRunnerScaler) shouldWaitForRateLimit() (bool, time.Duration) {
823829
if s.rateLimit.Remaining == 0 && !s.rateLimit.ResetTime.IsZero() && time.Now().Before(s.rateLimit.ResetTime) {
824830
reset := time.Until(s.rateLimit.ResetTime)
825-
s.logger.V(0).Info(fmt.Sprintf("Rate limit exceeded, resets at %s, waiting for %s", s.rateLimit.ResetTime, reset))
831+
s.logger.V(1).Info(fmt.Sprintf("Rate limit exceeded, resets at %s, waiting for %s", s.rateLimit.ResetTime, reset))
826832
return true, reset
827833
}
828834

829835
if !s.rateLimit.RetryAfterTime.IsZero() && time.Now().Before(s.rateLimit.RetryAfterTime) {
830836
retry := time.Until(s.rateLimit.RetryAfterTime)
831-
s.logger.V(0).Info(fmt.Sprintf("Rate limit exceeded, retry after %s, waiting for %s", s.rateLimit.RetryAfterTime, retry))
837+
s.logger.V(1).Info(fmt.Sprintf("Rate limit exceeded, retry after %s, waiting for %s", s.rateLimit.RetryAfterTime, retry))
832838
return true, retry
833839
}
834840

tests/scalers/github_runner/github_runner_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ spec:
219219
labels: {{.Labels}}
220220
runnerScopeFromEnv: "RUNNER_SCOPE"
221221
enableEtags: "true"
222+
enableBackoff: "true"
222223
authenticationRef:
223224
name: github-trigger-auth
224225
`

0 commit comments

Comments
 (0)