Skip to content

Commit 3a6736e

Browse files
authored
refactor(core): normalized numeric config resolution with env precedence (#2430)
- Created a utility file for shared configuration helpers. - Moved and renamed normalizeSingleValue to resolveNumericConfig within the new utility module.
1 parent 670b154 commit 3a6736e

3 files changed

Lines changed: 322 additions & 50 deletions

File tree

packages/core/src/config/index.js

Lines changed: 26 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const configValidators = require('./configValidators');
1313
const deepMerge = require('../util/deepMerge');
1414
const { DEFAULT_STACK_TRACE_LENGTH, DEFAULT_STACK_TRACE_MODE } = require('../util/constants');
1515
const { validateStackTraceMode, validateStackTraceLength } = require('./configValidators/stackTraceValidation');
16+
const util = require('./util');
1617

1718
/**
1819
* @typedef {Object} InstanaTracingOption
@@ -141,6 +142,7 @@ module.exports.configValidators = configValidators;
141142
module.exports.init = _logger => {
142143
logger = _logger;
143144
configNormalizers.init({ logger });
145+
util.init(logger);
144146
};
145147

146148
/**
@@ -216,12 +218,12 @@ function normalizeMetricsConfig(config) {
216218
config.metrics = {};
217219
}
218220

219-
config.metrics.transmissionDelay = normalizeSingleValue(
220-
config.metrics.transmissionDelay,
221-
defaults.metrics.transmissionDelay,
222-
'config.metrics.transmissionDelay',
223-
'INSTANA_METRICS_TRANSMISSION_DELAY'
224-
);
221+
config.metrics.transmissionDelay = util.resolveNumericConfig({
222+
envVar: 'INSTANA_METRICS_TRANSMISSION_DELAY',
223+
configValue: config.metrics.transmissionDelay,
224+
defaultValue: defaults.metrics.transmissionDelay,
225+
configPath: 'config.metrics.transmissionDelay'
226+
});
225227

226228
config.metrics.timeBetweenHealthcheckCalls =
227229
config.metrics.timeBetweenHealthcheckCalls || defaults.metrics.timeBetweenHealthcheckCalls;
@@ -372,12 +374,12 @@ function normalizeActivateImmediately(config) {
372374
function normalizeTracingTransmission(config) {
373375
config.tracing.maxBufferedSpans = config.tracing.maxBufferedSpans || defaults.tracing.maxBufferedSpans;
374376

375-
config.tracing.transmissionDelay = normalizeSingleValue(
376-
config.tracing.transmissionDelay,
377-
defaults.tracing.transmissionDelay,
378-
'config.tracing.transmissionDelay',
379-
'INSTANA_TRACING_TRANSMISSION_DELAY'
380-
);
377+
config.tracing.transmissionDelay = util.resolveNumericConfig({
378+
envVar: 'INSTANA_TRACING_TRANSMISSION_DELAY',
379+
configValue: config.tracing.transmissionDelay,
380+
defaultValue: defaults.tracing.transmissionDelay,
381+
configPath: 'config.tracing.transmissionDelay'
382+
});
381383

382384
// DEPRECATED! This was never documented, but we shared it with a customer.
383385
if (process.env['INSTANA_DEV_MIN_DELAY_BEFORE_SENDING_SPANS']) {
@@ -397,19 +399,19 @@ function normalizeTracingTransmission(config) {
397399
}
398400
}
399401

400-
config.tracing.forceTransmissionStartingAt = normalizeSingleValue(
401-
config.tracing.forceTransmissionStartingAt,
402-
defaults.tracing.forceTransmissionStartingAt,
403-
'config.tracing.forceTransmissionStartingAt',
404-
'INSTANA_FORCE_TRANSMISSION_STARTING_AT'
405-
);
402+
config.tracing.forceTransmissionStartingAt = util.resolveNumericConfig({
403+
envVar: 'INSTANA_FORCE_TRANSMISSION_STARTING_AT',
404+
configValue: config.tracing.forceTransmissionStartingAt,
405+
defaultValue: defaults.tracing.forceTransmissionStartingAt,
406+
configPath: 'config.tracing.forceTransmissionStartingAt'
407+
});
406408

407-
config.tracing.initialTransmissionDelay = normalizeSingleValue(
408-
config.tracing.initialTransmissionDelay,
409-
defaults.tracing.initialTransmissionDelay,
410-
'config.tracing.initialTransmissionDelay',
411-
'INSTANA_TRACING_INITIAL_TRANSMISSION_DELAY'
412-
);
409+
config.tracing.initialTransmissionDelay = util.resolveNumericConfig({
410+
envVar: 'INSTANA_TRACING_INITIAL_TRANSMISSION_DELAY',
411+
configValue: config.tracing.initialTransmissionDelay,
412+
defaultValue: defaults.tracing.initialTransmissionDelay,
413+
configPath: 'config.tracing.initialTransmissionDelay'
414+
});
413415
}
414416

415417
/**
@@ -713,32 +715,6 @@ function parseSecretsEnvVar(envVarValue) {
713715
};
714716
}
715717

716-
/**
717-
* @param {*} configValue
718-
* @param {*} defaultValue
719-
* @param {string} configPath
720-
* @param {string} envVarKey
721-
* @returns {*}
722-
*/
723-
function normalizeSingleValue(configValue, defaultValue, configPath, envVarKey) {
724-
const envVarVal = process.env[envVarKey];
725-
let originalValue = configValue;
726-
if (configValue == null && envVarVal == null) {
727-
return defaultValue;
728-
} else if (configValue == null && envVarVal != null) {
729-
originalValue = envVarVal;
730-
configValue = parseInt(originalValue, 10);
731-
}
732-
733-
if (typeof configValue !== 'number' || isNaN(configValue)) {
734-
logger.warn(
735-
`The value of ${configPath} (or ${envVarKey}) ("${originalValue}") is ' +
736-
'not numerical or cannot be parsed to a numerical value. Assuming the default value ${defaultValue}.`
737-
);
738-
return defaultValue;
739-
}
740-
return configValue;
741-
}
742718
/**
743719
* @param {InstanaConfig} config
744720
*/

packages/core/src/config/util.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
/*
2+
* (c) Copyright IBM Corp. 2026
3+
*/
4+
5+
'use strict';
6+
7+
/** @type {import('../core').GenericLogger} */
8+
let logger;
9+
10+
/**
11+
* @param {import('../core').GenericLogger} [_logger]
12+
*/
13+
exports.init = _logger => {
14+
logger = _logger;
15+
};
16+
17+
/**
18+
* @param {Object} params
19+
* @param {string} params.envVar
20+
* @param {number|string|undefined|null} params.configValue
21+
* @param {number} params.defaultValue
22+
* @param {string} params.configPath
23+
* @returns {number}
24+
*/
25+
exports.resolveNumericConfig = function resolveNumericConfig({ envVar, configValue, defaultValue, configPath }) {
26+
const envRaw = process.env[envVar];
27+
28+
/** @param {number|string|null|undefined} val */
29+
const toValidNumber = val => {
30+
const num = typeof val === 'number' ? val : Number(val);
31+
return Number.isNaN(num) ? undefined : num;
32+
};
33+
34+
if (envRaw != null) {
35+
const envParsed = toValidNumber(envRaw);
36+
if (envParsed !== undefined) {
37+
return envParsed;
38+
}
39+
40+
logger.warn(`Invalid numeric value from env:${envVar}: "${envRaw}". Ignoring and checking config value.`);
41+
}
42+
43+
if (configValue != null) {
44+
const configParsed = toValidNumber(configValue);
45+
if (configParsed !== undefined) {
46+
return configParsed;
47+
}
48+
49+
logger.warn(
50+
`Invalid numeric value for ${configPath} from config: "${configValue}". Falling back to default: ${defaultValue}.`
51+
);
52+
}
53+
54+
return defaultValue;
55+
};

0 commit comments

Comments
 (0)