From f2e166e6812a04718efe1f9ba5a741c613c21f74 Mon Sep 17 00:00:00 2001 From: Abhijeet Prasad Date: Tue, 8 Apr 2025 11:34:36 +0200 Subject: [PATCH] feat(node): Add server.address to nodejs logs --- packages/node/src/sdk/client.ts | 12 ++++++++++- packages/node/test/sdk/client.test.ts | 30 ++++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/packages/node/src/sdk/client.ts b/packages/node/src/sdk/client.ts index f7d59add8056..d7fcbc5f23d6 100644 --- a/packages/node/src/sdk/client.ts +++ b/packages/node/src/sdk/client.ts @@ -21,11 +21,12 @@ export class NodeClient extends ServerRuntimeClient { private _logOnExitFlushListener: (() => void) | undefined; public constructor(options: NodeClientOptions) { + const serverName = options.serverName || global.process.env.SENTRY_NAME || os.hostname(); const clientOptions: ServerRuntimeClientOptions = { ...options, platform: 'node', runtime: { name: 'node', version: global.process.version }, - serverName: options.serverName || global.process.env.SENTRY_NAME || os.hostname(), + serverName, }; if (options.openTelemetryInstrumentations) { @@ -47,6 +48,15 @@ export class NodeClient extends ServerRuntimeClient { _INTERNAL_flushLogsBuffer(this); }; + if (serverName) { + this.on('beforeCaptureLog', log => { + log.attributes = { + ...log.attributes, + 'server.address': serverName, + }; + }); + } + process.on('beforeExit', this._logOnExitFlushListener); } } diff --git a/packages/node/test/sdk/client.test.ts b/packages/node/test/sdk/client.test.ts index 18b6c1d3ef53..7b7178660511 100644 --- a/packages/node/test/sdk/client.test.ts +++ b/packages/node/test/sdk/client.test.ts @@ -1,7 +1,7 @@ import * as os from 'os'; import { ProxyTracer } from '@opentelemetry/api'; import * as opentelemetryInstrumentationPackage from '@opentelemetry/instrumentation'; -import type { Event, EventHint } from '@sentry/core'; +import type { Event, EventHint, Log } from '@sentry/core'; import { SDK_VERSION, Scope, getCurrentScope, getGlobalScope, getIsolationScope } from '@sentry/core'; import { setOpenTelemetryContextAsyncContextStrategy } from '@sentry/opentelemetry'; import { afterEach, beforeEach, describe, expect, it, test, vi } from 'vitest'; @@ -281,4 +281,32 @@ describe('NodeClient', () => { }), ); }); + + describe('log capture', () => { + it('adds server name to log attributes', () => { + const options = getDefaultNodeClientOptions({ _experiments: { enableLogs: true } }); + const client = new NodeClient(options); + + const log: Log = { level: 'info', message: 'test message', attributes: {} }; + client.emit('beforeCaptureLog', log); + + expect(log.attributes).toEqual({ + 'server.address': expect.any(String), + }); + }); + + it('preserves existing log attributes', () => { + const serverName = 'test-server'; + const options = getDefaultNodeClientOptions({ serverName, _experiments: { enableLogs: true } }); + const client = new NodeClient(options); + + const log: Log = { level: 'info', message: 'test message', attributes: { 'existing.attr': 'value' } }; + client.emit('beforeCaptureLog', log); + + expect(log.attributes).toEqual({ + 'existing.attr': 'value', + 'server.address': serverName, + }); + }); + }); });