errors_reporting.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package main
  2. import (
  3. "net/http"
  4. "strings"
  5. "time"
  6. "github.com/bugsnag/bugsnag-go"
  7. "github.com/getsentry/sentry-go"
  8. "github.com/honeybadger-io/honeybadger-go"
  9. )
  10. var (
  11. bugsnagEnabled bool
  12. honeybadgerEnabled bool
  13. sentryEnabled bool
  14. headersReplacer = strings.NewReplacer("-", "_")
  15. sentryTimeout = 5 * time.Second
  16. )
  17. func initErrorsReporting() {
  18. if len(conf.BugsnagKey) > 0 {
  19. bugsnag.Configure(bugsnag.Configuration{
  20. APIKey: conf.BugsnagKey,
  21. ReleaseStage: conf.BugsnagStage,
  22. })
  23. bugsnagEnabled = true
  24. }
  25. if len(conf.HoneybadgerKey) > 0 {
  26. honeybadger.Configure(honeybadger.Configuration{
  27. APIKey: conf.HoneybadgerKey,
  28. Env: conf.HoneybadgerEnv,
  29. })
  30. honeybadgerEnabled = true
  31. }
  32. if len(conf.SentryDSN) > 0 {
  33. sentry.Init(sentry.ClientOptions{
  34. Dsn: conf.SentryDSN,
  35. Release: conf.SentryRelease,
  36. Environment: conf.SentryEnvironment,
  37. })
  38. sentryEnabled = true
  39. }
  40. }
  41. func reportError(err error, req *http.Request) {
  42. if bugsnagEnabled {
  43. bugsnag.Notify(err, req)
  44. }
  45. if honeybadgerEnabled {
  46. headers := make(honeybadger.CGIData)
  47. for k, v := range req.Header {
  48. key := "HTTP_" + headersReplacer.Replace(strings.ToUpper(k))
  49. headers[key] = v[0]
  50. }
  51. honeybadger.Notify(err, req.URL, headers)
  52. }
  53. if sentryEnabled {
  54. hub := sentry.CurrentHub().Clone()
  55. hub.Scope().SetRequest(req)
  56. hub.Scope().SetLevel(sentry.LevelError)
  57. eventID := hub.CaptureException(err)
  58. if eventID != nil {
  59. hub.Flush(sentryTimeout)
  60. }
  61. }
  62. }