From bc8cb71d22d14befd5f9460f7f117469499a1801 Mon Sep 17 00:00:00 2001 From: Hashim1999164 <64767361+Hashim1999164@users.noreply.github.com> Date: Fri, 2 Oct 2026 21:12:13 +0000 Subject: [PATCH] fix: emit startup configuration summaries at info level Configuration and loaded integrations are informational, not warnings. Keep agent and generic diagnostics on warn so real problems stay visible. Matches the dd-trace-rb change for the same startup log noise. --- packages/dd-trace/src/startup-log.js | 6 +- packages/dd-trace/test/startup-log.spec.js | 90 ++++++++++++---------- 2 files changed, 53 insertions(+), 43 deletions(-) diff --git a/packages/dd-trace/src/startup-log.js b/packages/dd-trace/src/startup-log.js index 02e697feaea..12a91abb31b 100644 --- a/packages/dd-trace/src/startup-log.js +++ b/packages/dd-trace/src/startup-log.js @@ -3,7 +3,7 @@ const os = require('os') const { inspect } = require('util') const tracerVersion = require('../../../package.json').version -const { warn } = require('./log/writer') +const { info, warn } = require('./log/writer') const errors = {} let config @@ -27,7 +27,7 @@ function startupLog () { const out = configInfo() - warn('DATADOG TRACER CONFIGURATION - ' + out) + info('DATADOG TRACER CONFIGURATION - ' + out) } /** @@ -41,7 +41,7 @@ function logIntegrations () { integrationsAlreadyRan = true - warn('DATADOG TRACER INTEGRATIONS LOADED - ' + JSON.stringify(Object.keys(pluginManager._pluginsByName))) + info('DATADOG TRACER INTEGRATIONS LOADED - ' + JSON.stringify(Object.keys(pluginManager._pluginsByName))) } /** diff --git a/packages/dd-trace/test/startup-log.spec.js b/packages/dd-trace/test/startup-log.spec.js index df237d422e0..b53c687818f 100644 --- a/packages/dd-trace/test/startup-log.spec.js +++ b/packages/dd-trace/test/startup-log.spec.js @@ -38,10 +38,12 @@ const testSamplingRules = [ describe('startup logging', () => { let warnStub + let infoStub let tracerInfoMethod before(() => { warnStub = sinon.stub(console, 'warn') + infoStub = sinon.stub(console, 'info') delete require.cache[require.resolve('../src/startup-log')] const { setStartupLogConfig, @@ -67,10 +69,13 @@ describe('startup logging', () => { logAgentError({ status: 500, message: 'Error: fake error' }) }) - after(() => warnStub.restore()) + after(() => { + warnStub.restore() + infoStub.restore() + }) it('startupLog should output config without integrations_loaded', () => { - const logLine = warnStub.firstCall.args[0] + const logLine = infoStub.firstCall.args[0] assert.strictEqual(logLine.startsWith('DATADOG TRACER CONFIGURATION - '), true) const logObj = JSON.parse(logLine.replace('DATADOG TRACER CONFIGURATION - ', '')) assert.strictEqual('integrations_loaded' in logObj, false) @@ -86,12 +91,12 @@ describe('startup logging', () => { }) it('logIntegrations should output loaded integrations', () => { - const logLine = warnStub.secondCall.args[0] + const logLine = infoStub.secondCall.args[0] assert.strictEqual(logLine, 'DATADOG TRACER INTEGRATIONS LOADED - ["http","fs","semver"]') }) it('logAgentError should output diagnostic message', () => { - const logLine = warnStub.thirdCall.args[0] + const logLine = warnStub.firstCall.args[0] assert.strictEqual(logLine, 'DATADOG TRACER DIAGNOSTIC - Agent Error: Error: fake error') }) @@ -133,7 +138,7 @@ describe('startup logging', () => { describe('startupLog should not include integrations_loaded (regression #7470)', () => { it('should not include integrations_loaded when pluginManager is not yet set', () => { - sinon.stub(console, 'warn') + sinon.stub(console, 'info') delete require.cache[require.resolve('../src/startup-log')] const { setStartupLogConfig, @@ -143,14 +148,14 @@ describe('startupLog should not include integrations_loaded (regression #7470)', setStartupLogConfig(configWithStartupLogs) startupLog() /* eslint-disable-next-line no-console */ - const warnStub = /** @type {sinon.SinonStub} */ (console.warn) - const logObj = JSON.parse(warnStub.firstCall.args[0].replace('DATADOG TRACER CONFIGURATION - ', '')) - warnStub.restore() + const infoStub = /** @type {sinon.SinonStub} */ (console.info) + const logObj = JSON.parse(infoStub.firstCall.args[0].replace('DATADOG TRACER CONFIGURATION - ', '')) + infoStub.restore() assert.strictEqual('integrations_loaded' in logObj, false) }) it('should not include integrations_loaded even when pluginManager is set', () => { - sinon.stub(console, 'warn') + sinon.stub(console, 'info') delete require.cache[require.resolve('../src/startup-log')] const { setStartupLogConfig, @@ -162,29 +167,29 @@ describe('startupLog should not include integrations_loaded (regression #7470)', setStartupLogConfig(configWithStartupLogs) startupLog() /* eslint-disable-next-line no-console */ - const warnStub = /** @type {sinon.SinonStub} */ (console.warn) - const logObj = JSON.parse(warnStub.firstCall.args[0].replace('DATADOG TRACER CONFIGURATION - ', '')) - warnStub.restore() + const infoStub = /** @type {sinon.SinonStub} */ (console.info) + const logObj = JSON.parse(infoStub.firstCall.args[0].replace('DATADOG TRACER CONFIGURATION - ', '')) + infoStub.restore() assert.strictEqual('integrations_loaded' in logObj, false) }) }) describe('startup log guards', () => { it('startupLog should only run once', () => { - sinon.stub(console, 'warn') + sinon.stub(console, 'info') delete require.cache[require.resolve('../src/startup-log')] const { setStartupLogConfig, startupLog } = require('../src/startup-log') setStartupLogConfig(configWithStartupLogs) startupLog() startupLog() /* eslint-disable-next-line no-console */ - const warnStub = /** @type {sinon.SinonStub} */ (console.warn) - assert.strictEqual(warnStub.callCount, 1) - warnStub.restore() + const infoStub = /** @type {sinon.SinonStub} */ (console.info) + assert.strictEqual(infoStub.callCount, 1) + infoStub.restore() }) it('logIntegrations should only run once', () => { - sinon.stub(console, 'warn') + sinon.stub(console, 'info') delete require.cache[require.resolve('../src/startup-log')] const { setStartupLogConfig, setStartupLogPluginManager, logIntegrations } = require('../src/startup-log') setStartupLogConfig(configWithStartupLogs) @@ -192,9 +197,9 @@ describe('startup log guards', () => { logIntegrations() logIntegrations() /* eslint-disable-next-line no-console */ - const warnStub = /** @type {sinon.SinonStub} */ (console.warn) - assert.strictEqual(warnStub.callCount, 1) - warnStub.restore() + const infoStub = /** @type {sinon.SinonStub} */ (console.info) + assert.strictEqual(infoStub.callCount, 1) + infoStub.restore() }) it('logAgentError should only run once', () => { @@ -213,6 +218,7 @@ describe('startup log guards', () => { it('should not log when startupLogs is false', () => { sinon.stub(console, 'warn') + sinon.stub(console, 'info') delete require.cache[require.resolve('../src/startup-log')] const { setStartupLogConfig, @@ -228,8 +234,12 @@ describe('startup log guards', () => { logAgentError({ status: 500, message: 'err' }) /* eslint-disable-next-line no-console */ const warnStub = /** @type {sinon.SinonStub} */ (console.warn) + /* eslint-disable-next-line no-console */ + const infoStub = /** @type {sinon.SinonStub} */ (console.info) assert.strictEqual(warnStub.callCount, 0) + assert.strictEqual(infoStub.callCount, 0) warnStub.restore() + infoStub.restore() }) }) @@ -239,7 +249,7 @@ describe('data_streams_enabled', () => { }) it('should be true when env var is true and config is unset', () => { - sinon.stub(console, 'warn') + sinon.stub(console, 'info') delete require.cache[require.resolve('../src/startup-log')] const { setStartupLogConfig, @@ -250,14 +260,14 @@ describe('data_streams_enabled', () => { setStartupLogConfig(getConfigFresh()) startupLog() /* eslint-disable-next-line no-console */ - const warnStub = /** @type {sinon.SinonStub} */ (console.warn) - const logObj = JSON.parse(warnStub.firstCall.args[0].replace('DATADOG TRACER CONFIGURATION - ', '')) - warnStub.restore() + const infoStub = /** @type {sinon.SinonStub} */ (console.info) + const logObj = JSON.parse(infoStub.firstCall.args[0].replace('DATADOG TRACER CONFIGURATION - ', '')) + infoStub.restore() assert.strictEqual(logObj.data_streams_enabled, true) }) it('should be true when env var is not set and config is true', () => { - sinon.stub(console, 'warn') + sinon.stub(console, 'info') delete require.cache[require.resolve('../src/startup-log')] const { setStartupLogConfig, @@ -268,14 +278,14 @@ describe('data_streams_enabled', () => { setStartupLogConfig(getConfigFresh({ dsmEnabled: true })) startupLog() /* eslint-disable-next-line no-console */ - const warnStub = /** @type {sinon.SinonStub} */ (console.warn) - const logObj = JSON.parse(warnStub.firstCall.args[0].replace('DATADOG TRACER CONFIGURATION - ', '')) - warnStub.restore() + const infoStub = /** @type {sinon.SinonStub} */ (console.info) + const logObj = JSON.parse(infoStub.firstCall.args[0].replace('DATADOG TRACER CONFIGURATION - ', '')) + infoStub.restore() assert.strictEqual(logObj.data_streams_enabled, true) }) it('should be false when env var is true but config is false', () => { - sinon.stub(console, 'warn') + sinon.stub(console, 'info') delete require.cache[require.resolve('../src/startup-log')] const { setStartupLogConfig, @@ -286,9 +296,9 @@ describe('data_streams_enabled', () => { setStartupLogConfig(getConfigFresh({ dsmEnabled: false })) startupLog() /* eslint-disable-next-line no-console */ - const warnStub = /** @type {sinon.SinonStub} */ (console.warn) - const logObj = JSON.parse(warnStub.firstCall.args[0].replace('DATADOG TRACER CONFIGURATION - ', '')) - warnStub.restore() + const infoStub = /** @type {sinon.SinonStub} */ (console.info) + const logObj = JSON.parse(infoStub.firstCall.args[0].replace('DATADOG TRACER CONFIGURATION - ', '')) + infoStub.restore() assert.strictEqual(logObj.data_streams_enabled, false) }) }) @@ -302,7 +312,7 @@ describe('profiling_enabled', () => { ['auto', true], ['true', true], ].forEach(([envVar, expected]) => { - sinon.stub(console, 'warn') + sinon.stub(console, 'info') delete require.cache[require.resolve('../src/startup-log')] const { setStartupLogConfig, @@ -313,9 +323,9 @@ describe('profiling_enabled', () => { setStartupLogConfig(getConfigFresh()) startupLog() /* eslint-disable-next-line no-console */ - const warnStub = /** @type {sinon.SinonStub} */ (console.warn) - const logObj = JSON.parse(warnStub.firstCall.args[0].replace('DATADOG TRACER CONFIGURATION - ', '')) - warnStub.restore() + const infoStub = /** @type {sinon.SinonStub} */ (console.info) + const logObj = JSON.parse(infoStub.firstCall.args[0].replace('DATADOG TRACER CONFIGURATION - ', '')) + infoStub.restore() assert.strictEqual(logObj.profiling_enabled, expected) }) }) @@ -337,7 +347,7 @@ describe('otlp export flags', () => { afterEach(clearOtlpEnv) function startupLogObj (configOptions) { - sinon.stub(console, 'warn') + sinon.stub(console, 'info') delete require.cache[require.resolve('../src/startup-log')] const { setStartupLogConfig, @@ -347,9 +357,9 @@ describe('otlp export flags', () => { setStartupLogConfig(getConfigFresh(configOptions)) startupLog() /* eslint-disable-next-line no-console */ - const warnStub = /** @type {sinon.SinonStub} */ (console.warn) - const logObj = JSON.parse(warnStub.firstCall.args[0].replace('DATADOG TRACER CONFIGURATION - ', '')) - warnStub.restore() + const infoStub = /** @type {sinon.SinonStub} */ (console.info) + const logObj = JSON.parse(infoStub.firstCall.args[0].replace('DATADOG TRACER CONFIGURATION - ', '')) + infoStub.restore() return logObj }