-
Notifications
You must be signed in to change notification settings - Fork 3
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
add ability to replicate Sentry report generation for testing #65
Comments
bobheadxi
added a commit
to sourcegraph/sourcegraph
that referenced
this issue
Apr 15, 2024
…61895) We aggregate all errors on a single log entry to get accurate representations of issues in Sentry, while not generating thousands of log entries at the same time. Because this means we only get higher-level logger context, we must annotate the errors directly with some hidden details to preserve Sentry grouping while adding context for diagnostics. We do this by using CockroachDB error's `WithSafeDetails` helper, which annotates an error with details that are _not_ rendered by `err.Error()` but _are_ included in Sentry reports (via the `Message` field). Currently, we annotate the event ID, feature, action, and source (see example output below) Context on this request: https://sourcegraph.slack.com/archives/C06CCJR4K9R/p1713054354443579 ## Test plan _Super_ jank unit tests that try to emulate how we build Sentry reports, relying on knowledge of how our Sentry report building works internally. I opened sourcegraph/log#65 in case there are new use cases for this in the future. Running the test with `-v` demonstrates the output: ``` $ go test -timeout 30s -run ^TestSummarizeFailedEvents$ github.com/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/server -v === RUN TestSummarizeFailedEvents === RUN TestSummarizeFailedEvents/all_failed === RUN TestSummarizeFailedEvents/all_failed/Sentry_report publish_events_test.go:83: Sentry Error message for field "error.0": publish_events_test.go:38: event publish failed (1) feature:"feature_0" action:"action_0" id:"id_0" server:{version:"TestSummarizeFailedEvents/all_failed"} client:{name:"test_client"} Wraps: (2) attached stack trace -- stack trace: | github.com/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/server.TestSummarizeFailedEvents.func1 | /Users/robert@sourcegraph.com/Projects/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/server/publish_events_test.go:38 | testing.tRunner | /Users/robert@sourcegraph.com/.asdf/installs/golang/1.22.1/go/src/testing/testing.go:1689 | runtime.goexit | /Users/robert@sourcegraph.com/.asdf/installs/golang/1.22.1/go/src/runtime/asm_arm64.s:1222 Wraps: (3) event publish failed Error types: (1) *safedetails.withSafeDetails (2) *withstack.withStack (3) *errutil.leafError -- report composition: *errutil.leafError: event publish failed publish_events_test.go:38: *withstack.withStack (top exception) *safedetails.withSafeDetails: feature:"feature_0" action:"action_0" id:"id_0" server:{version:"TestSummarizeFailedEvents/all_failed"} client:{name:"test_client"} publish_events_test.go:83: Sentry Error message for field "error.1": publish_events_test.go:38: event publish failed (1) feature:"feature_1" action:"action_1" id:"id_1" server:{version:"TestSummarizeFailedEvents/all_failed"} Wraps: (2) attached stack trace -- stack trace: | github.com/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/server.TestSummarizeFailedEvents.func1 | /Users/robert@sourcegraph.com/Projects/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/server/publish_events_test.go:38 | testing.tRunner | /Users/robert@sourcegraph.com/.asdf/installs/golang/1.22.1/go/src/testing/testing.go:1689 | runtime.goexit | /Users/robert@sourcegraph.com/.asdf/installs/golang/1.22.1/go/src/runtime/asm_arm64.s:1222 Wraps: (3) event publish failed Error types: (1) *safedetails.withSafeDetails (2) *withstack.withStack (3) *errutil.leafError -- report composition: *errutil.leafError: event publish failed publish_events_test.go:38: *withstack.withStack (top exception) *safedetails.withSafeDetails: feature:"feature_1" action:"action_1" id:"id_1" server:{version:"TestSummarizeFailedEvents/all_failed"} publish_events_test.go:83: Sentry Error message for field "error.2": publish_events_test.go:38: event publish failed (1) feature:"feature_2" action:"action_2" id:"id_2" server:{version:"TestSummarizeFailedEvents/all_failed"} client:{name:"test_client"} Wraps: (2) attached stack trace -- stack trace: | github.com/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/server.TestSummarizeFailedEvents.func1 | /Users/robert@sourcegraph.com/Projects/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/server/publish_events_test.go:38 | testing.tRunner | /Users/robert@sourcegraph.com/.asdf/installs/golang/1.22.1/go/src/testing/testing.go:1689 | runtime.goexit | /Users/robert@sourcegraph.com/.asdf/installs/golang/1.22.1/go/src/runtime/asm_arm64.s:1222 Wraps: (3) event publish failed Error types: (1) *safedetails.withSafeDetails (2) *withstack.withStack (3) *errutil.leafError -- report composition: *errutil.leafError: event publish failed publish_events_test.go:38: *withstack.withStack (top exception) *safedetails.withSafeDetails: feature:"feature_2" action:"action_2" id:"id_2" server:{version:"TestSummarizeFailedEvents/all_failed"} client:{name:"test_client"} publish_events_test.go:83: Sentry Error message for field "error.3": publish_events_test.go:38: event publish failed (1) feature:"feature_3" action:"action_3" id:"id_3" server:{version:"TestSummarizeFailedEvents/all_failed"} Wraps: (2) attached stack trace -- stack trace: | github.com/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/server.TestSummarizeFailedEvents.func1 | /Users/robert@sourcegraph.com/Projects/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/server/publish_events_test.go:38 | testing.tRunner | /Users/robert@sourcegraph.com/.asdf/installs/golang/1.22.1/go/src/testing/testing.go:1689 | runtime.goexit | /Users/robert@sourcegraph.com/.asdf/installs/golang/1.22.1/go/src/runtime/asm_arm64.s:1222 Wraps: (3) event publish failed Error types: (1) *safedetails.withSafeDetails (2) *withstack.withStack (3) *errutil.leafError -- report composition: *errutil.leafError: event publish failed publish_events_test.go:38: *withstack.withStack (top exception) *safedetails.withSafeDetails: feature:"feature_3" action:"action_3" id:"id_3" server:{version:"TestSummarizeFailedEvents/all_failed"} publish_events_test.go:83: Sentry Error message for field "error.4": publish_events_test.go:38: event publish failed (1) feature:"feature_4" action:"action_4" id:"id_4" server:{version:"TestSummarizeFailedEvents/all_failed"} client:{name:"test_client"} Wraps: (2) attached stack trace -- stack trace: | github.com/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/server.TestSummarizeFailedEvents.func1 | /Users/robert@sourcegraph.com/Projects/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/server/publish_events_test.go:38 | testing.tRunner | /Users/robert@sourcegraph.com/.asdf/installs/golang/1.22.1/go/src/testing/testing.go:1689 | runtime.goexit | /Users/robert@sourcegraph.com/.asdf/installs/golang/1.22.1/go/src/runtime/asm_arm64.s:1222 Wraps: (3) event publish failed Error types: (1) *safedetails.withSafeDetails (2) *withstack.withStack (3) *errutil.leafError -- report composition: *errutil.leafError: event publish failed publish_events_test.go:38: *withstack.withStack (top exception) *safedetails.withSafeDetails: feature:"feature_4" action:"action_4" id:"id_4" server:{version:"TestSummarizeFailedEvents/all_failed"} client:{name:"test_client"} === RUN TestSummarizeFailedEvents/some_failed === RUN TestSummarizeFailedEvents/all_succeeded === RUN TestSummarizeFailedEvents/all_succeeded_(large_set) --- PASS: TestSummarizeFailedEvents (0.23s) --- PASS: TestSummarizeFailedEvents/all_failed (0.22s) --- PASS: TestSummarizeFailedEvents/all_failed/Sentry_report (0.00s) --- PASS: TestSummarizeFailedEvents/some_failed (0.00s) --- PASS: TestSummarizeFailedEvents/all_succeeded (0.00s) --- PASS: TestSummarizeFailedEvents/all_succeeded_(large_set) (0.00s) PASS ok github.com/sourcegraph/sourcegraph/cmd/telemetry-gateway/internal/server (cached) ```
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Useful for testing what gets reported to Sentry at the end of the day, based on a
log.Field
, such as the use case in sourcegraph/sourcegraph#61895. Ideally we can expose a simpler struct that represents how a report shows up in Sentry.The text was updated successfully, but these errors were encountered: