From 84816b4949d4f4a58ed5b8d8c75f1f24255738bb Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Thu, 17 Oct 2024 08:38:30 +0000 Subject: [PATCH 1/3] perf(node): Truncate breadcrumb messages created by console integration --- packages/node/src/integrations/console.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/node/src/integrations/console.ts b/packages/node/src/integrations/console.ts index 5cd2eb2ce98a..3a7c246463f4 100644 --- a/packages/node/src/integrations/console.ts +++ b/packages/node/src/integrations/console.ts @@ -5,6 +5,9 @@ import { addConsoleInstrumentationHandler, severityLevelFromString } from '@sent const INTEGRATION_NAME = 'Console'; +const TRUNCATION_MSG = ' (breadcrumb truncated)'; +const MAX_BREADCRUMB_MSG_LENGTH = 2048; // 2 KB + const _consoleIntegration = (() => { return { name: INTEGRATION_NAME, @@ -14,11 +17,17 @@ const _consoleIntegration = (() => { return; } + // Truncate the breadcrumb length to max 2KB including the truncated snippet + let formattedMessage: string = util.format.apply(undefined, args); + if (formattedMessage.length > MAX_BREADCRUMB_MSG_LENGTH) { + formattedMessage = formattedMessage.slice(MAX_BREADCRUMB_MSG_LENGTH - TRUNCATION_MSG.length) + TRUNCATION_MSG; + } + addBreadcrumb( { category: 'console', level: severityLevelFromString(level), - message: util.format.apply(undefined, args), + message: formattedMessage, }, { input: [...args], From be9195c19f8efa068900bc5a568c2aa9ffbe11e7 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Fri, 18 Oct 2024 07:55:26 +0000 Subject: [PATCH 2/3] Just truncate bro --- packages/node/src/integrations/console.ts | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/packages/node/src/integrations/console.ts b/packages/node/src/integrations/console.ts index 3a7c246463f4..f8216e7ea15e 100644 --- a/packages/node/src/integrations/console.ts +++ b/packages/node/src/integrations/console.ts @@ -1,13 +1,10 @@ import * as util from 'node:util'; import { addBreadcrumb, defineIntegration, getClient } from '@sentry/core'; import type { IntegrationFn } from '@sentry/types'; -import { addConsoleInstrumentationHandler, severityLevelFromString } from '@sentry/utils'; +import { addConsoleInstrumentationHandler, severityLevelFromString, truncate } from '@sentry/utils'; const INTEGRATION_NAME = 'Console'; -const TRUNCATION_MSG = ' (breadcrumb truncated)'; -const MAX_BREADCRUMB_MSG_LENGTH = 2048; // 2 KB - const _consoleIntegration = (() => { return { name: INTEGRATION_NAME, @@ -17,17 +14,11 @@ const _consoleIntegration = (() => { return; } - // Truncate the breadcrumb length to max 2KB including the truncated snippet - let formattedMessage: string = util.format.apply(undefined, args); - if (formattedMessage.length > MAX_BREADCRUMB_MSG_LENGTH) { - formattedMessage = formattedMessage.slice(MAX_BREADCRUMB_MSG_LENGTH - TRUNCATION_MSG.length) + TRUNCATION_MSG; - } - addBreadcrumb( { category: 'console', level: severityLevelFromString(level), - message: formattedMessage, + message: truncate(util.format.apply(undefined, args), 2048), // 2KB }, { input: [...args], From 6418d22e18b1efad8fa534c5bd29402421a072c0 Mon Sep 17 00:00:00 2001 From: Luca Forstner Date: Fri, 18 Oct 2024 08:34:32 +0000 Subject: [PATCH 3/3] Add tests --- packages/node/src/integrations/console.ts | 13 ++-- .../node/test/integration/console.test.ts | 60 +++++++++++++++++++ 2 files changed, 65 insertions(+), 8 deletions(-) create mode 100644 packages/node/test/integration/console.test.ts diff --git a/packages/node/src/integrations/console.ts b/packages/node/src/integrations/console.ts index f8216e7ea15e..4a7cea53ec90 100644 --- a/packages/node/src/integrations/console.ts +++ b/packages/node/src/integrations/console.ts @@ -1,11 +1,13 @@ import * as util from 'node:util'; import { addBreadcrumb, defineIntegration, getClient } from '@sentry/core'; -import type { IntegrationFn } from '@sentry/types'; import { addConsoleInstrumentationHandler, severityLevelFromString, truncate } from '@sentry/utils'; const INTEGRATION_NAME = 'Console'; -const _consoleIntegration = (() => { +/** + * Capture console logs as breadcrumbs. + */ +export const consoleIntegration = defineIntegration(() => { return { name: INTEGRATION_NAME, setup(client) { @@ -28,9 +30,4 @@ const _consoleIntegration = (() => { }); }, }; -}) satisfies IntegrationFn; - -/** - * Capture console logs as breadcrumbs. - */ -export const consoleIntegration = defineIntegration(_consoleIntegration); +}); diff --git a/packages/node/test/integration/console.test.ts b/packages/node/test/integration/console.test.ts new file mode 100644 index 000000000000..d869959ebdfc --- /dev/null +++ b/packages/node/test/integration/console.test.ts @@ -0,0 +1,60 @@ +import * as SentryCore from '@sentry/core'; +import { resetInstrumentationHandlers } from '@sentry/utils'; +import { getClient } from '../../src'; +import type { NodeClient } from '../../src'; +import { consoleIntegration } from '../../src/integrations/console'; + +const addBreadcrumbSpy = jest.spyOn(SentryCore, 'addBreadcrumb'); + +jest.spyOn(console, 'log').mockImplementation(() => { + // noop so that we don't spam the logs +}); + +afterEach(() => { + jest.clearAllMocks(); + resetInstrumentationHandlers(); +}); + +describe('Console integration', () => { + it('should add a breadcrumb on console.log', () => { + consoleIntegration().setup?.(getClient() as NodeClient); + + // eslint-disable-next-line no-console + console.log('test'); + + expect(addBreadcrumbSpy).toHaveBeenCalledTimes(1); + expect(addBreadcrumbSpy).toHaveBeenCalledWith( + { + category: 'console', + level: 'log', + message: 'test', + }, + { + input: ['test'], + level: 'log', + }, + ); + }); + + it('should truncate breadcrumbs with more than 2 KB message size', () => { + consoleIntegration().setup?.(getClient() as NodeClient); + + const longMsg = 'A'.repeat(10_000); + + // eslint-disable-next-line no-console + console.log(longMsg); + + expect(addBreadcrumbSpy).toHaveBeenCalledTimes(1); + expect(addBreadcrumbSpy).toHaveBeenCalledWith( + { + category: 'console', + level: 'log', + message: `${'A'.repeat(2048)}...`, + }, + { + input: [longMsg], + level: 'log', + }, + ); + }); +});