From 4abf3fe83e4869718c53e9af2361ea454c8a6be8 Mon Sep 17 00:00:00 2001 From: Arya Date: Wed, 1 Apr 2026 11:31:53 +0530 Subject: [PATCH 1/8] refactor(collector): refcatored config module --- .../collector/src/util/normalizeConfig.js | 131 +++++++++++++++--- 1 file changed, 111 insertions(+), 20 deletions(-) diff --git a/packages/collector/src/util/normalizeConfig.js b/packages/collector/src/util/normalizeConfig.js index 11e13a5254..49225efa09 100644 --- a/packages/collector/src/util/normalizeConfig.js +++ b/packages/collector/src/util/normalizeConfig.js @@ -16,38 +16,129 @@ const defaults = { /** * Merges the config that was passed to the init function with environment variables and default values. - * @param {import('../types/collector').CollectorConfig} config + * @param {import('../types/collector').CollectorConfig} userConfig * @returns {import('../types/collector').CollectorConfig} */ -module.exports = function normalizeConfig(config = {}) { - config.agentHost = config.agentHost || process.env.INSTANA_AGENT_HOST || defaults.agentHost; - config.agentPort = config.agentPort || parseToPositiveInteger(process.env.INSTANA_AGENT_PORT, defaults.agentPort); - config.agentRequestTimeout = - config.agentRequestTimeout || - parseToPositiveInteger(process.env.INSTANA_AGENT_REQUEST_TIMEOUT, defaults.agentRequestTimeout); +module.exports = function normalizeConfig(userConfig = {}) { + const finalConfig = {}; - config.autoProfile = config.autoProfile || process.env.INSTANA_AUTO_PROFILE || defaults.autoProfile; - config.tracing = config.tracing || {}; + finalConfig.agentHost = normalizeAgentHost(userConfig, defaults); + finalConfig.agentPort = normalizeAgentPort(userConfig, defaults); + finalConfig.agentRequestTimeout = normalizeAgentRequestTimeout(userConfig, defaults); + finalConfig.autoProfile = normalizeAutoProfile(userConfig, defaults); + finalConfig.tracing = normalizeTracing(userConfig); + finalConfig.reportUnhandledPromiseRejections = normalizeUnhandledRejections(userConfig); - if (config.reportUnhandledPromiseRejections == null) { - config.reportUnhandledPromiseRejections = false; + return finalConfig; +}; + +/** + * @param {import('../types/collector').CollectorConfig} userConfig + * @param {{ agentHost: string }} defaultConfig + * @returns {string} + */ +function normalizeAgentHost(userConfig, defaultConfig) { + return resolveConfig(process.env.INSTANA_AGENT_HOST, userConfig.agentHost, defaultConfig.agentHost); +} + +/** + * @param {import('../types/collector').CollectorConfig} userConfig + * @param {{ agentPort: number }} defaultConfig + * @returns {number} + */ +function normalizeAgentPort(userConfig, defaultConfig) { + return resolveNumericConfig(process.env.INSTANA_AGENT_PORT, userConfig.agentPort, defaultConfig.agentPort); +} + +/** + * @param {import('../types/collector').CollectorConfig} userConfig + * @param {{ agentRequestTimeout: number }} defaultConfig + * @returns {number} + */ +function normalizeAgentRequestTimeout(userConfig, defaultConfig) { + return resolveNumericConfig( + process.env.INSTANA_AGENT_REQUEST_TIMEOUT, + userConfig.agentRequestTimeout, + defaultConfig.agentRequestTimeout + ); +} + +/** + * @param {import('../types/collector').CollectorConfig} userConfig + * @param {{ autoProfile: string | boolean }} defaultConfig + * @returns {string | boolean} + */ +function normalizeAutoProfile(userConfig, defaultConfig) { + return resolveConfig(process.env.INSTANA_AUTO_PROFILE, userConfig.autoProfile, defaultConfig.autoProfile); +} + +/** + * @param {import('../types/collector').CollectorConfig} userConfig + * @returns {object} + */ +function normalizeTracing(userConfig) { + return userConfig.tracing ?? {}; +} + +/** + * @param {import('../types/collector').CollectorConfig} userConfig + * @returns {boolean} + */ +function normalizeUnhandledRejections(userConfig) { + return userConfig.reportUnhandledPromiseRejections ?? false; +} + +/** + * @template T + * @param {T | undefined} envValue + * @param {T | undefined} configValue + * @param {T} defaultValue + * @returns {T} + */ +function resolveConfig(envValue, configValue, defaultValue) { + if (configValue != null) { + return configValue; } - return config; -}; + if (envValue != null) { + return envValue; + } + + return defaultValue; +} /** - * @param {string | number} value + * @param {string | undefined} envValue + * @param {number | undefined} configValue * @param {number} defaultValue * @returns {number} */ -function parseToPositiveInteger(value, defaultValue) { - if (typeof value !== 'string') { - return defaultValue; +function resolveNumericConfig(envValue, configValue, defaultValue) { + if (configValue != null) { + return configValue; } - value = parseInt(value, 10); - if (!isNaN(value)) { - return Math.abs(Math.round(value)); + + const parsedEnv = parseToPositiveInteger(envValue); + if (parsedEnv != null) { + return parsedEnv; } return defaultValue; } + +/** + * @param {string | number | undefined} value + * @returns {number | null} + */ +function parseToPositiveInteger(value) { + if (typeof value !== 'string') { + return null; + } + + const parsed = Number.parseInt(value, 10); + + if (!isNaN(parsed)) { + return Math.abs(Math.round(parsed)); + } + + return null; +} From ce2c3f7d9ddf4670e896926ed7aae902a090e071 Mon Sep 17 00:00:00 2001 From: Arya Date: Wed, 1 Apr 2026 18:44:19 +0530 Subject: [PATCH 2/8] chore: refactor --- packages/collector/src/util/normalizeConfig.js | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/packages/collector/src/util/normalizeConfig.js b/packages/collector/src/util/normalizeConfig.js index 49225efa09..95a64a2c80 100644 --- a/packages/collector/src/util/normalizeConfig.js +++ b/packages/collector/src/util/normalizeConfig.js @@ -22,11 +22,14 @@ const defaults = { module.exports = function normalizeConfig(userConfig = {}) { const finalConfig = {}; + // NOTE: This function only normalizes collector-specific configuration fields. + // Other userConfig fields (like serviceName, tracing, etc.) are passed through as-is + // and will be normalized later by core/config when this collector config is passed + // as extraFinalConfig to core's normalize function. finalConfig.agentHost = normalizeAgentHost(userConfig, defaults); finalConfig.agentPort = normalizeAgentPort(userConfig, defaults); finalConfig.agentRequestTimeout = normalizeAgentRequestTimeout(userConfig, defaults); finalConfig.autoProfile = normalizeAutoProfile(userConfig, defaults); - finalConfig.tracing = normalizeTracing(userConfig); finalConfig.reportUnhandledPromiseRejections = normalizeUnhandledRejections(userConfig); return finalConfig; @@ -72,14 +75,6 @@ function normalizeAutoProfile(userConfig, defaultConfig) { return resolveConfig(process.env.INSTANA_AUTO_PROFILE, userConfig.autoProfile, defaultConfig.autoProfile); } -/** - * @param {import('../types/collector').CollectorConfig} userConfig - * @returns {object} - */ -function normalizeTracing(userConfig) { - return userConfig.tracing ?? {}; -} - /** * @param {import('../types/collector').CollectorConfig} userConfig * @returns {boolean} From d03173c721fc214c79fdfbd030de10b850dd5b9e Mon Sep 17 00:00:00 2001 From: Arya Date: Wed, 8 Apr 2026 13:53:36 +0530 Subject: [PATCH 3/8] chore: updated --- packages/collector/src/util/normalizeConfig.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/collector/src/util/normalizeConfig.js b/packages/collector/src/util/normalizeConfig.js index 95a64a2c80..40da6bf791 100644 --- a/packages/collector/src/util/normalizeConfig.js +++ b/packages/collector/src/util/normalizeConfig.js @@ -31,6 +31,7 @@ module.exports = function normalizeConfig(userConfig = {}) { finalConfig.agentRequestTimeout = normalizeAgentRequestTimeout(userConfig, defaults); finalConfig.autoProfile = normalizeAutoProfile(userConfig, defaults); finalConfig.reportUnhandledPromiseRejections = normalizeUnhandledRejections(userConfig); + finalConfig.tracing = userConfig.tracing || {}; return finalConfig; }; From 9e60fbdf0d1afdf95da7c03f6c3e2579b15befcb Mon Sep 17 00:00:00 2001 From: Arya Date: Wed, 8 Apr 2026 15:45:25 +0530 Subject: [PATCH 4/8] chore: updated --- packages/collector/src/index.js | 8 +- .../collector/src/util/normalizeConfig.js | 79 ++++++++----------- .../unit/src/util/normalizeConfig.test.js | 19 +++-- 3 files changed, 49 insertions(+), 57 deletions(-) diff --git a/packages/collector/src/index.js b/packages/collector/src/index.js index 47bec9e9b3..5b9f8544c9 100644 --- a/packages/collector/src/index.js +++ b/packages/collector/src/index.js @@ -103,7 +103,7 @@ const instanaSharedMetrics = require('@instana/shared-metrics'); require('./tracing'); // load additional instrumentations const log = require('./logger'); -const normalizeCollectorConfig = require('./util/normalizeConfig'); +const collectorConfig = require('./util/normalizeConfig'); const experimental = require('./experimental'); // NOTE: Default collector logger && config for cases like `preinit`. @@ -158,10 +158,12 @@ function init(userConfig = {}) { log.init(userConfig); } - const collectorConfig = normalizeCollectorConfig(userConfig); + collectorConfig.init(config); + + const finalCollectorConfig = collectorConfig.normalizeConfig(userConfig); config = instanaNodeJsCore.coreConfig.normalize({ userConfig, - finalConfigBase: collectorConfig + finalConfigBase: finalCollectorConfig }); agentConnection = require('./agentConnection'); diff --git a/packages/collector/src/util/normalizeConfig.js b/packages/collector/src/util/normalizeConfig.js index 40da6bf791..bfc9e8da15 100644 --- a/packages/collector/src/util/normalizeConfig.js +++ b/packages/collector/src/util/normalizeConfig.js @@ -3,10 +3,21 @@ * (c) Copyright Instana Inc. and contributors 2019 */ -/* eslint-disable dot-notation */ - 'use strict'; +const util = require('@instana/core/src/config/util'); + +/** @type {import('@instana/core/src/core').GenericLogger} */ +let logger; + +/** + * @param {import('@instana/core/src/config').InstanaConfig} config + */ +exports.init = function init(config) { + logger = config.logger; + util.init(logger); +}; + const defaults = { agentHost: '127.0.0.1', agentPort: 42699, @@ -19,7 +30,7 @@ const defaults = { * @param {import('../types/collector').CollectorConfig} userConfig * @returns {import('../types/collector').CollectorConfig} */ -module.exports = function normalizeConfig(userConfig = {}) { +function normalizeConfig(userConfig = {}) { const finalConfig = {}; // NOTE: This function only normalizes collector-specific configuration fields. @@ -34,7 +45,13 @@ module.exports = function normalizeConfig(userConfig = {}) { finalConfig.tracing = userConfig.tracing || {}; return finalConfig; -}; +} + +// Export both init and normalizeConfig +// For backward compatibility, also make normalizeConfig the default export +module.exports = normalizeConfig; +module.exports.init = exports.init; +module.exports.normalizeConfig = normalizeConfig; /** * @param {import('../types/collector').CollectorConfig} userConfig @@ -51,7 +68,12 @@ function normalizeAgentHost(userConfig, defaultConfig) { * @returns {number} */ function normalizeAgentPort(userConfig, defaultConfig) { - return resolveNumericConfig(process.env.INSTANA_AGENT_PORT, userConfig.agentPort, defaultConfig.agentPort); + return util.resolveNumericConfig({ + envVar: 'INSTANA_AGENT_PORT', + configValue: userConfig.agentPort, + defaultValue: defaultConfig.agentPort, + configPath: 'config.agentPort' + }); } /** @@ -60,11 +82,12 @@ function normalizeAgentPort(userConfig, defaultConfig) { * @returns {number} */ function normalizeAgentRequestTimeout(userConfig, defaultConfig) { - return resolveNumericConfig( - process.env.INSTANA_AGENT_REQUEST_TIMEOUT, - userConfig.agentRequestTimeout, - defaultConfig.agentRequestTimeout - ); + return util.resolveNumericConfig({ + envVar: 'INSTANA_AGENT_REQUEST_TIMEOUT', + configValue: userConfig.agentRequestTimeout, + defaultValue: defaultConfig.agentRequestTimeout, + configPath: 'config.agentRequestTimeout' + }); } /** @@ -102,39 +125,3 @@ function resolveConfig(envValue, configValue, defaultValue) { return defaultValue; } - -/** - * @param {string | undefined} envValue - * @param {number | undefined} configValue - * @param {number} defaultValue - * @returns {number} - */ -function resolveNumericConfig(envValue, configValue, defaultValue) { - if (configValue != null) { - return configValue; - } - - const parsedEnv = parseToPositiveInteger(envValue); - if (parsedEnv != null) { - return parsedEnv; - } - return defaultValue; -} - -/** - * @param {string | number | undefined} value - * @returns {number | null} - */ -function parseToPositiveInteger(value) { - if (typeof value !== 'string') { - return null; - } - - const parsed = Number.parseInt(value, 10); - - if (!isNaN(parsed)) { - return Math.abs(Math.round(parsed)); - } - - return null; -} diff --git a/packages/collector/test/unit/src/util/normalizeConfig.test.js b/packages/collector/test/unit/src/util/normalizeConfig.test.js index 9662fedbce..1d5187712a 100644 --- a/packages/collector/test/unit/src/util/normalizeConfig.test.js +++ b/packages/collector/test/unit/src/util/normalizeConfig.test.js @@ -10,6 +10,17 @@ const expect = require('chai').expect; const normalizeConfig = require('@_local/collector/src/util/normalizeConfig'); describe('util.normalizeConfig', () => { + before(() => { + normalizeConfig.init({ + logger: { + debug: () => {}, + info: () => {}, + warn: () => {}, + error: () => {} + } + }); + }); + beforeEach(resetEnv); afterEach(resetEnv); @@ -84,14 +95,6 @@ describe('util.normalizeConfig', () => { expect(config.agentPort).to.equal(42699); }); - it('should normalize negative env values', () => { - process.env.INSTANA_AGENT_PORT = '-3000'; - - const config = normalizeConfig(); - - expect(config.agentPort).to.equal(3000); - }); - it('should fallback to default for invalid env value', () => { process.env.INSTANA_AGENT_PORT = 'invalid'; From 96cecd3e31b7a323ed2f2026f3b306441cb0c559 Mon Sep 17 00:00:00 2001 From: Arya Date: Wed, 8 Apr 2026 16:03:20 +0530 Subject: [PATCH 5/8] chore: updated --- packages/collector/src/util/normalizeConfig.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/collector/src/util/normalizeConfig.js b/packages/collector/src/util/normalizeConfig.js index bfc9e8da15..761fab7042 100644 --- a/packages/collector/src/util/normalizeConfig.js +++ b/packages/collector/src/util/normalizeConfig.js @@ -7,15 +7,11 @@ const util = require('@instana/core/src/config/util'); -/** @type {import('@instana/core/src/core').GenericLogger} */ -let logger; - /** * @param {import('@instana/core/src/config').InstanaConfig} config */ exports.init = function init(config) { - logger = config.logger; - util.init(logger); + util.init(config.logger); }; const defaults = { From d93823b82f405cad5a4dbb5cb6c290586f78c791 Mon Sep 17 00:00:00 2001 From: Arya Date: Wed, 8 Apr 2026 17:06:07 +0530 Subject: [PATCH 6/8] chore: fake logger utility --- .../collector/test/unit/src/util/normalizeConfig.test.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/collector/test/unit/src/util/normalizeConfig.test.js b/packages/collector/test/unit/src/util/normalizeConfig.test.js index 1d5187712a..9179cfc9ab 100644 --- a/packages/collector/test/unit/src/util/normalizeConfig.test.js +++ b/packages/collector/test/unit/src/util/normalizeConfig.test.js @@ -7,17 +7,13 @@ const expect = require('chai').expect; +const testUtils = require('@_local/core/test/test_util'); const normalizeConfig = require('@_local/collector/src/util/normalizeConfig'); describe('util.normalizeConfig', () => { before(() => { normalizeConfig.init({ - logger: { - debug: () => {}, - info: () => {}, - warn: () => {}, - error: () => {} - } + logger: testUtils.createFakeLogger() }); }); From 2ada60c6ae752f826945484581410057f4c28668 Mon Sep 17 00:00:00 2001 From: Arya Date: Wed, 8 Apr 2026 17:59:15 +0530 Subject: [PATCH 7/8] chore: fake logger utility --- packages/collector/src/index.js | 2 -- packages/collector/src/util/normalizeConfig.js | 7 ------- .../collector/test/unit/src/util/normalizeConfig.test.js | 6 ++---- 3 files changed, 2 insertions(+), 13 deletions(-) diff --git a/packages/collector/src/index.js b/packages/collector/src/index.js index 5b9f8544c9..8921bf3e50 100644 --- a/packages/collector/src/index.js +++ b/packages/collector/src/index.js @@ -158,8 +158,6 @@ function init(userConfig = {}) { log.init(userConfig); } - collectorConfig.init(config); - const finalCollectorConfig = collectorConfig.normalizeConfig(userConfig); config = instanaNodeJsCore.coreConfig.normalize({ userConfig, diff --git a/packages/collector/src/util/normalizeConfig.js b/packages/collector/src/util/normalizeConfig.js index 761fab7042..2497fb7ec7 100644 --- a/packages/collector/src/util/normalizeConfig.js +++ b/packages/collector/src/util/normalizeConfig.js @@ -7,13 +7,6 @@ const util = require('@instana/core/src/config/util'); -/** - * @param {import('@instana/core/src/config').InstanaConfig} config - */ -exports.init = function init(config) { - util.init(config.logger); -}; - const defaults = { agentHost: '127.0.0.1', agentPort: 42699, diff --git a/packages/collector/test/unit/src/util/normalizeConfig.test.js b/packages/collector/test/unit/src/util/normalizeConfig.test.js index 9179cfc9ab..17497d9c25 100644 --- a/packages/collector/test/unit/src/util/normalizeConfig.test.js +++ b/packages/collector/test/unit/src/util/normalizeConfig.test.js @@ -6,15 +6,13 @@ 'use strict'; const expect = require('chai').expect; - const testUtils = require('@_local/core/test/test_util'); +const coreConfig = require('@instana/core/src/config'); const normalizeConfig = require('@_local/collector/src/util/normalizeConfig'); describe('util.normalizeConfig', () => { before(() => { - normalizeConfig.init({ - logger: testUtils.createFakeLogger() - }); + coreConfig.init(testUtils.createFakeLogger()); }); beforeEach(resetEnv); From a1ae584618fa02f9ecade86f1b942017e9e55fae Mon Sep 17 00:00:00 2001 From: Arya Date: Wed, 8 Apr 2026 18:03:17 +0530 Subject: [PATCH 8/8] chore: fake logger utility --- packages/collector/src/index.js | 4 ++-- packages/collector/src/util/normalizeConfig.js | 10 ++-------- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/packages/collector/src/index.js b/packages/collector/src/index.js index 8921bf3e50..cf3e557a9d 100644 --- a/packages/collector/src/index.js +++ b/packages/collector/src/index.js @@ -103,7 +103,7 @@ const instanaSharedMetrics = require('@instana/shared-metrics'); require('./tracing'); // load additional instrumentations const log = require('./logger'); -const collectorConfig = require('./util/normalizeConfig'); +const normalizeConfig = require('./util/normalizeConfig'); const experimental = require('./experimental'); // NOTE: Default collector logger && config for cases like `preinit`. @@ -158,7 +158,7 @@ function init(userConfig = {}) { log.init(userConfig); } - const finalCollectorConfig = collectorConfig.normalizeConfig(userConfig); + const finalCollectorConfig = normalizeConfig(userConfig); config = instanaNodeJsCore.coreConfig.normalize({ userConfig, finalConfigBase: finalCollectorConfig diff --git a/packages/collector/src/util/normalizeConfig.js b/packages/collector/src/util/normalizeConfig.js index 2497fb7ec7..61a176a7e7 100644 --- a/packages/collector/src/util/normalizeConfig.js +++ b/packages/collector/src/util/normalizeConfig.js @@ -19,7 +19,7 @@ const defaults = { * @param {import('../types/collector').CollectorConfig} userConfig * @returns {import('../types/collector').CollectorConfig} */ -function normalizeConfig(userConfig = {}) { +module.exports = function normalizeConfig(userConfig = {}) { const finalConfig = {}; // NOTE: This function only normalizes collector-specific configuration fields. @@ -34,13 +34,7 @@ function normalizeConfig(userConfig = {}) { finalConfig.tracing = userConfig.tracing || {}; return finalConfig; -} - -// Export both init and normalizeConfig -// For backward compatibility, also make normalizeConfig the default export -module.exports = normalizeConfig; -module.exports.init = exports.init; -module.exports.normalizeConfig = normalizeConfig; +}; /** * @param {import('../types/collector').CollectorConfig} userConfig