From 8481d977bb952f6fa99dcbebc1026c5603c2794d Mon Sep 17 00:00:00 2001 From: Spencer Date: Wed, 15 Apr 2026 15:48:15 +0000 Subject: [PATCH] fix: add back global string limit gracefully returning a valid json string --- packages/core/src/telemetry/trace.test.ts | 17 +++++++++++++++++ packages/core/src/telemetry/trace.ts | 8 ++++++++ 2 files changed, 25 insertions(+) diff --git a/packages/core/src/telemetry/trace.test.ts b/packages/core/src/telemetry/trace.test.ts index e9d2dc47dd..41bba1a3df 100644 --- a/packages/core/src/telemetry/trace.test.ts +++ b/packages/core/src/telemetry/trace.test.ts @@ -124,6 +124,23 @@ describe('truncateForTelemetry', () => { ); }); + it('should enforce a global payload string limit without breaking JSON', () => { + const obj = { + a: 'x'.repeat(100), + b: 'y'.repeat(100), + }; + // Capping global string length to 50 + const result = truncateForTelemetry(obj, 100, 100, 4, 50) as string; + + // It should replace the entire object with a valid JSON string indicating truncation + expect(result).toBe( + '"[TRUNCATED: Payload exceeded global limit of 50 characters. Original length: 215]"', + ); + + // Prove it remains perfectly parseable JSON + expect(() => JSON.parse(result)).not.toThrow(); + }); + it('should stringify objects unchanged if within maxLength', () => { const obj = { a: 1 }; expect(truncateForTelemetry(obj, 100)).toBe(JSON.stringify(obj)); diff --git a/packages/core/src/telemetry/trace.ts b/packages/core/src/telemetry/trace.ts index bd9b32c119..fc323961ac 100644 --- a/packages/core/src/telemetry/trace.ts +++ b/packages/core/src/telemetry/trace.ts @@ -67,6 +67,7 @@ export function truncateForTelemetry( maxStringLength = 10000, maxArrayLength = 100, maxDepth = 4, + maxGlobalStringLength = 50000, ): AttributeValue | undefined { const truncateObj = (v: unknown, depth: number): unknown => { if (typeof v === 'string') { @@ -149,6 +150,13 @@ export function truncateForTelemetry( const stringified = safeJsonStringify(truncated); + if (stringified.length > maxGlobalStringLength) { + const graphemes = Array.from(stringified); + if (graphemes.length > maxGlobalStringLength) { + return `"[TRUNCATED: Payload exceeded global limit of ${maxGlobalStringLength} characters. Original length: ${graphemes.length}]"`; + } + } + return stringified as AttributeValue; }