From 96717e1aec6a0c7affca7d8fced12af8e1c2ba2d Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 14 Oct 2025 16:57:14 +0200 Subject: [PATCH] feat(node): Capture `pino` logger name --- .../suites/pino/scenario-next.mjs | 2 +- .../suites/pino/scenario.mjs | 2 +- .../suites/pino/test.ts | 20 ++++++----- packages/node-core/src/integrations/pino.ts | 36 ++++++++++++------- 4 files changed, 37 insertions(+), 23 deletions(-) diff --git a/dev-packages/node-integration-tests/suites/pino/scenario-next.mjs b/dev-packages/node-integration-tests/suites/pino/scenario-next.mjs index 11fc038fea3a..2965038990fd 100644 --- a/dev-packages/node-integration-tests/suites/pino/scenario-next.mjs +++ b/dev-packages/node-integration-tests/suites/pino/scenario-next.mjs @@ -1,7 +1,7 @@ import * as Sentry from '@sentry/node'; import pino from 'pino-next'; -const logger = pino({}); +const logger = pino({ name: 'myapp' }); Sentry.withIsolationScope(() => { Sentry.startSpan({ name: 'startup' }, () => { diff --git a/dev-packages/node-integration-tests/suites/pino/scenario.mjs b/dev-packages/node-integration-tests/suites/pino/scenario.mjs index 3ff6c0b5e08d..ea8dc5e223d0 100644 --- a/dev-packages/node-integration-tests/suites/pino/scenario.mjs +++ b/dev-packages/node-integration-tests/suites/pino/scenario.mjs @@ -1,7 +1,7 @@ import * as Sentry from '@sentry/node'; import pino from 'pino'; -const logger = pino({}); +const logger = pino({ name: 'myapp' }); Sentry.withIsolationScope(() => { Sentry.startSpan({ name: 'startup' }, () => { diff --git a/dev-packages/node-integration-tests/suites/pino/test.ts b/dev-packages/node-integration-tests/suites/pino/test.ts index 15a9397ebb27..cc88f650203b 100644 --- a/dev-packages/node-integration-tests/suites/pino/test.ts +++ b/dev-packages/node-integration-tests/suites/pino/test.ts @@ -64,13 +64,14 @@ conditionalTest({ min: 20 })('Pino integration', () => { trace_id: expect.any(String), severity_number: 9, attributes: expect.objectContaining({ - 'sentry.origin': { value: 'auto.logging.pino', type: 'string' }, - 'sentry.pino.level': { value: 30, type: 'integer' }, + 'pino.logger.name': { value: 'myapp', type: 'string' }, + 'pino.logger.level': { value: 30, type: 'integer' }, user: { value: 'user-id', type: 'string' }, something: { type: 'string', value: '{"more":3,"complex":"nope"}', }, + 'sentry.origin': { value: 'auto.logging.pino', type: 'string' }, 'sentry.release': { value: '1.0', type: 'string' }, 'sentry.sdk.name': { value: 'sentry.javascript.node', type: 'string' }, }), @@ -82,9 +83,10 @@ conditionalTest({ min: 20 })('Pino integration', () => { trace_id: expect.any(String), severity_number: 17, attributes: expect.objectContaining({ - 'sentry.origin': { value: 'auto.logging.pino', type: 'string' }, - 'sentry.pino.level': { value: 50, type: 'integer' }, + 'pino.logger.name': { value: 'myapp', type: 'string' }, + 'pino.logger.level': { value: 50, type: 'integer' }, err: { value: '{}', type: 'string' }, + 'sentry.origin': { value: 'auto.logging.pino', type: 'string' }, 'sentry.release': { value: '1.0', type: 'string' }, 'sentry.sdk.name': { value: 'sentry.javascript.node', type: 'string' }, }), @@ -138,13 +140,14 @@ conditionalTest({ min: 20 })('Pino integration', () => { trace_id: expect.any(String), severity_number: 9, attributes: expect.objectContaining({ - 'sentry.origin': { value: 'auto.logging.pino', type: 'string' }, - 'sentry.pino.level': { value: 30, type: 'integer' }, + 'pino.logger.name': { value: 'myapp', type: 'string' }, + 'pino.logger.level': { value: 30, type: 'integer' }, user: { value: 'user-id', type: 'string' }, something: { type: 'string', value: '{"more":3,"complex":"nope"}', }, + 'sentry.origin': { value: 'auto.logging.pino', type: 'string' }, 'sentry.release': { value: '1.0', type: 'string' }, 'sentry.sdk.name': { value: 'sentry.javascript.node', type: 'string' }, }), @@ -156,9 +159,10 @@ conditionalTest({ min: 20 })('Pino integration', () => { trace_id: expect.any(String), severity_number: 17, attributes: expect.objectContaining({ - 'sentry.origin': { value: 'auto.logging.pino', type: 'string' }, - 'sentry.pino.level': { value: 50, type: 'integer' }, + 'pino.logger.name': { value: 'myapp', type: 'string' }, + 'pino.logger.level': { value: 50, type: 'integer' }, err: { value: '{}', type: 'string' }, + 'sentry.origin': { value: 'auto.logging.pino', type: 'string' }, 'sentry.release': { value: '1.0', type: 'string' }, 'sentry.sdk.name': { value: 'sentry.javascript.node', type: 'string' }, }), diff --git a/packages/node-core/src/integrations/pino.ts b/packages/node-core/src/integrations/pino.ts index af3f41735c4a..6b78bcdb4386 100644 --- a/packages/node-core/src/integrations/pino.ts +++ b/packages/node-core/src/integrations/pino.ts @@ -94,17 +94,23 @@ export const pinoIntegration = defineIntegration((userOptions: DeepPartial = { + ...obj, + 'sentry.origin': 'auto.logging.pino', + 'pino.logger.level': levelNumber, + }; + + const parsedResult = JSON.parse(result) as { name?: string }; + + if (parsedResult.name) { + attributes['pino.logger.name'] = parsedResult.name; + } + _INTERNAL_captureLog({ level, message, attributes }); } @@ -135,14 +141,18 @@ export const pinoIntegration = defineIntegration((userOptions: DeepPartial { - const { self, arguments: args } = data as { self: Pino; arguments: PinoHookArgs }; - onPinoStart(self, args); + injectedChannel.end.subscribe(data => { + const { self, arguments: args, result } = data as { self: Pino; arguments: PinoHookArgs; result: string }; + onPinoStart(self, args, result); }); - integratedChannel.start.subscribe(data => { - const { instance, arguments: args } = data as { instance: Pino; arguments: PinoHookArgs }; - onPinoStart(instance, args); + integratedChannel.end.subscribe(data => { + const { + instance, + arguments: args, + result, + } = data as { instance: Pino; arguments: PinoHookArgs; result: string }; + onPinoStart(instance, args, result); }); }, };