






















@@ -35,6 +35,72 @@ describe("qa-otel-smoke receiver bounds", () => {
3535);
3636});
373738+function makePassingSmokeAssertionInput(): Parameters<typeof testing.assertSmoke>[0] {
39+return {
40+bodyText: {
41+logs: ["diagnostics-otel: logs exporter enabled"],
42+},
43+childExitCode: 0,
44+disallowedBodyNeedles: ["OTEL-QA-SECRET"],
45+logRecords: [
46+{
47+body: "diagnostics-otel: logs exporter enabled",
48+traceId: "trace",
49+spanId: "span",
50+},
51+],
52+metrics: [{ name: "openclaw.harness.duration_ms" }],
53+requests: [
54+{
55+path: "/v1/traces",
56+signal: "traces",
57+bytes: 16,
58+contentEncoding: undefined,
59+status: 200,
60+spanCount: 5,
61+metricCount: 0,
62+logCount: 0,
63+},
64+{
65+path: "/v1/metrics",
66+signal: "metrics",
67+bytes: 16,
68+contentEncoding: undefined,
69+status: 200,
70+spanCount: 0,
71+metricCount: 1,
72+logCount: 0,
73+},
74+{
75+path: "/v1/logs",
76+signal: "logs",
77+bytes: 16,
78+contentEncoding: undefined,
79+status: 200,
80+spanCount: 0,
81+metricCount: 0,
82+logCount: 1,
83+},
84+],
85+spans: [
86+{ name: "openclaw.run", parent: false, attributes: {} },
87+{ name: "openclaw.harness.run", parent: true, attributes: {} },
88+{ name: "openclaw.context.assembled", parent: true, attributes: {} },
89+{ name: "openclaw.message.delivery", parent: true, attributes: {} },
90+{
91+name: "chat gpt-5.5",
92+parent: true,
93+attributes: {
94+"gen_ai.operation.name": "chat",
95+"gen_ai.request.model": "gpt-5.5",
96+"openclaw.model": "gpt-5.5",
97+"openclaw.provider": "openai",
98+},
99+},
100+],
101+};
102+}
103+38104it("accepts package-manager forwarded arguments", () => {
39105expect(
40106testing.parseArgs([
@@ -232,74 +298,41 @@ describe("qa-otel-smoke receiver bounds", () => {
232298});
233299234300it("allows safe operational OTLP log bodies while leak checks inspect raw payloads", () => {
235-const assertion = testing.assertSmoke({
236-bodyText: {
237-logs: ["diagnostics-otel: logs exporter enabled"],
238-},
239-childExitCode: 0,
240-disallowedBodyNeedles: ["OTEL-QA-SECRET"],
241-logRecords: [
242-{
243-body: "diagnostics-otel: logs exporter enabled",
244-traceId: "trace",
245-spanId: "span",
246-},
247-],
248-metrics: [{ name: "openclaw.harness.duration_ms" }],
249-requests: [
250-{
251-path: "/v1/traces",
252-signal: "traces",
253-bytes: 16,
254-contentEncoding: undefined,
255-status: 200,
256-spanCount: 5,
257-metricCount: 0,
258-logCount: 0,
259-},
260-{
261-path: "/v1/metrics",
262-signal: "metrics",
263-bytes: 16,
264-contentEncoding: undefined,
265-status: 200,
266-spanCount: 0,
267-metricCount: 1,
268-logCount: 0,
269-},
270-{
271-path: "/v1/logs",
272-signal: "logs",
273-bytes: 16,
274-contentEncoding: undefined,
275-status: 200,
276-spanCount: 0,
277-metricCount: 0,
278-logCount: 1,
279-},
280-],
281-spans: [
282-{ name: "openclaw.run", parent: false, attributes: {} },
283-{ name: "openclaw.harness.run", parent: true, attributes: {} },
284-{ name: "openclaw.context.assembled", parent: true, attributes: {} },
285-{ name: "openclaw.message.delivery", parent: true, attributes: {} },
286-{
287-name: "chat gpt-5.5",
288-parent: true,
289-attributes: {
290-"gen_ai.operation.name": "chat",
291-"gen_ai.request.model": "gpt-5.5",
292-"openclaw.model": "gpt-5.5",
293-"openclaw.provider": "openai",
294-},
295-},
296-],
297-});
301+const assertion = testing.assertSmoke(makePassingSmokeAssertionInput());
298302299303expect(assertion.passed).toBe(true);
300304expect(assertion.failures).toEqual([]);
301305});
302306307+it("still fails when OTLP log payload text leaks scenario content", () => {
308+const input = makePassingSmokeAssertionInput();
309+input.bodyText = {
310+logs: ["diagnostics-otel: log payload contains OTEL-QA-SECRET"],
311+};
312+313+const assertion = testing.assertSmoke(input);
314+315+expect(assertion.passed).toBe(false);
316+expect(assertion.failures).toContain("OTLP logs payload leaked content: OTEL-QA-SECRET");
317+expect(assertion.leakContexts.logs?.[0]).toContain("[needle]");
318+});
319+320+it("still requires OTLP log records to carry trace correlation", () => {
321+const input = makePassingSmokeAssertionInput();
322+input.logRecords = [
323+{
324+body: "diagnostics-otel: logs exporter enabled",
325+traceId: "",
326+spanId: "",
327+},
328+];
329+330+const assertion = testing.assertSmoke(input);
331+332+expect(assertion.passed).toBe(false);
333+expect(assertion.failures).toContain("no OTLP log records included trace/span correlation ids");
334+});
335+303336it("preserves leak markers even when later body text is truncated", () => {
304337const captured: { traces?: string[] } = {};
305338此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。