@senpi/runtime 3.0.6-dev.runtime-phase-2.20260630134451 → 3.0.6-dev.runtime-phase-2.20260630134536
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/dist/actions/action-events.d.ts.map +1 -1
- package/dist/actions/action-events.js +39 -5
- package/dist/actions/action-events.js.map +1 -1
- package/dist/actions/event-derivation.d.ts +2 -0
- package/dist/actions/event-derivation.d.ts.map +1 -1
- package/dist/actions/event-derivation.js +2 -0
- package/dist/actions/event-derivation.js.map +1 -1
- package/dist/cli/guide-commands.d.ts.map +1 -1
- package/dist/cli/guide-commands.js +61 -0
- package/dist/cli/guide-commands.js.map +1 -1
- package/dist/cli/senpi-commands.d.ts +14 -0
- package/dist/cli/senpi-commands.d.ts.map +1 -1
- package/dist/cli/senpi-commands.js +386 -2
- package/dist/cli/senpi-commands.js.map +1 -1
- package/dist/dsl/events/initial-state.d.ts.map +1 -1
- package/dist/dsl/events/initial-state.js +1 -0
- package/dist/dsl/events/initial-state.js.map +1 -1
- package/dist/dsl/monitor/dsl-failure-events.d.ts +42 -0
- package/dist/dsl/monitor/dsl-failure-events.d.ts.map +1 -0
- package/dist/dsl/monitor/dsl-failure-events.js +73 -0
- package/dist/dsl/monitor/dsl-failure-events.js.map +1 -0
- package/dist/dsl/monitor/process-one-position.d.ts.map +1 -1
- package/dist/dsl/monitor/process-one-position.js +46 -37
- package/dist/dsl/monitor/process-one-position.js.map +1 -1
- package/dist/dsl/plugin/index.d.ts.map +1 -1
- package/dist/dsl/plugin/index.js +6 -0
- package/dist/dsl/plugin/index.js.map +1 -1
- package/dist/health/types.d.ts +14 -0
- package/dist/health/types.d.ts.map +1 -1
- package/dist/health/types.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +220 -7
- package/dist/index.js.map +1 -1
- package/dist/risk/risk-audit-log.d.ts +7 -0
- package/dist/risk/risk-audit-log.d.ts.map +1 -1
- package/dist/risk/risk-audit-log.js +48 -1
- package/dist/risk/risk-audit-log.js.map +1 -1
- package/dist/runtime/lifecycle-events.d.ts +43 -0
- package/dist/runtime/lifecycle-events.d.ts.map +1 -1
- package/dist/runtime/lifecycle-events.js +61 -0
- package/dist/runtime/lifecycle-events.js.map +1 -1
- package/dist/runtime/runtime-schema.d.ts +63 -9
- package/dist/runtime/runtime-schema.d.ts.map +1 -1
- package/dist/runtime/runtime-schema.js +8 -1
- package/dist/runtime/runtime-schema.js.map +1 -1
- package/dist/runtime/runtime.d.ts +8 -0
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +104 -5
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/supervisor/long-running-supervisor.d.ts +3 -0
- package/dist/runtime/supervisor/long-running-supervisor.d.ts.map +1 -1
- package/dist/runtime/supervisor/long-running-supervisor.js +27 -53
- package/dist/runtime/supervisor/long-running-supervisor.js.map +1 -1
- package/dist/runtime-api/intake/intake-events.d.ts +44 -0
- package/dist/runtime-api/intake/intake-events.d.ts.map +1 -0
- package/dist/runtime-api/intake/intake-events.js +131 -0
- package/dist/runtime-api/intake/intake-events.js.map +1 -0
- package/dist/runtime-api/intake/scanner-launcher.d.ts +2 -0
- package/dist/runtime-api/intake/scanner-launcher.d.ts.map +1 -1
- package/dist/runtime-api/intake/scanner-launcher.js +58 -15
- package/dist/runtime-api/intake/scanner-launcher.js.map +1 -1
- package/dist/runtime-api/intake/scanner-registry.d.ts +3 -0
- package/dist/runtime-api/intake/scanner-registry.d.ts.map +1 -1
- package/dist/runtime-api/intake/scanner-registry.js +3 -0
- package/dist/runtime-api/intake/scanner-registry.js.map +1 -1
- package/dist/runtime-api/intake/supervisor-events.d.ts +61 -0
- package/dist/runtime-api/intake/supervisor-events.d.ts.map +1 -0
- package/dist/runtime-api/intake/supervisor-events.js +173 -0
- package/dist/runtime-api/intake/supervisor-events.js.map +1 -0
- package/dist/runtime-api/routes/signals.d.ts.map +1 -1
- package/dist/runtime-api/routes/signals.js +119 -27
- package/dist/runtime-api/routes/signals.js.map +1 -1
- package/dist/runtime-api/server.d.ts.map +1 -1
- package/dist/runtime-api/server.js +10 -1
- package/dist/runtime-api/server.js.map +1 -1
- package/dist/scanners/engine/engine.d.ts.map +1 -1
- package/dist/scanners/engine/engine.js +3 -0
- package/dist/scanners/engine/engine.js.map +1 -1
- package/dist/scanners/runtime-module.d.ts.map +1 -1
- package/dist/scanners/runtime-module.js +6 -0
- package/dist/scanners/runtime-module.js.map +1 -1
- package/dist/senpi/client.d.ts.map +1 -1
- package/dist/senpi/client.js +50 -5
- package/dist/senpi/client.js.map +1 -1
- package/dist/state/state-events.d.ts +13 -0
- package/dist/state/state-events.d.ts.map +1 -0
- package/dist/state/state-events.js +22 -0
- package/dist/state/state-events.js.map +1 -0
- package/dist/state/state-manager.d.ts.map +1 -1
- package/dist/state/state-manager.js +14 -1
- package/dist/state/state-manager.js.map +1 -1
- package/dist/telemetry/event-builders.d.ts +0 -2
- package/dist/telemetry/event-builders.d.ts.map +1 -1
- package/dist/telemetry/event-builders.js.map +1 -1
- package/dist/telemetry/event-store.d.ts +66 -0
- package/dist/telemetry/event-store.d.ts.map +1 -0
- package/dist/telemetry/event-store.js +202 -0
- package/dist/telemetry/event-store.js.map +1 -0
- package/dist/telemetry/identity.d.ts +10 -0
- package/dist/telemetry/identity.d.ts.map +1 -1
- package/dist/telemetry/identity.js +1 -0
- package/dist/telemetry/identity.js.map +1 -1
- package/dist/telemetry/metrics.d.ts +137 -15
- package/dist/telemetry/metrics.d.ts.map +1 -1
- package/dist/telemetry/metrics.js +357 -74
- package/dist/telemetry/metrics.js.map +1 -1
- package/dist/telemetry/otel-sdk.d.ts +1 -1
- package/dist/telemetry/otel-sdk.js +1 -1
- package/dist/telemetry/spans/gen-ai.d.ts +4 -0
- package/dist/telemetry/spans/gen-ai.d.ts.map +1 -1
- package/dist/telemetry/spans/gen-ai.js +9 -0
- package/dist/telemetry/spans/gen-ai.js.map +1 -1
- package/dist/telemetry/spans/redact-pii.d.ts.map +1 -1
- package/dist/telemetry/spans/redact-pii.js +4 -1
- package/dist/telemetry/spans/redact-pii.js.map +1 -1
- package/dist/telemetry/spans/span-hooks.d.ts +7 -0
- package/dist/telemetry/spans/span-hooks.d.ts.map +1 -1
- package/dist/telemetry/spans/span-hooks.js +179 -24
- package/dist/telemetry/spans/span-hooks.js.map +1 -1
- package/dist/telemetry/tool-plane.d.ts +31 -0
- package/dist/telemetry/tool-plane.d.ts.map +1 -0
- package/dist/telemetry/tool-plane.js +70 -0
- package/dist/telemetry/tool-plane.js.map +1 -0
- package/dist/telemetry/trace-identity.d.ts.map +1 -1
- package/dist/telemetry/trace-identity.js +3 -0
- package/dist/telemetry/trace-identity.js.map +1 -1
- package/dist/types/dsl/index.d.ts +6 -0
- package/dist/types/dsl/index.d.ts.map +1 -1
- package/dist/utils/event-catalog.d.ts +237 -0
- package/dist/utils/event-catalog.d.ts.map +1 -1
- package/dist/utils/event-catalog.js +51 -0
- package/dist/utils/event-catalog.js.map +1 -1
- package/dist/utils/logger.d.ts +5 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +24 -22
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/wallet-address.d.ts +3 -0
- package/dist/utils/wallet-address.d.ts.map +1 -0
- package/dist/utils/wallet-address.js +17 -0
- package/dist/utils/wallet-address.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The supervised-scanner substrate's telemetry bridge: it translates the vendor-neutral
|
|
3
|
+
* `LongRunningSupervisor "event"` channel into our catalog events and health metrics, the only
|
|
4
|
+
* catalog/metric-aware seam (the supervisor stays vendor-neutral). {@link buildScannerLifecycleEvent}
|
|
5
|
+
* maps the channel into the `scanner.*` catalog family so the boundary — child spawn/exit/crash-loop/
|
|
6
|
+
* silence-kill — is observable (graceful `stopped` is intentionally not catalogued; it is covered by
|
|
7
|
+
* `runtime.stopped`). {@link buildScannerLaunchFailedEvent} covers the launcher-side failures that
|
|
8
|
+
* never reach the supervisor's channel: a scanner that fails to wire up at all, or fails to re-mint
|
|
9
|
+
* its id on relaunch. {@link recordScannerLifecycleMetrics} is the metric side — the restart counter
|
|
10
|
+
* and degraded gauge that page an operator without a trace or log scan.
|
|
11
|
+
*
|
|
12
|
+
* The builders are pure `(input) => EmittableEvent | null`; the launcher emits the result through
|
|
13
|
+
* `emitEvent`'s guard, so a throwing build or a telemetry failure can never disturb the supervisor's
|
|
14
|
+
* run loop or the wiring. The metric recorder is a guarded side-effect (the instruments swallow throws).
|
|
15
|
+
*/
|
|
16
|
+
import { EVENT_NAME, eventAttrs } from "../../utils/event-catalog.js";
|
|
17
|
+
import { recordScannerRestart, recordScannerDegradedDelta } from "../../telemetry/metrics.js";
|
|
18
|
+
/** The id/name/supervisor/wallet attributes every lifecycle event carries. */
|
|
19
|
+
function baseAttrs(ctx) {
|
|
20
|
+
return {
|
|
21
|
+
"senpi.scanner.id": ctx.scannerId,
|
|
22
|
+
"senpi.scanner.name": ctx.scannerName,
|
|
23
|
+
"senpi.supervisor.id": ctx.supervisorId,
|
|
24
|
+
// Addresses are case-insensitive; lowercase to match the identity join key.
|
|
25
|
+
"senpi.strategy.address": ctx.wallet ? ctx.wallet.toLowerCase() : undefined,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Map one supervisor lifecycle event to its event-log record, or `null` for `stopped` (not
|
|
30
|
+
* catalogued). The switch is exhaustive over {@link LongRunningEvent}: a new transition added to the
|
|
31
|
+
* union without a case here is a compile error.
|
|
32
|
+
*/
|
|
33
|
+
export function buildScannerLifecycleEvent(event, ctx) {
|
|
34
|
+
const base = baseAttrs(ctx);
|
|
35
|
+
const { scannerName } = ctx;
|
|
36
|
+
switch (event.type) {
|
|
37
|
+
case "spawned":
|
|
38
|
+
return {
|
|
39
|
+
name: EVENT_NAME.scannerSpawned,
|
|
40
|
+
level: "info",
|
|
41
|
+
body: `Scanner ${scannerName} spawned (pid ${event.pid}, attempt ${event.attempt})`,
|
|
42
|
+
attributes: eventAttrs({
|
|
43
|
+
...base,
|
|
44
|
+
"senpi.supervisor.run_id": event.runId,
|
|
45
|
+
"senpi.scanner.pid": event.pid,
|
|
46
|
+
"senpi.scanner.attempt": event.attempt,
|
|
47
|
+
}),
|
|
48
|
+
};
|
|
49
|
+
case "exited": {
|
|
50
|
+
// A child that never ran (spawn throw / ENOENT) carries the exception — surface it as a warn
|
|
51
|
+
// exit with the stack on the event, rather than a plain info exit.
|
|
52
|
+
const failed = event.error !== undefined;
|
|
53
|
+
const exitDesc = event.exitCode !== null ? `code ${event.exitCode}` : `signal ${event.signal ?? "unknown"}`;
|
|
54
|
+
return {
|
|
55
|
+
name: EVENT_NAME.scannerExited,
|
|
56
|
+
level: failed ? "warn" : "info",
|
|
57
|
+
body: failed
|
|
58
|
+
? `Scanner ${scannerName} failed to start`
|
|
59
|
+
: `Scanner ${scannerName} exited (${exitDesc}) after ${event.durationMs}ms`,
|
|
60
|
+
attributes: eventAttrs({
|
|
61
|
+
...base,
|
|
62
|
+
"senpi.supervisor.run_id": event.runId,
|
|
63
|
+
"senpi.scanner.pid": event.pid,
|
|
64
|
+
"senpi.scanner.exit_code": event.exitCode ?? undefined,
|
|
65
|
+
"senpi.scanner.signal": event.signal,
|
|
66
|
+
"senpi.scanner.duration_ms": event.durationMs,
|
|
67
|
+
}),
|
|
68
|
+
...(failed ? { error: event.error } : {}),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
case "restarting":
|
|
72
|
+
return {
|
|
73
|
+
name: EVENT_NAME.scannerRestarted,
|
|
74
|
+
level: "info",
|
|
75
|
+
body: `Scanner ${scannerName} restarting in ${event.backoffMs}ms (attempt ${event.attempt})`,
|
|
76
|
+
attributes: eventAttrs({
|
|
77
|
+
...base,
|
|
78
|
+
"senpi.supervisor.run_id": event.runId,
|
|
79
|
+
"senpi.scanner.backoff_ms": event.backoffMs,
|
|
80
|
+
"senpi.scanner.attempt": event.attempt,
|
|
81
|
+
}),
|
|
82
|
+
};
|
|
83
|
+
case "degraded":
|
|
84
|
+
return {
|
|
85
|
+
name: EVENT_NAME.scannerDegraded,
|
|
86
|
+
level: "warn",
|
|
87
|
+
body: `Scanner ${scannerName} degraded — ${event.reason}`,
|
|
88
|
+
attributes: eventAttrs({
|
|
89
|
+
...base,
|
|
90
|
+
"senpi.scanner.rapid_failures": event.rapidFailures,
|
|
91
|
+
}),
|
|
92
|
+
};
|
|
93
|
+
case "recovered":
|
|
94
|
+
return {
|
|
95
|
+
name: EVENT_NAME.scannerRecovered,
|
|
96
|
+
level: "info",
|
|
97
|
+
body: `Scanner ${scannerName} recovered to healthy`,
|
|
98
|
+
attributes: eventAttrs({ ...base }),
|
|
99
|
+
};
|
|
100
|
+
case "silence-killed":
|
|
101
|
+
return {
|
|
102
|
+
name: EVENT_NAME.scannerSilenceKilled,
|
|
103
|
+
level: "warn",
|
|
104
|
+
body: `Scanner ${scannerName} silent for ${event.silenceMs}ms — killed (pid ${event.pid})`,
|
|
105
|
+
attributes: eventAttrs({
|
|
106
|
+
...base,
|
|
107
|
+
"senpi.supervisor.run_id": event.runId,
|
|
108
|
+
"senpi.scanner.pid": event.pid,
|
|
109
|
+
"senpi.scanner.silence_ms": event.silenceMs,
|
|
110
|
+
}),
|
|
111
|
+
};
|
|
112
|
+
case "swept-orphan":
|
|
113
|
+
return {
|
|
114
|
+
name: EVENT_NAME.scannerOrphanSwept,
|
|
115
|
+
level: "info",
|
|
116
|
+
body: `Swept orphaned scanner process (pid ${event.pid})`,
|
|
117
|
+
attributes: eventAttrs({
|
|
118
|
+
...base,
|
|
119
|
+
"senpi.scanner.pid": event.pid,
|
|
120
|
+
}),
|
|
121
|
+
};
|
|
122
|
+
case "stopped":
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Record the metric side of a lifecycle event: the `scanner.restarts` counter on each restart, and
|
|
128
|
+
* the `scanner.degraded` up/down gauge across the crash-loop edge (+1 on `degraded`, −1 on
|
|
129
|
+
* `recovered`). A teardown while degraded never emits `recovered`, so `stopped` carries `wasDegraded`
|
|
130
|
+
* and balances the gauge with its own −1 — otherwise a partial teardown (hot-uninstall, single-scanner
|
|
131
|
+
* stop) would leak a permanent +1 for that name+wallet. Dimensioned by the stable scanner name +
|
|
132
|
+
* wallet, not the ephemeral id. Other transitions carry no metric.
|
|
133
|
+
*/
|
|
134
|
+
export function recordScannerLifecycleMetrics(event, ctx) {
|
|
135
|
+
const dims = {
|
|
136
|
+
scannerName: ctx.scannerName,
|
|
137
|
+
strategyAddress: ctx.wallet ? ctx.wallet.toLowerCase() : undefined,
|
|
138
|
+
};
|
|
139
|
+
switch (event.type) {
|
|
140
|
+
case "restarting":
|
|
141
|
+
recordScannerRestart(dims);
|
|
142
|
+
break;
|
|
143
|
+
case "degraded":
|
|
144
|
+
recordScannerDegradedDelta(1, dims);
|
|
145
|
+
break;
|
|
146
|
+
case "recovered":
|
|
147
|
+
recordScannerDegradedDelta(-1, dims);
|
|
148
|
+
break;
|
|
149
|
+
case "stopped":
|
|
150
|
+
// Balance the gauge on a teardown that happened while degraded (no `recovered` was emitted).
|
|
151
|
+
if (event.wasDegraded)
|
|
152
|
+
recordScannerDegradedDelta(-1, dims);
|
|
153
|
+
break;
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/** Build the `scanner.launch_failed` event (warn) for a launch/remint failure, with the exception attached. */
|
|
157
|
+
export function buildScannerLaunchFailedEvent(failure) {
|
|
158
|
+
const verb = failure.phase === "remint" ? "failed to re-mint on relaunch" : "failed to wire up";
|
|
159
|
+
return {
|
|
160
|
+
name: EVENT_NAME.scannerLaunchFailed,
|
|
161
|
+
level: "warn",
|
|
162
|
+
body: `Scanner ${failure.scannerName} ${verb}`,
|
|
163
|
+
attributes: eventAttrs({
|
|
164
|
+
"senpi.scanner.name": failure.scannerName,
|
|
165
|
+
"senpi.scanner.launch_phase": failure.phase,
|
|
166
|
+
"senpi.strategy.address": failure.wallet ? failure.wallet.toLowerCase() : undefined,
|
|
167
|
+
"senpi.scanner.id": failure.scannerId,
|
|
168
|
+
"senpi.supervisor.id": failure.supervisorId,
|
|
169
|
+
}),
|
|
170
|
+
error: failure.error,
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
//# sourceMappingURL=supervisor-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supervisor-events.js","sourceRoot":"","sources":["../../../src/runtime-api/intake/supervisor-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../../src/runtime-api/routes/signals.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../../../src/runtime-api/routes/signals.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAO7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,EAAc,KAAK,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAahE,MAAM,WAAW,wBAAwB;IACvC,QAAQ,EAAE,eAAe,CAAC;IAC1B,MAAM,EAAE,gBAAgB,CAAC;IACzB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,MAAM,CAAC;IACjC,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7E,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACtE;;;;OAIG;IACH,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,wFAAwF;IACxF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,wBAAwB,GAC7B,IAAI,CAmON"}
|
|
@@ -2,11 +2,15 @@
|
|
|
2
2
|
* Fastify route wiring for the supervised intake /signals and /errors routes.
|
|
3
3
|
* The route IS mounted via createApi when intakeContext is present.
|
|
4
4
|
*/
|
|
5
|
+
import { trace } from "@opentelemetry/api";
|
|
5
6
|
import { Value } from "@sinclair/typebox/value";
|
|
6
7
|
import { SignalsBodySchema, ErrorsBodySchema } from "./signals.schema.js";
|
|
7
8
|
import { processSignalPost } from "../intake/process-signal-post.js";
|
|
8
9
|
import { processErrorPost } from "../intake/process-error-post.js";
|
|
9
10
|
import { noopLogger } from "../../utils/logger.js";
|
|
11
|
+
import { emitEvent } from "../../actions/event-derivation.js";
|
|
12
|
+
import { recordSignalIntake } from "../../telemetry/metrics.js";
|
|
13
|
+
import { buildSignalDispositionEvent, buildSignalRejectedEvent, buildScaffoldErrorEvent, } from "../intake/intake-events.js";
|
|
10
14
|
/**
|
|
11
15
|
* Register the supervised intake /signals and /errors routes.
|
|
12
16
|
*/
|
|
@@ -21,6 +25,46 @@ export function registerSignalsRoute(fastify, opts) {
|
|
|
21
25
|
const onError = opts.onError ?? (() => { });
|
|
22
26
|
const maxItems = opts.maxItemsPerSignalsRequest;
|
|
23
27
|
const logger = opts.logger ?? noopLogger;
|
|
28
|
+
// Enrich the inbound HTTP server span (created by `http` auto-instrumentation) with the intake
|
|
29
|
+
// disposition. A rejected/expired/superseded signal returns a structured 2xx/4xx that auto-instr
|
|
30
|
+
// can't flag as notable, so without this the span is silent on what the boundary decided. Guarded:
|
|
31
|
+
// span enrichment must never break request handling. No new span is created.
|
|
32
|
+
const enrichIntakeSpan = (attrs) => {
|
|
33
|
+
// Metric plane: count the disposition at request grain, riding the same disposition the span
|
|
34
|
+
// enrichment carries (a heterogeneous batch counts once as `mixed`). Per-signal granularity lives
|
|
35
|
+
// on the `signal.*` event log; this counter is the alertable per-request trend.
|
|
36
|
+
const disposition = attrs["senpi.intake.disposition"];
|
|
37
|
+
if (disposition !== undefined) {
|
|
38
|
+
// Dimension by the stable registry name, not the ephemeral reminted id on the span — a
|
|
39
|
+
// crash-looping scanner rotates its id every relaunch and would explode counter cardinality.
|
|
40
|
+
recordSignalIntake({
|
|
41
|
+
scannerName: registry.resolve(attrs["senpi.scanner.id"] ?? "")?.scannerName ?? "unknown",
|
|
42
|
+
disposition,
|
|
43
|
+
reasonCode: attrs["senpi.intake.reason_code"],
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
try {
|
|
47
|
+
const span = trace.getActiveSpan();
|
|
48
|
+
if (!span)
|
|
49
|
+
return;
|
|
50
|
+
const defined = {};
|
|
51
|
+
for (const [k, v] of Object.entries(attrs))
|
|
52
|
+
if (v !== undefined)
|
|
53
|
+
defined[k] = v;
|
|
54
|
+
span.setAttributes(defined);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
/* never break request handling */
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
// Best-effort scanner context from an unvalidated body: the envelope schema failed, but a usable
|
|
61
|
+
// scanner_id may still let the reject be grouped by scanner.
|
|
62
|
+
const bestEffortCtx = (body) => {
|
|
63
|
+
const id = body?.scanner_id;
|
|
64
|
+
const scannerId = typeof id === "string" && id ? id : "unknown";
|
|
65
|
+
const resolved = registry.resolve(scannerId);
|
|
66
|
+
return { scannerId, scannerName: resolved?.scannerName, wallet: resolved?.wallet };
|
|
67
|
+
};
|
|
24
68
|
// POST /signals
|
|
25
69
|
fastify.post("/signals", async (request, reply) => {
|
|
26
70
|
if (!Value.Check(SignalsBodySchema, request.body)) {
|
|
@@ -32,17 +76,36 @@ export function registerSignalsRoute(fastify, opts) {
|
|
|
32
76
|
.slice(0, 10)
|
|
33
77
|
.map((e) => `path=${e.path} msg=${e.message} got=${JSON.stringify(e.value)?.slice(0, 120)}`);
|
|
34
78
|
logger.warn(`[intake] INVALID_SHAPE scanner_id=${String(body?.scanner_id ?? "?")} errors=${JSON.stringify(errors)}`);
|
|
79
|
+
const ctx = bestEffortCtx(request.body);
|
|
80
|
+
emitEvent(logger, () => buildSignalRejectedEvent("invalid_shape", ctx));
|
|
81
|
+
enrichIntakeSpan({
|
|
82
|
+
"senpi.scanner.id": ctx.scannerId,
|
|
83
|
+
"senpi.intake.disposition": "rejected",
|
|
84
|
+
"senpi.intake.reason_code": "invalid_shape",
|
|
85
|
+
});
|
|
35
86
|
return reply.status(400).send({
|
|
36
87
|
success: false,
|
|
37
88
|
error: { code: "INVALID_SHAPE", message: "Invalid request body" },
|
|
38
89
|
});
|
|
39
90
|
}
|
|
40
91
|
const body = request.body;
|
|
92
|
+
// Resolve the scanner once so every disposition event carries its name + wallet.
|
|
93
|
+
const resolved = registry.resolve(body.scanner_id);
|
|
94
|
+
const ctx = {
|
|
95
|
+
scannerId: body.scanner_id,
|
|
96
|
+
scannerName: resolved?.scannerName,
|
|
97
|
+
wallet: resolved?.wallet,
|
|
98
|
+
};
|
|
41
99
|
// Enforce the configured per-request item cap before any work — matches the
|
|
42
|
-
// legacy address-routed route's 400 / INVALID_REQUEST. Checked before
|
|
43
|
-
//
|
|
100
|
+
// legacy address-routed route's 400 / INVALID_REQUEST. Checked before the
|
|
101
|
+
// per-signal pipeline so an oversized batch is one request-level reject.
|
|
44
102
|
if (maxItems !== undefined && body.signals.length > maxItems) {
|
|
45
|
-
logger
|
|
103
|
+
emitEvent(logger, () => buildSignalRejectedEvent("max_items_exceeded", ctx));
|
|
104
|
+
enrichIntakeSpan({
|
|
105
|
+
"senpi.scanner.id": ctx.scannerId,
|
|
106
|
+
"senpi.intake.disposition": "rejected",
|
|
107
|
+
"senpi.intake.reason_code": "max_items_exceeded",
|
|
108
|
+
});
|
|
46
109
|
return reply.status(400).send({
|
|
47
110
|
success: false,
|
|
48
111
|
error: {
|
|
@@ -51,9 +114,6 @@ export function registerSignalsRoute(fastify, opts) {
|
|
|
51
114
|
},
|
|
52
115
|
});
|
|
53
116
|
}
|
|
54
|
-
// Resolve scannerName once for use in log lines.
|
|
55
|
-
const resolved = registry.resolve(body.scanner_id);
|
|
56
|
-
const scannerName = resolved?.scannerName ?? "";
|
|
57
117
|
const result = await processSignalPost(body, {
|
|
58
118
|
registry,
|
|
59
119
|
record,
|
|
@@ -63,41 +123,47 @@ export function registerSignalsRoute(fastify, opts) {
|
|
|
63
123
|
onAccepted,
|
|
64
124
|
});
|
|
65
125
|
if (!result.ok) {
|
|
66
|
-
|
|
126
|
+
// The sole POST-level reject from processSignalPost is an unknown scanner_id (an oversized
|
|
127
|
+
// batch already returned above). Emit it as a coded request-level signal.rejected.
|
|
128
|
+
emitEvent(logger, () => buildSignalRejectedEvent("unknown_scanner", ctx));
|
|
129
|
+
enrichIntakeSpan({
|
|
130
|
+
"senpi.scanner.id": ctx.scannerId,
|
|
131
|
+
"senpi.intake.disposition": "rejected",
|
|
132
|
+
"senpi.intake.reason_code": "unknown_scanner",
|
|
133
|
+
});
|
|
67
134
|
return reply.status(404).send({
|
|
68
135
|
success: false,
|
|
69
136
|
error: { code: result.reason, message: result.reason },
|
|
70
137
|
});
|
|
71
138
|
}
|
|
72
|
-
// Empty signals list — no-op
|
|
73
|
-
//
|
|
139
|
+
// Empty signals list — a no-op liveness ping (a watch-only scanner POSTs empty
|
|
140
|
+
// every tick), not a catalogued disposition. Log at debug so it doesn't drown
|
|
141
|
+
// the real per-signal outcome events emitted below.
|
|
74
142
|
if (result.signals.length === 0) {
|
|
75
143
|
logger.debug(`[intake] no-op scanner_id=${body.scanner_id}`);
|
|
144
|
+
enrichIntakeSpan({ "senpi.scanner.id": ctx.scannerId, "senpi.intake.disposition": "noop" });
|
|
76
145
|
return reply.send({
|
|
77
146
|
success: true,
|
|
78
147
|
data: { signals: result.signals },
|
|
79
148
|
});
|
|
80
149
|
}
|
|
81
|
-
//
|
|
150
|
+
// One signal.* event per disposition — the pre-decision acceptance fact at the boundary.
|
|
82
151
|
for (let i = 0; i < result.signals.length; i++) {
|
|
83
152
|
const status = result.signals[i];
|
|
84
|
-
const
|
|
85
|
-
|
|
86
|
-
switch (status.status) {
|
|
87
|
-
case "accepted":
|
|
88
|
-
logger.info(`[intake] accepted asset=${asset} scanner=${scannerName} correlationId=${status.correlationId} scanner_id=${body.scanner_id}`);
|
|
89
|
-
break;
|
|
90
|
-
case "rejected":
|
|
91
|
-
logger.info(`[intake] rejected asset=${asset} scanner_id=${body.scanner_id} reason=${status.reason}`);
|
|
92
|
-
break;
|
|
93
|
-
case "expired":
|
|
94
|
-
logger.info(`[intake] expired asset=${asset} scanner_id=${body.scanner_id}`);
|
|
95
|
-
break;
|
|
96
|
-
case "superseded":
|
|
97
|
-
logger.info(`[intake] superseded asset=${asset} scanner_id=${body.scanner_id}`);
|
|
98
|
-
break;
|
|
99
|
-
}
|
|
153
|
+
const asset = body.signals[i]?.asset ?? "unknown";
|
|
154
|
+
emitEvent(logger, () => buildSignalDispositionEvent(status, asset, ctx));
|
|
100
155
|
}
|
|
156
|
+
// Summarize the batch onto the server span (signal-bearing POSTs are effectively single-signal):
|
|
157
|
+
// the disposition, plus the minted correlation id when exactly one was accepted.
|
|
158
|
+
const statuses = result.signals;
|
|
159
|
+
const acceptedIds = statuses.flatMap((s) => (s.status === "accepted" ? [s.correlationId] : []));
|
|
160
|
+
enrichIntakeSpan({
|
|
161
|
+
"senpi.scanner.id": ctx.scannerId,
|
|
162
|
+
"senpi.intake.disposition": statuses.every((s) => s.status === statuses[0].status)
|
|
163
|
+
? statuses[0].status
|
|
164
|
+
: "mixed",
|
|
165
|
+
"senpi.signal.correlation_id": acceptedIds.length === 1 ? acceptedIds[0] : undefined,
|
|
166
|
+
});
|
|
101
167
|
return reply.send({
|
|
102
168
|
success: true,
|
|
103
169
|
data: { signals: result.signals },
|
|
@@ -106,23 +172,49 @@ export function registerSignalsRoute(fastify, opts) {
|
|
|
106
172
|
// POST /errors
|
|
107
173
|
fastify.post("/errors", async (request, reply) => {
|
|
108
174
|
if (!Value.Check(ErrorsBodySchema, request.body)) {
|
|
175
|
+
const ctx = bestEffortCtx(request.body);
|
|
176
|
+
emitEvent(logger, () => buildSignalRejectedEvent("invalid_shape", ctx));
|
|
177
|
+
enrichIntakeSpan({
|
|
178
|
+
"senpi.scanner.id": ctx.scannerId,
|
|
179
|
+
"senpi.intake.disposition": "rejected",
|
|
180
|
+
"senpi.intake.reason_code": "invalid_shape",
|
|
181
|
+
});
|
|
109
182
|
return reply.status(400).send({
|
|
110
183
|
success: false,
|
|
111
184
|
error: { code: "INVALID_SHAPE", message: "Invalid request body" },
|
|
112
185
|
});
|
|
113
186
|
}
|
|
114
|
-
const
|
|
187
|
+
const body = request.body;
|
|
188
|
+
const result = await processErrorPost(body, {
|
|
115
189
|
registry,
|
|
116
190
|
now,
|
|
117
191
|
updateLiveness,
|
|
118
192
|
onError,
|
|
119
193
|
});
|
|
120
194
|
if (!result.ok) {
|
|
195
|
+
enrichIntakeSpan({
|
|
196
|
+
"senpi.scanner.id": body.scanner_id,
|
|
197
|
+
"senpi.intake.disposition": "rejected",
|
|
198
|
+
"senpi.intake.reason_code": "unknown_scanner",
|
|
199
|
+
});
|
|
121
200
|
return reply.status(404).send({
|
|
122
201
|
success: false,
|
|
123
202
|
error: { code: result.reason, message: result.reason },
|
|
124
203
|
});
|
|
125
204
|
}
|
|
205
|
+
// A scanner tick that errored or timed out — it produced no signal this tick. The /errors
|
|
206
|
+
// boundary is otherwise untelemetered (onError is a no-op in production).
|
|
207
|
+
const resolved = registry.resolve(body.scanner_id);
|
|
208
|
+
const ctx = {
|
|
209
|
+
scannerId: body.scanner_id,
|
|
210
|
+
scannerName: resolved?.scannerName,
|
|
211
|
+
wallet: resolved?.wallet,
|
|
212
|
+
};
|
|
213
|
+
emitEvent(logger, () => buildScaffoldErrorEvent(body.error, ctx));
|
|
214
|
+
enrichIntakeSpan({
|
|
215
|
+
"senpi.scanner.id": body.scanner_id,
|
|
216
|
+
"senpi.intake.disposition": "scaffold_error",
|
|
217
|
+
});
|
|
126
218
|
return reply.send({ success: true });
|
|
127
219
|
});
|
|
128
220
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../../../src/runtime-api/routes/signals.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAEhD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AACrE,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAGnE,OAAO,EAAE,UAAU,EAAe,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"signals.js","sourceRoot":"","sources":["../../../src/runtime-api/routes/signals.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/runtime-api/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAKxD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/runtime-api/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,SAAS,CAAC;AAKxD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAItD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,kFAAkF;IAClF,cAAc,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC3C,4EAA4E;IAC5E,SAAS,EAAE,SAAS,CAAC;IACrB,mFAAmF;IACnF,MAAM,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,OAAO,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,IAAI,CAAC;CACvF;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,eAAe,CAAC;IACzB,SAAS,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,aAAa,GAAG,YAAY,CAqF3D"}
|
|
@@ -19,6 +19,8 @@ import { registerAuditRoute } from "./routes/audit.js";
|
|
|
19
19
|
import { registerHealthRoute } from "./routes/health.js";
|
|
20
20
|
import { registerStateRoute } from "./routes/state.js";
|
|
21
21
|
import { createReadiness } from "./readiness.js";
|
|
22
|
+
import { emitEvent } from "../actions/event-derivation.js";
|
|
23
|
+
import { buildSignalRejectedEvent } from "./intake/intake-events.js";
|
|
22
24
|
/**
|
|
23
25
|
* Create and configure the Fastify HTTP server.
|
|
24
26
|
*
|
|
@@ -58,13 +60,20 @@ export function createApi(deps) {
|
|
|
58
60
|
});
|
|
59
61
|
// Custom error handler — normalises Fastify validation / payload errors into
|
|
60
62
|
// the senpi-stack envelope `{ success: false, error: { code, message } }`.
|
|
61
|
-
fastify.setErrorHandler((error,
|
|
63
|
+
fastify.setErrorHandler((error, req, reply) => {
|
|
62
64
|
// Fastify v5 types setErrorHandler with `unknown`; cast once for the handler.
|
|
63
65
|
const err = error;
|
|
64
66
|
const statusCode = err.statusCode;
|
|
65
67
|
if (statusCode === 400 ||
|
|
66
68
|
statusCode === 413 ||
|
|
67
69
|
statusCode === 415) {
|
|
70
|
+
// A malformed-JSON / oversized / wrong-content-type body throws before the intake handler runs,
|
|
71
|
+
// so the envelope reject is otherwise untelemetered. Emit it at request grain (scanner unknown —
|
|
72
|
+
// the body never parsed), scoped to the intake routes. Strip any query string before matching.
|
|
73
|
+
const path = req.url.split("?")[0];
|
|
74
|
+
if (deps.intakeContext && (path === "/signals" || path === "/errors")) {
|
|
75
|
+
emitEvent(deps.logger, () => buildSignalRejectedEvent("invalid_request", { scannerId: "unknown" }));
|
|
76
|
+
}
|
|
68
77
|
return reply.status(statusCode).send({
|
|
69
78
|
success: false,
|
|
70
79
|
error: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/runtime-api/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,OAAiC,MAAM,SAAS,CAAC;AACxD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/runtime-api/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/scanners/engine/engine.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,KAAK,EAGV,mBAAmB,EACpB,MAAM,0BAA0B,CAAC;AAElC,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EAET,oBAAoB,EACrB,MAAM,aAAa,CAAC;AAErB,OAAO,EAEL,KAAK,4BAA4B,EACjC,KAAK,2BAA2B,EAEjC,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAGL,KAAK,yBAAyB,EAC/B,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EACL,gBAAgB,EAEjB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAsB/E,qEAAqE;AACrE,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,SAAS,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,+BAAgC,SAAQ,0BAA0B;IACjF,YAAY,EAAE,mBAAmB,CAAC;IAClC,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,kFAAkF;AAClF,qBAAa,aAAa;IAatB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAb9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAuB;IACjD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA+B;IAIxD,OAAO,CAAC,QAAQ,CAA+B;IAC/C,OAAO,CAAC,gBAAgB,CAAS;gBAGd,IAAI,EAAE,yBAAyB,EAC/B,WAAW,EAAE,kBAAkB,EAChD,QAAQ,CAAC,EAAE,gBAAgB;IAO7B,OAAO,CAAC,eAAe;IAcvB,sDAAsD;IACtD,QAAQ,CAAC,GAAG,GAAG,OAAO,EAAE,EAAE,GAAG,OAAO,EAClC,QAAQ,EAAE,oBAAoB,EAC9B,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,GACxB,IAAI;IASP,gEAAgE;IAChE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAYnD,qEAAqE;IACrE,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,IAAI;IAYpD,wEAAwE;IAClE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B5B,+EAA+E;IACzE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B,iFAAiF;IACjF,IAAI,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,0BAA0B,EAAE;IASpD,kFAAkF;IAClF,qBAAqB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,+BAA+B,EAAE;IAa1E,8EAA8E;IACxE,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC;IAUxE,6DAA6D;IACvD,SAAS,CACb,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,SAAS,EACpB,MAAM,EAAE,OAAO,GACd,OAAO,CAAC,IAAI,CAAC;IAkBhB;;;OAGG;IACG,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC;IA2BzE;;;;;OAKG;YACW,OAAO;
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../../src/scanners/engine/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -205,6 +205,8 @@ export class ScannerEngine {
|
|
|
205
205
|
const runId = randomUUID();
|
|
206
206
|
try {
|
|
207
207
|
span.setAttribute("senpi.run.id", runId);
|
|
208
|
+
// The scanner kind (signal type), so a trace shows which scanner ran, not just its instance id.
|
|
209
|
+
span.setAttribute("senpi.scanner.type", entry.scanner.definition.signalType);
|
|
208
210
|
const id = this.resolveIdentity();
|
|
209
211
|
if (id)
|
|
210
212
|
await setTraceIdentityAttributes(id);
|
|
@@ -286,6 +288,7 @@ export class ScannerEngine {
|
|
|
286
288
|
try {
|
|
287
289
|
span.setAttribute("senpi.run.id", runId);
|
|
288
290
|
span.setAttribute("senpi.scanner.id", request.scanner);
|
|
291
|
+
span.setAttribute("senpi.scanner.type", entry.scanner.definition.signalType);
|
|
289
292
|
span.setAttribute("senpi.scanner.origin", "external");
|
|
290
293
|
const id = this.resolveIdentity();
|
|
291
294
|
if (id)
|