@senpi/runtime 3.0.127 → 3.0.129
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 +4 -12
- package/dist/actions/action-events.d.ts +7 -21
- package/dist/actions/action-events.d.ts.map +1 -1
- package/dist/actions/action-events.js +26 -54
- package/dist/actions/action-events.js.map +1 -1
- package/dist/actions/action-runtime-module.d.ts.map +1 -1
- package/dist/actions/action-runtime-module.js +7 -38
- package/dist/actions/action-runtime-module.js.map +1 -1
- package/dist/actions/close-position/close-position.action.d.ts.map +1 -1
- package/dist/actions/close-position/close-position.action.js +15 -122
- package/dist/actions/close-position/close-position.action.js.map +1 -1
- package/dist/actions/decision-engine.d.ts.map +1 -1
- package/dist/actions/decision-engine.js +2 -15
- package/dist/actions/decision-engine.js.map +1 -1
- package/dist/actions/event-derivation.d.ts +2 -71
- package/dist/actions/event-derivation.d.ts.map +1 -1
- package/dist/actions/event-derivation.js +8 -251
- package/dist/actions/event-derivation.js.map +1 -1
- package/dist/actions/open-position/open-position.action.d.ts +2 -17
- package/dist/actions/open-position/open-position.action.d.ts.map +1 -1
- package/dist/actions/open-position/open-position.action.js +47 -162
- package/dist/actions/open-position/open-position.action.js.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.d.ts +1 -2
- package/dist/actions/position-tracker/position-tracker.action.d.ts.map +1 -1
- package/dist/actions/position-tracker/position-tracker.action.js +17 -62
- package/dist/actions/position-tracker/position-tracker.action.js.map +1 -1
- package/dist/actions/store/types.d.ts +2 -9
- package/dist/actions/store/types.d.ts.map +1 -1
- package/dist/actions/store/types.js.map +1 -1
- package/dist/actions/types.d.ts +0 -13
- package/dist/actions/types.d.ts.map +1 -1
- package/dist/actions/types.js +0 -13
- package/dist/actions/types.js.map +1 -1
- package/dist/cli/guide-commands.d.ts.map +1 -1
- package/dist/cli/guide-commands.js +6 -7
- package/dist/cli/guide-commands.js.map +1 -1
- package/dist/cli/senpi-commands.d.ts.map +1 -1
- package/dist/cli/senpi-commands.js +11 -4
- package/dist/cli/senpi-commands.js.map +1 -1
- package/dist/dsl/engine-client/event-mapping.d.ts.map +1 -1
- package/dist/dsl/engine-client/event-mapping.js +0 -14
- package/dist/dsl/engine-client/event-mapping.js.map +1 -1
- package/dist/dsl/events/build-closed-event.d.ts +1 -16
- package/dist/dsl/events/build-closed-event.d.ts.map +1 -1
- package/dist/dsl/events/build-closed-event.js +0 -6
- package/dist/dsl/events/build-closed-event.js.map +1 -1
- package/dist/dsl/events/handlers.d.ts +0 -7
- package/dist/dsl/events/handlers.d.ts.map +1 -1
- package/dist/dsl/events/handlers.js +7 -37
- package/dist/dsl/events/handlers.js.map +1 -1
- package/dist/dsl/monitor/create-monitor.d.ts +2 -6
- package/dist/dsl/monitor/create-monitor.d.ts.map +1 -1
- package/dist/dsl/monitor/create-monitor.js +9 -15
- package/dist/dsl/monitor/create-monitor.js.map +1 -1
- package/dist/dsl/monitor/dsl-failure-events.d.ts +0 -2
- package/dist/dsl/monitor/dsl-failure-events.d.ts.map +1 -1
- package/dist/dsl/monitor/dsl-failure-events.js +1 -2
- package/dist/dsl/monitor/dsl-failure-events.js.map +1 -1
- package/dist/dsl/monitor/process-one-position.d.ts +0 -1
- package/dist/dsl/monitor/process-one-position.d.ts.map +1 -1
- package/dist/dsl/monitor/process-one-position.js +25 -59
- package/dist/dsl/monitor/process-one-position.js.map +1 -1
- package/dist/dsl/plugin/index.d.ts +2 -8
- package/dist/dsl/plugin/index.d.ts.map +1 -1
- package/dist/dsl/plugin/index.js +6 -8
- package/dist/dsl/plugin/index.js.map +1 -1
- package/dist/health/types.d.ts +0 -13
- package/dist/health/types.d.ts.map +1 -1
- package/dist/health/types.js +0 -12
- package/dist/health/types.js.map +1 -1
- package/dist/index.d.ts +4 -27
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +42 -254
- package/dist/index.js.map +1 -1
- package/dist/runtime/action-registry.d.ts.map +1 -1
- package/dist/runtime/action-registry.js +3 -4
- package/dist/runtime/action-registry.js.map +1 -1
- package/dist/runtime/auto-update/coordinator.d.ts +6 -13
- package/dist/runtime/auto-update/coordinator.d.ts.map +1 -1
- package/dist/runtime/auto-update/coordinator.js +18 -86
- package/dist/runtime/auto-update/coordinator.js.map +1 -1
- package/dist/runtime/auto-update/run-update-command.d.ts.map +1 -1
- package/dist/runtime/auto-update/run-update-command.js +3 -4
- package/dist/runtime/auto-update/run-update-command.js.map +1 -1
- package/dist/runtime/auto-update/types.d.ts +5 -11
- package/dist/runtime/auto-update/types.d.ts.map +1 -1
- package/dist/runtime/auto-update/types.js +0 -11
- package/dist/runtime/auto-update/types.js.map +1 -1
- package/dist/runtime/domain-events.d.ts.map +1 -1
- package/dist/runtime/domain-events.js +0 -7
- package/dist/runtime/domain-events.js.map +1 -1
- package/dist/runtime/lifecycle-events.d.ts +1 -9
- package/dist/runtime/lifecycle-events.d.ts.map +1 -1
- package/dist/runtime/lifecycle-events.js +2 -11
- package/dist/runtime/lifecycle-events.js.map +1 -1
- package/dist/runtime/reconcile-run.d.ts +3 -13
- package/dist/runtime/reconcile-run.d.ts.map +1 -1
- package/dist/runtime/reconcile-run.js +3 -4
- package/dist/runtime/reconcile-run.js.map +1 -1
- package/dist/runtime/reconcile-state.d.ts +0 -8
- package/dist/runtime/reconcile-state.d.ts.map +1 -1
- package/dist/runtime/reconcile-state.js +1 -4
- package/dist/runtime/reconcile-state.js.map +1 -1
- package/dist/runtime/run.d.ts +0 -1
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js.map +1 -1
- package/dist/runtime/runtime-schema.js +3 -3
- package/dist/runtime/runtime-schema.js.map +1 -1
- package/dist/runtime/runtime.d.ts +0 -1
- package/dist/runtime/runtime.d.ts.map +1 -1
- package/dist/runtime/runtime.js +3 -27
- package/dist/runtime/runtime.js.map +1 -1
- package/dist/runtime/supervisor/long-running-supervisor.d.ts +0 -13
- package/dist/runtime/supervisor/long-running-supervisor.d.ts.map +1 -1
- package/dist/runtime/supervisor/long-running-supervisor.js +0 -1
- package/dist/runtime/supervisor/long-running-supervisor.js.map +1 -1
- package/dist/runtime/validate-dsl-position-tracking.d.ts.map +1 -1
- package/dist/runtime/validate-dsl-position-tracking.js +1 -2
- package/dist/runtime/validate-dsl-position-tracking.js.map +1 -1
- package/dist/runtime-api/handlers/ingest-signals.d.ts.map +1 -1
- package/dist/runtime-api/handlers/ingest-signals.js +0 -1
- package/dist/runtime-api/handlers/ingest-signals.js.map +1 -1
- package/dist/runtime-api/handlers/types.d.ts +0 -5
- package/dist/runtime-api/handlers/types.d.ts.map +1 -1
- package/dist/runtime-api/intake/intake-events.d.ts +1 -1
- package/dist/runtime-api/intake/intake-events.d.ts.map +1 -1
- package/dist/runtime-api/intake/intake-events.js +3 -9
- package/dist/runtime-api/intake/intake-events.js.map +1 -1
- package/dist/runtime-api/intake/intake-mount.d.ts.map +1 -1
- package/dist/runtime-api/intake/intake-mount.js +19 -4
- package/dist/runtime-api/intake/intake-mount.js.map +1 -1
- package/dist/runtime-api/intake/process-error-post.d.ts +1 -6
- package/dist/runtime-api/intake/process-error-post.d.ts.map +1 -1
- package/dist/runtime-api/intake/process-error-post.js +1 -5
- package/dist/runtime-api/intake/process-error-post.js.map +1 -1
- package/dist/runtime-api/intake/process-signal-post.d.ts +1 -7
- package/dist/runtime-api/intake/process-signal-post.d.ts.map +1 -1
- package/dist/runtime-api/intake/process-signal-post.js +0 -5
- package/dist/runtime-api/intake/process-signal-post.js.map +1 -1
- package/dist/runtime-api/intake/scaffold-error-router.js.map +1 -1
- package/dist/runtime-api/intake/scanner-launcher.d.ts.map +1 -1
- package/dist/runtime-api/intake/scanner-launcher.js +0 -15
- package/dist/runtime-api/intake/scanner-launcher.js.map +1 -1
- package/dist/runtime-api/intake/types.d.ts +0 -55
- package/dist/runtime-api/intake/types.d.ts.map +1 -1
- package/dist/runtime-api/routes/signals.d.ts +0 -2
- package/dist/runtime-api/routes/signals.d.ts.map +1 -1
- package/dist/runtime-api/routes/signals.js +1 -5
- package/dist/runtime-api/routes/signals.js.map +1 -1
- package/dist/runtime-api/routes/signals.schema.d.ts +0 -43
- package/dist/runtime-api/routes/signals.schema.d.ts.map +1 -1
- package/dist/runtime-api/routes/signals.schema.js +0 -43
- package/dist/runtime-api/routes/signals.schema.js.map +1 -1
- package/dist/runtime-api/server.d.ts +1 -7
- package/dist/runtime-api/server.d.ts.map +1 -1
- package/dist/runtime-api/server.js +0 -1
- package/dist/runtime-api/server.js.map +1 -1
- package/dist/scanners/engine/engine.d.ts +1 -22
- package/dist/scanners/engine/engine.d.ts.map +1 -1
- package/dist/scanners/engine/engine.js +11 -78
- package/dist/scanners/engine/engine.js.map +1 -1
- package/dist/scanners/engine/lifecycle.d.ts +1 -7
- package/dist/scanners/engine/lifecycle.d.ts.map +1 -1
- package/dist/scanners/events.d.ts +0 -4
- package/dist/scanners/events.d.ts.map +1 -1
- package/dist/scanners/events.js +0 -2
- package/dist/scanners/events.js.map +1 -1
- package/dist/scanners/external/scaffold/delivery.py +25 -194
- package/dist/scanners/external/scaffold/scaffold.py +31 -172
- package/dist/scanners/external/scaffold/senpi_mcp.py +8 -150
- package/dist/scanners/external-scanner-receiver.d.ts +0 -17
- package/dist/scanners/external-scanner-receiver.d.ts.map +1 -1
- package/dist/scanners/external-scanner-receiver.js +0 -8
- package/dist/scanners/external-scanner-receiver.js.map +1 -1
- package/dist/scanners/runtime-module.d.ts +0 -1
- package/dist/scanners/runtime-module.d.ts.map +1 -1
- package/dist/scanners/runtime-module.js +9 -66
- package/dist/scanners/runtime-module.js.map +1 -1
- package/dist/telemetry/attributes.d.ts +0 -20
- package/dist/telemetry/attributes.d.ts.map +1 -1
- package/dist/telemetry/attributes.js +0 -24
- package/dist/telemetry/attributes.js.map +1 -1
- package/dist/telemetry/event-builders.d.ts +6 -81
- package/dist/telemetry/event-builders.d.ts.map +1 -1
- package/dist/telemetry/event-builders.js +17 -141
- package/dist/telemetry/event-builders.js.map +1 -1
- package/dist/telemetry/event-store.d.ts +0 -6
- package/dist/telemetry/event-store.d.ts.map +1 -1
- package/dist/telemetry/event-store.js +8 -12
- package/dist/telemetry/event-store.js.map +1 -1
- package/dist/telemetry/metrics.d.ts +2 -14
- package/dist/telemetry/metrics.d.ts.map +1 -1
- package/dist/telemetry/metrics.js +4 -19
- package/dist/telemetry/metrics.js.map +1 -1
- package/dist/telemetry/spans/redact-pii.d.ts.map +1 -1
- package/dist/telemetry/spans/redact-pii.js +2 -18
- package/dist/telemetry/spans/redact-pii.js.map +1 -1
- package/dist/telemetry/tracing.d.ts +0 -9
- package/dist/telemetry/tracing.d.ts.map +1 -1
- package/dist/telemetry/tracing.js +0 -36
- package/dist/telemetry/tracing.js.map +1 -1
- package/dist/types/dsl/index.d.ts +0 -11
- package/dist/types/dsl/index.d.ts.map +1 -1
- package/dist/types/scanner.d.ts +0 -15
- package/dist/types/scanner.d.ts.map +1 -1
- package/dist/utils/event-catalog.d.ts +0 -166
- package/dist/utils/event-catalog.d.ts.map +1 -1
- package/dist/utils/event-catalog.js +0 -18
- package/dist/utils/event-catalog.js.map +1 -1
- package/dist/utils/logger.d.ts +1 -4
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/validate/recipe-checks.d.ts.map +1 -1
- package/dist/validate/recipe-checks.js +2 -2
- package/dist/validate/recipe-checks.js.map +1 -1
- package/openclaw.plugin.json +4 -8
- package/package.json +1 -1
- package/dist/actions/skipped-signal-results.d.ts +0 -25
- package/dist/actions/skipped-signal-results.d.ts.map +0 -1
- package/dist/actions/skipped-signal-results.js +0 -71
- package/dist/actions/skipped-signal-results.js.map +0 -1
- package/dist/runtime-api/intake/ingest-request.d.ts +0 -17
- package/dist/runtime-api/intake/ingest-request.d.ts.map +0 -1
- package/dist/runtime-api/intake/ingest-request.js +0 -34
- package/dist/runtime-api/intake/ingest-request.js.map +0 -1
- package/dist/runtime-api/intake/scaffold-tick-router.d.ts +0 -39
- package/dist/runtime-api/intake/scaffold-tick-router.d.ts.map +0 -1
- package/dist/runtime-api/intake/scaffold-tick-router.js +0 -122
- package/dist/runtime-api/intake/scaffold-tick-router.js.map +0 -1
- package/dist/scanners/external/scaffold/tick_facts.py +0 -130
- package/dist/scanners/external/scaffold/ulid.py +0 -58
- package/dist/telemetry/live-telemetry.d.ts +0 -238
- package/dist/telemetry/live-telemetry.d.ts.map +0 -1
- package/dist/telemetry/live-telemetry.js +0 -853
- package/dist/telemetry/live-telemetry.js.map +0 -1
- package/dist/telemetry/scanner-stats.d.ts +0 -143
- package/dist/telemetry/scanner-stats.d.ts.map +0 -1
- package/dist/telemetry/scanner-stats.js +0 -426
- package/dist/telemetry/scanner-stats.js.map +0 -1
- package/dist/telemetry/scanner-tick-feed.d.ts +0 -87
- package/dist/telemetry/scanner-tick-feed.d.ts.map +0 -1
- package/dist/telemetry/scanner-tick-feed.js +0 -48
- package/dist/telemetry/scanner-tick-feed.js.map +0 -1
- package/dist/telemetry/strategy-topology.d.ts +0 -99
- package/dist/telemetry/strategy-topology.d.ts.map +0 -1
- package/dist/telemetry/strategy-topology.js +0 -93
- package/dist/telemetry/strategy-topology.js.map +0 -1
- package/dist/telemetry/telemetry-publisher.d.ts +0 -63
- package/dist/telemetry/telemetry-publisher.d.ts.map +0 -1
- package/dist/telemetry/telemetry-publisher.js +0 -229
- package/dist/telemetry/telemetry-publisher.js.map +0 -1
- package/dist/telemetry/tick-frame.d.ts +0 -212
- package/dist/telemetry/tick-frame.d.ts.map +0 -1
- package/dist/telemetry/tick-frame.js +0 -421
- package/dist/telemetry/tick-frame.js.map +0 -1
- package/dist/telemetry/timeline-buffer.d.ts +0 -95
- package/dist/telemetry/timeline-buffer.d.ts.map +0 -1
- package/dist/telemetry/timeline-buffer.js +0 -237
- package/dist/telemetry/timeline-buffer.js.map +0 -1
- package/dist/utils/telemetry-required-log.d.ts +0 -60
- package/dist/utils/telemetry-required-log.d.ts.map +0 -1
- package/dist/utils/telemetry-required-log.js +0 -105
- package/dist/utils/telemetry-required-log.js.map +0 -1
- package/dist/utils/ulid.d.ts +0 -9
- package/dist/utils/ulid.d.ts.map +0 -1
- package/dist/utils/ulid.js +0 -43
- package/dist/utils/ulid.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"live-telemetry.js","sourceRoot":"","sources":["../../src/telemetry/live-telemetry.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The `plugin.senpi.scanner.stats` payload: per-scanner activity counters plus the per-scanner state
|
|
3
|
-
* a summary screen needs, built as one pure function of its inputs.
|
|
4
|
-
*
|
|
5
|
-
* Two halves, from two sources:
|
|
6
|
-
* - The **counters** are computed on demand by scanning the recent-window buffer — no second data
|
|
7
|
-
* structure, no pre-aggregation on the write path, no retention setting of their own. Records are
|
|
8
|
-
* grouped by `(address, scannerId)` and bucketed by timestamp, because `scannerId` alone collides
|
|
9
|
-
* across strategies (the engine keys on the same pair).
|
|
10
|
-
* - The **state fields** are not derivable from records at all — health, schedule and liveness live in
|
|
11
|
-
* the health/system-state providers — so they arrive as {@link ScannerStateSnapshot} inputs and are
|
|
12
|
-
* joined on the same key. A scanner known to only one side still gets an entry: counters without
|
|
13
|
-
* state read `unknown`, state without counters carries an empty bucket list.
|
|
14
|
-
*
|
|
15
|
-
* The box never picks the window. It emits fixed-width buckets and the frontend sums however many it
|
|
16
|
-
* wants, so one payload serves every client and every window at once. `since` is what makes that sum
|
|
17
|
-
* honest: it is the stamp of the oldest record still held, and when nothing is held it is the moment
|
|
18
|
-
* this epoch began watching — "I have been watching since X and nothing happened" is a different
|
|
19
|
-
* statement from "no data", and only one of them is true.
|
|
20
|
-
*/
|
|
21
|
-
import type { ComponentHealth } from "../health/types.js";
|
|
22
|
-
import type { TimelineRecord } from "./timeline-buffer.js";
|
|
23
|
-
/**
|
|
24
|
-
* Bucket width in ms. It sets two things at once: the payload cost per active scanner, and the finest
|
|
25
|
-
* window a frontend can ask for (it can sum buckets, never split one).
|
|
26
|
-
*
|
|
27
|
-
* 15s divides the windows a summary screen actually shows — 1m is 4 buckets, 5m is 20, 15m is 60 — so
|
|
28
|
-
* no rendered window ever needs a partial bucket. It is also about two ticks of the fastest scanner
|
|
29
|
-
* the runtime will schedule (built-in cadence is floored at 7s in `runtime-schema.ts`), which keeps a
|
|
30
|
-
* bucket from hiding a run while still letting "it went quiet 30 seconds ago" show up. Buckets are
|
|
31
|
-
* emitted sparsely, so an idle scanner costs nothing regardless of this value.
|
|
32
|
-
*
|
|
33
|
-
* This is the number to change once real payload sizes are measured — see also the `bucketMs` input,
|
|
34
|
-
* which overrides it per call.
|
|
35
|
-
*/
|
|
36
|
-
export declare const DEFAULT_BUCKET_MS = 15000;
|
|
37
|
-
/**
|
|
38
|
-
* Ceiling on the buckets one payload may carry, across every scanner and every address.
|
|
39
|
-
*
|
|
40
|
-
* Buckets are the only part of this payload that grows without a bound of its own. A scanner
|
|
41
|
-
* producing one counted record per run fills one bucket per run, so a retention window of N records
|
|
42
|
-
* is N buckets on a single scanner, and every address the box runs adds its own series — the state
|
|
43
|
-
* rows do not, because there is one per registered scanner. One bucket serialises to about sixty
|
|
44
|
-
* bytes, so this budgets them at roughly 60 KiB and leaves the rest of the frame to the rows.
|
|
45
|
-
*
|
|
46
|
-
* Nothing downstream survives a breach: this payload travels southbound to the bridge, whose
|
|
47
|
-
* southbound read limit is 1 MiB unless a deployment sets its own, and a frame past it takes the
|
|
48
|
-
* connection down rather than losing the one sample.
|
|
49
|
-
*
|
|
50
|
-
* The trim cuts at a bucket boundary, so a payload may carry up to one extra bucket per scanner —
|
|
51
|
-
* splitting a timestamp across scanners would misalign the series a client sums.
|
|
52
|
-
*/
|
|
53
|
-
export declare const MAX_STATS_BUCKETS = 1000;
|
|
54
|
-
/**
|
|
55
|
-
* The four counters, which sum to the records counted in the bucket — each counted record
|
|
56
|
-
* increments exactly one of them, and one position transition is counted once however many records
|
|
57
|
-
* describe it (see {@link classify}). `closes` is its own field because an accepted close is none of
|
|
58
|
-
* the other three: it opened nothing, it was not declined, and nothing failed — folding it into any
|
|
59
|
-
* of them replaces one wrong number with another.
|
|
60
|
-
*/
|
|
61
|
-
export interface ScannerStatsBucket {
|
|
62
|
-
/** Bucket start, epoch ms, aligned to a `bucketMs` grid so buckets line up across scanners. */
|
|
63
|
-
readonly t: number;
|
|
64
|
-
readonly opens: number;
|
|
65
|
-
readonly closes: number;
|
|
66
|
-
readonly skips: number;
|
|
67
|
-
readonly errors: number;
|
|
68
|
-
}
|
|
69
|
-
/**
|
|
70
|
-
* One scanner's state as the health/system-state providers report it. These fields have no
|
|
71
|
-
* representation in the buffer, so the builder takes them rather than reaching into the runtime.
|
|
72
|
-
*
|
|
73
|
-
* `inFlightSince` is a timestamp, not a boolean: a scan running for 200ms is normal and one running
|
|
74
|
-
* for four minutes on a 15s interval is hung, and a boolean cannot tell those apart.
|
|
75
|
-
*/
|
|
76
|
-
export interface ScannerStateSnapshot {
|
|
77
|
-
readonly address: string;
|
|
78
|
-
readonly scannerId: string;
|
|
79
|
-
readonly health: ComponentHealth;
|
|
80
|
-
readonly degradedReason?: string | null;
|
|
81
|
-
readonly enabled: boolean;
|
|
82
|
-
readonly inFlightSince: number | null;
|
|
83
|
-
readonly lastRunStartedAt: number | null;
|
|
84
|
-
readonly lastRunFinishedAt: number | null;
|
|
85
|
-
readonly lastRunStatus: string | null;
|
|
86
|
-
readonly lastRunReason: string | null;
|
|
87
|
-
readonly nextRunAt: number | null;
|
|
88
|
-
readonly lastAliveAt: number | null;
|
|
89
|
-
/** Null when no supervision row covers this scanner — a known zero is a different statement. */
|
|
90
|
-
readonly restartCount: number | null;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* One scanner on the wire. `scannerId` is absent — not null — when the records could not be
|
|
94
|
-
* attributed to a scanner; the client buckets those separately rather than seeing them folded into a
|
|
95
|
-
* named scanner's numbers. Every state field is `null` when no snapshot covers this scanner, which is
|
|
96
|
-
* a different statement from a known `false` or a known `0`.
|
|
97
|
-
*
|
|
98
|
-
* `degradedReason`, `lastRunStatus` and `lastRunReason` are copied from the snapshot as they were
|
|
99
|
-
* given. They are free text captured from a scanner process, so the publisher scrubs and caps them
|
|
100
|
-
* on the way out — this builder stays pure and holds no redactor.
|
|
101
|
-
*/
|
|
102
|
-
export interface ScannerStatsEntry {
|
|
103
|
-
readonly address: string;
|
|
104
|
-
readonly scannerId?: string;
|
|
105
|
-
readonly health: ComponentHealth;
|
|
106
|
-
readonly degradedReason: string | null;
|
|
107
|
-
readonly enabled: boolean | null;
|
|
108
|
-
readonly inFlightSince: number | null;
|
|
109
|
-
readonly lastRunStartedAt: number | null;
|
|
110
|
-
readonly lastRunFinishedAt: number | null;
|
|
111
|
-
readonly lastRunStatus: string | null;
|
|
112
|
-
readonly lastRunReason: string | null;
|
|
113
|
-
readonly nextRunAt: number | null;
|
|
114
|
-
readonly lastAliveAt: number | null;
|
|
115
|
-
readonly restartCount: number | null;
|
|
116
|
-
/** Only buckets with activity, ascending by `t`. A gap means zero, not missing. */
|
|
117
|
-
readonly buckets: ScannerStatsBucket[];
|
|
118
|
-
}
|
|
119
|
-
export interface ScannerStatsPayload {
|
|
120
|
-
readonly v: 1;
|
|
121
|
-
readonly epoch: string;
|
|
122
|
-
readonly sampledAt: number;
|
|
123
|
-
/** Oldest record still held, or the buffer's start time when nothing is held. Never absent. */
|
|
124
|
-
readonly since: number;
|
|
125
|
-
readonly bucketMs: number;
|
|
126
|
-
readonly scanners: ScannerStatsEntry[];
|
|
127
|
-
}
|
|
128
|
-
export interface BuildScannerStatsInput {
|
|
129
|
-
/** The buffer's epoch ULID. A change means the box restarted. */
|
|
130
|
-
readonly epoch: string;
|
|
131
|
-
/** Every record the counters are derived from — the buffer's full held window. */
|
|
132
|
-
readonly records: readonly TimelineRecord[];
|
|
133
|
-
/** Per-scanner state from the health/system-state providers. */
|
|
134
|
-
readonly scannerState: readonly ScannerStateSnapshot[];
|
|
135
|
-
/** When this epoch began watching. Used as `since` only while the buffer holds nothing. */
|
|
136
|
-
readonly bufferStartedAt: number;
|
|
137
|
-
readonly sampledAt: number;
|
|
138
|
-
/** Overrides {@link DEFAULT_BUCKET_MS}. Ignored unless it is a finite width of at least 1ms. */
|
|
139
|
-
readonly bucketMs?: number;
|
|
140
|
-
}
|
|
141
|
-
/** Build one `plugin.senpi.scanner.stats` payload. Pure: no timers, no clocks, no runtime reads. */
|
|
142
|
-
export declare function buildScannerStats(input: BuildScannerStatsInput): ScannerStatsPayload;
|
|
143
|
-
//# sourceMappingURL=scanner-stats.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scanner-stats.d.ts","sourceRoot":"","sources":["../../src/telemetry/scanner-stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,426 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* The `plugin.senpi.scanner.stats` payload: per-scanner activity counters plus the per-scanner state
|
|
3
|
-
* a summary screen needs, built as one pure function of its inputs.
|
|
4
|
-
*
|
|
5
|
-
* Two halves, from two sources:
|
|
6
|
-
* - The **counters** are computed on demand by scanning the recent-window buffer — no second data
|
|
7
|
-
* structure, no pre-aggregation on the write path, no retention setting of their own. Records are
|
|
8
|
-
* grouped by `(address, scannerId)` and bucketed by timestamp, because `scannerId` alone collides
|
|
9
|
-
* across strategies (the engine keys on the same pair).
|
|
10
|
-
* - The **state fields** are not derivable from records at all — health, schedule and liveness live in
|
|
11
|
-
* the health/system-state providers — so they arrive as {@link ScannerStateSnapshot} inputs and are
|
|
12
|
-
* joined on the same key. A scanner known to only one side still gets an entry: counters without
|
|
13
|
-
* state read `unknown`, state without counters carries an empty bucket list.
|
|
14
|
-
*
|
|
15
|
-
* The box never picks the window. It emits fixed-width buckets and the frontend sums however many it
|
|
16
|
-
* wants, so one payload serves every client and every window at once. `since` is what makes that sum
|
|
17
|
-
* honest: it is the stamp of the oldest record still held, and when nothing is held it is the moment
|
|
18
|
-
* this epoch began watching — "I have been watching since X and nothing happened" is a different
|
|
19
|
-
* statement from "no data", and only one of them is true.
|
|
20
|
-
*/
|
|
21
|
-
import { normalizeStrategyAddress } from "./event-store.js";
|
|
22
|
-
import { createLogger } from "../utils/logger.js";
|
|
23
|
-
const logger = createLogger("[senpi-core][scanner-stats]");
|
|
24
|
-
/**
|
|
25
|
-
* Bucket width in ms. It sets two things at once: the payload cost per active scanner, and the finest
|
|
26
|
-
* window a frontend can ask for (it can sum buckets, never split one).
|
|
27
|
-
*
|
|
28
|
-
* 15s divides the windows a summary screen actually shows — 1m is 4 buckets, 5m is 20, 15m is 60 — so
|
|
29
|
-
* no rendered window ever needs a partial bucket. It is also about two ticks of the fastest scanner
|
|
30
|
-
* the runtime will schedule (built-in cadence is floored at 7s in `runtime-schema.ts`), which keeps a
|
|
31
|
-
* bucket from hiding a run while still letting "it went quiet 30 seconds ago" show up. Buckets are
|
|
32
|
-
* emitted sparsely, so an idle scanner costs nothing regardless of this value.
|
|
33
|
-
*
|
|
34
|
-
* This is the number to change once real payload sizes are measured — see also the `bucketMs` input,
|
|
35
|
-
* which overrides it per call.
|
|
36
|
-
*/
|
|
37
|
-
export const DEFAULT_BUCKET_MS = 15_000;
|
|
38
|
-
/**
|
|
39
|
-
* Ceiling on the buckets one payload may carry, across every scanner and every address.
|
|
40
|
-
*
|
|
41
|
-
* Buckets are the only part of this payload that grows without a bound of its own. A scanner
|
|
42
|
-
* producing one counted record per run fills one bucket per run, so a retention window of N records
|
|
43
|
-
* is N buckets on a single scanner, and every address the box runs adds its own series — the state
|
|
44
|
-
* rows do not, because there is one per registered scanner. One bucket serialises to about sixty
|
|
45
|
-
* bytes, so this budgets them at roughly 60 KiB and leaves the rest of the frame to the rows.
|
|
46
|
-
*
|
|
47
|
-
* Nothing downstream survives a breach: this payload travels southbound to the bridge, whose
|
|
48
|
-
* southbound read limit is 1 MiB unless a deployment sets its own, and a frame past it takes the
|
|
49
|
-
* connection down rather than losing the one sample.
|
|
50
|
-
*
|
|
51
|
-
* The trim cuts at a bucket boundary, so a payload may carry up to one extra bucket per scanner —
|
|
52
|
-
* splitting a timestamp across scanners would misalign the series a client sums.
|
|
53
|
-
*/
|
|
54
|
-
export const MAX_STATS_BUCKETS = 1_000;
|
|
55
|
-
/**
|
|
56
|
-
* The one event carrying an action outcome, one record per evaluation. It carries two kinds of fact:
|
|
57
|
-
* a **decision** the runtime made, and a **lifecycle observation** — the runtime noticing a position
|
|
58
|
-
* transition that already happened. See {@link classify}.
|
|
59
|
-
*/
|
|
60
|
-
const OUTCOME_EVENT = "signal.outcome";
|
|
61
|
-
/** Scanner-side tick failures: the scanner produced nothing, and that is not a decision. */
|
|
62
|
-
const ERROR_EVENTS = new Set(["scaffold.tick_error", "scaffold.tick_timeout"]);
|
|
63
|
-
const ATTR_OUTCOME_RESULT = "senpi.outcome.result";
|
|
64
|
-
const ATTR_ACTION_TYPE = "senpi.action.type";
|
|
65
|
-
const ATTR_SIGNAL_TYPE = "senpi.signal.type";
|
|
66
|
-
const ATTR_SIGNAL_ASSET = "senpi.signal.asset";
|
|
67
|
-
const ATTR_SCANNER_NAME = "senpi.scanner.name";
|
|
68
|
-
const ATTR_SCANNER_ID = "senpi.scanner.id";
|
|
69
|
-
/** The only disposition meaning an order was actually placed — of either kind. */
|
|
70
|
-
const RESULT_ACCEPTED = "accepted";
|
|
71
|
-
/** The disposition meaning the attempt itself failed. */
|
|
72
|
-
const RESULT_ERROR = "error";
|
|
73
|
-
/** The producer's closed disposition set; anything outside it is drift worth a warning. */
|
|
74
|
-
const KNOWN_RESULTS = new Set([RESULT_ACCEPTED, "rejected", "blocked", RESULT_ERROR]);
|
|
75
|
-
/** The `ActionType` values that tell an accepted decision which bucket it belongs in. */
|
|
76
|
-
const ACTION_OPEN = "OPEN_POSITION";
|
|
77
|
-
const ACTION_CLOSE = "CLOSE_POSITION";
|
|
78
|
-
/**
|
|
79
|
-
* The action that reports what it saw rather than what it chose. Its accepted outcomes are lifecycle
|
|
80
|
-
* observations, and the transition rides {@link ATTR_SIGNAL_TYPE} — `senpi.action.type` is the same
|
|
81
|
-
* value for an opening and a closing, so it cannot tell them apart.
|
|
82
|
-
*/
|
|
83
|
-
const ACTION_TRACKER = "POSITION_TRACKER";
|
|
84
|
-
/** The two lifecycle transitions that are an open and a close. */
|
|
85
|
-
const SIGNAL_OPENED = "POSITION_OPENED";
|
|
86
|
-
const SIGNAL_CLOSED = "POSITION_CLOSED";
|
|
87
|
-
/**
|
|
88
|
-
* Transitions the tracker reports that are neither an open nor a close. A size change or a flip
|
|
89
|
-
* moves no position across the boundary the four buckets count, so they are knowingly counted
|
|
90
|
-
* nowhere — listed rather than defaulted, so a sixth transition still warns.
|
|
91
|
-
*/
|
|
92
|
-
const UNCOUNTED_SIGNALS = new Set(["POSITION_INCREASED", "POSITION_DECREASED", "POSITION_FLIPPED"]);
|
|
93
|
-
/** Separates the two halves of a group key. Never appears in a wallet or a scanner id. */
|
|
94
|
-
const KEY_SEP = "\u0000";
|
|
95
|
-
/**
|
|
96
|
-
* Distinct unrecognised dispositions already warned about, process-wide. Keyed by value rather than
|
|
97
|
-
* one-shot so a second kind of drift is still reported, and never per record — the flush tick can
|
|
98
|
-
* carry thousands of them.
|
|
99
|
-
*/
|
|
100
|
-
const warnedResults = new Set();
|
|
101
|
-
/** The same, for action types. The empty string keys an outcome that carried none. */
|
|
102
|
-
const warnedActionTypes = new Set();
|
|
103
|
-
/** The same, for the lifecycle transitions on a tracker row. */
|
|
104
|
-
const warnedSignalTypes = new Set();
|
|
105
|
-
/**
|
|
106
|
-
* The worst overflow warned about so far. A box permanently over the cap would otherwise warn on
|
|
107
|
-
* every sample tick, and one that is getting worse would otherwise say so only once.
|
|
108
|
-
*/
|
|
109
|
-
let warnedBucketOverflow = 0;
|
|
110
|
-
function key(address, scannerId) {
|
|
111
|
-
return `${address}${KEY_SEP}${scannerId ?? ""}`;
|
|
112
|
-
}
|
|
113
|
-
/**
|
|
114
|
-
* Rule 1: `senpi.scanner.id` carries the stable id on `signal.outcome` but the ephemeral, per-spawn id
|
|
115
|
-
* on the scaffold tick events, where the stable value rides `senpi.scanner.name`. Reading the id
|
|
116
|
-
* unqualified splits one scanner into two on every restart. The tap resolves this; the fallback here
|
|
117
|
-
* keeps a record whose tap did not from landing in the unattributed bucket.
|
|
118
|
-
*/
|
|
119
|
-
function resolveScannerId(record) {
|
|
120
|
-
if (typeof record.scannerId === "string" && record.scannerId !== "")
|
|
121
|
-
return record.scannerId;
|
|
122
|
-
const name = record.attrs?.[ATTR_SCANNER_NAME];
|
|
123
|
-
if (typeof name === "string" && name !== "")
|
|
124
|
-
return name;
|
|
125
|
-
const id = record.attrs?.[ATTR_SCANNER_ID];
|
|
126
|
-
if (typeof id === "string" && id !== "")
|
|
127
|
-
return id;
|
|
128
|
-
return undefined;
|
|
129
|
-
}
|
|
130
|
-
function warnUnknownResult(result) {
|
|
131
|
-
if (warnedResults.has(result))
|
|
132
|
-
return;
|
|
133
|
-
warnedResults.add(result);
|
|
134
|
-
logger.warn("signal.outcome carried an unrecognised disposition; counting it as a skip", {
|
|
135
|
-
[ATTR_OUTCOME_RESULT]: result,
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
function warnUnknownActionType(actionType) {
|
|
139
|
-
if (warnedActionTypes.has(actionType))
|
|
140
|
-
return;
|
|
141
|
-
warnedActionTypes.add(actionType);
|
|
142
|
-
logger.warn("an accepted signal.outcome named no action type this counter knows; counting it in no bucket", {
|
|
143
|
-
[ATTR_ACTION_TYPE]: actionType === "" ? "(absent)" : actionType,
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
function warnUnknownSignalType(signalType) {
|
|
147
|
-
if (warnedSignalTypes.has(signalType))
|
|
148
|
-
return;
|
|
149
|
-
warnedSignalTypes.add(signalType);
|
|
150
|
-
logger.warn("a lifecycle observation named a transition this counter knows nothing about; counting it in no bucket", {
|
|
151
|
-
[ATTR_SIGNAL_TYPE]: signalType === "" ? "(absent)" : signalType,
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
/** One attribute as a string, with an absent or non-string value read as the empty string. */
|
|
155
|
-
function attr(record, name) {
|
|
156
|
-
const raw = record.attrs?.[name];
|
|
157
|
-
return typeof raw === "string" ? raw : "";
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Decided transitions a lifecycle observation may still be folded into, as a multiset keyed by
|
|
161
|
-
* `(counter, address, asset)`.
|
|
162
|
-
*
|
|
163
|
-
* A multiset rather than a set because both halves repeat: a strategy that opens, closes and reopens
|
|
164
|
-
* the same asset inside one window produces two decided opens and two observed ones, and each
|
|
165
|
-
* observation must be absorbed by its own decision. Keyed on the asset rather than
|
|
166
|
-
* `senpi.position.id` because the id is systematically absent on an observed close — the tracker
|
|
167
|
-
* clears the registry entry before the outcome record is built — so it would join opens only.
|
|
168
|
-
*/
|
|
169
|
-
class DecidedTransitions {
|
|
170
|
-
counts = new Map();
|
|
171
|
-
static key(counter, address, asset) {
|
|
172
|
-
return `${counter}${KEY_SEP}${address}${KEY_SEP}${asset}`;
|
|
173
|
-
}
|
|
174
|
-
add(counter, address, asset) {
|
|
175
|
-
const k = DecidedTransitions.key(counter, address, asset);
|
|
176
|
-
this.counts.set(k, (this.counts.get(k) ?? 0) + 1);
|
|
177
|
-
}
|
|
178
|
-
/** Consume one decision covering this transition; false when none is left to absorb it. */
|
|
179
|
-
take(counter, address, asset) {
|
|
180
|
-
const k = DecidedTransitions.key(counter, address, asset);
|
|
181
|
-
const remaining = this.counts.get(k);
|
|
182
|
-
if (remaining === undefined || remaining === 0)
|
|
183
|
-
return false;
|
|
184
|
-
this.counts.set(k, remaining - 1);
|
|
185
|
-
return true;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
/**
|
|
189
|
-
* Which of the two order buckets an accepted **decision** feeds.
|
|
190
|
-
*
|
|
191
|
-
* `closes` is asserted positively — a close is the case that has to be proven. An action type that
|
|
192
|
-
* is unrecognised, or absent (the producer omits the attribute rather than stamping a placeholder
|
|
193
|
-
* that would poison a counter), feeds no bucket at all: guessing one is what let a third action type
|
|
194
|
-
* double every open, and a number that silently absorbs the unclassifiable is worse than a number
|
|
195
|
-
* that is one short and a warning that says so. Warned once per distinct value.
|
|
196
|
-
*/
|
|
197
|
-
function decidedCounter(actionType) {
|
|
198
|
-
if (actionType === ACTION_CLOSE)
|
|
199
|
-
return "closes";
|
|
200
|
-
if (actionType === ACTION_OPEN)
|
|
201
|
-
return "opens";
|
|
202
|
-
warnUnknownActionType(actionType);
|
|
203
|
-
return null;
|
|
204
|
-
}
|
|
205
|
-
/**
|
|
206
|
-
* Which bucket an accepted **lifecycle observation** feeds, given the decisions still unabsorbed.
|
|
207
|
-
*
|
|
208
|
-
* The transition rides `senpi.signal.type`; an opening and a closing share the tracker's action
|
|
209
|
-
* type. An observation counts only when no decision already counted the same transition — the
|
|
210
|
-
* decision is the better record (it carries the scanner that made the call), so it is the one kept,
|
|
211
|
-
* and the observation is folded into it. What is left over is real and otherwise unrecorded: an
|
|
212
|
-
* externally-opened position nothing decided, and — the dominant case — a DSL exit, which closes
|
|
213
|
-
* through the MCP client without ever routing through `ClosePositionAction` and so emits no
|
|
214
|
-
* `CLOSE_POSITION` outcome to be counted.
|
|
215
|
-
*/
|
|
216
|
-
function observedCounter(record, decided) {
|
|
217
|
-
const signalType = attr(record, ATTR_SIGNAL_TYPE);
|
|
218
|
-
let counter;
|
|
219
|
-
if (signalType === SIGNAL_OPENED)
|
|
220
|
-
counter = "opens";
|
|
221
|
-
else if (signalType === SIGNAL_CLOSED)
|
|
222
|
-
counter = "closes";
|
|
223
|
-
else {
|
|
224
|
-
if (!UNCOUNTED_SIGNALS.has(signalType))
|
|
225
|
-
warnUnknownSignalType(signalType);
|
|
226
|
-
return null;
|
|
227
|
-
}
|
|
228
|
-
const address = normalizeStrategyAddress(record.address);
|
|
229
|
-
return decided.take(counter, address, attr(record, ATTR_SIGNAL_ASSET)) ? null : counter;
|
|
230
|
-
}
|
|
231
|
-
/**
|
|
232
|
-
* Which counter a record feeds, or `null` when it feeds none.
|
|
233
|
-
*
|
|
234
|
-
* **The invariant:** `opens + closes + skips + errors` equals the number of records this counter
|
|
235
|
-
* accepted, each contributing exactly one, and one position transition is counted once however many
|
|
236
|
-
* records describe it. A record is counted nowhere — and warned about — when it cannot be placed:
|
|
237
|
-
* an unrecognised or absent action type, a lifecycle transition this counter does not model, and an
|
|
238
|
-
* observation of a transition a decision has already counted.
|
|
239
|
-
*
|
|
240
|
-
* An order leaving the box is asserted positively: `accepted` is the single disposition that means
|
|
241
|
-
* one did (`disposition()` in `event-builders.ts` maps the executed result to it). What the action
|
|
242
|
-
* type then settles is not only which bucket but which *kind of fact* the record is — a decision the
|
|
243
|
-
* runtime made, or an observation of a transition that already happened. Everything else that
|
|
244
|
-
* reached a decision placed no order, so `rejected` (actively gated) and `blocked` (not attempted)
|
|
245
|
-
* both read as a skip, and so does any value the producer adds later — an unrecognised disposition
|
|
246
|
-
* is warned about rather than silently dropped.
|
|
247
|
-
*
|
|
248
|
-
* A failed attempt is an `error`, not an open or a close (nothing was placed) and not a skip (it was
|
|
249
|
-
* not declined) — which is as true of a close as of an open, and of a lifecycle event the tracker
|
|
250
|
-
* failed to record, so the action type splits the accepted case only. The scaffold tick failures
|
|
251
|
-
* land in the same counter: from the summary screen both mean the scanner lost work to a fault.
|
|
252
|
-
*/
|
|
253
|
-
function classify(record, decided) {
|
|
254
|
-
if (ERROR_EVENTS.has(record.name))
|
|
255
|
-
return "errors";
|
|
256
|
-
if (record.name !== OUTCOME_EVENT)
|
|
257
|
-
return null;
|
|
258
|
-
const result = attr(record, ATTR_OUTCOME_RESULT);
|
|
259
|
-
if (result === RESULT_ACCEPTED) {
|
|
260
|
-
const actionType = attr(record, ATTR_ACTION_TYPE);
|
|
261
|
-
return actionType === ACTION_TRACKER ? observedCounter(record, decided) : decidedCounter(actionType);
|
|
262
|
-
}
|
|
263
|
-
if (result === RESULT_ERROR)
|
|
264
|
-
return "errors";
|
|
265
|
-
if (!KNOWN_RESULTS.has(result))
|
|
266
|
-
warnUnknownResult(result);
|
|
267
|
-
return "skips";
|
|
268
|
-
}
|
|
269
|
-
/**
|
|
270
|
-
* The decided transitions the observations in this window may be folded into: one entry per accepted
|
|
271
|
-
* `OPEN_POSITION` / `CLOSE_POSITION`.
|
|
272
|
-
*
|
|
273
|
-
* A whole pass ahead of the counting loop, because the observation trails its decision by up to one
|
|
274
|
-
* tracker poll and can land in a later bucket — a running tally would fold only the ones that happen
|
|
275
|
-
* to arrive first. Scoped to the window: a decision evicted from the buffer no longer absorbs
|
|
276
|
-
* anything, so its observation reads as an open nothing decided, which is exactly what the records
|
|
277
|
-
* still held say.
|
|
278
|
-
*/
|
|
279
|
-
function collectDecidedTransitions(records) {
|
|
280
|
-
const decided = new DecidedTransitions();
|
|
281
|
-
for (const record of records) {
|
|
282
|
-
if (!Number.isFinite(record.ts) || record.name !== OUTCOME_EVENT)
|
|
283
|
-
continue;
|
|
284
|
-
if (attr(record, ATTR_OUTCOME_RESULT) !== RESULT_ACCEPTED)
|
|
285
|
-
continue;
|
|
286
|
-
const actionType = attr(record, ATTR_ACTION_TYPE);
|
|
287
|
-
if (actionType !== ACTION_OPEN && actionType !== ACTION_CLOSE)
|
|
288
|
-
continue;
|
|
289
|
-
decided.add(actionType === ACTION_OPEN ? "opens" : "closes", normalizeStrategyAddress(record.address), attr(record, ATTR_SIGNAL_ASSET));
|
|
290
|
-
}
|
|
291
|
-
return decided;
|
|
292
|
-
}
|
|
293
|
-
/**
|
|
294
|
-
* The oldest bucket start the payload may keep, or undefined when everything fits. Chosen so the
|
|
295
|
-
* kept buckets number at most {@link MAX_STATS_BUCKETS}, cut on a timestamp so every scanner's
|
|
296
|
-
* series starts at the same place.
|
|
297
|
-
*/
|
|
298
|
-
function trimCutoff(groups) {
|
|
299
|
-
const starts = [];
|
|
300
|
-
for (const group of groups)
|
|
301
|
-
for (const t of group.buckets.keys())
|
|
302
|
-
starts.push(t);
|
|
303
|
-
if (starts.length <= MAX_STATS_BUCKETS)
|
|
304
|
-
return undefined;
|
|
305
|
-
starts.sort((a, b) => b - a);
|
|
306
|
-
const cutoff = starts[MAX_STATS_BUCKETS - 1];
|
|
307
|
-
const dropped = starts.filter((t) => t < cutoff).length;
|
|
308
|
-
if (dropped > warnedBucketOverflow) {
|
|
309
|
-
warnedBucketOverflow = dropped;
|
|
310
|
-
logger.warn("scanner stats dropped its oldest buckets to keep the payload inside one frame", {
|
|
311
|
-
"senpi.telemetry.buckets_dropped": dropped,
|
|
312
|
-
"senpi.telemetry.buckets_kept": starts.length - dropped,
|
|
313
|
-
"senpi.telemetry.bucket_limit": MAX_STATS_BUCKETS,
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
return cutoff;
|
|
317
|
-
}
|
|
318
|
-
function resolveBucketMs(requested) {
|
|
319
|
-
if (requested === undefined)
|
|
320
|
-
return DEFAULT_BUCKET_MS;
|
|
321
|
-
// A zero or negative width makes every bucket key Infinity or NaN, which would collapse the whole
|
|
322
|
-
// series into one unreadable bucket rather than fail loudly.
|
|
323
|
-
return Number.isFinite(requested) && requested >= 1 ? Math.floor(requested) : DEFAULT_BUCKET_MS;
|
|
324
|
-
}
|
|
325
|
-
function groupFor(groups, address, scannerId) {
|
|
326
|
-
const k = key(address, scannerId);
|
|
327
|
-
let group = groups.get(k);
|
|
328
|
-
if (group === undefined) {
|
|
329
|
-
group = { address, ...(scannerId !== undefined ? { scannerId } : {}), buckets: new Map() };
|
|
330
|
-
groups.set(k, group);
|
|
331
|
-
}
|
|
332
|
-
return group;
|
|
333
|
-
}
|
|
334
|
-
/** Address, then scanner id, with the unattributed entry last so it reads as a footnote. */
|
|
335
|
-
function compareEntries(a, b) {
|
|
336
|
-
if (a.address !== b.address)
|
|
337
|
-
return a.address < b.address ? -1 : 1;
|
|
338
|
-
if (a.scannerId === b.scannerId)
|
|
339
|
-
return 0;
|
|
340
|
-
if (a.scannerId === undefined)
|
|
341
|
-
return 1;
|
|
342
|
-
if (b.scannerId === undefined)
|
|
343
|
-
return -1;
|
|
344
|
-
return a.scannerId < b.scannerId ? -1 : 1;
|
|
345
|
-
}
|
|
346
|
-
function toEntry(group, snapshot, cutoff) {
|
|
347
|
-
const buckets = [...group.buckets.entries()]
|
|
348
|
-
.filter(([t]) => cutoff === undefined || t >= cutoff)
|
|
349
|
-
.sort(([a], [b]) => a - b)
|
|
350
|
-
.map(([t, counts]) => ({
|
|
351
|
-
t,
|
|
352
|
-
opens: counts.opens,
|
|
353
|
-
closes: counts.closes,
|
|
354
|
-
skips: counts.skips,
|
|
355
|
-
errors: counts.errors,
|
|
356
|
-
}));
|
|
357
|
-
return {
|
|
358
|
-
address: group.address,
|
|
359
|
-
...(group.scannerId !== undefined ? { scannerId: group.scannerId } : {}),
|
|
360
|
-
health: snapshot?.health ?? "unknown",
|
|
361
|
-
degradedReason: snapshot?.degradedReason ?? null,
|
|
362
|
-
enabled: snapshot?.enabled ?? null,
|
|
363
|
-
inFlightSince: snapshot?.inFlightSince ?? null,
|
|
364
|
-
lastRunStartedAt: snapshot?.lastRunStartedAt ?? null,
|
|
365
|
-
lastRunFinishedAt: snapshot?.lastRunFinishedAt ?? null,
|
|
366
|
-
lastRunStatus: snapshot?.lastRunStatus ?? null,
|
|
367
|
-
lastRunReason: snapshot?.lastRunReason ?? null,
|
|
368
|
-
nextRunAt: snapshot?.nextRunAt ?? null,
|
|
369
|
-
lastAliveAt: snapshot?.lastAliveAt ?? null,
|
|
370
|
-
restartCount: snapshot?.restartCount ?? null,
|
|
371
|
-
buckets,
|
|
372
|
-
};
|
|
373
|
-
}
|
|
374
|
-
/** Build one `plugin.senpi.scanner.stats` payload. Pure: no timers, no clocks, no runtime reads. */
|
|
375
|
-
export function buildScannerStats(input) {
|
|
376
|
-
const bucketMs = resolveBucketMs(input.bucketMs);
|
|
377
|
-
const groups = new Map();
|
|
378
|
-
const snapshots = new Map();
|
|
379
|
-
// Seeded first so a scanner the providers know about still gets an entry when it has produced
|
|
380
|
-
// nothing — a silent scanner is a fact the summary screen must be able to show.
|
|
381
|
-
for (const snapshot of input.scannerState) {
|
|
382
|
-
const address = normalizeStrategyAddress(snapshot.address);
|
|
383
|
-
snapshots.set(key(address, snapshot.scannerId), snapshot);
|
|
384
|
-
groupFor(groups, address, snapshot.scannerId);
|
|
385
|
-
}
|
|
386
|
-
const decided = collectDecidedTransitions(input.records);
|
|
387
|
-
let oldest;
|
|
388
|
-
for (const record of input.records) {
|
|
389
|
-
const ts = record.ts;
|
|
390
|
-
if (!Number.isFinite(ts))
|
|
391
|
-
continue;
|
|
392
|
-
// `since` tracks every held record, not only the counted ones: it describes the window the client
|
|
393
|
-
// is reading, which is the whole buffer.
|
|
394
|
-
if (oldest === undefined || ts < oldest)
|
|
395
|
-
oldest = ts;
|
|
396
|
-
const counter = classify(record, decided);
|
|
397
|
-
if (counter === null)
|
|
398
|
-
continue;
|
|
399
|
-
const group = groupFor(groups, normalizeStrategyAddress(record.address), resolveScannerId(record));
|
|
400
|
-
const t = Math.floor(ts / bucketMs) * bucketMs;
|
|
401
|
-
let counts = group.buckets.get(t);
|
|
402
|
-
if (counts === undefined) {
|
|
403
|
-
counts = { opens: 0, closes: 0, skips: 0, errors: 0 };
|
|
404
|
-
group.buckets.set(t, counts);
|
|
405
|
-
}
|
|
406
|
-
counts[counter] += 1;
|
|
407
|
-
}
|
|
408
|
-
const cutoff = trimCutoff(groups.values());
|
|
409
|
-
const scanners = [...groups.entries()]
|
|
410
|
-
.map(([k, group]) => toEntry(group, snapshots.get(k), cutoff))
|
|
411
|
-
.sort(compareEntries);
|
|
412
|
-
// A broken start time must not put a non-finite `since` on the wire — it serialises to null and
|
|
413
|
-
// the client's truncation check silently stops working.
|
|
414
|
-
const held = oldest ?? (Number.isFinite(input.bufferStartedAt) ? input.bufferStartedAt : input.sampledAt);
|
|
415
|
-
return {
|
|
416
|
-
v: 1,
|
|
417
|
-
epoch: input.epoch,
|
|
418
|
-
sampledAt: input.sampledAt,
|
|
419
|
-
// `since` labels the counters, so a trim moves it: the buckets no longer reach back to the
|
|
420
|
-
// oldest record held, and a client summing them from an older mark would read the gap as zeros.
|
|
421
|
-
since: cutoff !== undefined && cutoff > held ? cutoff : held,
|
|
422
|
-
bucketMs,
|
|
423
|
-
scanners,
|
|
424
|
-
};
|
|
425
|
-
}
|
|
426
|
-
//# sourceMappingURL=scanner-stats.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scanner-stats.js","sourceRoot":"","sources":["../../src/telemetry/scanner-stats.ts"],"names":[],"mappings":"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"}
|