diff --git a/internal/telemetry/sentry.go b/internal/telemetry/sentry.go index 258fec0f544..5b1420a1866 100644 --- a/internal/telemetry/sentry.go +++ b/internal/telemetry/sentry.go @@ -51,8 +51,8 @@ func initSentryClient(appName string) bool { return err == nil } -func newSentryException(err error) []sentry.Exception { - errMsg := err.Error() +func newSentryException(errToLog error) []sentry.Exception { + errMsg := errToLog.Error() binPkg := "" modPath := "" if build, ok := debug.ReadBuildInfo(); ok { @@ -66,12 +66,12 @@ func newSentryException(err error) []sentry.Exception { var stFunc func() []runtime.Frame errType := "Generic Error" for { - if t := exportedErrType(err); t != "" { + if t := exportedErrType(errToLog); t != "" { errType = t } //nolint:errorlint - switch stackErr := err.(type) { + switch stackErr := errToLog.(type) { // If the error implements the StackTrace method in the redact package, then // prefer that. The Sentry SDK gets some things wrong when guessing how // to extract the stack trace. @@ -98,11 +98,11 @@ func newSentryException(err error) []sentry.Exception { return frames } } - uw := errors.Unwrap(err) + uw := errors.Unwrap(errToLog) if uw == nil { break } - err = uw + errToLog = uw } ex := []sentry.Exception{{Type: errType, Value: errMsg}} if stFunc != nil { diff --git a/internal/telemetry/telemetry.go b/internal/telemetry/telemetry.go index f2f1622ef3e..aebda518101 100644 --- a/internal/telemetry/telemetry.go +++ b/internal/telemetry/telemetry.go @@ -114,7 +114,8 @@ func commandEvent(meta Metadata) (id string, msg *segment.Track) { // Error reports an error to the telemetry server. func Error(err error, meta Metadata) { - if !started || err == nil { + errToLog := err // use errToLog to avoid shadowing err later. Use err to keep API clean. + if !started || errToLog == nil { return } @@ -127,7 +128,7 @@ func Error(err error, meta Metadata) { EventID: sentry.EventID(ExecutionID), Level: sentry.LevelError, User: sentry.User{ID: deviceID}, - Exception: newSentryException(redact.Error(err)), + Exception: newSentryException(redact.Error(errToLog)), Contexts: map[string]map[string]any{ "os": { "name": build.OS(), diff --git a/internal/telemetry/telemetry_test.go b/internal/telemetry/telemetry_test.go new file mode 100644 index 00000000000..97524376a10 --- /dev/null +++ b/internal/telemetry/telemetry_test.go @@ -0,0 +1,19 @@ +package telemetry + +import ( + "errors" + "testing" +) + +// TestErrorBasic does a very simple sanity check to ensure the error can be sent +// to the sentry and segment buffers +func TestErrorBasic(t *testing.T) { + segmentBufferDir = t.TempDir() + sentryBufferDir = t.TempDir() + started = true + + fakeErr := errors.New("fake error") + meta := Metadata{} + + Error(fakeErr, meta) +}