From a83e956754c9475886e8df2cf4ffe816114ff2ad Mon Sep 17 00:00:00 2001 From: Diogo Sobral Date: Mon, 4 Aug 2025 12:42:22 +0100 Subject: [PATCH] Update datadog serializer to properly handle non-object errors --- src/index.js | 9 ++++++++- test/src/index.test.js | 26 ++++++++++++++++++++++++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/index.js b/src/index.js index bf1fb2a..b3b9495 100644 --- a/src/index.js +++ b/src/index.js @@ -4,7 +4,7 @@ * Module dependencies. */ -const { cloneDeep, cloneDeepWith, escapeRegExp, get, set } = require('lodash'); +const { cloneDeep, cloneDeepWith, escapeRegExp, get, isPlainObject, set } = require('lodash'); const { serializeError: errorSerializer } = require('serialize-error'); const stringify = require('json-stringify-safe'); const traverse = require('traverse'); @@ -214,6 +214,13 @@ module.exports.anonymizer = ( */ function datadogErrorSerializer(error) { + if (!isPlainObject(error)) { + return { + details: error, + kind: 'Error' + }; + } + return { ...error, kind: error.name || 'Error' diff --git a/test/src/index.test.js b/test/src/index.test.js index a8aef56..6aea549 100644 --- a/test/src/index.test.js +++ b/test/src/index.test.js @@ -832,9 +832,21 @@ describe('Anonymizer', () => { const serializer = jest.fn(builtinSerializers.datadogError); const serializers = [ { path: 'err', serializer }, + { path: 'errArr', serializer }, + { path: 'errStr', serializer }, { path: 'error', serializer } ]; - const whitelist = ['error.foo', 'error.kind', 'error.message', 'error.name', 'error.stack']; + const whitelist = [ + 'errArr.details.*', + 'errArr.kind', + 'errStr.details', + 'errStr.kind', + 'error.foo', + 'error.kind', + 'error.message', + 'error.name', + 'error.stack' + ]; const anonymize = anonymizer({ whitelist }, { serializers }); const result = anonymize({ @@ -842,16 +854,26 @@ describe('Anonymizer', () => { err: { statusCode: 400 }, + errArr: ['foo', 'bar'], + errStr: 'foobar', error, error2: error, foo: 'bar' }); - expect(serializer).toHaveBeenCalledTimes(2); + expect(serializer).toHaveBeenCalledTimes(4); expect(result.err).toEqual({ kind: '--REDACTED--', statusCode: '--REDACTED--' }); + expect(result.errArr).toEqual({ + details: ['foo', 'bar'], + kind: 'Error' + }); + expect(result.errStr).toEqual({ + details: 'foobar', + kind: 'Error' + }); expect(result.error).toEqual({ kind: 'Error', message: 'foobar',