diff --git a/src/lib/observability.ts b/src/lib/observability.ts index 71d2b96b1..8bb791c58 100644 --- a/src/lib/observability.ts +++ b/src/lib/observability.ts @@ -101,6 +101,7 @@ export function initializeObservability(): void { Sentry.init({ dsn: sentryDsn, environment: import.meta.env.MODE, + ignoreErrors: [/^Synthetic observability verification$/], sendDefaultPii: false, beforeBreadcrumb: filterObservabilityBreadcrumb, dataCollection: { diff --git a/src/test/observability.test.ts b/src/test/observability.test.ts index 8ecc5022b..58e0f9a6b 100644 --- a/src/test/observability.test.ts +++ b/src/test/observability.test.ts @@ -209,6 +209,7 @@ describe("observability primitives", () => { expect(sentryInitMock).toHaveBeenCalledOnce(); expect(sentryInitMock).toHaveBeenCalledWith(expect.objectContaining({ dsn: "https://public-test@sentry.example/1", + ignoreErrors: [/^Synthetic observability verification$/], sendDefaultPii: false, beforeBreadcrumb: filterObservabilityBreadcrumb, dataCollection: { diff --git a/src/test/sentry-event-filter.test.ts b/src/test/sentry-event-filter.test.ts new file mode 100644 index 000000000..b03920515 --- /dev/null +++ b/src/test/sentry-event-filter.test.ts @@ -0,0 +1,31 @@ +import * as Sentry from "@sentry/react"; +import { describe, expect, it, vi } from "vitest"; + +describe("Sentry event filtering", () => { + it("drops only the exact synthetic observability verification error", async () => { + const send = vi.fn(async () => ({})); + + Sentry.init({ + dsn: "https://0123456789abcdef0123456789abcdef@o0.ingest.sentry.io/1", + ignoreErrors: [/^Synthetic observability verification$/], + transport: () => ({ + send, + flush: async () => true, + }), + }); + + Sentry.captureException(new Error("Synthetic observability verification")); + await Sentry.flush(1_000); + expect(send).not.toHaveBeenCalled(); + + Sentry.captureException(new Error("Synthetic observability verification failed")); + await Sentry.flush(1_000); + expect(send).toHaveBeenCalledOnce(); + + Sentry.captureException(new Error("Real privacy route failure")); + await Sentry.flush(1_000); + expect(send).toHaveBeenCalledTimes(2); + + await Sentry.close(1_000); + }); +});