@migor/agentia 0.9.4 → 0.10.0
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/CHANGELOG.md +1280 -4
- package/README.en.md +61 -3
- package/README.md +66 -4
- package/dist/AGENTS.md +330 -45
- package/dist/container/container.js +21 -0
- package/dist/container/container.js.map +1 -1
- package/dist/core/limits.d.ts +101 -14
- package/dist/core/limits.js +103 -13
- package/dist/core/limits.js.map +1 -1
- package/dist/core/line-framing.d.ts +36 -0
- package/dist/core/line-framing.js +39 -0
- package/dist/core/line-framing.js.map +1 -0
- package/dist/core/message.d.ts +11 -0
- package/dist/core/run.d.ts +68 -4
- package/dist/core/run.js +27 -1
- package/dist/core/run.js.map +1 -1
- package/dist/core/schema.js +59 -8
- package/dist/core/schema.js.map +1 -1
- package/dist/core/timeout.d.ts +43 -1
- package/dist/core/timeout.js +76 -3
- package/dist/core/timeout.js.map +1 -1
- package/dist/core/tool.d.ts +25 -1
- package/dist/core/trace.d.ts +40 -1
- package/dist/core/trace.js +26 -0
- package/dist/core/trace.js.map +1 -1
- package/dist/engine/budget.js +14 -0
- package/dist/engine/budget.js.map +1 -1
- package/dist/engine/defer.d.ts +49 -0
- package/dist/engine/defer.js +72 -0
- package/dist/engine/defer.js.map +1 -0
- package/dist/engine/errors.d.ts +23 -1
- package/dist/engine/errors.js +24 -0
- package/dist/engine/errors.js.map +1 -1
- package/dist/engine/forwarded.d.ts +14 -5
- package/dist/engine/forwarded.js +4 -1
- package/dist/engine/forwarded.js.map +1 -1
- package/dist/engine/loop-result.d.ts +65 -7
- package/dist/engine/loop-result.js +24 -5
- package/dist/engine/loop-result.js.map +1 -1
- package/dist/engine/loop.d.ts +2 -0
- package/dist/engine/loop.js +157 -17
- package/dist/engine/loop.js.map +1 -1
- package/dist/engine/mcp-server-http.d.ts +2 -0
- package/dist/engine/mcp-server-http.js +215 -0
- package/dist/engine/mcp-server-http.js.map +1 -0
- package/dist/engine/mcp-server-stdio.d.ts +15 -0
- package/dist/engine/mcp-server-stdio.js +106 -0
- package/dist/engine/mcp-server-stdio.js.map +1 -0
- package/dist/engine/mcp-server.d.ts +134 -0
- package/dist/engine/mcp-server.js +232 -0
- package/dist/engine/mcp-server.js.map +1 -0
- package/dist/engine/menu-drift.d.ts +34 -0
- package/dist/engine/menu-drift.js +81 -0
- package/dist/engine/menu-drift.js.map +1 -0
- package/dist/engine/policy.d.ts +2 -1
- package/dist/engine/policy.js +7 -1
- package/dist/engine/policy.js.map +1 -1
- package/dist/engine/replay.d.ts +2 -1
- package/dist/engine/replay.js +3 -2
- package/dist/engine/replay.js.map +1 -1
- package/dist/engine/resume-input.d.ts +10 -0
- package/dist/engine/resume-input.js +11 -0
- package/dist/engine/resume-input.js.map +1 -1
- package/dist/engine/run-config.d.ts +26 -2
- package/dist/engine/run-config.js +60 -0
- package/dist/engine/run-config.js.map +1 -1
- package/dist/engine/spec.d.ts +33 -4
- package/dist/engine/spec.js.map +1 -1
- package/dist/engine/tool-context.d.ts +10 -5
- package/dist/engine/tool-context.js +5 -1
- package/dist/engine/tool-context.js.map +1 -1
- package/dist/engine/tracer.d.ts +43 -5
- package/dist/engine/tracer.js +73 -10
- package/dist/engine/tracer.js.map +1 -1
- package/dist/engine/trimming.js +28 -2
- package/dist/engine/trimming.js.map +1 -1
- package/dist/engine/turn.d.ts +60 -3
- package/dist/engine/turn.js +180 -71
- package/dist/engine/turn.js.map +1 -1
- package/dist/engine/types.d.ts +89 -3
- package/dist/engine/types.js +38 -2
- package/dist/engine/types.js.map +1 -1
- package/dist/eval/export.d.ts +48 -0
- package/dist/eval/export.js +146 -0
- package/dist/eval/export.js.map +1 -0
- package/dist/eval/harvest.js +7 -2
- package/dist/eval/harvest.js.map +1 -1
- package/dist/index.d.ts +8 -5
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/adapter-options.d.ts +22 -0
- package/dist/integrations/adapter-options.js +51 -0
- package/dist/integrations/adapter-options.js.map +1 -1
- package/dist/integrations/anthropic.d.ts +4 -2
- package/dist/integrations/anthropic.js +27 -27
- package/dist/integrations/anthropic.js.map +1 -1
- package/dist/integrations/file-sink.d.ts +20 -0
- package/dist/integrations/file-sink.js +27 -0
- package/dist/integrations/file-sink.js.map +1 -0
- package/dist/integrations/mcp-http.d.ts +3 -3
- package/dist/integrations/mcp-http.js +1 -1
- package/dist/integrations/mcp-http.js.map +1 -1
- package/dist/integrations/mcp-protocol.d.ts +115 -0
- package/dist/integrations/mcp-protocol.js +69 -0
- package/dist/integrations/mcp-protocol.js.map +1 -0
- package/dist/integrations/mcp-stdio.d.ts +3 -3
- package/dist/integrations/mcp-stdio.js +17 -3
- package/dist/integrations/mcp-stdio.js.map +1 -1
- package/dist/integrations/mcp.d.ts +6 -95
- package/dist/integrations/mcp.js +24 -66
- package/dist/integrations/mcp.js.map +1 -1
- package/dist/integrations/metrics-otlp.js +52 -7
- package/dist/integrations/metrics-otlp.js.map +1 -1
- package/dist/integrations/metrics-render.d.ts +15 -0
- package/dist/integrations/metrics-render.js +79 -2
- package/dist/integrations/metrics-render.js.map +1 -1
- package/dist/integrations/metrics-state.d.ts +99 -1
- package/dist/integrations/metrics-state.js +128 -4
- package/dist/integrations/metrics-state.js.map +1 -1
- package/dist/integrations/metrics.d.ts +62 -6
- package/dist/integrations/metrics.js +49 -8
- package/dist/integrations/metrics.js.map +1 -1
- package/dist/integrations/openai.js +9 -31
- package/dist/integrations/openai.js.map +1 -1
- package/dist/integrations/otlp.d.ts +3 -3
- package/dist/integrations/report.d.ts +7 -0
- package/dist/integrations/report.js +20 -1
- package/dist/integrations/report.js.map +1 -1
- package/dist/runtime/memory.d.ts +61 -1
- package/dist/runtime/memory.js +47 -7
- package/dist/runtime/memory.js.map +1 -1
- package/dist/runtime/run.d.ts +12 -2
- package/dist/runtime/run.js +126 -17
- package/dist/runtime/run.js.map +1 -1
- package/dist/store/fsStore.js +10 -4
- package/dist/store/fsStore.js.map +1 -1
- package/dist/store/record.d.ts +41 -0
- package/dist/store/record.js +54 -0
- package/dist/store/record.js.map +1 -0
- package/dist/store/redisStore.d.ts +24 -1
- package/dist/store/redisStore.js +42 -7
- package/dist/store/redisStore.js.map +1 -1
- package/dist/store/sqliteStore.d.ts +23 -0
- package/dist/store/sqliteStore.js +103 -8
- package/dist/store/sqliteStore.js.map +1 -1
- package/dist/store/store.d.ts +65 -2
- package/dist/store/store.js +5 -2
- package/dist/store/store.js.map +1 -1
- package/dist/toolkit/capability-cycles.d.ts +50 -0
- package/dist/toolkit/capability-cycles.js +88 -0
- package/dist/toolkit/capability-cycles.js.map +1 -0
- package/dist/toolkit/capability-slice.d.ts +86 -0
- package/dist/toolkit/capability-slice.js +98 -0
- package/dist/toolkit/capability-slice.js.map +1 -0
- package/dist/toolkit/module.d.ts +7 -1
- package/dist/toolkit/module.js +65 -32
- package/dist/toolkit/module.js.map +1 -1
- package/dist/transport/approval-policy.d.ts +1 -1
- package/dist/transport/approval-policy.js +8 -4
- package/dist/transport/approval-policy.js.map +1 -1
- package/dist/transport/approval-supervisor.d.ts +73 -0
- package/dist/transport/approval-supervisor.js +252 -0
- package/dist/transport/approval-supervisor.js.map +1 -0
- package/dist/transport/async.d.ts +159 -56
- package/dist/transport/async.js +627 -269
- package/dist/transport/async.js.map +1 -1
- package/dist/transport/drain-gate.d.ts +6 -2
- package/dist/transport/drain-gate.js +14 -2
- package/dist/transport/drain-gate.js.map +1 -1
- package/dist/transport/http-endpoints.d.ts +151 -0
- package/dist/transport/http-endpoints.js +480 -0
- package/dist/transport/http-endpoints.js.map +1 -0
- package/dist/transport/http-io.d.ts +66 -0
- package/dist/transport/http-io.js +145 -0
- package/dist/transport/http-io.js.map +1 -0
- package/dist/transport/http-route.d.ts +10 -3
- package/dist/transport/http-route.js +18 -3
- package/dist/transport/http-route.js.map +1 -1
- package/dist/transport/http-shapes.d.ts +11 -0
- package/dist/transport/http-shapes.js +31 -1
- package/dist/transport/http-shapes.js.map +1 -1
- package/dist/transport/http.d.ts +22 -35
- package/dist/transport/http.js +98 -476
- package/dist/transport/http.js.map +1 -1
- package/dist/transport/owner-id.d.ts +29 -0
- package/dist/transport/owner-id.js +46 -0
- package/dist/transport/owner-id.js.map +1 -0
- package/dist/transport/owner-liveness.d.ts +8 -0
- package/dist/transport/owner-liveness.js +56 -0
- package/dist/transport/owner-liveness.js.map +1 -0
- package/dist/transport/resume-policy.d.ts +48 -10
- package/dist/transport/resume-policy.js +25 -10
- package/dist/transport/resume-policy.js.map +1 -1
- package/dist/transport/resume-scanner.d.ts +55 -0
- package/dist/transport/resume-scanner.js +219 -0
- package/dist/transport/resume-scanner.js.map +1 -0
- package/dist/transport/scheduler.js +9 -23
- package/dist/transport/scheduler.js.map +1 -1
- package/dist/transport/signal-supervisor.d.ts +80 -0
- package/dist/transport/signal-supervisor.js +129 -0
- package/dist/transport/signal-supervisor.js.map +1 -0
- package/dist/transport/slot-pool.d.ts +9 -1
- package/dist/transport/slot-pool.js +9 -1
- package/dist/transport/slot-pool.js.map +1 -1
- package/dist/transport/task-events.d.ts +34 -3
- package/dist/transport/task-events.js +93 -5
- package/dist/transport/task-events.js.map +1 -1
- package/dist/transport/wake-policy.d.ts +50 -0
- package/dist/transport/wake-policy.js +43 -0
- package/dist/transport/wake-policy.js.map +1 -0
- package/package.json +14 -4
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Trace } from '../core/trace.js';
|
|
1
|
+
import type { SpanId, Trace, TraceId } from '../core/trace.js';
|
|
2
2
|
/**
|
|
3
3
|
* metricsSink 的**状态层**:进程内累加器 + 快照(本文件)与渲染/导出(`metrics-render.ts` /
|
|
4
4
|
* `metrics-otlp.ts`)分离。本文件只管「账」,不管「怎么给人看 / 怎么发出去」。
|
|
@@ -28,6 +28,12 @@ export interface ModelMetrics {
|
|
|
28
28
|
costUsd: number;
|
|
29
29
|
/** 成本估不出来的 turn 数(模型不在价格表内,且未用 priceOverrides 覆盖)*/
|
|
30
30
|
unpricedTurns: number;
|
|
31
|
+
/**
|
|
32
|
+
* 上游**没回报 usage** 的 turn 数(2026-09-28 外部深评 S2)。
|
|
33
|
+
* 与 `unpricedTurns` 是两件事:那个是「模型不在价格表里」,这个是「上游没给计量」——
|
|
34
|
+
* 两者都会让成本**看起来**是 0,但排障方向不同(换模型 vs 查端点/网关)。
|
|
35
|
+
*/
|
|
36
|
+
usageMissingTurns: number;
|
|
31
37
|
latencyP50: number;
|
|
32
38
|
latencyP95: number;
|
|
33
39
|
}
|
|
@@ -40,6 +46,48 @@ export interface ScoreMetrics {
|
|
|
40
46
|
/** 评分值合计(平均 = sum / count) */
|
|
41
47
|
sum: number;
|
|
42
48
|
}
|
|
49
|
+
/** 归因标签维度的 run 级指标(R8-P4;`snapshot().runLabels[key]`,key 为 `k=v` 逗号连) */
|
|
50
|
+
export interface RunLabelMetrics {
|
|
51
|
+
runs: number;
|
|
52
|
+
failed: number;
|
|
53
|
+
/** 四类 token 之和(与 run 级 tokens 口径一致) */
|
|
54
|
+
tokens: number;
|
|
55
|
+
/** 累计成本估算(美元);未定价的 run 不计入(与全局 costUsd 同口径) */
|
|
56
|
+
costUsd: number;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* runLabels 的内部累加器:比快照形状多带一份 `pairs`(渲染/出口按它拼标签,
|
|
60
|
+
* 不从 combo 键反解 —— 值里含 `,`/`=` 时反解会碎)。
|
|
61
|
+
*/
|
|
62
|
+
export interface RunLabelAcc extends RunLabelMetrics {
|
|
63
|
+
/** 已过完各自 KeyBudget 的 `[key, value]` 对(顺序 = 配置的 labelKeys 顺序) */
|
|
64
|
+
pairs: readonly (readonly [string, string])[];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* exemplar 槽位内容:指向「哪条 run」的最小引用(traceId + 根 spanId + 记账时刻)。
|
|
68
|
+
* 内部存**原始 id**,hex 投影(`wireTraceId` / `wireSpanId`)在各自出口做(单一真源在 core/trace.ts)。
|
|
69
|
+
*/
|
|
70
|
+
export interface RunExemplar {
|
|
71
|
+
traceId: TraceId;
|
|
72
|
+
/** run 根 span 的 id —— OTLP exemplar 的 spanId 字段(跳到具体 span,不只是整条 trace) */
|
|
73
|
+
spanId: SpanId;
|
|
74
|
+
/** 记账时刻(epoch 毫秒)—— OTLP 的 timeUnixNano / OpenMetrics 行尾时间戳都从它派生 */
|
|
75
|
+
at: number;
|
|
76
|
+
}
|
|
77
|
+
/** `snapshot().exemplars` 的形状 —— 「指标尖峰 → 那条 trace」的桥(只给读侧,不含 spanId 细节) */
|
|
78
|
+
export interface ExemplarSnapshot {
|
|
79
|
+
/** `runs_failed_total` 的 exemplar:**最近一次**失败的 run;尚无失败时 undefined */
|
|
80
|
+
failed: {
|
|
81
|
+
traceId: TraceId;
|
|
82
|
+
at: number;
|
|
83
|
+
} | undefined;
|
|
84
|
+
/** `run_duration_ms` 的 exemplar:迄今**最慢**的一次 run;尚无时长样本时 undefined */
|
|
85
|
+
slowest: {
|
|
86
|
+
traceId: TraceId;
|
|
87
|
+
durationMs: number;
|
|
88
|
+
at: number;
|
|
89
|
+
} | undefined;
|
|
90
|
+
}
|
|
43
91
|
/** 进程内累计快照(`snapshot()` 返回) */
|
|
44
92
|
export interface MetricsSnapshot {
|
|
45
93
|
/** 投递过 trace 的 run 总数(= `export` 被调用次数) */
|
|
@@ -74,6 +122,23 @@ export interface MetricsSnapshot {
|
|
|
74
122
|
droppedModels: number;
|
|
75
123
|
/** 因 `maxScores` 上限被归入 `__other__` 的不同评分维度数 */
|
|
76
124
|
droppedScores: number;
|
|
125
|
+
/**
|
|
126
|
+
* 归因标签维度(R8-P4):`metricsSink({ labelKeys })` 显式点名的键才有 —— 缺省为空对象
|
|
127
|
+
* (一个都不上)。key 为 `k=v` 逗号连(如 `tenant=acme,plan=pro`,值里的 `,`/`=`/`\`
|
|
128
|
+
* 经转义);每个键的相异值数受 `maxLabelValues` 封顶,**组合数**受 `maxLabelCombos`
|
|
129
|
+
* 封顶(超出的组合折叠进一个全 `__other__` 的桶),两处折叠都只丢标签粒度、不丢量。
|
|
130
|
+
*/
|
|
131
|
+
runLabels: Record<string, RunLabelMetrics>;
|
|
132
|
+
/** 每个已配置 labelKey 被 `maxLabelValues` 折叠的不同值数(只含配置了的键) */
|
|
133
|
+
droppedLabelValues: Record<string, number>;
|
|
134
|
+
/** 被 `maxLabelCombos` 折叠的不同标签组合数(未配置 labelKeys 时恒 0) */
|
|
135
|
+
droppedLabelCombos: number;
|
|
136
|
+
/**
|
|
137
|
+
* exemplar(指标 → trace 的桥,2026-09-27):只跟踪价值最高的两个槽位 ——
|
|
138
|
+
* 失败 counter 的「最近一次」与 run 时长 histogram 的「最慢一次」。
|
|
139
|
+
* 不做 per-能力/per-模型:基数上限封的是标签,挡不住「每键一个槽位」的扩散。
|
|
140
|
+
*/
|
|
141
|
+
exemplars: ExemplarSnapshot;
|
|
77
142
|
}
|
|
78
143
|
/**
|
|
79
144
|
* 标签基数配额:三个维度共用的「有界键空间」。
|
|
@@ -140,6 +205,7 @@ export interface ModelAcc {
|
|
|
140
205
|
tokens: number;
|
|
141
206
|
costUsd: number;
|
|
142
207
|
unpricedTurns: number;
|
|
208
|
+
usageMissingTurns: number;
|
|
143
209
|
stat: DurationStat;
|
|
144
210
|
}
|
|
145
211
|
/**
|
|
@@ -181,9 +247,35 @@ export declare class MetricsState {
|
|
|
181
247
|
readonly models: Map<string, ModelAcc>;
|
|
182
248
|
/** 评分累加器:key = `${name}\t${source}`(source 缺省 '';\t 不会出现在正常评分名里,做天然分隔符) */
|
|
183
249
|
readonly scores: Map<string, ScoreMetrics>;
|
|
250
|
+
/**
|
|
251
|
+
* exemplar 槽位(各一个,O(1),无界风险为零)—— 「指标尖峰 → 那条 trace」的桥。
|
|
252
|
+
* 失败是**覆盖式**(尖峰时要看的是最新的那条);最慢是**破纪录才换**
|
|
253
|
+
* (等值保留旧的:「最慢」是稳定锚点,不该被同速的新 run 顶来顶去)。
|
|
254
|
+
*/
|
|
255
|
+
failedExemplar: RunExemplar | undefined;
|
|
256
|
+
slowestExemplar: (RunExemplar & {
|
|
257
|
+
durationMs: number;
|
|
258
|
+
}) | undefined;
|
|
184
259
|
readonly capBudget: KeyBudget;
|
|
185
260
|
readonly modelBudget: KeyBudget;
|
|
186
261
|
readonly scoreBudget: KeyBudget;
|
|
262
|
+
/**
|
|
263
|
+
* 归因标签维度(R8-P4):combo 键(`k=v` 逗号连,值经转义)→ 累加器。
|
|
264
|
+
* 与上面三个维度不同:这里**没有** per-combo 时长窗口(时长直方图 × 标签组合的内存
|
|
265
|
+
* 是 cap × windowSize 的另一份乘法,收益不抵代价),只有四个计数。
|
|
266
|
+
* ⚠️ 键是 `labelCombo()` 的产物:值里的 `,` / `=` / `\` 会被转义 —— 裸拼接会让
|
|
267
|
+
* 两个不同的标签集拼出同一个键(2026-09-27 ⑧ 实测:`a="x,b=y",b="z"` 与
|
|
268
|
+
* `a="x",b="y,b=z"` 撞成一个键 ⇒ 后者被并进前者的账、还按前者的标签渲染)。
|
|
269
|
+
*/
|
|
270
|
+
readonly runLabels: Map<string, RunLabelAcc>;
|
|
271
|
+
/** 每个配置的 labelKey 一本基数配额(构造时按 labelKeys 建齐) */
|
|
272
|
+
readonly labelBudgets: Map<string, KeyBudget>;
|
|
273
|
+
/**
|
|
274
|
+
* combo 键空间的配额(R8-P4 补课,2026-09-27 ⑧):**组合数**才是真正的基数维度 ——
|
|
275
|
+
* 每键一本配额只封住值域,combo 是叉乘(`(maxLabelValues+1)^labelKeys.length`),
|
|
276
|
+
* 缺省 100 键域 + 3 键就是一百万条常驻条目,而 `droppedLabelValues` 一行都看不见它。
|
|
277
|
+
*/
|
|
278
|
+
readonly comboBudget: KeyBudget;
|
|
187
279
|
constructor(opts: {
|
|
188
280
|
windowSize: number;
|
|
189
281
|
maxCapabilities: number;
|
|
@@ -191,6 +283,12 @@ export declare class MetricsState {
|
|
|
191
283
|
maxScores: number;
|
|
192
284
|
labelMode: 'capability' | 'kind' | 'none';
|
|
193
285
|
buckets: readonly number[];
|
|
286
|
+
/** 归因标签键(已过 metrics.ts 的形状校验;空数组 = 维度整个关掉) */
|
|
287
|
+
labelKeys: readonly string[];
|
|
288
|
+
/** 每个 labelKey 的相异值上限(构造期已保证正数) */
|
|
289
|
+
maxLabelValues: number;
|
|
290
|
+
/** combo(标签组合)数上限(构造期已保证正数) */
|
|
291
|
+
maxLabelCombos: number;
|
|
194
292
|
});
|
|
195
293
|
private newCapability;
|
|
196
294
|
/** 能力标签分配:labelMode 决定粒度,capBudget 决定基数上限 */
|
|
@@ -1,7 +1,23 @@
|
|
|
1
1
|
import { capabilityKindOf } from '../core/trace.js';
|
|
2
|
+
import { TOOL_OUTPUT_EVENT, USAGE_MISSING_EVENT } from '../core/trace.js';
|
|
2
3
|
import { percentile } from '../core/stats.js';
|
|
3
|
-
/** 超过基数上限后新键的兜底标签(能力 / 模型 /
|
|
4
|
+
/** 超过基数上限后新键的兜底标签(能力 / 模型 / 评分 / 标签组合四个维度共用) */
|
|
4
5
|
const OTHER_LABEL = '__other__';
|
|
6
|
+
/**
|
|
7
|
+
* 标签 combo 的**身份**:`k=v` 逗号连,但值里的 `,` / `=` / `\` 先转义。
|
|
8
|
+
*
|
|
9
|
+
* 为什么不能裸拼:这个字符串同时是 Map 的 identity(不只是展示形)。裸拼时
|
|
10
|
+
* `[a='x,b=y', b='z']` 与 `[a='x', b='y,b=z']` 都拼成 `a=x,b=y,b=z` —— 两个不同的
|
|
11
|
+
* 标签集并进同一本账,且 `pairs` 只留第一次那份 ⇒ 后者的量被挂在前者的标签下
|
|
12
|
+
* (2026-09-27 ⑧ 实测)。转义之后正常值(不含这三个字符的)拼法与展示形**逐字不变**,
|
|
13
|
+
* 只有病态值才多出反斜杠,而那是它唯一的无歧义写法。
|
|
14
|
+
*
|
|
15
|
+
* 渲染侧不复用它 —— 那边的标签逐键从 `pairs` 出来(Prometheus 只要求转义值里的
|
|
16
|
+
* `"` 与 `\`),所以这里多出来的转义不会漏进指标文本。
|
|
17
|
+
*/
|
|
18
|
+
const labelCombo = (pairs) => pairs.map(([k, v]) => `${k}=${escCombo(v)}`).join(',');
|
|
19
|
+
/** `,` / `=` / `\` 三个字符按 `\` 前缀转义(键是合法标签名,用不到,但转义对两者都做) */
|
|
20
|
+
const escCombo = (s) => s.replace(/[\\,=]/g, (c) => `\\${c}`);
|
|
5
21
|
/**
|
|
6
22
|
* 折叠计数最多记这么多个**不同**键(每个维度各一本)。计数只用于报警「基数爆了」,
|
|
7
23
|
* 不值得为它留一本无界的账 —— 那等于把上限又拆掉一角。正常上限(50~200)下这个数
|
|
@@ -172,16 +188,44 @@ export class MetricsState {
|
|
|
172
188
|
models = new Map();
|
|
173
189
|
/** 评分累加器:key = `${name}\t${source}`(source 缺省 '';\t 不会出现在正常评分名里,做天然分隔符) */
|
|
174
190
|
scores = new Map();
|
|
191
|
+
/**
|
|
192
|
+
* exemplar 槽位(各一个,O(1),无界风险为零)—— 「指标尖峰 → 那条 trace」的桥。
|
|
193
|
+
* 失败是**覆盖式**(尖峰时要看的是最新的那条);最慢是**破纪录才换**
|
|
194
|
+
* (等值保留旧的:「最慢」是稳定锚点,不该被同速的新 run 顶来顶去)。
|
|
195
|
+
*/
|
|
196
|
+
failedExemplar;
|
|
197
|
+
slowestExemplar;
|
|
175
198
|
// 三个维度的键空间都封在这些配额里 —— 没有它们,三张 Map 与各自的时长窗口都是无界的
|
|
176
199
|
capBudget;
|
|
177
200
|
modelBudget;
|
|
178
201
|
scoreBudget;
|
|
202
|
+
/**
|
|
203
|
+
* 归因标签维度(R8-P4):combo 键(`k=v` 逗号连,值经转义)→ 累加器。
|
|
204
|
+
* 与上面三个维度不同:这里**没有** per-combo 时长窗口(时长直方图 × 标签组合的内存
|
|
205
|
+
* 是 cap × windowSize 的另一份乘法,收益不抵代价),只有四个计数。
|
|
206
|
+
* ⚠️ 键是 `labelCombo()` 的产物:值里的 `,` / `=` / `\` 会被转义 —— 裸拼接会让
|
|
207
|
+
* 两个不同的标签集拼出同一个键(2026-09-27 ⑧ 实测:`a="x,b=y",b="z"` 与
|
|
208
|
+
* `a="x",b="y,b=z"` 撞成一个键 ⇒ 后者被并进前者的账、还按前者的标签渲染)。
|
|
209
|
+
*/
|
|
210
|
+
runLabels = new Map();
|
|
211
|
+
/** 每个配置的 labelKey 一本基数配额(构造时按 labelKeys 建齐) */
|
|
212
|
+
labelBudgets = new Map();
|
|
213
|
+
/**
|
|
214
|
+
* combo 键空间的配额(R8-P4 补课,2026-09-27 ⑧):**组合数**才是真正的基数维度 ——
|
|
215
|
+
* 每键一本配额只封住值域,combo 是叉乘(`(maxLabelValues+1)^labelKeys.length`),
|
|
216
|
+
* 缺省 100 键域 + 3 键就是一百万条常驻条目,而 `droppedLabelValues` 一行都看不见它。
|
|
217
|
+
*/
|
|
218
|
+
comboBudget;
|
|
179
219
|
constructor(opts) {
|
|
180
220
|
this.opts = opts;
|
|
181
221
|
this.runStat = new DurationStat(opts.windowSize, opts.buckets);
|
|
182
222
|
this.capBudget = new KeyBudget(opts.maxCapabilities);
|
|
183
223
|
this.modelBudget = new KeyBudget(opts.maxModels);
|
|
184
224
|
this.scoreBudget = new KeyBudget(opts.maxScores);
|
|
225
|
+
for (const key of opts.labelKeys) {
|
|
226
|
+
this.labelBudgets.set(key, new KeyBudget(opts.maxLabelValues));
|
|
227
|
+
}
|
|
228
|
+
this.comboBudget = new KeyBudget(opts.maxLabelCombos);
|
|
185
229
|
}
|
|
186
230
|
newCapability() {
|
|
187
231
|
return {
|
|
@@ -202,8 +246,10 @@ export class MetricsState {
|
|
|
202
246
|
}
|
|
203
247
|
accumulate(trace) {
|
|
204
248
|
this.runs++;
|
|
205
|
-
if (trace.status === 'error')
|
|
249
|
+
if (trace.status === 'error') {
|
|
206
250
|
this.failed++;
|
|
251
|
+
this.failedExemplar = { traceId: trace.traceId, spanId: trace.rootSpanId, at: Date.now() };
|
|
252
|
+
}
|
|
207
253
|
const u = trace.totalUsage;
|
|
208
254
|
this.tokens.input += u.inputTokens;
|
|
209
255
|
this.tokens.output += u.outputTokens;
|
|
@@ -212,8 +258,17 @@ export class MetricsState {
|
|
|
212
258
|
if (u.costEstimate != null)
|
|
213
259
|
this.costUsd += u.costEstimate;
|
|
214
260
|
const d = runDurationMs(trace);
|
|
215
|
-
if (d !== undefined)
|
|
261
|
+
if (d !== undefined) {
|
|
216
262
|
this.runStat.add(d);
|
|
263
|
+
if (this.slowestExemplar === undefined || d > this.slowestExemplar.durationMs) {
|
|
264
|
+
this.slowestExemplar = {
|
|
265
|
+
traceId: trace.traceId,
|
|
266
|
+
spanId: trace.rootSpanId,
|
|
267
|
+
durationMs: d,
|
|
268
|
+
at: Date.now(),
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
}
|
|
217
272
|
// —— 评分(R7):只认根 span 的 score 事件(attachScore 的写入位置);
|
|
218
273
|
// body 宽容读取 —— name 不是 string / value 不是有限 number 就跳过,观测不击穿业务
|
|
219
274
|
const rootSpan = trace.spans.find((s) => s.spanId === trace.rootSpanId);
|
|
@@ -237,6 +292,35 @@ export class MetricsState {
|
|
|
237
292
|
this.scores.set(key, acc);
|
|
238
293
|
}
|
|
239
294
|
}
|
|
295
|
+
// —— 归因标签(R8-P4):只在显式配置了 labelKeys 时记账。值从 run 根的
|
|
296
|
+
// `labels.<key>` 属性读(loop.ts 写入),缺键/非字符串一律按 '' 计(观测宽容读取,
|
|
297
|
+
// 不击穿业务);每个值先过它那一键的 KeyBudget,超限折叠进 `__other__`。
|
|
298
|
+
if (this.opts.labelKeys.length > 0 && rootSpan) {
|
|
299
|
+
const perKey = [];
|
|
300
|
+
for (const key of this.opts.labelKeys) {
|
|
301
|
+
const raw = rootSpan.attributes[`labels.${key}`];
|
|
302
|
+
const value = typeof raw === 'string' ? raw : '';
|
|
303
|
+
perKey.push([key, this.labelBudgets.get(key).take(value)]);
|
|
304
|
+
}
|
|
305
|
+
// combo 数上限(2026-09-27 ⑧):每键配额只封住值域,**组合数**是叉乘、才是真正的
|
|
306
|
+
// 基数维度(缺省 100 值域 × 3 键 = 一百万)。超限后**新的**组合全折进一个桶,
|
|
307
|
+
// 量照收、只丢标签粒度 —— 与另外三道上限同款,且折叠发生必须可见
|
|
308
|
+
// (`snapshot().droppedLabelCombos` / `dropped_keys{kind="label:combos"}`)。
|
|
309
|
+
const rawCombo = labelCombo(perKey);
|
|
310
|
+
const kept = this.comboBudget.take(rawCombo);
|
|
311
|
+
const pairs = kept === rawCombo
|
|
312
|
+
? perKey
|
|
313
|
+
: this.opts.labelKeys.map((key) => [key, OTHER_LABEL]);
|
|
314
|
+
const combo = kept === rawCombo ? rawCombo : labelCombo(pairs);
|
|
315
|
+
const acc = this.runLabels.get(combo) ?? { runs: 0, failed: 0, tokens: 0, costUsd: 0, pairs };
|
|
316
|
+
acc.runs++;
|
|
317
|
+
if (trace.status === 'error')
|
|
318
|
+
acc.failed++;
|
|
319
|
+
acc.tokens += u.inputTokens + u.outputTokens + u.cacheReadTokens + u.cacheCreationTokens;
|
|
320
|
+
if (u.costEstimate != null)
|
|
321
|
+
acc.costUsd += u.costEstimate;
|
|
322
|
+
this.runLabels.set(combo, acc);
|
|
323
|
+
}
|
|
240
324
|
for (const span of trace.spans) {
|
|
241
325
|
if (span.kind === 'capability') {
|
|
242
326
|
const label = this.labelFor(capabilityKindOf(span), span.name);
|
|
@@ -269,6 +353,7 @@ export class MetricsState {
|
|
|
269
353
|
tokens: 0,
|
|
270
354
|
costUsd: 0,
|
|
271
355
|
unpricedTurns: 0,
|
|
356
|
+
usageMissingTurns: 0,
|
|
272
357
|
stat: new DurationStat(this.opts.windowSize, this.opts.buckets),
|
|
273
358
|
};
|
|
274
359
|
acc.turns++;
|
|
@@ -288,7 +373,11 @@ export class MetricsState {
|
|
|
288
373
|
this.models.set(model, acc);
|
|
289
374
|
// 普通工具的耗时/成败在 turn 的 tool.output 事件上(E1)—— 能力指标的另一路数据源
|
|
290
375
|
for (const e of span.events) {
|
|
291
|
-
|
|
376
|
+
// 上游没报计量的回合(S2):与 unpriced **分开数** —— 那个是「模型没定价」,
|
|
377
|
+
// 这个是「上游没给读数」,排障方向不同
|
|
378
|
+
if (e.name === USAGE_MISSING_EVENT)
|
|
379
|
+
acc.usageMissingTurns++;
|
|
380
|
+
if (e.name !== TOOL_OUTPUT_EVENT)
|
|
292
381
|
continue;
|
|
293
382
|
const body = e.body;
|
|
294
383
|
if (!body || typeof body !== 'object' || typeof body.tool !== 'string')
|
|
@@ -327,6 +416,7 @@ export class MetricsState {
|
|
|
327
416
|
tokens: acc.tokens,
|
|
328
417
|
costUsd: acc.costUsd,
|
|
329
418
|
unpricedTurns: acc.unpricedTurns,
|
|
419
|
+
usageMissingTurns: acc.usageMissingTurns,
|
|
330
420
|
latencyP50: acc.stat.percentile(0.5),
|
|
331
421
|
latencyP95: acc.stat.percentile(0.95),
|
|
332
422
|
};
|
|
@@ -341,6 +431,19 @@ export class MetricsState {
|
|
|
341
431
|
const { name, source } = scoreLabels(key);
|
|
342
432
|
scoreOut[source === '' ? name : `${name}@${source}`] = { ...acc };
|
|
343
433
|
}
|
|
434
|
+
const runLabelOut = {};
|
|
435
|
+
for (const [combo, acc] of this.runLabels) {
|
|
436
|
+
runLabelOut[combo] = {
|
|
437
|
+
runs: acc.runs,
|
|
438
|
+
failed: acc.failed,
|
|
439
|
+
tokens: acc.tokens,
|
|
440
|
+
costUsd: acc.costUsd,
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
const droppedLabelValues = {};
|
|
444
|
+
for (const key of this.opts.labelKeys) {
|
|
445
|
+
droppedLabelValues[key] = this.labelBudgets.get(key).dropped;
|
|
446
|
+
}
|
|
344
447
|
return {
|
|
345
448
|
runs: this.runs,
|
|
346
449
|
failed: this.failed,
|
|
@@ -351,9 +454,24 @@ export class MetricsState {
|
|
|
351
454
|
capabilities: capabilityOut,
|
|
352
455
|
models: modelOut,
|
|
353
456
|
scores: scoreOut,
|
|
457
|
+
runLabels: runLabelOut,
|
|
458
|
+
droppedLabelValues,
|
|
459
|
+
droppedLabelCombos: this.comboBudget.dropped,
|
|
354
460
|
droppedCapabilities: this.capBudget.dropped,
|
|
355
461
|
droppedModels: this.modelBudget.dropped,
|
|
356
462
|
droppedScores: this.scoreBudget.dropped,
|
|
463
|
+
exemplars: {
|
|
464
|
+
failed: this.failedExemplar
|
|
465
|
+
? { traceId: this.failedExemplar.traceId, at: this.failedExemplar.at }
|
|
466
|
+
: undefined,
|
|
467
|
+
slowest: this.slowestExemplar
|
|
468
|
+
? {
|
|
469
|
+
traceId: this.slowestExemplar.traceId,
|
|
470
|
+
durationMs: this.slowestExemplar.durationMs,
|
|
471
|
+
at: this.slowestExemplar.at,
|
|
472
|
+
}
|
|
473
|
+
: undefined,
|
|
474
|
+
},
|
|
357
475
|
};
|
|
358
476
|
}
|
|
359
477
|
reset() {
|
|
@@ -369,12 +487,18 @@ export class MetricsState {
|
|
|
369
487
|
this.tokens.cacheRead = 0;
|
|
370
488
|
this.tokens.cacheCreation = 0;
|
|
371
489
|
this.runStat.reset();
|
|
490
|
+
this.failedExemplar = undefined;
|
|
491
|
+
this.slowestExemplar = undefined;
|
|
372
492
|
this.capabilities.clear();
|
|
373
493
|
this.models.clear();
|
|
374
494
|
this.scores.clear();
|
|
495
|
+
this.runLabels.clear();
|
|
375
496
|
this.capBudget.reset();
|
|
376
497
|
this.modelBudget.reset();
|
|
377
498
|
this.scoreBudget.reset();
|
|
499
|
+
for (const budget of this.labelBudgets.values())
|
|
500
|
+
budget.reset();
|
|
501
|
+
this.comboBudget.reset();
|
|
378
502
|
}
|
|
379
503
|
}
|
|
380
504
|
//# sourceMappingURL=metrics-state.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metrics-state.js","sourceRoot":"","sources":["../../src/integrations/metrics-state.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"metrics-state.js","sourceRoot":"","sources":["../../src/integrations/metrics-state.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { TraceSink } from '../core/trace.js';
|
|
2
2
|
import type { MetricsSnapshot } from './metrics-state.js';
|
|
3
|
-
export type { CapabilityMetrics, ModelMetrics, ScoreMetrics, MetricsSnapshot, } from './metrics-state.js';
|
|
3
|
+
export type { CapabilityMetrics, ExemplarSnapshot, ModelMetrics, ScoreMetrics, RunLabelMetrics, MetricsSnapshot, } from './metrics-state.js';
|
|
4
4
|
export { MetricsExportError } from './metrics-otlp.js';
|
|
5
5
|
/**
|
|
6
6
|
* Agentia —— 指标(D3 → 可观测下沉 E2/E3/E4/E5)。
|
|
@@ -22,16 +22,25 @@ export { MetricsExportError } from './metrics-otlp.js';
|
|
|
22
22
|
* - **histogram**(`*_bucket` / `*_sum` / `*_count`,累积语义)—— 抓取端可跨实例任意聚合;
|
|
23
23
|
* - **窗口内精确分位**(`*_last{quantile=...}` gauge)—— 单实例排障时更好读。
|
|
24
24
|
*
|
|
25
|
-
*
|
|
25
|
+
* **exemplars**(指标 → trace 的桥):记账时跟踪两个槽位 —— 失败 counter 挂「最近一次失败
|
|
26
|
+
* run」、run 时长 histogram 挂「迄今最慢的一次 run」(口径见 `MetricsSnapshot.exemplars`)。
|
|
27
|
+
* 出口:`'openmetrics'` 文本模式(样本行尾 `# {trace_id=…}`)与 OTLP(数据点原生
|
|
28
|
+
* exemplars 字段);缺省 `'prometheus'` 文本**不支持** exemplar,输出不含它。
|
|
29
|
+
*
|
|
30
|
+
* 零依赖:Prometheus/OpenMetrics 文本与 OTLP/JSON 都手写(纯文本 / JSON,不值得为此引客户端库)。
|
|
26
31
|
*/
|
|
27
32
|
export interface MetricsSinkOptions {
|
|
28
33
|
/**
|
|
29
34
|
* 输出形态:
|
|
30
35
|
* - `'prometheus'`(缺省)—— `render()` 出 Prometheus 文本,宿主挂到 `GET /metrics`;
|
|
31
|
-
* - `'
|
|
36
|
+
* - `'openmetrics'` —— 同为拉取式,但 `render()` 出 **OpenMetrics 文本**(样本行尾挂
|
|
37
|
+
* exemplar `# {trace_id="…"}`、文件以 `# EOF` 收尾)—— 「指标尖峰 → 那条 trace」的桥。
|
|
38
|
+
* 宿主需以 `application/openmetrics-text` 提供该端点(Prometheus 按 0.0.4 抓取会丢掉 exemplar);
|
|
39
|
+
* - `'otlp'` —— 用全局 `fetch` POST 到 `${endpoint}/v1/metrics`(OTLP/JSON,零依赖;
|
|
40
|
+
* exemplar 是 OTLP 的原生字段,随数据点一并发出)。
|
|
32
41
|
* 必须给 `endpoint`(不给就构造期抛错,比"静默不导出"好)。
|
|
33
42
|
*/
|
|
34
|
-
export?: 'prometheus' | 'otlp';
|
|
43
|
+
export?: 'prometheus' | 'openmetrics' | 'otlp';
|
|
35
44
|
/** `export:'otlp'` 的采集端基地址,例如 http://localhost:4318(尾部斜杠会被去掉) */
|
|
36
45
|
endpoint?: string;
|
|
37
46
|
/**
|
|
@@ -93,14 +102,61 @@ export interface MetricsSinkOptions {
|
|
|
93
102
|
* 条数 / 总和照常累加,被折叠的不同评分维度数见 `snapshot().droppedScores`。
|
|
94
103
|
*/
|
|
95
104
|
maxScores?: number;
|
|
105
|
+
/**
|
|
106
|
+
* 归因标签维度(R8-P4):**显式点名** run 根 `labels.<key>` 里的哪些键上指标标签,
|
|
107
|
+
* 缺省 `[]`(一个都不上 —— run 根属性照样记,只是不进指标)。
|
|
108
|
+
* 键必须是合法的 Prometheus 标签名(`/^[a-zA-Z_][a-zA-Z0-9_]*$/`),否则构造期抛错。
|
|
109
|
+
*
|
|
110
|
+
* 出口形态:`runs_total` / `runs_failed_total` / `tokens_total` / `cost_usd_total`
|
|
111
|
+
* 四个家族在全局样本之外**追加**带标签的样本(如 `runs_total{tenant="acme"}`)——
|
|
112
|
+
* 全局样本仍在(不带标签的那行就是总量)。⚠️ 查询侧注意:开了 labelKeys 后
|
|
113
|
+
* `sum(agentia_runs_total)` 会把全局行与分行**重复计数**,总量用不带标签的序列。
|
|
114
|
+
*
|
|
115
|
+
* ⚠️ 每个键的相异**值**数受 `maxLabelValues` 封顶,超出归入 `__other__`(折叠只丢
|
|
116
|
+
* 标签粒度不丢量,与 maxModels 同款)。光 opt-in 挡不住「我知道有几千租户、
|
|
117
|
+
* 我偏要上」—— sink 的内存不变量(上限 × 窗口 = 常驻内存上界)要求每个新基数
|
|
118
|
+
* 维度都有 cap,所以这道上限不可关。
|
|
119
|
+
*/
|
|
120
|
+
labelKeys?: readonly string[];
|
|
121
|
+
/**
|
|
122
|
+
* 每个 labelKey 的相异值数上限(缺省 100,**必须为正数**)。
|
|
123
|
+
* 超出后新值归入 `__other__`;被折叠的不同值数见 `snapshot().droppedLabelValues`。
|
|
124
|
+
*/
|
|
125
|
+
maxLabelValues?: number;
|
|
126
|
+
/**
|
|
127
|
+
* **标签组合数**上限(缺省 200,**必须为正数**)。
|
|
128
|
+
*
|
|
129
|
+
* 为什么需要它:`maxLabelValues` 封的是**每个键的值域**,而进内存的是键的组合 ——
|
|
130
|
+
* 组合数是叉乘(`(maxLabelValues+1)^labelKeys.length`),缺省值域 100 配 3 个键就是
|
|
131
|
+
* 一百万条常驻条目,且 `droppedLabelValues` 只报每键的折叠数、看不出组合已经爆了
|
|
132
|
+
* (2026-09-27 ⑧ 实测的静默失效)。这道上限与 `maxCapabilities` / `maxModels` /
|
|
133
|
+
* `maxScores` 同款:超限后**新的组合**折叠进一个全 `__other__` 的桶(量照收,只丢
|
|
134
|
+
* 标签粒度),被折叠的组合数见 `snapshot().droppedLabelCombos` 与
|
|
135
|
+
* `agentia_dropped_keys{kind="label:combos"}`。**不可关** —— 内存不变量要求每个新
|
|
136
|
+
* 基数维度都有 cap,opt-in 挡不住「明知有几千租户偏要上」。
|
|
137
|
+
*
|
|
138
|
+
* 单键配置(最常见)下组合数 ≈ 值数,这道上限不改变行为。
|
|
139
|
+
*/
|
|
140
|
+
maxLabelCombos?: number;
|
|
96
141
|
/** 时长直方图的桶边界(毫秒,升序);缺省见 DEFAULT_BUCKETS */
|
|
97
142
|
buckets?: readonly number[];
|
|
98
143
|
}
|
|
99
144
|
export interface MetricsSink extends TraceSink {
|
|
100
145
|
snapshot(): MetricsSnapshot;
|
|
101
|
-
/**
|
|
146
|
+
/**
|
|
147
|
+
* 文本格式渲染(零依赖手写):`export:'prometheus'`(缺省)出 `text/plain; version=0.0.4`,
|
|
148
|
+
* `export:'openmetrics'` 出 OpenMetrics 文本(带 exemplar、以 `# EOF` 收尾)。
|
|
149
|
+
* 宿主端点直接读 `contentType` 当响应头即可(框架内置的 `/metrics` 路由就是这么做的)。
|
|
150
|
+
*/
|
|
102
151
|
render(): string;
|
|
103
|
-
/**
|
|
152
|
+
/**
|
|
153
|
+
* `render()` 产物的 Content-Type(随 `export` 模式走):内置 `/metrics` 路由读它发响应头,
|
|
154
|
+
* 自己挂端点时也该读它而不是写死 —— 0.0.4 与 OpenMetrics 不是可互换的两种写法,
|
|
155
|
+
* 拿 0.0.4 的头去发带 exemplar 的文本,严格的抓取端会解析失败。
|
|
156
|
+
* (可选是为了向后兼容手写的 MetricsSink 实现;本工厂返回的一定带。)
|
|
157
|
+
*/
|
|
158
|
+
readonly contentType?: string;
|
|
159
|
+
/** 主动导出一次(`export:'otlp'` 时有意义;prometheus/openmetrics 拉取式为空操作)。失败按 onExportError 处理 */
|
|
104
160
|
flush(): Promise<void>;
|
|
105
161
|
/** 停掉定时导出(进程收尾 / 测试用) */
|
|
106
162
|
stop(): void;
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { zeroClauseOf } from '../core/limits.js';
|
|
1
2
|
import { MetricsState } from './metrics-state.js';
|
|
2
|
-
import { renderPrometheus } from './metrics-render.js';
|
|
3
|
+
import { renderOpenMetrics, renderPrometheus } from './metrics-render.js';
|
|
3
4
|
import { flushOtlpMetrics } from './metrics-otlp.js';
|
|
4
5
|
export { MetricsExportError } from './metrics-otlp.js';
|
|
5
6
|
const DEFAULT_WINDOW = 1024;
|
|
@@ -8,14 +9,28 @@ const DEFAULT_MAX_CAPABILITIES = 200;
|
|
|
8
9
|
const DEFAULT_MAX_MODELS = 50;
|
|
9
10
|
/** 评分维度 = `name@source`,一个应用的 eval 个数是有限的,默认与能力同宽 */
|
|
10
11
|
const DEFAULT_MAX_SCORES = 200;
|
|
12
|
+
/**
|
|
13
|
+
* 归因标签每个键的相异值上限缺省 100(R8-P4):比模型键宽(租户天然比模型多),
|
|
14
|
+
* 又足够小 —— 真有几千租户的部署应该靠 `__other__` 折叠 + droppedLabelValues 报警发现,
|
|
15
|
+
* 而不是把 Prometheus 与 sink 内存一起打爆
|
|
16
|
+
*/
|
|
17
|
+
const DEFAULT_MAX_LABEL_VALUES = 100;
|
|
18
|
+
/**
|
|
19
|
+
* 标签**组合数**缺省上限。取 200 而不是与 `maxLabelValues` 同值(100):单键配置下
|
|
20
|
+
* 组合数 ≈ 值数(100 < 200,行为不变),多键配置才是它的用武之地 —— 上限是
|
|
21
|
+
* 「上限 × 窗口 = 常驻内存」这条不变量里缺的那一角,宁可给够正常用量也不要紧到误折。
|
|
22
|
+
*/
|
|
23
|
+
const DEFAULT_MAX_LABEL_COMBOS = 200;
|
|
24
|
+
/** Prometheus 标签名的合法形状(labelKeys 的构造期校验按它) */
|
|
25
|
+
const LABEL_NAME_RE = /^[a-zA-Z_][a-zA-Z0-9_]*$/;
|
|
11
26
|
/** 缺省时长桶(毫秒):覆盖"工具几十毫秒 → run 几十秒"的常见区间 */
|
|
12
27
|
export const DEFAULT_BUCKETS = [
|
|
13
28
|
25, 50, 100, 250, 500, 1000, 2500, 5000, 10000, 30000,
|
|
14
29
|
];
|
|
15
30
|
export function metricsSink(opts = {}) {
|
|
16
31
|
const format = opts.export ?? 'prometheus';
|
|
17
|
-
if (format !== 'prometheus' && format !== 'otlp') {
|
|
18
|
-
throw new Error(`metricsSink: export 只支持 'prometheus' | 'otlp',收到 ${String(format)}`);
|
|
32
|
+
if (format !== 'prometheus' && format !== 'openmetrics' && format !== 'otlp') {
|
|
33
|
+
throw new Error(`metricsSink: export 只支持 'prometheus' | 'openmetrics' | 'otlp',收到 ${String(format)}`);
|
|
19
34
|
}
|
|
20
35
|
const otlpEndpoint = opts.endpoint?.replace(/\/+$/, '');
|
|
21
36
|
if (format === 'otlp' && !otlpEndpoint) {
|
|
@@ -23,19 +38,37 @@ export function metricsSink(opts = {}) {
|
|
|
23
38
|
}
|
|
24
39
|
const windowSize = opts.windowSize ?? DEFAULT_WINDOW;
|
|
25
40
|
if (!(windowSize > 0)) {
|
|
26
|
-
throw new Error(`metricsSink: windowSize
|
|
41
|
+
throw new Error(`metricsSink: windowSize 必须为正数(${zeroClauseOf('metricsSink.windowSize')}),收到 ${opts.windowSize}`);
|
|
27
42
|
}
|
|
28
43
|
const maxCapabilities = opts.maxCapabilities ?? DEFAULT_MAX_CAPABILITIES;
|
|
29
44
|
if (!(maxCapabilities > 0)) {
|
|
30
|
-
throw new Error(`metricsSink: maxCapabilities
|
|
45
|
+
throw new Error(`metricsSink: maxCapabilities 必须为正数(${zeroClauseOf('metricsSink.maxCapabilities')}),收到 ${opts.maxCapabilities}`);
|
|
31
46
|
}
|
|
32
47
|
const maxModels = opts.maxModels ?? DEFAULT_MAX_MODELS;
|
|
33
48
|
if (!(maxModels > 0)) {
|
|
34
|
-
throw new Error(`metricsSink: maxModels
|
|
49
|
+
throw new Error(`metricsSink: maxModels 必须为正数(${zeroClauseOf('metricsSink.maxModels')}),收到 ${opts.maxModels}`);
|
|
35
50
|
}
|
|
36
51
|
const maxScores = opts.maxScores ?? DEFAULT_MAX_SCORES;
|
|
37
52
|
if (!(maxScores > 0)) {
|
|
38
|
-
throw new Error(`metricsSink: maxScores
|
|
53
|
+
throw new Error(`metricsSink: maxScores 必须为正数(${zeroClauseOf('metricsSink.maxScores')}),收到 ${opts.maxScores}`);
|
|
54
|
+
}
|
|
55
|
+
const maxLabelValues = opts.maxLabelValues ?? DEFAULT_MAX_LABEL_VALUES;
|
|
56
|
+
if (!(maxLabelValues > 0)) {
|
|
57
|
+
throw new Error(`metricsSink: maxLabelValues 必须为正数(${zeroClauseOf('metricsSink.maxLabelValues')}),收到 ${opts.maxLabelValues}`);
|
|
58
|
+
}
|
|
59
|
+
const maxLabelCombos = opts.maxLabelCombos ?? DEFAULT_MAX_LABEL_COMBOS;
|
|
60
|
+
if (!(maxLabelCombos > 0)) {
|
|
61
|
+
throw new Error(`metricsSink: maxLabelCombos 必须为正数(${zeroClauseOf('metricsSink.maxLabelCombos')}),收到 ${opts.maxLabelCombos}`);
|
|
62
|
+
}
|
|
63
|
+
const labelKeys = [];
|
|
64
|
+
for (const k of opts.labelKeys ?? []) {
|
|
65
|
+
if (typeof k !== 'string' || !LABEL_NAME_RE.test(k)) {
|
|
66
|
+
throw new Error(`metricsSink: labelKeys 必须是合法的 Prometheus 标签名(/^[a-zA-Z_][a-zA-Z0-9_]*$/),收到 ${JSON.stringify(k)}`);
|
|
67
|
+
}
|
|
68
|
+
if (labelKeys.includes(k)) {
|
|
69
|
+
throw new Error(`metricsSink: labelKeys 有重复的键 ${JSON.stringify(k)}`);
|
|
70
|
+
}
|
|
71
|
+
labelKeys.push(k);
|
|
39
72
|
}
|
|
40
73
|
const labelMode = opts.labelMode ?? 'capability';
|
|
41
74
|
const buckets = opts.buckets ?? DEFAULT_BUCKETS;
|
|
@@ -55,9 +88,12 @@ export function metricsSink(opts = {}) {
|
|
|
55
88
|
maxScores,
|
|
56
89
|
labelMode,
|
|
57
90
|
buckets,
|
|
91
|
+
labelKeys,
|
|
92
|
+
maxLabelValues,
|
|
93
|
+
maxLabelCombos,
|
|
58
94
|
});
|
|
59
95
|
const snapshot = () => state.snapshot();
|
|
60
|
-
const render = () => renderPrometheus(state, p);
|
|
96
|
+
const render = () => format === 'openmetrics' ? renderOpenMetrics(state, p) : renderPrometheus(state, p);
|
|
61
97
|
const flush = async () => {
|
|
62
98
|
if (format !== 'otlp')
|
|
63
99
|
return; // prometheus 模式:拉取式,无主动导出
|
|
@@ -94,6 +130,11 @@ export function metricsSink(opts = {}) {
|
|
|
94
130
|
},
|
|
95
131
|
snapshot,
|
|
96
132
|
render,
|
|
133
|
+
// 与 render() 同源:0.0.4 与 OpenMetrics 不可互换(后者带 exemplar、以 # EOF 收尾),
|
|
134
|
+
// 内置 /metrics 路由与本对象自带的 contentType 必须永远一致 ⇒ 只在这里写一次。
|
|
135
|
+
contentType: format === 'openmetrics'
|
|
136
|
+
? 'application/openmetrics-text; version=1.0.0; charset=utf-8'
|
|
137
|
+
: 'text/plain; version=0.0.4; charset=utf-8',
|
|
97
138
|
flush,
|
|
98
139
|
stop() {
|
|
99
140
|
if (timer)
|