Skip to content

Commit ed98c1f

Browse files
authored
feat(node): Capture pino logger name (#17930)
Pino loggers can be named but we didn't capture this information: ```ts import pino from 'pino'; const logger = pino({ name: 'my-component' }); ``` This PR changes the hook from `start` to `end` which means we can parse the output JSON and fetch the name if one was supplied.
1 parent ac57cec commit ed98c1f

File tree

4 files changed

+37
-23
lines changed

4 files changed

+37
-23
lines changed

dev-packages/node-integration-tests/suites/pino/scenario-next.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as Sentry from '@sentry/node';
22
import pino from 'pino-next';
33

4-
const logger = pino({});
4+
const logger = pino({ name: 'myapp' });
55

66
Sentry.withIsolationScope(() => {
77
Sentry.startSpan({ name: 'startup' }, () => {

dev-packages/node-integration-tests/suites/pino/scenario.mjs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as Sentry from '@sentry/node';
22
import pino from 'pino';
33

4-
const logger = pino({});
4+
const logger = pino({ name: 'myapp' });
55

66
Sentry.withIsolationScope(() => {
77
Sentry.startSpan({ name: 'startup' }, () => {

dev-packages/node-integration-tests/suites/pino/test.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,14 @@ conditionalTest({ min: 20 })('Pino integration', () => {
6464
trace_id: expect.any(String),
6565
severity_number: 9,
6666
attributes: expect.objectContaining({
67-
'sentry.origin': { value: 'auto.logging.pino', type: 'string' },
68-
'sentry.pino.level': { value: 30, type: 'integer' },
67+
'pino.logger.name': { value: 'myapp', type: 'string' },
68+
'pino.logger.level': { value: 30, type: 'integer' },
6969
user: { value: 'user-id', type: 'string' },
7070
something: {
7171
type: 'string',
7272
value: '{"more":3,"complex":"nope"}',
7373
},
74+
'sentry.origin': { value: 'auto.logging.pino', type: 'string' },
7475
'sentry.release': { value: '1.0', type: 'string' },
7576
'sentry.sdk.name': { value: 'sentry.javascript.node', type: 'string' },
7677
}),
@@ -82,9 +83,10 @@ conditionalTest({ min: 20 })('Pino integration', () => {
8283
trace_id: expect.any(String),
8384
severity_number: 17,
8485
attributes: expect.objectContaining({
85-
'sentry.origin': { value: 'auto.logging.pino', type: 'string' },
86-
'sentry.pino.level': { value: 50, type: 'integer' },
86+
'pino.logger.name': { value: 'myapp', type: 'string' },
87+
'pino.logger.level': { value: 50, type: 'integer' },
8788
err: { value: '{}', type: 'string' },
89+
'sentry.origin': { value: 'auto.logging.pino', type: 'string' },
8890
'sentry.release': { value: '1.0', type: 'string' },
8991
'sentry.sdk.name': { value: 'sentry.javascript.node', type: 'string' },
9092
}),
@@ -138,13 +140,14 @@ conditionalTest({ min: 20 })('Pino integration', () => {
138140
trace_id: expect.any(String),
139141
severity_number: 9,
140142
attributes: expect.objectContaining({
141-
'sentry.origin': { value: 'auto.logging.pino', type: 'string' },
142-
'sentry.pino.level': { value: 30, type: 'integer' },
143+
'pino.logger.name': { value: 'myapp', type: 'string' },
144+
'pino.logger.level': { value: 30, type: 'integer' },
143145
user: { value: 'user-id', type: 'string' },
144146
something: {
145147
type: 'string',
146148
value: '{"more":3,"complex":"nope"}',
147149
},
150+
'sentry.origin': { value: 'auto.logging.pino', type: 'string' },
148151
'sentry.release': { value: '1.0', type: 'string' },
149152
'sentry.sdk.name': { value: 'sentry.javascript.node', type: 'string' },
150153
}),
@@ -156,9 +159,10 @@ conditionalTest({ min: 20 })('Pino integration', () => {
156159
trace_id: expect.any(String),
157160
severity_number: 17,
158161
attributes: expect.objectContaining({
159-
'sentry.origin': { value: 'auto.logging.pino', type: 'string' },
160-
'sentry.pino.level': { value: 50, type: 'integer' },
162+
'pino.logger.name': { value: 'myapp', type: 'string' },
163+
'pino.logger.level': { value: 50, type: 'integer' },
161164
err: { value: '{}', type: 'string' },
165+
'sentry.origin': { value: 'auto.logging.pino', type: 'string' },
162166
'sentry.release': { value: '1.0', type: 'string' },
163167
'sentry.sdk.name': { value: 'sentry.javascript.node', type: 'string' },
164168
}),

packages/node-core/src/integrations/pino.ts

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -94,17 +94,23 @@ export const pinoIntegration = defineIntegration((userOptions: DeepPartial<PinoO
9494
const injectedChannel = tracingChannel('orchestrion:pino:pino-log');
9595
const integratedChannel = tracingChannel('pino_asJson');
9696

97-
function onPinoStart(self: Pino, args: PinoHookArgs): void {
97+
function onPinoStart(self: Pino, args: PinoHookArgs, result: string): void {
9898
const [obj, message, levelNumber] = args;
9999
const level = self?.levels?.labels?.[levelNumber] || 'info';
100100

101-
const attributes = {
102-
...obj,
103-
'sentry.origin': 'auto.logging.pino',
104-
'sentry.pino.level': levelNumber,
105-
};
106-
107101
if (enableLogs && options.log.levels.includes(level)) {
102+
const attributes: Record<string, unknown> = {
103+
...obj,
104+
'sentry.origin': 'auto.logging.pino',
105+
'pino.logger.level': levelNumber,
106+
};
107+
108+
const parsedResult = JSON.parse(result) as { name?: string };
109+
110+
if (parsedResult.name) {
111+
attributes['pino.logger.name'] = parsedResult.name;
112+
}
113+
108114
_INTERNAL_captureLog({ level, message, attributes });
109115
}
110116

@@ -135,14 +141,18 @@ export const pinoIntegration = defineIntegration((userOptions: DeepPartial<PinoO
135141
}
136142
}
137143

138-
injectedChannel.start.subscribe(data => {
139-
const { self, arguments: args } = data as { self: Pino; arguments: PinoHookArgs };
140-
onPinoStart(self, args);
144+
injectedChannel.end.subscribe(data => {
145+
const { self, arguments: args, result } = data as { self: Pino; arguments: PinoHookArgs; result: string };
146+
onPinoStart(self, args, result);
141147
});
142148

143-
integratedChannel.start.subscribe(data => {
144-
const { instance, arguments: args } = data as { instance: Pino; arguments: PinoHookArgs };
145-
onPinoStart(instance, args);
149+
integratedChannel.end.subscribe(data => {
150+
const {
151+
instance,
152+
arguments: args,
153+
result,
154+
} = data as { instance: Pino; arguments: PinoHookArgs; result: string };
155+
onPinoStart(instance, args, result);
146156
});
147157
},
148158
};

0 commit comments

Comments
 (0)