From 032131d3b3b904a58178bbd93b728f34b2a71587 Mon Sep 17 00:00:00 2001 From: "sentry[bot]" <39604003+sentry[bot]@users.noreply.github.com> Date: Sat, 15 Aug 2026 10:48:33 +0000 Subject: [PATCH] fix(telemetry): silence ConfigError for missing DSN --- packages/cli/src/lib/error-reporting.ts | 11 ++++++++++- packages/cli/test/lib/error-reporting.test.ts | 7 ++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/lib/error-reporting.ts b/packages/cli/src/lib/error-reporting.ts index a44c98596..612fa5da6 100644 --- a/packages/cli/src/lib/error-reporting.ts +++ b/packages/cli/src/lib/error-reporting.ts @@ -29,6 +29,7 @@ import { ApiError, AuthError, CliError, + ConfigError, ContextError, DeviceFlowError, HostScopeError, @@ -54,7 +55,8 @@ type SilenceReason = | "output_error" | "auth_expected" | "api_user_error" - | "network_error"; + | "network_error" + | "config_error"; /** * Classify whether an error should be silenced. @@ -94,6 +96,13 @@ export function classifySilenced(error: unknown): SilenceReason | null { if (error instanceof ApiError && error.status > 400 && error.status < 500) { return "api_user_error"; } + // A ConfigError means the user did not provide a required configuration value + // (e.g. no DSN via --dsn or SENTRY_DSN). This is expected user + // misconfiguration, not a CLI bug — silencing it removes noise from + // telemetry while the `cli.error.silenced` metric preserves volume (CLI-28M). + if (error instanceof ConfigError) { + return "config_error"; + } // A 400 (Bad Request) signals a malformed request the CLI built — a code // defect — so it is always captured. A user's unparseable `--query` is NOT a // 400 here: it is converted to a ValidationError at the command boundary diff --git a/packages/cli/test/lib/error-reporting.test.ts b/packages/cli/test/lib/error-reporting.test.ts index 1b0bed9e1..8ba7e62fc 100644 --- a/packages/cli/test/lib/error-reporting.test.ts +++ b/packages/cli/test/lib/error-reporting.test.ts @@ -305,11 +305,16 @@ describe("classifySilenced", () => { ], ["ValidationError", new ValidationError("bad")], ["SeerError", new SeerError("not_enabled")], - ["ConfigError", new ConfigError("bad")], ["generic Error", new Error("boom")], ])("does NOT silence %s", (_label, err) => { expect(classifySilenced(err)).toBeNull(); }); + + test("silences ConfigError as config_error (CLI-28M)", () => { + // ConfigError means the user omitted a required config value (e.g. no DSN). + // It is user misconfiguration, not a CLI bug — silence it to reduce noise. + expect(classifySilenced(new ConfigError("bad"))).toBe("config_error"); + }); }); // ---------------------------------------------------------------------------