diff --git a/internal/sentry/reporter.go b/internal/sentry/reporter.go index b50fa0a6..319f4119 100644 --- a/internal/sentry/reporter.go +++ b/internal/sentry/reporter.go @@ -61,9 +61,17 @@ func NewReporter(appName, appVersion string, userAgent fmt.Stringer) *Reporter { } func (r *Reporter) ReportException(i interface{}) error { + return r.ReportExceptionWithContext(i, make(map[string]interface{})) +} + +func (r *Reporter) ReportMessage(msg string) error { + return r.ReportMessageWithContext(msg, make(map[string]interface{})) +} + +func (r *Reporter) ReportExceptionWithContext(i interface{}, context map[string]interface{}) error { err := fmt.Errorf("recover: %v", i) - return r.scopedReport(func() { + return r.scopedReport(context, func() { if eventID := sentry.CaptureException(err); eventID != nil { logrus.WithError(err). WithField("reportID", *eventID). @@ -72,8 +80,8 @@ func (r *Reporter) ReportException(i interface{}) error { }) } -func (r *Reporter) ReportMessage(msg string) error { - return r.scopedReport(func() { +func (r *Reporter) ReportMessageWithContext(msg string, context map[string]interface{}) error { + return r.scopedReport(context, func() { if eventID := sentry.CaptureMessage(msg); eventID != nil { logrus.WithField("message", msg). WithField("reportID", *eventID). @@ -83,7 +91,7 @@ func (r *Reporter) ReportMessage(msg string) error { } // Report reports a sentry crash with stacktrace from all goroutines. -func (r *Reporter) scopedReport(doReport func()) error { +func (r *Reporter) scopedReport(context map[string]interface{}, doReport func()) error { SkipDuringUnwind() if os.Getenv("PROTONMAIL_ENV") == "dev" { @@ -101,6 +109,7 @@ func (r *Reporter) scopedReport(doReport func()) error { sentry.WithScope(func(scope *sentry.Scope) { SkipDuringUnwind() scope.SetTags(tags) + scope.SetContexts(context) doReport() }) diff --git a/internal/store/event_loop.go b/internal/store/event_loop.go index e17deaf5..50453c9a 100644 --- a/internal/store/event_loop.go +++ b/internal/store/event_loop.go @@ -247,7 +247,12 @@ func (loop *eventLoop) processNextEvent() (more bool, err error) { // nolint[fun l.WithError(err).WithField("errors", loop.errCounter).Error("Error skipped") loop.errCounter++ if loop.errCounter == errMaxSentry { - if sentryErr := loop.store.sentryReporter.ReportMessage("Warning: event loop issues: " + err.Error() + ", " + loop.currentEventID); sentryErr != nil { + context := map[string]interface{}{ + "EventLoop": map[string]interface{}{ + "EventID": loop.currentEventID, + }, + } + if sentryErr := loop.store.sentryReporter.ReportMessageWithContext("Warning: event loop issues: "+err.Error(), context); sentryErr != nil { l.WithError(sentryErr).Error("Failed to report error to sentry") } } @@ -302,7 +307,12 @@ func (loop *eventLoop) processEvent(event *pmapi.Event) (err error) { eventLog.Info("Processing refresh event") loop.store.triggerSync() - if sentryErr := loop.store.sentryReporter.ReportMessage("Warning: refresh occurred, " + loop.currentEventID); sentryErr != nil { + context := map[string]interface{}{ + "EventLoop": map[string]interface{}{ + "EventID": loop.currentEventID, + }, + } + if sentryErr := loop.store.sentryReporter.ReportMessageWithContext("Warning: refresh occurred", context); sentryErr != nil { loop.log.WithError(sentryErr).Error("Failed to report refresh to sentry") }