bugsnag.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package bugsnag
  2. import (
  3. "fmt"
  4. "log/slog"
  5. "net/http"
  6. "github.com/bugsnag/bugsnag-go/v2"
  7. )
  8. // logger is the logger forwarder for bugsnag
  9. type logger struct{}
  10. func (l logger) Printf(format string, v ...interface{}) {
  11. slog.Debug(fmt.Sprintf(format, v...), "source", "bugsnag")
  12. }
  13. type reporter struct {
  14. notifier *bugsnag.Notifier
  15. }
  16. func New(config *Config) (*reporter, error) {
  17. if err := config.Validate(); err != nil {
  18. return nil, err
  19. }
  20. if len(config.Key) == 0 {
  21. return nil, nil
  22. }
  23. notifier := bugsnag.New(bugsnag.Configuration{
  24. APIKey: config.Key,
  25. ReleaseStage: config.Stage,
  26. PanicHandler: func() {}, // Disable forking the process
  27. Logger: logger{},
  28. Synchronous: true,
  29. })
  30. return &reporter{notifier: notifier}, nil
  31. }
  32. func (r *reporter) Report(err error, req *http.Request, meta map[string]any) {
  33. extra := make(bugsnag.MetaData)
  34. for k, v := range meta {
  35. extra.Add("Processing Context", k, v)
  36. }
  37. if repErr := r.notifier.Notify(err, req, extra); repErr != nil {
  38. slog.Warn("Failed to report error to Bugsnag", "error", repErr)
  39. }
  40. }
  41. func (r *reporter) Close() {
  42. // noop
  43. }