From 325f630fed252f7eac8d0c329d0c63a5686e991f Mon Sep 17 00:00:00 2001 From: "sentry[bot]" <39604003+sentry[bot]@users.noreply.github.com> Date: Thu, 1 Oct 2026 23:23:16 +0000 Subject: [PATCH 1/2] fix(error-reporting): silence undici TypeError: terminated network errors (CLI-2AD) --- packages/cli/src/lib/error-reporting.ts | 4 +++- packages/cli/src/lib/errors.ts | 10 +++++++++- packages/cli/test/lib/error-reporting.test.ts | 7 +++++++ packages/cli/test/lib/errors.test.ts | 17 +++++++++++++++++ 4 files changed, 36 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/lib/error-reporting.ts b/packages/cli/src/lib/error-reporting.ts index 29101826c..7625bfa66 100644 --- a/packages/cli/src/lib/error-reporting.ts +++ b/packages/cli/src/lib/error-reporting.ts @@ -76,7 +76,9 @@ export function classifySilenced(error: unknown): SilenceReason | null { return "output_error"; } // A raw `TypeError: "fetch failed"` (CLI-16W) means the CLI could not reach - // Sentry at all (offline, DNS, connection refused/timeout). There is nothing + // Sentry at all (offline, DNS, connection refused/timeout); a raw + // `TypeError: "terminated"` (CLI-2AD) means the connection dropped while + // streaming the response body. There is nothing // actionable in a "user is offline" report, so drop it — same rationale as // EPIPE/EBADF OS noise in `beforeSend`. Note: TLS cert errors are wrapped as // ApiError(status 0), NOT matched here, so they stay captured/actionable. diff --git a/packages/cli/src/lib/errors.ts b/packages/cli/src/lib/errors.ts index 65a6e8e26..4dadf40c7 100644 --- a/packages/cli/src/lib/errors.ts +++ b/packages/cli/src/lib/errors.ts @@ -911,6 +911,11 @@ export function toSearchQueryError( * `TypeError: "fetch failed"` for every such failure (the real errno is in * `cause`). * + * When the connection drops *after* response headers arrive (e.g. `read + * ETIMEDOUT` while streaming the body), undici instead aborts the body stream + * with `TypeError: "terminated"` (CLI-2AD). That is the same class of + * environmental failure, so it is matched too. + * * This reflects the user's environment, not a CLI bug, so it is treated as a * user error (no upgrade nudge) and is not reported to Sentry — the same * rationale as dropping EPIPE/EBADF OS noise in `beforeSend`. @@ -922,7 +927,10 @@ export function toSearchQueryError( * CLI bug" treatment for `status === 0` check it explicitly. */ export function isNetworkError(error: unknown): boolean { - return error instanceof TypeError && error.message === "fetch failed"; + return ( + error instanceof TypeError && + (error.message === "fetch failed" || error.message === "terminated") + ); } /** diff --git a/packages/cli/test/lib/error-reporting.test.ts b/packages/cli/test/lib/error-reporting.test.ts index df57db792..9a609e8c9 100644 --- a/packages/cli/test/lib/error-reporting.test.ts +++ b/packages/cli/test/lib/error-reporting.test.ts @@ -251,6 +251,13 @@ describe("classifySilenced", () => { ); }); + test("silences a raw 'terminated' TypeError (mid-body connection drop)", () => { + const err = new TypeError("terminated", { + cause: new Error("read ETIMEDOUT"), + }); + expect(classifySilenced(err)).toBe("network_error"); + }); + test("does NOT silence a TLS cert error wrapped as ApiError(0)", () => { // status 0 is shared by network failures and TLS cert errors; the latter // are actionable (missing CA) and must stay captured. diff --git a/packages/cli/test/lib/errors.test.ts b/packages/cli/test/lib/errors.test.ts index ea91399cd..a188aeb68 100644 --- a/packages/cli/test/lib/errors.test.ts +++ b/packages/cli/test/lib/errors.test.ts @@ -536,6 +536,11 @@ describe("isUserError", () => { new TypeError("fetch failed"), true, ], + [ + "raw terminated TypeError (mid-body network drop)", + new TypeError("terminated"), + true, + ], ["ApiError 400", new ApiError("bad request", 400), false], [ // A user's unparseable --query becomes a ValidationError at the command @@ -565,6 +570,18 @@ describe("isNetworkError", () => { expect(isNetworkError(new TypeError("fetch failed"))).toBe(true); }); + test("true for a raw 'terminated' TypeError (mid-body connection drop)", () => { + const err = new TypeError("terminated", { + cause: new Error("read ETIMEDOUT"), + }); + expect(isNetworkError(err)).toBe(true); + expect(isNetworkError(new TypeError("terminated"))).toBe(true); + }); + + test("false for a plain Error with message 'terminated'", () => { + expect(isNetworkError(new Error("terminated"))).toBe(false); + }); + test("false for ApiError status 0 (shared with TLS cert errors)", () => { // status 0 is also used for TLS cert errors, which must stay actionable. expect(isNetworkError(new ApiError("Network error", 0))).toBe(false); From 8f7e30f6a8af404ba778003b488fad27f6135f55 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 1 Oct 2026 23:24:11 +0000 Subject: [PATCH 2/2] chore: regenerate docs --- .../skills/sentry-cli/references/agent-conversation.md | 2 +- .../sentry-cli/skills/sentry-cli/references/dashboard.md | 2 +- .../plugins/sentry-cli/skills/sentry-cli/references/event.md | 2 +- .../sentry-cli/skills/sentry-cli/references/explore.md | 2 +- .../sentry-cli/skills/sentry-cli/references/feedback.md | 2 +- .../plugins/sentry-cli/skills/sentry-cli/references/issue.md | 4 ++-- .../plugins/sentry-cli/skills/sentry-cli/references/log.md | 2 +- .../plugins/sentry-cli/skills/sentry-cli/references/replay.md | 2 +- .../plugins/sentry-cli/skills/sentry-cli/references/span.md | 2 +- .../plugins/sentry-cli/skills/sentry-cli/references/trace.md | 4 ++-- 10 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/agent-conversation.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/agent-conversation.md index dd6ffe1d6..d2cbc9ef7 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/agent-conversation.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/agent-conversation.md @@ -18,7 +18,7 @@ List recent agent conversations **Flags:** - `-n, --limit - Number of conversations (1-1000) - (default: "25")` - `-q, --query - Search query` -- `-t, --period - Time range: "7d", "2026-08-01..2026-09-01", ">=2026-08-01" - (default: "7d")` +- `-t, --period - Time range: "7d", "2026-09-01..2026-10-01", ">=2026-09-01" - (default: "7d")` - `-f, --fresh - Bypass cache, re-detect projects, and fetch fresh data` - `-c, --cursor - Navigate pages: "next", "prev", "first" (or raw cursor string)` diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dashboard.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dashboard.md index 949428f5b..66c776eff 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dashboard.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/dashboard.md @@ -42,7 +42,7 @@ View a dashboard - `-w, --web - Open in browser` - `-f, --fresh - Bypass cache, re-detect projects, and fetch fresh data` - `-r, --refresh - Auto-refresh interval in seconds (default: 60, min: 10)` -- `-t, --period - Time range: "7d", "2026-08-01..2026-09-01", ">=2026-08-01"` +- `-t, --period - Time range: "7d", "2026-09-01..2026-10-01", ">=2026-09-01"` - `--renderer - Graphics renderer (defaults to auto; falls back to auto when unavailable) - (default: "auto")` - `--no-graphics-cap - Use the terminal-native graphics width (may fall back to ASCII for very large dashboards)` diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/event.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/event.md index 9cc411d25..59c60af32 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/event.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/event.md @@ -86,7 +86,7 @@ List events for an issue - `-n, --limit - Number of events (1-1000) - (default: "25")` - `-q, --query - Search query (Sentry search syntax)` - `--full - Include full event body (stacktraces)` -- `-t, --period - Time range: "7d", "2026-08-01..2026-09-01", ">=2026-08-01" - (default: "7d")` +- `-t, --period - Time range: "7d", "2026-09-01..2026-10-01", ">=2026-09-01" - (default: "7d")` - `-f, --fresh - Bypass cache, re-detect projects, and fetch fresh data` - `-c, --cursor - Navigate pages: "next", "prev", "first" (or raw cursor string)` diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/explore.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/explore.md index ae1f4fd78..1565de4b1 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/explore.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/explore.md @@ -24,7 +24,7 @@ Query aggregate event data (Explore) - `-s, --sort - Sort field (prefix with - for desc, e.g., "-count()")` - `-e, --environment ... - Environment filter (repeatable, comma-separated)` - `-n, --limit - Number of rows (1-1000) - (default: "25")` -- `-t, --period - Time range: "7d", "2026-08-01..2026-09-01", ">=2026-08-01" - (default: "24h")` +- `-t, --period - Time range: "7d", "2026-09-01..2026-10-01", ">=2026-09-01" - (default: "24h")` - `-f, --fresh - Bypass cache, re-detect projects, and fetch fresh data` - `-c, --cursor - Navigate pages: "next", "prev", "first" (or raw cursor string)` diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/feedback.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/feedback.md index 70293ae18..a8fc76c85 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/feedback.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/feedback.md @@ -19,7 +19,7 @@ List and search User Feedback - `--status - Mailbox: unresolved, resolved, spam, or all - (default: "unresolved")` - `-n, --limit - Number of feedback items (1-1000) - (default: "25")` - `-q, --query - Search query (Sentry issue search syntax)` -- `-t, --period - Time range: "7d", "2026-08-01..2026-09-01", ">=2026-08-01" - (default: "14d")` +- `-t, --period - Time range: "7d", "2026-09-01..2026-10-01", ">=2026-09-01" - (default: "14d")` - `-f, --fresh - Bypass cache, re-detect projects, and fetch fresh data` - `-c, --cursor - Navigate pages: "next", "prev", "first" (or raw cursor string)` diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/issue.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/issue.md index a6dce81d7..0ac798f7c 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/issue.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/issue.md @@ -19,7 +19,7 @@ List issues in a project - `-q, --query - Search query (Sentry syntax, implicit AND, no OR operator)` - `-n, --limit - Maximum number of issues to list - (default: "25")` - `-s, --sort - Sort by: recommended, date, new, freq, user (default: recommended on sentry.io, else date)` -- `-t, --period - Time range: "7d", "2026-08-01..2026-09-01", ">=2026-08-01" - (default: "90d")` +- `-t, --period - Time range: "7d", "2026-09-01..2026-10-01", ">=2026-09-01" - (default: "90d")` - `-c, --cursor - Pagination cursor (use "next" for next page, "prev" for previous)` - `--compact - Single-line rows for compact output (auto-detects if omitted)` - `-f, --fresh - Bypass cache, re-detect projects, and fetch fresh data` @@ -92,7 +92,7 @@ List events for a specific issue - `-n, --limit - Number of events (1-1000) - (default: "25")` - `-q, --query - Search query (Sentry search syntax)` - `--full - Include full event body (stacktraces)` -- `-t, --period - Time range: "7d", "2026-08-01..2026-09-01", ">=2026-08-01" - (default: "7d")` +- `-t, --period - Time range: "7d", "2026-09-01..2026-10-01", ">=2026-09-01" - (default: "7d")` - `-f, --fresh - Bypass cache, re-detect projects, and fetch fresh data` - `-c, --cursor - Navigate pages: "next", "prev", "first" (or raw cursor string)` diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/log.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/log.md index ff35ecf5f..d36318e08 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/log.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/log.md @@ -19,7 +19,7 @@ List logs from a project - `-n, --limit - Number of log entries (1-1000) - (default: "100")` - `-q, --query - Filter query (e.g., "severity:error", "project:backend", "project:[a,b]")` - `-f, --follow - Stream logs (optionally specify poll interval in seconds)` -- `-t, --period - Time range: "7d", "2026-08-01..2026-09-01", ">=2026-08-01"` +- `-t, --period - Time range: "7d", "2026-09-01..2026-10-01", ">=2026-09-01"` - `-s, --sort - Sort order: "newest" (default) or "oldest" - (default: "newest")` - `--fresh - Bypass cache, re-detect projects, and fetch fresh data` diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/replay.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/replay.md index 81447b88e..a24aaeccf 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/replay.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/replay.md @@ -20,7 +20,7 @@ List recent Session Replays - `-q, --query - Search query (Sentry replay search syntax)` - `-e, --environment ... - Filter by environment (repeatable, comma-separated)` - `-s, --sort - Sort by: date, oldest, duration, errors, activity, or a raw replay sort field - (default: "date")` -- `-t, --period - Time range: "7d", "2026-08-01..2026-09-01", ">=2026-08-01" - (default: "7d")` +- `-t, --period - Time range: "7d", "2026-09-01..2026-10-01", ">=2026-09-01" - (default: "7d")` - `-f, --fresh - Bypass cache, re-detect projects, and fetch fresh data` - `-c, --cursor - Navigate pages: "next", "prev", "first" (or raw cursor string)` diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/span.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/span.md index 92b764ed1..99d24ee36 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/span.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/span.md @@ -19,7 +19,7 @@ List spans in a project or trace - `-n, --limit - Number of spans (<=1000) - (default: "25")` - `-q, --query - Filter spans (e.g., "op:db", "project:backend", "project:[cli,api]")` - `-s, --sort - Sort order: date, duration - (default: "date")` -- `-t, --period - Time range: "7d", "2026-08-01..2026-09-01", ">=2026-08-01" - (default: "7d")` +- `-t, --period - Time range: "7d", "2026-09-01..2026-10-01", ">=2026-09-01" - (default: "7d")` - `-f, --fresh - Bypass cache, re-detect projects, and fetch fresh data` - `-c, --cursor - Navigate pages: "next", "prev", "first" (or raw cursor string)` diff --git a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/trace.md b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/trace.md index 6cd22b450..a41fd7221 100644 --- a/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/trace.md +++ b/packages/cli/plugins/sentry-cli/skills/sentry-cli/references/trace.md @@ -19,7 +19,7 @@ List recent traces in a project - `-n, --limit - Number of traces (1-1000) - (default: "25")` - `-q, --query - Search query (Sentry search syntax)` - `-s, --sort - Sort by: date, duration - (default: "date")` -- `-t, --period - Time range: "7d", "2026-08-01..2026-09-01", ">=2026-08-01" - (default: "7d")` +- `-t, --period - Time range: "7d", "2026-09-01..2026-10-01", ">=2026-09-01" - (default: "7d")` - `-f, --fresh - Bypass cache, re-detect projects, and fetch fresh data` - `-c, --cursor - Navigate pages: "next", "prev", "first" (or raw cursor string)` @@ -91,7 +91,7 @@ View logs associated with a trace **Flags:** - `-w, --web - Open trace in browser` -- `-t, --period - Time range: "7d", "2026-08-01..2026-09-01", ">=2026-08-01" - (default: "14d")` +- `-t, --period - Time range: "7d", "2026-09-01..2026-10-01", ">=2026-09-01" - (default: "14d")` - `-n, --limit - Number of log entries (<=1000) - (default: "100")` - `-q, --query - Filter query (e.g., "severity:error", "project:backend", "project:[a,b]")` - `-s, --sort - Sort order: "newest" (default) or "oldest" - (default: "newest")`