timeout is now configurable and documented

This commit is contained in:
Roberto Bampi 2014-11-25 13:36:08 +01:00
parent 383ab1fb69
commit 5df4b882d0
2 changed files with 35 additions and 11 deletions

View File

@ -40,3 +40,22 @@ When logs are sent to sentry these fields are treated differently.
is logging the event (hostname.example.com) is logging the event (hostname.example.com)
- logger is the part of the application which is logging the event. - logger is the part of the application which is logging the event.
In go this usually means setting it to the name of the package. In go this usually means setting it to the name of the package.
## Timeout
`Timeout` is the time the sentry hook will wait for a response
from the sentry server.
If this time elapses with no response from
the server an error will be returned.
If `Timeout` is set to 0 the SentryHook will not wait for a reply
and will assume a correct delivery.
The SentryHook has a default timeout of `100 milliseconds` when created
with a call to `NewSentryHook`. This can be changed by assigning a value to the `Timeout` field:
```go
hook, _ := logrus_sentry.NewSentryHook(...)
hook.Timeout = 20*time.Seconds
```

View File

@ -8,10 +8,6 @@ import (
"github.com/getsentry/raven-go" "github.com/getsentry/raven-go"
) )
const (
timeout = 100 * time.Millisecond
)
var ( var (
severityMap = map[logrus.Level]raven.Severity{ severityMap = map[logrus.Level]raven.Severity{
logrus.DebugLevel: raven.DEBUG, logrus.DebugLevel: raven.DEBUG,
@ -42,18 +38,24 @@ func getAndDel(d logrus.Fields, key string) (string, bool) {
// SentryHook delivers logs to a sentry server. // SentryHook delivers logs to a sentry server.
type SentryHook struct { type SentryHook struct {
// Timeout sets the time to wait for a delivery error from the sentry server.
// If this is set to zero the server will not wait for any response and will
// consider the message correctly sent
Timeout time.Duration
client *raven.Client client *raven.Client
levels []logrus.Level levels []logrus.Level
} }
// NewSentryHook creates a hook to be added to an instance of logger // NewSentryHook creates a hook to be added to an instance of logger
// and initializes the raven client. // and initializes the raven client.
// This method sets the timeout to 100 milliseconds.
func NewSentryHook(DSN string, levels []logrus.Level) (*SentryHook, error) { func NewSentryHook(DSN string, levels []logrus.Level) (*SentryHook, error) {
client, err := raven.NewClient(DSN, nil) client, err := raven.NewClient(DSN, nil)
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &SentryHook{client, levels}, nil return &SentryHook{100 * time.Millisecond, client, levels}, nil
} }
// Called when an event should be sent to sentry // Called when an event should be sent to sentry
@ -79,6 +81,8 @@ func (hook *SentryHook) Fire(entry *logrus.Entry) error {
packet.Extra = map[string]interface{}(d) packet.Extra = map[string]interface{}(d)
_, errCh := hook.client.Capture(packet, nil) _, errCh := hook.client.Capture(packet, nil)
timeout := hook.Timeout
if timeout != 0 {
timeoutCh := time.After(timeout) timeoutCh := time.After(timeout)
select { select {
case err := <-errCh: case err := <-errCh:
@ -86,6 +90,7 @@ func (hook *SentryHook) Fire(entry *logrus.Entry) error {
case <-timeoutCh: case <-timeoutCh:
return fmt.Errorf("no response from sentry server in %s", timeout) return fmt.Errorf("no response from sentry server in %s", timeout)
} }
}
return nil return nil
} }