next-observer 0.3.18 → 0.3.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -20
- package/dist/agents/investigator.js +1 -1
- package/dist/agents/investigator.js.map +1 -1
- package/dist/agents/specialists.js +6 -2
- package/dist/agents/specialists.js.map +1 -1
- package/dist/debug/detector.d.ts +34 -4
- package/dist/debug/detector.js +83 -6
- package/dist/debug/detector.js.map +1 -1
- package/dist/debug/queries.d.ts +6 -0
- package/dist/debug/queries.js +5 -0
- package/dist/debug/queries.js.map +1 -1
- package/dist/ui/assets/{index-7sobglen.js → index-BRvlocwe.js} +1 -1
- package/dist/ui/index.html +1 -1
- package/package.json +4 -3
package/README.md
CHANGED
|
@@ -1,40 +1,101 @@
|
|
|
1
1
|
# next-observer
|
|
2
2
|
|
|
3
|
-
The observer for
|
|
4
|
-
|
|
5
|
-
into your app's dependencies.
|
|
3
|
+
The **observer** for Next.js: one process that receives your app's telemetry, shows it, and has **AI agents** investigate
|
|
4
|
+
it. A server, a UI, an anomaly detector and the agents — started with `npx`, never installed into your app.
|
|
6
5
|
|
|
7
6
|
```bash
|
|
8
|
-
npx next-observer
|
|
7
|
+
npx next-observer init # once: connects the app (installs the APM agent, next-observe, into it)
|
|
8
|
+
npm run observe # the observer + `next dev`; open http://127.0.0.1:4318
|
|
9
9
|
```
|
|
10
10
|
|
|
11
|
-
-
|
|
12
|
-
|
|
13
|
-
with exact errors, N+1 patterns — with evidence cards built from the data, not by the model
|
|
14
|
-
- **Anomaly detector** that starts an investigation by itself when error rates or latency jump
|
|
15
|
-
- **Cold starts are not regressions:** the first request of a route after a server start (in `next dev` it includes
|
|
16
|
-
compiling the route) is left out of latency stats and the detector, and marked in traces (needs next-observe ≥ 0.2.2)
|
|
11
|
+
No app at hand? `npx next-observer collector --demo` starts the observer with a sample shop that has four things to
|
|
12
|
+
find: a deployment that made checkout slower, a failing endpoint, an N+1 query, and an error the last deployment brought.
|
|
17
13
|
|
|
18
|
-
|
|
14
|
+

