export type Labels = Record; export declare class Metrics { private counters; private gauges; private dynamic; private histos; counter(name: string, help: string): void; gauge(name: string, help: string): void; dynamicGauge(name: string, help: string, fn: () => number): void; histogram(name: string, help: string, buckets?: number[]): void; inc(name: string, labels?: Labels, n?: number): void; setGauge(name: string, value: number, labels?: Labels): void; addGauge(name: string, delta: number, labels?: Labels): void; observe(name: string, value: number, labels?: Labels): void; /** [ref] 2-j:dynamic gauge 求值抛错不再折成 0 —— 0 是该 gauge 的合法读数,折 0 让故障态与真实 0 * 在 wire 上逐字节不可区分(与上方 inc 静默 no-op 同族:观测面的 fail-silent 正是观测要消灭的东西)。 * 披露方向:错帧**不发样本行**(缺席=读数未知,面板显示 no data 而非假 0)+ 计 * `metric_gauge_eval_errors_total{name}`(响亮、可告警)。每次求值(每次刮取/snapshot)错一次计一次; * 仍然绝不 propagate(/metrics 不因单个读数器坏而 500)。 */ private evalDynamic; /** Prometheus text exposition (content-type text/plain; version=0.0.4). */ render(): string; /** Structured snapshot of the whole registry — the OTLP exporter maps this to OTel data points * (counters→Sum monotonic, gauges/dynamic→Gauge, histograms→Histogram). Read-only copy. */ snapshot(): MetricSnapshot; /** Curated health summary (friendly JSON) for a lightweight fleet dashboard — the sema-registry's * fleet page fetches this per worker and renders cards + computes rates over polls (no Prometheus * needed). Counters are cumulative totals; histograms are reported as averages (sum/count). */ summarize(): MetricsSummary; } /** S-451:`/metrics/summary` 上「失败最多的路由」保留几条。看板要的是**头部**,不是全表; * `routeLabel` 的值域本来就有界(路由声明表 + `"other"`),这个上限只是让这张脸的大小与路由表长解耦。 */ export declare const HTTP_ERROR_ROUTE_TOP_N = 10; export interface MetricsSummary { runsActive: number; tasks: Record; tokensTotal: number; costUsd: number; costUsdByModel: Record; /** true ⇒ 窗口内有 cost 未知的 brain.call(unpriced 部署),costUsd/costUsdByModel 是下界(D5)。 */ costUnknown: boolean; unpricedCalls: number; taskDurationAvgSec: number | null; brainFirstTokenAvgMs: number | null; brainCallAvgMs: number | null; cacheHitRateAvg: number | null; promptCacheLowHit: number; rateLimited: number; costQuotaRejected: number; budgetExceeded: Record; /** 答后撞顶(walltime/turns)的计数。⚠️ 与 {@link budgetExceeded} **口径不同**:本枚在 deps 级通告席上铸, * 覆盖**每一条**引擎 run(后台子代 / 委派嵌套腿 / leader 车道);`budgetExceeded` 只由 HTTP 提交腿的 * `finalizeTaskResult` 递增(= 顶层 HTTP 提交的 run)。两枚相加只在后者那个较窄的总体里成立。 */ limitCeilingAfterAnswer: Record; degraded: Record; degenerate: Record; memoryConsolidationOps: Record; planCacheRecurrence: { tasks: number; hits: number; hitRate: number | null; }; cascade: Record; verifications: Record; councilRuns: Record; toolErrors: Record; /** S-451(additive,7.87.0):窗内 HTTP **失败**请求数,按状态码**类**聚合 —— 键只有 `"4xx"` / `"5xx"` * 两种,2xx/3xx 一格不进。⚠️ `"4xx"` 里**含 `499`**(本仓给「客户端在响应结束前断连」铸的标签, * SSE 长连接上是常态)—— 看一场真风暴时按 {@link httpErrorsByRoute} 分辨是哪条腿。 * 空对象 = 窗内零失败(与 `tasks`/`toolErrors` 同律:键恒在场,不用缺席表示零)。 */ httpErrorsByClass: Record; /** S-451(additive,7.87.0):失败(4xx+5xx 合计)最多的前 {@link HTTP_ERROR_ROUTE_TOP_N} 条 **route 标签** * (`routeLabel` 的低基数形,id 已折成 `:id`;未命中路由表的落 `"other"`)。按计数降序。 * 这是「180 次 404 到底打在哪」的那一格。 */ httpErrorsByRoute: Record; } export interface MetricSnapshot { counters: Array<{ name: string; help: string; series: Array<{ labels: Labels; value: number; }>; }>; gauges: Array<{ name: string; help: string; series: Array<{ labels: Labels; value: number; }>; }>; histograms: Array<{ name: string; help: string; buckets: number[]; series: Array<{ labels: Labels; counts: number[]; sum: number; count: number; }>; }>; } /** Register the service's standard metric set. */ export declare function createMetrics(): Metrics; //# sourceMappingURL=metrics.d.ts.map