From 6b7b3e9179b161f4120bb5528a12aea5f59502b4 Mon Sep 17 00:00:00 2001 From: DarthSim Date: Mon, 17 Feb 2025 22:15:54 +0300 Subject: [PATCH] Replace `*ierrors.Error` with actual data type in Sentry and Honeybadger integrations --- errorreport/honeybadger/honeybadger.go | 10 +++++++++- errorreport/sentry/sentry.go | 20 +++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/errorreport/honeybadger/honeybadger.go b/errorreport/honeybadger/honeybadger.go index 8bd65b1c..c9e9f6fa 100644 --- a/errorreport/honeybadger/honeybadger.go +++ b/errorreport/honeybadger/honeybadger.go @@ -2,11 +2,13 @@ package honeybadger import ( "net/http" + "reflect" "strings" "github.com/honeybadger-io/honeybadger-go" "github.com/imgproxy/imgproxy/v3/config" + "github.com/imgproxy/imgproxy/v3/ierrors" ) var ( @@ -42,5 +44,11 @@ func Report(err error, req *http.Request, meta map[string]any) { extra[key] = v } - honeybadger.Notify(err, req.URL, extra) + hbErr := honeybadger.NewError(err) + + if e, ok := err.(*ierrors.Error); ok { + hbErr.Class = reflect.TypeOf(e.Unwrap()).String() + } + + honeybadger.Notify(hbErr, req.URL, extra) } diff --git a/errorreport/sentry/sentry.go b/errorreport/sentry/sentry.go index 6748740f..e777fd75 100644 --- a/errorreport/sentry/sentry.go +++ b/errorreport/sentry/sentry.go @@ -40,8 +40,22 @@ func Report(err error, req *http.Request, meta map[string]any) { hub.Scope().SetContext("Processing context", meta) } - eventID := hub.CaptureException(err) - if eventID != nil { - hub.Flush(timeout) + // imgproxy wraps almost all errors into *ierrors.Error, so Sentry will show + // the same error type for all errors. We need to fix it. + // + // Instead of using hub.CaptureException(err), we need to create an event + // manually and replace `*ierrors.Error` with the wrapped error type + // (which is the previous exception type in the exception chain). + if event := hub.Client().EventFromException(err, sentry.LevelError); event != nil { + for i := 1; i < len(event.Exception); i++ { + if event.Exception[i].Type == "*ierrors.Error" { + event.Exception[i].Type = event.Exception[i-1].Type + } + } + + eventID := hub.CaptureEvent(event) + if eventID != nil { + hub.Flush(timeout) + } } }