|
|
15
|
+
|
|
16
|
+
## Two packages, one letter apart
|
|
17
|
+
|
|
18
|
+
| | [`next-observe`](https://www.npmjs.com/package/next-observe) | [`next-observer`](https://www.npmjs.com/package/next-observer) |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| **What it is** | the **APM agent** | the **observer** — a server with a UI and **AI agents** |
|
|
21
|
+
| **Where it runs** | inside your Next.js app (a dependency) | next to the app, started with `npx` (never a dependency) |
|
|
22
|
+
| **What it does** | collects telemetry and sends it | receives telemetry, shows it, investigates it |
|
|
23
|
+
| **Contains AI?** | no — OpenTelemetry only | yes — the AI agents live here |
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
your Next.js app the observer
|
|
27
|
+
┌──────────────────────────┐ ┌──────────────────────────────────┐
|
|
28
|
+
│ next-observe │ traces │ next-observer (port 4318) │
|
|
29
|
+
│ the APM agent │ ───────────▶ │ server · UI · anomaly detector │
|
|
30
|
+
│ collects and sends │ OTLP/HTTP │ AI agents that investigate │
|
|
31
|
+
└──────────────────────────┘ └──────────────────────────────────┘
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**Two kinds of "agent" — they are not the same thing:**
|
|
35
|
+
|
|
36
|
+
- **APM agent** = `next-observe`. The classic meaning from application performance monitoring: a library inside the app
|
|
37
|
+
that records what happens (requests, timings, errors) and ships it out. It decides nothing.
|
|
38
|
+
- **AI agents** = inside `next-observer`. Language models with tools that query the recorded telemetry and answer
|
|
39
|
+
"what is slow, since which deployment, and where in the code". They never run inside your app.
|
|
40
|
+
|
|
41
|
+
## What you get
|
|
42
|
+
|
|
43
|
+
**Overview** — requests by status class, latency and 5xx rate, each compared with the period before; the slowest and
|
|
44
|
+
the busiest routes. When the latest deployment made a route slower or more error-prone, a banner says so with the
|
|
45
|
+
measured numbers, and **Investigate** hands the question to the AI agents.
|
|
46
|
+
|
|
47
|
+
**AI agents that investigate — asked or on their own.** The anomaly detector watches incoming traces; when errors or
|
|
48
|
+
latency jump it starts an investigation by itself. The agents get facts only from tools over your telemetry, and the
|
|
49
|
+
evidence cards under a report are built by code from those tool results, not written by the model.
|
|
50
|
+
|
|
51
|
+

|
|
52
|
+
|
|
53
|
+
**Errors as defects** — one entry per "this operation fails with this message", not per failed request: where the
|
|
54
|
+
error originated, which requests fail because of it, when it was first seen, and whether the last deployment brought it.
|
|
55
|
+
|
|
56
|
+

|
|
57
|
+
|
|
58
|
+
**Traces** — a waterfall, the critical path (the spans that decided the duration), each operation's own time, and how
|
|
59
|
+
this call compares with the others of its kind.
|
|
60
|
+
|
|
61
|
+

|
|
62
|
+
|
|
63
|
+
**One operation up close** — its latency distribution, and a note when the calls fall into two clearly separate speeds
|
|
64
|
+
(a fast and a slow path, or the version before and after a deployment).
|
|
65
|
+
|
|
66
|
+

|
|
67
|
+
|
|
68
|
+
**Copy prompt** — on a trace, a defect or a finished investigation: a ready prompt for a coding agent (Claude Code,
|
|
69
|
+
Cursor, …) with the measured facts and the task, so the fix starts from data instead of a retelling.
|
|
70
|
+
|
|
71
|
+
Also: cold starts are not regressions (the first request of a route after a server start is left out of latency and
|
|
72
|
+
marked), no Docker and no external backend, and it accepts OTLP/HTTP from any OpenTelemetry SDK — not only `next-observe`.
|
|
73
|
+
|
|
74
|
+
Requires Node.js 22.18+.
|
|
19
75
|
|
|
20
76
|
## Commands
|
|
21
77
|
|
|
22
78
|
```bash
|
|
23
79
|
next-observer init [--root <dir>] [--proxy] # connect a Next.js app (see below)
|
|
24
|
-
next-observer dev [--root <dir>] [--port <n>] [-- <next dev args>] # observer + next dev
|
|
25
|
-
next-observer collector [--host <h>] [--port <n>] [--api-key <k>] [--ui-password <p>] [--demo]
|
|
80
|
+
next-observer dev [--root <dir>] [--port <n>] [-- <next dev args>] # the observer + your app's `next dev`
|
|
81
|
+
next-observer collector [--host <h>] [--port <n>] [--api-key <k>] [--ui-password <p>] [--demo] # the observer alone
|
|
26
82
|
```
|
|
27
83
|
|
|
28
84
|
Run them with `npx next-observer <command>`; installed globally (`npm i -g next-observer`) the command is also
|
|
29
85
|
available as `nxo`.
|
|
30
86
|
|
|
31
|
-
`next-observer init` installs `next-observe
|
|
87
|
+
`next-observer init` installs the APM agent, `next-observe`, with the project's package manager, wraps the exported `next.config` in
|
|
32
88
|
`withObserve()`, creates `instrumentation.ts` and `instrumentation-client.ts` (in `src/` when the app lives there; `.js`
|
|
33
89
|
without TypeScript) and adds an `observe` script. Already connected files stay untouched; an existing `register()` is
|
|
34
90
|
never rewritten — init says what to add. `--proxy` also creates the runtime proxy route for browser spans.
|
|
35
91
|
|
|
36
|
-
`next-observer
|
|
37
|
-
|
|
92
|
+
`next-observer dev` is a convenience for local work: it starts the observer and then your app's own `next dev` in the
|
|
93
|
+
same terminal. The app stays yours — the observer only launches it.
|
|
94
|
+
|
|
95
|
+
`next-observer collector` runs the observer alone — next to `next dev` in another terminal, or on a server for
|
|
96
|
+
production. ("Collector" is the OpenTelemetry word for the server that receives telemetry; here it comes with the UI,
|
|
97
|
+
the detector and the AI agents.) `--demo` preloads the sample shop and keeps sending live traffic, so the detector and
|
|
98
|
+
the AI agents have something to find without an app.
|
|
38
99
|
|
|
39
100
|
## On a server
|
|
40
101
|
|
|
@@ -47,16 +108,21 @@ next-observer collector --host 0.0.0.0 --api-key <ingest key> --ui-password <pas
|
|
|
47
108
|
`--api-key` is for the apps sending traces (`OBSERVE_API_KEY` in the app), `--ui-password` for the people opening the
|
|
48
109
|
UI and the chat (the browser asks for it). `/health` stays open for uptime checks. Without them the banner warns.
|
|
49
110
|
|
|
50
|
-
## Models
|
|
111
|
+
## Models for the AI agents
|
|
51
112
|
|
|
52
113
|
| `OBSERVE_AI` | Model |
|
|
53
114
|
|---|---|
|
|
54
|
-
| `mock` (default) | deterministic stand-in — the whole pipeline runs without tokens |
|
|
115
|
+
| `mock` (default) | deterministic stand-in — the whole pipeline runs without a model, tokens or a network |
|
|
55
116
|
| `real` | Gemini when `GEMINI_API_KEY` + `GEMINI_MODEL` are set, otherwise [Kitana](https://www.npmjs.com/package/@kitana-sdk/adk) (Claude / Codex CLI, Ollama, API keys) |
|
|
56
117
|
|
|
57
|
-
|
|
118
|
+
One investigation makes 7–12 model calls. A call that hangs is started again once; "too many requests" (429) and
|
|
119
|
+
"overloaded" (5xx) are waited for and retried — up to a minute, as the provider asks. A free Gemini tier allows only a
|
|
120
|
+
few requests per minute, so an investigation may pause for that minute; a key without credits, a wrong key or a wrong
|
|
121
|
+
model name is explained in the chat in plain words.
|
|
122
|
+
|
|
123
|
+
## Your own AI agents
|
|
58
124
|
|
|
59
|
-
|
|
125
|
+
The built-in AI agents are an orchestrator and three specialists (latency, errors, traffic). To change them, put `observe.agents.ts` (or `.mts`, `.js`, `.mjs`) in the app root. A specialist with a built-in name
|
|
60
126
|
(`latency_agent`, `error_agent`, `traffic_agent`) replaces it; a new name adds one. The orchestrator picks specialists by
|
|
61
127
|
their `description`; the rules "facts from tools only" and "own tools only" are added to every instruction.
|
|
62
128
|
|
|
@@ -82,6 +148,7 @@ Tools: `get_services`, `get_operation_stats`, `compare_versions`, `get_errors`,
|
|
|
82
148
|
|---|---|---|
|
|
83
149
|
| `OBSERVE_AI` | `mock` | `mock` \| `real` |
|
|
84
150
|
| `OBSERVE_DETECTOR` | on | `off` disables the anomaly detector |
|
|
151
|
+
| `OBSERVE_MODEL_TIMEOUT_MS` | `90000` | how long one model call may take before it is started again |
|
|
85
152
|
| `OBSERVE_API_KEY` | — | require `x-api-key` on ingest (`/v1/traces`) |
|
|
86
153
|
| `OBSERVE_UI_PASSWORD` | — | require a password for the UI, the query API and the chat (browser login, any user name) |
|
|
87
154
|
| `OBSERVE_PORT`, `OBSERVE_HOST`, `OBSERVE_ROOT` | `4318`, `127.0.0.1`, `.` | same as `--port`, `--host`, `--root` |
|
|
@@ -67,7 +67,7 @@ export function createInvestigator(options) {
|
|
|
67
67
|
compare_versions: tool(agent, 'compare_versions', 'Latest deployed version vs the previous one per operation: p95 ratio and error-rate delta. `errorRateChangeSignificant: false` means the error-rate difference is within random noise for that many requests. Use it to name the deployment that caused a regression.', z.object({ service, operation, sinceMinutes: since }), (a) => q.compareVersions(a)),
|
|
68
68
|
get_errors: tool(agent, 'get_errors', 'Failing operations: error rate, top exception messages (each with when it was first seen and in which versions), example trace ids.', z.object({ service, operation, sinceMinutes: since }), (a) => q.getErrors(a)),
|
|
69
69
|
search_traces: tool(agent, 'search_traces', 'Recent traces matching filters, to get example trace ids.', z.object({ service, operation, minDurationMs: z.number().optional(), hasError: z.boolean().optional(), sinceMinutes: since }), (a) => q.searchTraces(a)),
|
|
70
|
-
get_trace: tool(agent, 'get_trace', 'One trace as a tree with self time, errors and code file paths; `repeated` lists ≥3 identical sibling calls (N+1); `nextInternalMs` is time inside Next.js itself (routing, rendering, dev compilation), not the app code.', z.object({ traceId: z.string().describe('32-char hex trace id from search_traces') }), (a) => q.getTrace(a)),
|
|
70
|
+
get_trace: tool(agent, 'get_trace', 'One trace as a tree with self time, errors and code file paths; `repeated` lists ≥3 identical sibling calls (N+1); `nextInternalMs` is time inside Next.js itself (routing, rendering, dev compilation), not the app code; `integrityCheck` on a span means it returned successfully, quickly, and still the wrong data — the span has no error and may not even be slow, so check this field specifically rather than assuming a clean-looking span is fine.', z.object({ traceId: z.string().describe('32-char hex trace id from search_traces, or from an anomaly question') }), (a) => q.getTrace(a)),
|
|
71
71
|
});
|
|
72
72
|
const agents = specialists.map((spec) => {
|
|
73
73
|
const available = tools(spec.name);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"investigator.js","sourceRoot":"","sources":["../../src/agents/investigator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"investigator.js","sourceRoot":"","sources":["../../src/agents/investigator.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,11 +34,15 @@ Distinguish external dependencies from internal code. Max 3 sentences.`,
|
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
name: 'error_agent',
|
|
37
|
-
description: 'Error specialist: failing operations, error rates, exact exception messages, source vs downstream victims, whether an error is new.',
|
|
37
|
+
description: 'Error specialist: failing operations, error rates, exact exception messages, source vs downstream victims, whether an error is new — and data-integrity problems (a response that came back successfully and quickly but with the wrong data, no exception at all).',
|
|
38
38
|
instruction: `You are an error specialist. Report the failing operation, its error rate and the exact exception message.
|
|
39
39
|
Use get_trace on an example trace to separate the source span from its downstream victims and to find the code file.
|
|
40
40
|
Say whether the error is new: get_errors tells when each message was first seen and in which versions; compare_versions
|
|
41
|
-
tells whether the error rate changed with the latest deployment (errorRateChangeSignificant).
|
|
41
|
+
tells whether the error rate changed with the latest deployment (errorRateChangeSignificant).
|
|
42
|
+
A trace can look completely clean — no error, not slow — and still be wrong: get_trace's \`integrityCheck\` field on a
|
|
43
|
+
span means that span's response did not match what was requested. get_errors will not find these (their status is not
|
|
44
|
+
"error"); you only see them by opening the trace. Report this as a data-integrity problem, distinct from an exception,
|
|
45
|
+
and name what the mismatched spans share (same operation? same deployment version?). Max 4 sentences.`,
|
|
42
46
|
tools: ['get_errors', 'compare_versions', 'search_traces', 'get_trace'],
|
|
43
47
|
},
|
|
44
48
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"specialists.js","sourceRoot":"","sources":["../../src/agents/specialists.ts"],"names":[],"mappings":"AAAA,qHAAqH;AACrH,2HAA2H;AAE3H,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,cAAc,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,YAAY,EAAE,eAAe,EAAE,WAAW,CAAU,CAAA;AAa1I,MAAM,IAAI,GAAG,wBAAwB,CAAA;AAErC,wGAAwG;AACxG,MAAM,UAAU,gBAAgB,CAAC,IAAoB;IACnD,MAAM,KAAK,GAAG,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,YAAY,CAAA;IACzF,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IAChG,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,0DAA0D,CAAC,CAAA;IAC/I,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,8BAA8B,CAAC,CAAA;IACzF,KAAK,MAAM,KAAK,IAAI,CAAC,aAAa,EAAE,aAAa,CAAU,EAAE,CAAC;QAC5D,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,KAAK,KAAK,6BAA6B,CAAC,CAAA;IAC9H,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,qCAAqC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChJ,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAE,UAAgC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;IACxF,IAAI,OAAO,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,KAAK,mBAAmB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC1H,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAA;AACzI,CAAC;AAED,MAAM,CAAC,MAAM,oBAAoB,GAAqB;IACpD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EAAE,wGAAwG;QACrH,WAAW,EAAE;;;uEAGsD;QACnE,KAAK,EAAE,CAAC,qBAAqB,EAAE,kBAAkB,EAAE,eAAe,EAAE,WAAW,CAAC;KACjF;IACD;QACE,IAAI,EAAE,aAAa;QACnB,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"specialists.js","sourceRoot":"","sources":["../../src/agents/specialists.ts"],"names":[],"mappings":"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"}
|
package/dist/debug/detector.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { NormalizedSpan } from '../collector/types.js';
|
|
2
|
-
export type AnomalyType = 'high_error_rate' | 'high_latency' | 'no_traffic';
|
|
1
|
+
import type { NormalizedSpan, SpanEvent } from '../collector/types.js';
|
|
2
|
+
export type AnomalyType = 'high_error_rate' | 'high_latency' | 'no_traffic' | 'data_integrity';
|
|
3
3
|
export interface Anomaly {
|
|
4
4
|
id: string;
|
|
5
5
|
type: AnomalyType;
|
|
@@ -11,7 +11,7 @@ export interface Anomaly {
|
|
|
11
11
|
};
|
|
12
12
|
severity: 'warning' | 'critical';
|
|
13
13
|
detectedAtMs: number;
|
|
14
|
-
/** What was measured: error share, slow share,
|
|
14
|
+
/** What was measured: error share, slow share, seconds of silence, or (data_integrity) a raw failure count. */
|
|
15
15
|
value: number;
|
|
16
16
|
threshold: number;
|
|
17
17
|
/** Server requests in the window the value is based on (0 for no_traffic). */
|
|
@@ -25,6 +25,17 @@ export interface Anomaly {
|
|
|
25
25
|
errors: number;
|
|
26
26
|
slow: number;
|
|
27
27
|
}[];
|
|
28
|
+
/**
|
|
29
|
+
* `data_integrity` only: the specific checks that failed, each one evidence a latency/error-rate chart can never
|
|
30
|
+
* show — the response came back fast, with a 2xx, and still was not the one that was asked for.
|
|
31
|
+
*/
|
|
32
|
+
integrityFailures?: {
|
|
33
|
+
service: string;
|
|
34
|
+
operation: string;
|
|
35
|
+
traceId: string;
|
|
36
|
+
expected: unknown;
|
|
37
|
+
actual: unknown;
|
|
38
|
+
}[];
|
|
28
39
|
}
|
|
29
40
|
export interface DetectorOptions {
|
|
30
41
|
/** Window for the app-wide rule. */
|
|
@@ -48,6 +59,16 @@ export interface DetectorOptions {
|
|
|
48
59
|
cooldownMs?: number;
|
|
49
60
|
now?: () => number;
|
|
50
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* A span whose own status/duration are both unremarkable — fast, 2xx — can still carry proof that the data inside it
|
|
64
|
+
* was wrong: code that verified "did I get back what I asked for" records that verdict as this event, independent of
|
|
65
|
+
* whether the span threw. See docs/APM_FINDINGS.md, incident F: a connection pooler in transaction-pooling mode can
|
|
66
|
+
* return another concurrent query's result instead of erroring or hanging — nothing about status or latency shows it.
|
|
67
|
+
*/
|
|
68
|
+
export declare const INTEGRITY_CHECK_EVENT = "integrity_check";
|
|
69
|
+
/** Exported so agent tools (debug/queries.ts: getTrace) can show the same evidence the detector acted on — an
|
|
70
|
+
* anomaly whose question names a trace id is only as trustworthy as the agent's own ability to go look at it. */
|
|
71
|
+
export declare function integrityFailureEvent(s: NormalizedSpan): SpanEvent | undefined;
|
|
51
72
|
export declare class AnomalyDetector {
|
|
52
73
|
readonly options: Required<Omit<DetectorOptions, 'now'>>;
|
|
53
74
|
private readonly now;
|
|
@@ -59,7 +80,11 @@ export declare class AnomalyDetector {
|
|
|
59
80
|
private reported;
|
|
60
81
|
private seq;
|
|
61
82
|
constructor(options?: DetectorOptions);
|
|
62
|
-
/**
|
|
83
|
+
/**
|
|
84
|
+
* Feed spans as they are ingested. Kept beyond server-entry spans: any span carrying a failed `integrity_check`
|
|
85
|
+
* event, since that check naturally lives on the call that did the verifying (e.g. a `db.query` child span) —
|
|
86
|
+
* dropping non-server spans here would make the data_integrity rule below unable to ever see its own evidence.
|
|
87
|
+
*/
|
|
63
88
|
observe(spans: NormalizedSpan[]): void;
|
|
64
89
|
/** Evaluate the window now; returns new anomalies (respecting cooldowns). */
|
|
65
90
|
check(): Anomaly[];
|
|
@@ -71,6 +96,11 @@ export declare class AnomalyDetector {
|
|
|
71
96
|
*/
|
|
72
97
|
private alreadyExplained;
|
|
73
98
|
private anomaly;
|
|
99
|
+
/**
|
|
100
|
+
* `bad` are spans whose own status/duration passed every other rule and still carry proof they returned the wrong
|
|
101
|
+
* data (see `integrityFailureEvent`) — always `critical`, there is no "warning" tier for a response that lied.
|
|
102
|
+
*/
|
|
103
|
+
private integrityAnomaly;
|
|
74
104
|
}
|
|
75
105
|
/** The question the agents get when an anomaly fires — carries the evidence so they know where to start. */
|
|
76
106
|
export declare function questionFor(anomaly: Anomaly): string;
|
package/dist/debug/detector.js
CHANGED
|
@@ -1,7 +1,19 @@
|
|
|
1
1
|
const DEFAULTS = { windowMs: 10_000, operationWindowMs: 30_000, errorRate: 0.2, slowMs: 1000, slowRate: 0.3, noTrafficMs: 120_000, minSamples: 5, cooldownMs: 300_000 };
|
|
2
|
-
// Only server entry spans count: Next emits ~7 internal spans per request, which
|
|
3
|
-
// any threshold. Browser and internal spans are ignored.
|
|
2
|
+
// Only server entry spans count for the rate-based rules below: Next emits ~7 internal spans per request, which
|
|
3
|
+
// would dilute a 30% error rate below any threshold. Browser and internal spans are ignored there.
|
|
4
4
|
const isServerRequest = (s) => s.kind === 'server';
|
|
5
|
+
/**
|
|
6
|
+
* A span whose own status/duration are both unremarkable — fast, 2xx — can still carry proof that the data inside it
|
|
7
|
+
* was wrong: code that verified "did I get back what I asked for" records that verdict as this event, independent of
|
|
8
|
+
* whether the span threw. See docs/APM_FINDINGS.md, incident F: a connection pooler in transaction-pooling mode can
|
|
9
|
+
* return another concurrent query's result instead of erroring or hanging — nothing about status or latency shows it.
|
|
10
|
+
*/
|
|
11
|
+
export const INTEGRITY_CHECK_EVENT = 'integrity_check';
|
|
12
|
+
/** Exported so agent tools (debug/queries.ts: getTrace) can show the same evidence the detector acted on — an
|
|
13
|
+
* anomaly whose question names a trace id is only as trustworthy as the agent's own ability to go look at it. */
|
|
14
|
+
export function integrityFailureEvent(s) {
|
|
15
|
+
return s.events.find((e) => e.name === INTEGRITY_CHECK_EVENT && e.attributes.ok === false);
|
|
16
|
+
}
|
|
5
17
|
export class AnomalyDetector {
|
|
6
18
|
options;
|
|
7
19
|
now;
|
|
@@ -17,13 +29,17 @@ export class AnomalyDetector {
|
|
|
17
29
|
this.options = { ...DEFAULTS, ...rest };
|
|
18
30
|
this.now = now ?? Date.now;
|
|
19
31
|
}
|
|
20
|
-
/**
|
|
32
|
+
/**
|
|
33
|
+
* Feed spans as they are ingested. Kept beyond server-entry spans: any span carrying a failed `integrity_check`
|
|
34
|
+
* event, since that check naturally lives on the call that did the verifying (e.g. a `db.query` child span) —
|
|
35
|
+
* dropping non-server spans here would make the data_integrity rule below unable to ever see its own evidence.
|
|
36
|
+
*/
|
|
21
37
|
observe(spans) {
|
|
22
38
|
const atMs = this.now();
|
|
23
39
|
if (spans.length > 0)
|
|
24
40
|
this.lastSeenMs = atMs;
|
|
25
41
|
for (const span of spans)
|
|
26
|
-
if (isServerRequest(span))
|
|
42
|
+
if (isServerRequest(span) || integrityFailureEvent(span))
|
|
27
43
|
this.window.push({ atMs, span });
|
|
28
44
|
}
|
|
29
45
|
/** Evaluate the window now; returns new anomalies (respecting cooldowns). */
|
|
@@ -31,7 +47,10 @@ export class AnomalyDetector {
|
|
|
31
47
|
const now = this.now();
|
|
32
48
|
const o = this.options;
|
|
33
49
|
this.window = this.window.filter((w) => now - w.atMs <= Math.max(o.windowMs, o.operationWindowMs));
|
|
50
|
+
// `within` includes the non-server spans kept only for their integrity-check event (see `observe`); the
|
|
51
|
+
// rate-based rules must not see those, so they go through `serverWithin` instead.
|
|
34
52
|
const within = (ms) => this.window.filter((w) => now - w.atMs <= ms).map((w) => w.span);
|
|
53
|
+
const serverWithin = (ms) => within(ms).filter(isServerRequest);
|
|
35
54
|
const found = [];
|
|
36
55
|
const judge = (list, windowMs, subject) => {
|
|
37
56
|
if (list.length < o.minSamples)
|
|
@@ -47,16 +66,37 @@ export class AnomalyDetector {
|
|
|
47
66
|
found.push(this.anomaly('high_latency', slowRate, o.slowRate, list, now, slowRate >= 2 * o.slowRate, windowMs, subject));
|
|
48
67
|
}
|
|
49
68
|
};
|
|
50
|
-
judge(
|
|
69
|
+
judge(serverWithin(o.windowMs), o.windowMs);
|
|
51
70
|
// Per operation: on a realistic route mix one broken endpoint (30% errors) is only ~10% of all requests —
|
|
52
71
|
// below the app-wide threshold, yet clearly an incident.
|
|
53
72
|
const byOperation = new Map();
|
|
54
|
-
for (const s of
|
|
73
|
+
for (const s of serverWithin(o.operationWindowMs)) {
|
|
55
74
|
const key = `${s.service}\u0000${s.name}`;
|
|
56
75
|
byOperation.set(key, [...(byOperation.get(key) ?? []), s]);
|
|
57
76
|
}
|
|
58
77
|
for (const list of byOperation.values())
|
|
59
78
|
judge(list, o.operationWindowMs, { service: list[0].service, operation: list[0].name });
|
|
79
|
+
// Zero-tolerance, unlike the two rate-based rules above: a wrong-data response is never acceptable even once, so
|
|
80
|
+
// this does not wait for a share to cross a threshold (and does not need minSamples — one occurrence among two
|
|
81
|
+
// requests is already the whole story, not noise). Scans `within`, not `serverWithin`: the check naturally lives
|
|
82
|
+
// on the span that did the verifying (often a db.query child span, not the server entry span), so excluding
|
|
83
|
+
// non-server spans here would make this rule unable to ever see its own evidence.
|
|
84
|
+
const byOperationAny = new Map();
|
|
85
|
+
for (const s of within(o.operationWindowMs)) {
|
|
86
|
+
const key = `${s.service}\u0000${s.name}`;
|
|
87
|
+
byOperationAny.set(key, [...(byOperationAny.get(key) ?? []), s]);
|
|
88
|
+
}
|
|
89
|
+
const judgeIntegrity = (list, windowMs, subject) => {
|
|
90
|
+
const bad = list.filter((s) => integrityFailureEvent(s) !== undefined);
|
|
91
|
+
if (bad.length === 0)
|
|
92
|
+
return;
|
|
93
|
+
if (subject && found.some((a) => a.type === 'data_integrity' && a.scope === 'all'))
|
|
94
|
+
return;
|
|
95
|
+
found.push(this.integrityAnomaly(bad, now, windowMs, subject));
|
|
96
|
+
};
|
|
97
|
+
judgeIntegrity(within(o.windowMs), o.windowMs);
|
|
98
|
+
for (const list of byOperationAny.values())
|
|
99
|
+
judgeIntegrity(list, o.operationWindowMs, { service: list[0].service, operation: list[0].name });
|
|
60
100
|
if (this.lastSeenMs !== null && now - this.lastSeenMs > o.noTrafficMs) {
|
|
61
101
|
found.push(this.anomaly('no_traffic', Math.round((now - this.lastSeenMs) / 1000), o.noTrafficMs / 1000, [], now, true, o.windowMs));
|
|
62
102
|
}
|
|
@@ -122,6 +162,38 @@ export class AnomalyDetector {
|
|
|
122
162
|
operations,
|
|
123
163
|
};
|
|
124
164
|
}
|
|
165
|
+
/**
|
|
166
|
+
* `bad` are spans whose own status/duration passed every other rule and still carry proof they returned the wrong
|
|
167
|
+
* data (see `integrityFailureEvent`) — always `critical`, there is no "warning" tier for a response that lied.
|
|
168
|
+
*/
|
|
169
|
+
integrityAnomaly(bad, now, windowMs, subject) {
|
|
170
|
+
const byOperation = new Map();
|
|
171
|
+
for (const s of bad) {
|
|
172
|
+
const key = `${s.service}\u0000${s.name}`;
|
|
173
|
+
const entry = byOperation.get(key) ?? { service: s.service, operation: s.name, count: 0, errors: 0, slow: 0 };
|
|
174
|
+
entry.count++;
|
|
175
|
+
entry.errors++; // reuses `errors` as "failures" so existing operations-sorting/display code needs no new field
|
|
176
|
+
byOperation.set(key, entry);
|
|
177
|
+
}
|
|
178
|
+
const integrityFailures = bad.slice(0, 5).map((s) => {
|
|
179
|
+
const event = integrityFailureEvent(s);
|
|
180
|
+
return { service: s.service, operation: s.name, traceId: s.traceId, expected: event.attributes.expected, actual: event.attributes.actual };
|
|
181
|
+
});
|
|
182
|
+
return {
|
|
183
|
+
id: `data_integrity-${now}-${++this.seq}`,
|
|
184
|
+
type: 'data_integrity',
|
|
185
|
+
scope: subject ? 'operation' : 'all',
|
|
186
|
+
...(subject ? { subject } : {}),
|
|
187
|
+
severity: 'critical',
|
|
188
|
+
detectedAtMs: now,
|
|
189
|
+
value: bad.length,
|
|
190
|
+
threshold: 0,
|
|
191
|
+
sampleSize: bad.length,
|
|
192
|
+
windowMs,
|
|
193
|
+
operations: [...byOperation.values()].sort((a, b) => b.errors - a.errors).slice(0, 3),
|
|
194
|
+
integrityFailures,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
125
197
|
}
|
|
126
198
|
/** The question the agents get when an anomaly fires — carries the evidence so they know where to start. */
|
|
127
199
|
export function questionFor(anomaly) {
|
|
@@ -133,6 +205,11 @@ export function questionFor(anomaly) {
|
|
|
133
205
|
return `Anomaly detected: ${Math.round(anomaly.value * 100)}% of ${what} failed in the last ${seconds}s (${anomaly.sampleSize} requests). Most affected: ${ops}. Find the failing operation, the exact error and its source.`;
|
|
134
206
|
case 'high_latency':
|
|
135
207
|
return `Anomaly detected: ${Math.round(anomaly.value * 100)}% of ${what} were slower than threshold in the last ${seconds}s (${anomaly.sampleSize} requests). Most affected: ${ops}. Find what is slow and which deployment introduced it.`;
|
|
208
|
+
case 'data_integrity': {
|
|
209
|
+
const sample = anomaly.integrityFailures?.[0];
|
|
210
|
+
const evidence = sample ? ` Example: asked for ${JSON.stringify(sample.expected)}, got back ${JSON.stringify(sample.actual)} (trace ${sample.traceId}).` : '';
|
|
211
|
+
return `Anomaly detected: ${anomaly.sampleSize} response(s) to ${what} in the last ${seconds}s did not match what was requested — not an error, not slow, just wrong.${evidence} This is not a latency or error-rate problem: find what these requests share (same connection pool? same deployment?) and whether it is still happening.`;
|
|
212
|
+
}
|
|
136
213
|
case 'no_traffic':
|
|
137
214
|
return `Anomaly detected: no spans received for ${anomaly.value}s after traffic was flowing. Check which services went silent.`;
|
|
138
215
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/debug/detector.ts"],"names":[],"mappings":"AA+CA,MAAM,QAAQ,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAA;AAEvK,qHAAqH;AACrH,yDAAyD;AACzD,MAAM,eAAe,GAAG,CAAC,CAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAA;AAElE,MAAM,OAAO,eAAe;IACjB,OAAO,CAAwC;IACvC,GAAG,CAAc;IAC1B,MAAM,GAA6C,EAAE,CAAA;IACrD,UAAU,GAAkB,IAAI,CAAA;IACxC,4DAA4D;IAC3C,cAAc,GAAG,IAAI,GAAG,EAAkB,CAAA;IAC3D,sGAAsG;IAC9F,QAAQ,GAAc,EAAE,CAAA;IACxB,GAAG,GAAG,CAAC,CAAA;IAEf,YAAY,OAAO,GAAoB,EAAE;QACvC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,CAAA;QAChC,IAAI,CAAC,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAA;QACvC,IAAI,CAAC,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,CAAA;IAC5B,CAAC;IAED,uCAAuC;IACvC,OAAO,CAAC,KAAuB;QAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACvB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;QAC5C,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,IAAI,eAAe,CAAC,IAAI,CAAC;gBAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;IACvF,CAAC;IAED,6EAA6E;IAC7E,KAAK;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAA;QACtB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAA;QAClG,MAAM,MAAM,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QAC/F,MAAM,KAAK,GAAc,EAAE,CAAA;QAE3B,MAAM,KAAK,GAAG,CAAC,IAAsB,EAAE,QAAgB,EAAE,OAA4B,EAAE,EAAE;YACvF,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,UAAU;gBAAE,OAAM;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YAC/E,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAA;YACjF,iFAAiF;YACjF,MAAM,OAAO,GAAG,CAAC,IAAiB,EAAE,EAAE,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAA;YACzG,IAAI,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,iBAAiB,CAAC,EAAE,CAAC;gBAC3D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,IAAI,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;YACjI,CAAC;YACD,IAAI,QAAQ,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBACtD,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;YAC1H,CAAC;QACH,CAAC,CAAA;QACD,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAA;QACrC,0GAA0G;QAC1G,yDAAyD;QACzD,MAAM,WAAW,GAAG,IAAI,GAAG,EAA4B,CAAA;QACvD,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,EAAE,CAAC;YAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,IAAI,EAAE,CAAA;YACzC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC5D,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,MAAM,EAAE;YAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAA;QAEhI,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;YACtE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,WAAW,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAA;QACrI,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,UAAU,CAAC,CAAA;QAChF,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACxB,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,OAAO,CAAC,OAAO,SAAS,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;YAClG,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YACzC,IAAI,IAAI,KAAK,SAAS,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,CAAC,UAAU;gBAAE,OAAO,KAAK,CAAA;YACjE,IAAI,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAA;YAC1C,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;YACjC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACrB,OAAO,IAAI,CAAA;QACb,CAAC,CAAC,CAAA;IACJ,CAAC;IAED;;;;;OAKG;IACK,gBAAgB,CAAC,CAAU;QACjC,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY;YAAE,OAAO,KAAK,CAAA;QACzC,MAAM,EAAE,GAAG,CAAC,OAAe,EAAE,SAAiB,EAAE,EAAE,CAAC,GAAG,OAAO,SAAS,SAAS,EAAE,CAAA;QACjF,MAAM,MAAM,GAAG,CAAC,KAAuB,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAA;QAC/G,IAAI,CAAC,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACtB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,OAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;YACzG,OAAO,CAAC,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QAC1G,CAAC;QACD,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,OAAQ,CAAC,OAAO,EAAE,CAAC,CAAC,OAAQ,CAAC,SAAS,CAAC,CAAA;QACzD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC,CAAA;IACjG,CAAC;IAEO,OAAO,CAAC,IAAiB,EAAE,KAAa,EAAE,SAAiB,EAAE,QAA0B,EAAE,GAAW,EAAE,QAAiB,EAAE,QAAgB,EAAE,OAA4B;QAC7K,MAAM,WAAW,GAAG,IAAI,GAAG,EAAyC,CAAA;QACpE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,OAAO,SAAS,CAAC,CAAC,IAAI,EAAE,CAAA;YACzC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAA;YAC7G,KAAK,CAAC,KAAK,EAAE,CAAA;YACb,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO;gBAAE,KAAK,CAAC,MAAM,EAAE,CAAA;YACxC,IAAI,CAAC,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,EAAE,CAAA;YACpD,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;QAC7B,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,CAAgC,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;QACtG,MAAM,UAAU,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;aACzC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,KAAK,YAAY,IAAI,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;aACtD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;aACvC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QACd,OAAO;YACL,EAAE,EAAE,GAAG,IAAI,IAAI,GAAG,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE;YAClC,IAAI;YACJ,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK;YACpC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;YAC3C,YAAY,EAAE,GAAG;YACjB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,GAAG,IAAI;YACtC,SAAS;YACT,UAAU,EAAE,QAAQ,CAAC,MAAM;YAC3B,QAAQ;YACR,UAAU;SACX,CAAA;IACH,CAAC;CACF;AAED,4GAA4G;AAC5G,MAAM,UAAU,WAAW,CAAC,OAAgB;IAC1C,MAAM,GAAG,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,SAAS,KAAK,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,MAAM,YAAY,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACvI,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAA;IACnD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,iBAAiB,CAAA;IAC1F,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,iBAAiB;YACpB,OAAO,qBAAqB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,QAAQ,IAAI,uBAAuB,OAAO,MAAM,OAAO,CAAC,UAAU,8BAA8B,GAAG,+DAA+D,CAAA;QAC/N,KAAK,cAAc;YACjB,OAAO,qBAAqB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,CAAC,QAAQ,IAAI,2CAA2C,OAAO,MAAM,OAAO,CAAC,UAAU,8BAA8B,GAAG,yDAAyD,CAAA;QAC7O,KAAK,YAAY;YACf,OAAO,2CAA2C,OAAO,CAAC,KAAK,gEAAgE,CAAA;IACnI,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"detector.js","sourceRoot":"","sources":["../../src/debug/detector.ts"],"names":[],"mappings":"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"}
|
package/dist/debug/queries.d.ts
CHANGED
|
@@ -19,6 +19,12 @@ export interface TraceRow {
|
|
|
19
19
|
/** Self time of hidden Next.js internal spans under this one (routing, rendering, dev compilation) — not user code. */
|
|
20
20
|
nextInternalMs?: number;
|
|
21
21
|
error?: string;
|
|
22
|
+
/** A verified wrong-data response (incident F) — distinct from `error`: status was fine, duration was fine, the
|
|
23
|
+
* data inside was not what was asked for. Only an app that instruments its own identity check can ever report this. */
|
|
24
|
+
integrityCheck?: {
|
|
25
|
+
expected: unknown;
|
|
26
|
+
actual: unknown;
|
|
27
|
+
};
|
|
22
28
|
attributes?: Record<string, unknown>;
|
|
23
29
|
}
|
|
24
30
|
export declare function createAgentQueries(storage: StorageAdapter, options?: QueryOptions): {
|
package/dist/debug/queries.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// Rules for every tool: compact, token-cheap output (aggregates, not raw spans), rounded numbers, and a `note`
|
|
4
4
|
// instead of an empty result when a name filter matches nothing (users say "checkout", spans say "chargePayment").
|
|
5
5
|
import { isFrameworkSpan } from '../collector/framework.js';
|
|
6
|
+
import { integrityFailureEvent } from './detector.js';
|
|
6
7
|
import { errorRateChangeIsSignificant } from './stats.js';
|
|
7
8
|
const round = (n) => Math.round(n * 10) / 10;
|
|
8
9
|
const ago = (now, ms) => Math.max(0, Math.round((now - ms) / 1000));
|
|
@@ -280,6 +281,7 @@ export function createAgentQueries(storage, options = {}) {
|
|
|
280
281
|
for (const s of kids) {
|
|
281
282
|
const internalMs = nextInternalMs.get(s.spanId);
|
|
282
283
|
const attributes = Object.fromEntries(KEY_ATTRIBUTES.filter((k) => s.attributes[k] !== undefined).map((k) => [k, s.attributes[k]]));
|
|
284
|
+
const integrityEvent = integrityFailureEvent(s);
|
|
283
285
|
rows.push({
|
|
284
286
|
depth,
|
|
285
287
|
name: s.name,
|
|
@@ -289,6 +291,9 @@ export function createAgentQueries(storage, options = {}) {
|
|
|
289
291
|
...(storage.isColdStart(s) ? { coldStart: true } : {}),
|
|
290
292
|
...(internalMs ? { nextInternalMs: round(internalMs) } : {}),
|
|
291
293
|
...(s.status === 'error' ? { error: exceptionMessage(s) ?? 'error' } : {}),
|
|
294
|
+
// Checked independent of `status`: incident F's whole point is that this fires on spans that are
|
|
295
|
+
// otherwise fine — fast, no error — so it is never conditioned on one already being set above.
|
|
296
|
+
...(integrityEvent ? { integrityCheck: { expected: integrityEvent.attributes.expected, actual: integrityEvent.attributes.actual } } : {}),
|
|
292
297
|
...(Object.keys(attributes).length ? { attributes } : {}),
|
|
293
298
|
});
|
|
294
299
|
visit(s.spanId, s.name, depth + 1);
|