From 735bbca056b61829b4aaf5e0373aef5785a2fa14 Mon Sep 17 00:00:00 2001 From: Rey Abolofia Date: Tue, 14 May 2024 14:33:42 -0700 Subject: [PATCH] Capture and handle errors during serialize. --- src/utils/tag-object.spec.ts | 17 +++++++++++++++++ src/utils/tag-object.ts | 10 +++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/utils/tag-object.spec.ts b/src/utils/tag-object.spec.ts index 943fc492..7f5f3a44 100644 --- a/src/utils/tag-object.spec.ts +++ b/src/utils/tag-object.spec.ts @@ -99,6 +99,23 @@ describe("tagObject", () => { ["function.request.vals.1", '{"thingTwo":2}'], ]); }); + it("handles circular objects", () => { + const span = { + setTag, + }; + var obj = { + key: "value", + array: Array(), + }; + obj.array.push(obj); + tagObject(span, "lambda_payload", { request: obj }, 1); + expect(setTag.mock.calls).toEqual([ + ["lambda_payload.request.key", "value"], + ["lambda_payload.request.array.0.key", "value"], + ["lambda_payload.request.array.0.array.0.key", "value"], + ["lambda_payload.request.array.0.array.0.array.0.key", "value"], + ]); + }); it("redacts common secret keys", () => { const span = { setTag, diff --git a/src/utils/tag-object.ts b/src/utils/tag-object.ts index 423b3590..c0b3099f 100644 --- a/src/utils/tag-object.ts +++ b/src/utils/tag-object.ts @@ -1,3 +1,5 @@ +import { logDebug } from "./log"; + const redactableKeys = ["authorization", "x-authorization", "password", "token"]; export function tagObject(currentSpan: any, key: string, obj: any, depth = 0, maxDepth = 10): any { @@ -6,7 +8,13 @@ export function tagObject(currentSpan: any, key: string, obj: any, depth = 0, ma return currentSpan.setTag(key, obj); } if (depth >= maxDepth) { - const strOrUndefined = JSON.stringify(obj); + let strOrUndefined; + try { + strOrUndefined = JSON.stringify(obj); + } catch (e) { + logDebug(`Unable to stringify object for tagging: ${e}`); + return; + } if (typeof strOrUndefined === "undefined") return; return currentSpan.setTag(key, redactVal(key, strOrUndefined.substring(0, 5000))); }