






















@@ -2478,6 +2478,118 @@ describe("diagnostics-otel service", () => {
24782478await service.stop?.(ctx);
24792479});
248024802481+test("exports session recovery and talk metrics with bounded attributes", async () => {
2482+const service = createDiagnosticsOtelService();
2483+const ctx = createOtelContext(OTEL_TEST_ENDPOINT, { metrics: true });
2484+await service.start(ctx);
2485+2486+emitTrustedDiagnosticEvent({
2487+type: "session.recovery.requested",
2488+sessionId: "session-should-not-export",
2489+sessionKey: "key-should-not-export",
2490+state: "processing",
2491+ageMs: 12_000,
2492+reason: "startup-sweep",
2493+activeWorkKind: "tool_call",
2494+allowActiveAbort: true,
2495+});
2496+emitTrustedDiagnosticEvent({
2497+type: "session.recovery.completed",
2498+sessionId: "session-should-not-export",
2499+sessionKey: "key-should-not-export",
2500+state: "processing",
2501+ageMs: 13_000,
2502+reason: "startup-sweep",
2503+activeWorkKind: "tool_call",
2504+status: "released",
2505+action: "abort-active-run",
2506+});
2507+emitTrustedDiagnosticEvent({
2508+type: "talk.event",
2509+sessionId: "talk-session-should-not-export",
2510+turnId: "turn-should-not-export",
2511+talkEventType: "input.audio.delta",
2512+mode: "realtime",
2513+transport: "gateway-relay",
2514+brain: "agent-consult",
2515+provider: "openai",
2516+byteLength: 320,
2517+});
2518+emitTrustedDiagnosticEvent({
2519+type: "talk.event",
2520+sessionId: "talk-session-should-not-export",
2521+talkEventType: "latency.metrics",
2522+mode: "realtime",
2523+transport: "gateway-relay",
2524+brain: "agent-consult",
2525+provider: "openai",
2526+durationMs: 45,
2527+});
2528+await flushDiagnosticEvents();
2529+2530+expect(
2531+telemetryState.counters.get("openclaw.session.recovery.requested")?.add,
2532+).toHaveBeenCalledWith(
2533+1,
2534+expect.objectContaining({
2535+"openclaw.state": "processing",
2536+"openclaw.action": "abort",
2537+"openclaw.active_work_kind": "tool_call",
2538+}),
2539+);
2540+expect(
2541+telemetryState.counters.get("openclaw.session.recovery.completed")?.add,
2542+).toHaveBeenCalledWith(
2543+1,
2544+expect.objectContaining({
2545+"openclaw.state": "processing",
2546+"openclaw.status": "released",
2547+"openclaw.action": "abort-active-run",
2548+}),
2549+);
2550+expect(
2551+telemetryState.histograms.get("openclaw.session.recovery.age_ms")?.record,
2552+).toHaveBeenCalledWith(
2553+13_000,
2554+expect.objectContaining({
2555+"openclaw.status": "released",
2556+}),
2557+);
2558+expect(telemetryState.counters.get("openclaw.talk.event")?.add).toHaveBeenCalledWith(1, {
2559+"openclaw.talk.brain": "agent-consult",
2560+"openclaw.talk.event_type": "input.audio.delta",
2561+"openclaw.talk.mode": "realtime",
2562+"openclaw.talk.provider": "openai",
2563+"openclaw.talk.transport": "gateway-relay",
2564+});
2565+expect(telemetryState.histograms.get("openclaw.talk.audio.bytes")?.record).toHaveBeenCalledWith(
2566+320,
2567+{
2568+"openclaw.talk.brain": "agent-consult",
2569+"openclaw.talk.event_type": "input.audio.delta",
2570+"openclaw.talk.mode": "realtime",
2571+"openclaw.talk.provider": "openai",
2572+"openclaw.talk.transport": "gateway-relay",
2573+},
2574+);
2575+expect(
2576+telemetryState.histograms.get("openclaw.talk.event.duration_ms")?.record,
2577+).toHaveBeenCalledWith(45, {
2578+"openclaw.talk.brain": "agent-consult",
2579+"openclaw.talk.event_type": "latency.metrics",
2580+"openclaw.talk.mode": "realtime",
2581+"openclaw.talk.provider": "openai",
2582+"openclaw.talk.transport": "gateway-relay",
2583+});
2584+2585+const talkCounterCalls = JSON.stringify(
2586+telemetryState.counters.get("openclaw.talk.event")?.add.mock.calls,
2587+);
2588+expect(talkCounterCalls).not.toContain("talk-session-should-not-export");
2589+expect(talkCounterCalls).not.toContain("turn-should-not-export");
2590+await service.stop?.(ctx);
2591+});
2592+24812593test("does not export model or tool content unless capture is explicitly enabled", async () => {
24822594const service = createDiagnosticsOtelService();
24832595const ctx = createOtelContext(OTEL_TEST_ENDPOINT, { traces: true, metrics: true });
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。