// AutoNotify logs a panic on a goroutine and then repanics. // It should only be used in places that have existing panic handlers further // up the stack. See bugsnag.Recover(). The rawData is used to send extra // information along with any panics that are handled this way. // Usage: defer bugsnag.AutoNotify() func AutoNotify(rawData ...interface{}) { if err := recover(); err != nil { rawData = defaultNotifier.addDefaultSeverity(rawData, SeverityError) defaultNotifier.Notify(errors.New(err, 2), rawData...) panic(err) } }
// Notify sends an error to Bugsnag. Any rawData you pass here will be sent to // Bugsnag after being converted to JSON. e.g. bugsnag.SeverityError, bugsnag.Context, // or bugsnag.MetaData. func (notifier *Notifier) Notify(err error, rawData ...interface{}) (e error) { event, config := newEvent(errors.New(err, 1), rawData, notifier) // Never block, start throwing away errors if we have too many. e = middleware.Run(event, config, func() error { config.logf("notifying bugsnag: %s", event.Message) if config.notifyInReleaseStage() { if config.Synchronous { return (&payload{event, config}).deliver() } // Ensure that any errors are logged if they occur in a goroutine. go func(event *Event, config *Configuration) { err := (&payload{event, config}).deliver() if err != nil { config.logf("bugsnag.Notify: %v", err) } }(event, config) return nil } return fmt.Errorf("not notifying in %s", config.ReleaseStage) }) if e != nil { config.logf("bugsnag.Notify: %v", e) } return e }
// Fire forwards an error to Bugsnag. Given a logrus.Entry, it extracts the // "error" field (or the Message if the error isn't present) and sends it off. func (hook *bugsnagHook) Fire(entry *logrus.Entry) error { var notifyErr error err, ok := entry.Data["error"].(error) if ok { notifyErr = err } else { notifyErr = errors.New(entry.Message) } metadata := bugsnag.MetaData{} metadata["metadata"] = make(map[string]interface{}) for key, val := range entry.Data { if key != "error" { metadata["metadata"][key] = val } } errWithStack := bugsnag_errors.New(notifyErr, skipStackFrames) bugsnagErr := bugsnag.Notify(errWithStack, metadata) if bugsnagErr != nil { return ErrBugsnagSendFailed{bugsnagErr} } return nil }
// Notify sends an error to Bugsnag. Any rawData you pass here will be sent to // Bugsnag after being converted to JSON. e.g. bugsnag.SeverityError, bugsnag.Context, // or bugsnag.MetaData. func (notifier *Notifier) Notify(err error, rawData ...interface{}) (e error) { event, config := newEvent(errors.New(err, 1), rawData, notifier) // Never block, start throwing away errors if we have too many. e = middleware.Run(event, config, func() error { config.log("notifying bugsnag: %s", event.Message) if config.notifyInReleaseStage() { if config.Synchronous { return (&payload{event, config}).deliver() } go (&payload{event, config}).deliver() return nil } return fmt.Errorf("not notifying in %s", config.ReleaseStage) }) if e != nil { config.log("bugsnag.Notify: %v", e) } return e }
// Fire forwards an error to Bugsnag. Given a logrus.Entry, it extracts the // "error" field (or the Message if the error isn't present) and sends it off. func (hook *bugsnagHook) Fire(entry *logrus.Entry) error { var notifyErr error var errorClass bugsnag.ErrorClass err, ok := entry.Data["error"].(error) if ok { notifyErr = err errorClass = bugsnag.ErrorClass{Name: entry.Message} } else { notifyErr = errors.New(entry.Message) } errWithStack := bugsnag_errors.New(notifyErr, skipStackFrames) metadata := bugsnag.MetaData{} for f, v := range entry.Data { metadata.Add("logrus", f, fmt.Sprintf("%+v", v)) } var bugsnagErr error bugsnagErr = bugsnag.Notify(errWithStack, metadata, errorClass) if bugsnagErr != nil { return ErrBugsnagSendFailed{bugsnagErr} } return nil }
// Recover logs a panic on a goroutine and then recovers. // The rawData is used to send extra information along with // any panics that are handled this way // Usage: defer bugsnag.Recover() func Recover(rawData ...interface{}) { if err := recover(); err != nil { rawData = defaultNotifier.addDefaultSeverity(rawData, SeverityWarning) defaultNotifier.Notify(errors.New(err, 2), rawData...) } }
// Notify sends an error to Bugsnag along with the current stack trace. The // rawData is used to send extra information along with the error. For example // you can pass the current http.Request to Bugsnag to see information about it // in the dashboard, or set the severity of the notification. func Notify(err error, rawData ...interface{}) error { return defaultNotifier.Notify(errors.New(err, 1), rawData...) }