diff --git a/packages/collector/src/index.js b/packages/collector/src/index.js index 47bec9e9b3..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 normalizeCollectorConfig = require('./util/normalizeConfig'); +const normalizeConfig = require('./util/normalizeConfig'); const experimental = require('./experimental'); // NOTE: Default collector logger && config for cases like `preinit`. @@ -158,10 +158,10 @@ function init(userConfig = {}) { log.init(userConfig); } - const collectorConfig = normalizeCollectorConfig(userConfig); + const finalCollectorConfig = 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 11e13a5254..61a176a7e7 100644 --- a/packages/collector/src/util/normalizeConfig.js +++ b/packages/collector/src/util/normalizeConfig.js @@ -3,10 +3,10 @@ * (c) Copyright Instana Inc. and contributors 2019 */ -/* eslint-disable dot-notation */ - 'use strict'; +const util = require('@instana/core/src/config/util'); + const defaults = { agentHost: '127.0.0.1', agentPort: 42699, @@ -16,38 +16,95 @@ 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 || {}; - - if (config.reportUnhandledPromiseRejections == null) { - config.reportUnhandledPromiseRejections = false; - } + // 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.reportUnhandledPromiseRejections = normalizeUnhandledRejections(userConfig); + finalConfig.tracing = userConfig.tracing || {}; - return config; + return finalConfig; }; /** - * @param {string | number} value - * @param {number} defaultValue + * @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 parseToPositiveInteger(value, defaultValue) { - if (typeof value !== 'string') { - return defaultValue; +function normalizeAgentPort(userConfig, defaultConfig) { + return util.resolveNumericConfig({ + envVar: 'INSTANA_AGENT_PORT', + configValue: userConfig.agentPort, + defaultValue: defaultConfig.agentPort, + configPath: 'config.agentPort' + }); +} + +/** + * @param {import('../types/collector').CollectorConfig} userConfig + * @param {{ agentRequestTimeout: number }} defaultConfig + * @returns {number} + */ +function normalizeAgentRequestTimeout(userConfig, defaultConfig) { + return util.resolveNumericConfig({ + envVar: 'INSTANA_AGENT_REQUEST_TIMEOUT', + configValue: userConfig.agentRequestTimeout, + defaultValue: defaultConfig.agentRequestTimeout, + configPath: 'config.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 {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; } - value = parseInt(value, 10); - if (!isNaN(value)) { - return Math.abs(Math.round(value)); + + if (envValue != null) { + return envValue; } + return defaultValue; } diff --git a/packages/collector/test/unit/src/util/normalizeConfig.test.js b/packages/collector/test/unit/src/util/normalizeConfig.test.js index 9662fedbce..17497d9c25 100644 --- a/packages/collector/test/unit/src/util/normalizeConfig.test.js +++ b/packages/collector/test/unit/src/util/normalizeConfig.test.js @@ -6,10 +6,15 @@ '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(() => { + coreConfig.init(testUtils.createFakeLogger()); + }); + beforeEach(resetEnv); afterEach(resetEnv); @@ -84,14 +89,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';