Skip to content

Commit 2155fc0

Browse files
Merge pull request #90 from shiftstack/retry
Retry when hitting 429 TooManyRequests
2 parents 7db3934 + ca78de3 commit 2155fc0

File tree

5 files changed

+56
-40
lines changed

5 files changed

+56
-40
lines changed

cmd/doctext/main.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"sync"
1010

1111
jira "github.com/andygrunwald/go-jira"
12+
"github.com/shiftstack/bugwatcher/pkg/jiraclient"
1213
"github.com/shiftstack/bugwatcher/pkg/query"
1314
)
1415

@@ -28,16 +29,9 @@ func main() {
2829
log.Fatalf("error unmarshaling TEAM_MEMBERS_DICT: %v", err)
2930
}
3031

31-
var jiraClient *jira.Client
32-
{
33-
var err error
34-
jiraClient, err = jira.NewClient(
35-
(&jira.BearerAuthTransport{Token: JIRA_TOKEN}).Client(),
36-
query.JiraBaseURL,
37-
)
38-
if err != nil {
39-
log.Fatalf("FATAL: error building a Jira client: %v", err)
40-
}
32+
jiraClient, err := jiraclient.NewWithToken(query.JiraBaseURL, JIRA_TOKEN)
33+
if err != nil {
34+
log.Fatalf("error building a Jira client: %v", err)
4135
}
4236

4337
triageChecks := [...]triageCheck{

cmd/posttriage/main.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"sync"
99

1010
jira "github.com/andygrunwald/go-jira"
11+
"github.com/shiftstack/bugwatcher/pkg/jiraclient"
1112
"github.com/shiftstack/bugwatcher/pkg/query"
1213
)
1314

@@ -18,16 +19,9 @@ var JIRA_TOKEN = os.Getenv("JIRA_TOKEN")
1819
func main() {
1920
ctx := context.Background()
2021

21-
var jiraClient *jira.Client
22-
{
23-
var err error
24-
jiraClient, err = jira.NewClient(
25-
(&jira.BearerAuthTransport{Token: JIRA_TOKEN}).Client(),
26-
query.JiraBaseURL,
27-
)
28-
if err != nil {
29-
log.Fatalf("FATAL: error building a Jira client: %v", err)
30-
}
22+
jiraClient, err := jiraclient.NewWithToken(query.JiraBaseURL, JIRA_TOKEN)
23+
if err != nil {
24+
log.Fatalf("error building a Jira client: %v", err)
3125
}
3226

3327
triageChecks := [...]triageCheck{

cmd/pretriage/main.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"time"
1111

1212
jira "github.com/andygrunwald/go-jira"
13+
"github.com/shiftstack/bugwatcher/pkg/jiraclient"
1314
"github.com/shiftstack/bugwatcher/pkg/query"
1415
)
1516

@@ -35,16 +36,9 @@ func main() {
3536
log.Fatalf("error unmarshaling TEAM_MEMBERS_DICT: %v", err)
3637
}
3738

38-
var jiraClient *jira.Client
39-
{
40-
var err error
41-
jiraClient, err = jira.NewClient(
42-
(&jira.BearerAuthTransport{Token: JIRA_TOKEN}).Client(),
43-
query.JiraBaseURL,
44-
)
45-
if err != nil {
46-
log.Fatalf("error building a Jira client: %v", err)
47-
}
39+
jiraClient, err := jiraclient.NewWithToken(query.JiraBaseURL, JIRA_TOKEN)
40+
if err != nil {
41+
log.Fatalf("error building a Jira client: %v", err)
4842
}
4943

5044
var wg sync.WaitGroup

cmd/triage/main.go

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010

1111
jira "github.com/andygrunwald/go-jira"
1212
"github.com/shiftstack/bugwatcher/cmd/triage/tasker"
13+
"github.com/shiftstack/bugwatcher/pkg/jiraclient"
1314
"github.com/shiftstack/bugwatcher/pkg/query"
1415
)
1516

@@ -29,16 +30,9 @@ func main() {
2930
log.Fatalf("error unmarshaling TEAM_MEMBERS_DICT: %v", err)
3031
}
3132

32-
var jiraClient *jira.Client
33-
{
34-
var err error
35-
jiraClient, err = jira.NewClient(
36-
(&jira.BearerAuthTransport{Token: JIRA_TOKEN}).Client(),
37-
query.JiraBaseURL,
38-
)
39-
if err != nil {
40-
log.Fatalf("error building a Jira client: %v", err)
41-
}
33+
jiraClient, err := jiraclient.NewWithToken(query.JiraBaseURL, JIRA_TOKEN)
34+
if err != nil {
35+
log.Fatalf("error building a Jira client: %v", err)
4236
}
4337

4438
var (

pkg/jiraclient/jiraclient.go

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package jiraclient
2+
3+
import (
4+
"log"
5+
"net/http"
6+
"strconv"
7+
"time"
8+
9+
jira "github.com/andygrunwald/go-jira"
10+
)
11+
12+
type throttlingHttpClient struct {
13+
*http.Client
14+
}
15+
16+
func (c *throttlingHttpClient) Do(req *http.Request) (*http.Response, error) {
17+
res, err := c.Client.Do(req)
18+
19+
if res.StatusCode == http.StatusTooManyRequests {
20+
wait := time.Second * 1
21+
if retryAfter := res.Header.Get("retry-after"); retryAfter != "" {
22+
if n, err := strconv.Atoi(retryAfter); err != nil {
23+
wait = time.Duration(n) * time.Second
24+
}
25+
}
26+
log.Printf("Throttled by Jira: waiting %s", wait)
27+
time.Sleep(wait)
28+
return c.Do(req)
29+
}
30+
31+
return res, err
32+
}
33+
34+
// NewWithToken returns a Jira client that retries when hitting 429
35+
func NewWithToken(baseURL, jiraToken string) (jiraClient *jira.Client, err error) {
36+
return jira.NewClient(
37+
&throttlingHttpClient{(&jira.BearerAuthTransport{Token: jiraToken}).Client()},
38+
baseURL,
39+
)
40+
}

0 commit comments

Comments
 (0)