Skip to content

Commit

Permalink
Support retries
Browse files Browse the repository at this point in the history
  • Loading branch information
flimzy committed Dec 20, 2016
1 parent ff2fc4f commit 9cd97e9
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 15 deletions.
42 changes: 27 additions & 15 deletions sentry.go
Original file line number Diff line number Diff line change
Expand Up @@ -247,29 +247,41 @@ func (hook *SentryHook) Flush() {
}

func (hook *SentryHook) sendPacket(packet *raven.Packet) error {
_, errCh := hook.client.Capture(packet, nil)
cases := []reflect.SelectCase{
reflect.SelectCase{
Dir: reflect.SelectRecv,
Chan: reflect.ValueOf(errCh),
},
}
cases := make([]reflect.SelectCase, 1, 2)
timeout := hook.Timeout
if timeout > 0 {
cases = append(cases, reflect.SelectCase{
Dir: reflect.SelectRecv,
Chan: reflect.ValueOf(time.After(timeout)),
})
}
chosen, recv, _ := reflect.Select(cases)
switch chosen {
case 0:
err, _ := recv.Interface().(error)
return err
case 1:
return fmt.Errorf("no response from sentry server in %s", timeout)
var err error
for i := 0; i < int(hook.Retries)+1; i++ {
_, errCh := hook.client.Capture(packet, nil)
cases[0] = reflect.SelectCase{
Dir: reflect.SelectRecv,
Chan: reflect.ValueOf(errCh),
}

chosen, recv, _ := reflect.Select(cases)
switch chosen {
case 0:
var ok bool
err, ok = recv.Interface().(error)
if !ok {
// Success!
return nil
}
if err.Error() == "raven: got http status 429" {
continue
}
return err
case 1:
return fmt.Errorf("no response from sentry server in %s", timeout)
}
}
return nil
// Retries count exceeded, return the error
return err
}

func (hook *SentryHook) findStacktraceAndCause(err error) (*raven.Stacktrace, error) {
Expand Down
45 changes: 45 additions & 0 deletions sentry_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -450,3 +450,48 @@ func (myStacktracerError) GetStacktrace() *raven.Stacktrace {
},
}
}

func TestRetries(t *testing.T) {
failures := 8
s := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
// This HTTP handler will respond with a 429 3 times, then success,
// ignoring the request otherwise.
defer req.Body.Close()
if failures > 0 {
rw.WriteHeader(http.StatusTooManyRequests)
failures--
return
}
rw.WriteHeader(http.StatusOK)
}))
defer s.Close()
fragments := strings.SplitN(s.URL, "://", 2)
dsn := fmt.Sprintf(
"%s://public:secret@%s/sentry/project-id",
fragments[0],
fragments[1],
)
logger := getTestLogger()

hook, err := NewSentryHook(dsn, []logrus.Level{
logrus.ErrorLevel,
})

if err != nil {
t.Fatal(err.Error())
}
logger.Hooks.Add(hook)
hook.Retries = 5
if err := hook.Fire(&logrus.Entry{}); err == nil {
t.Errorf("Expected failure")
}
if failures != 2 { // Ensure the failure counter was properly decremented
t.Errorf("Expected failure counter to be 3, got %d", failures)
}
if err := hook.Fire(&logrus.Entry{}); err != nil {
t.Errorf("Expected success, got: %s", err)
}
if failures != 0 { // Ensure the failure counter was properly decremented
t.Errorf("Expected failure counter to be 3, got %d", failures)
}
}

0 comments on commit 9cd97e9

Please sign in to comment.