From b1e4dac5bbc24024db6f172e30302ff69aa82d49 Mon Sep 17 00:00:00 2001 From: kirrg001 Date: Tue, 18 Aug 2026 13:36:03 +0200 Subject: [PATCH 1/2] fix(core): allowed metrics interval up to 60s refs https://jsw.ibm.com/browse/INSTA-102260 --- packages/core/src/config/index.js | 2 +- .../core/test/config/normalizeConfig_test.js | 30 +++++++++++++------ 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/packages/core/src/config/index.js b/packages/core/src/config/index.js index 18c033cbf5..a204364b28 100644 --- a/packages/core/src/config/index.js +++ b/packages/core/src/config/index.js @@ -133,7 +133,7 @@ let currentConfig; /** @type {String[]} */ const allowedSecretMatchers = ['equals', 'equals-ignore-case', 'contains', 'contains-ignore-case', 'regex', 'none']; -const transmissionDelayMaxValue = 5000; +const transmissionDelayMaxValue = 60 * 1000; /** * @typedef {Object} InstanaConfig diff --git a/packages/core/test/config/normalizeConfig_test.js b/packages/core/test/config/normalizeConfig_test.js index c45a3dd108..0e3b170584 100644 --- a/packages/core/test/config/normalizeConfig_test.js +++ b/packages/core/test/config/normalizeConfig_test.js @@ -116,27 +116,39 @@ describe('config.normalizeConfig', () => { expect(config.metrics.transmissionDelay).to.equal(1000); }); - it('should use max metrics transmission settings when value exceeds max of 5000', () => { - process.env.INSTANA_METRICS_TRANSMISSION_DELAY = '6000'; + it('should accept metrics transmission delay of 5s', () => { + process.env.INSTANA_METRICS_TRANSMISSION_DELAY = String(5 * 1000); const normalizedConfig = coreConfig.normalize(); - expect(normalizedConfig.metrics.transmissionDelay).to.equal(5000); + expect(normalizedConfig.metrics.transmissionDelay).to.equal(5 * 1000); }); - it('should accept metrics transmission delay at max value of 5000', () => { - process.env.INSTANA_METRICS_TRANSMISSION_DELAY = '5000'; + it('should accept metrics transmission delay of 30s', () => { + process.env.INSTANA_METRICS_TRANSMISSION_DELAY = String(30 * 1000); const normalizedConfig = coreConfig.normalize(); - expect(normalizedConfig.metrics.transmissionDelay).to.equal(5000); + expect(normalizedConfig.metrics.transmissionDelay).to.equal(30 * 1000); }); - it('should use max metrics transmission settings when value exceeds max 5000', () => { + it('should cap metrics transmission delay of 120s to max of 60s', () => { + process.env.INSTANA_METRICS_TRANSMISSION_DELAY = String(120 * 1000); + const normalizedConfig = coreConfig.normalize(); + expect(normalizedConfig.metrics.transmissionDelay).to.equal(60 * 1000); + }); + + it('should accept metrics transmission delay at max value of 60s', () => { + process.env.INSTANA_METRICS_TRANSMISSION_DELAY = String(60 * 1000); + const normalizedConfig = coreConfig.normalize(); + expect(normalizedConfig.metrics.transmissionDelay).to.equal(60 * 1000); + }); + + it('should cap metrics transmission delay from config exceeding 60s', () => { const config = coreConfig.normalize({ userConfig: { metrics: { - transmissionDelay: 9753 + transmissionDelay: 90 * 1000 } } }); - expect(config.metrics.transmissionDelay).to.equal(5000); + expect(config.metrics.transmissionDelay).to.equal(60 * 1000); }); it('should use default (1000) for transmissionDelay when neither env nor config is set', () => { From 02a9425737b5f1b07655ece2a8f32fabc9c4036c Mon Sep 17 00:00:00 2001 From: Abhilash Date: Thu, 27 Aug 2026 17:03:02 +0530 Subject: [PATCH 2/2] chore: updated allow list --- packages/core/src/config/index.js | 23 +++-- .../core/test/config/normalizeConfig_test.js | 84 +++++++++++-------- 2 files changed, 65 insertions(+), 42 deletions(-) diff --git a/packages/core/src/config/index.js b/packages/core/src/config/index.js index a204364b28..cd31d8a59c 100644 --- a/packages/core/src/config/index.js +++ b/packages/core/src/config/index.js @@ -133,7 +133,11 @@ let currentConfig; /** @type {String[]} */ const allowedSecretMatchers = ['equals', 'equals-ignore-case', 'contains', 'contains-ignore-case', 'regex', 'none']; -const transmissionDelayMaxValue = 60 * 1000; +// Allowed poll rate values in milliseconds +// (1s, 5s, 10s, 20s, 30s, 60s, 120s, 180s, 240s, 300s, 360s, 420s, 480s, 540s, 600s) +const allowedTransmissionDelayValues = [ + 1000, 5000, 10000, 20000, 30000, 60000, 120000, 180000, 240000, 300000, 360000, 420000, 480000, 540000, 600000 +]; /** * @typedef {Object} InstanaConfig @@ -156,7 +160,7 @@ let defaults = { packageJsonPath: null, metrics: { - transmissionDelay: 1000, + transmissionDelay: 30000, timeBetweenHealthcheckCalls: 3000 }, @@ -319,15 +323,18 @@ function normalizeMetricsConfig({ userConfig = {}, defaultConfig = {}, finalConf [validators.numberValidator] ); - finalConfig.metrics.transmissionDelay = transmissionDelay; - - // Validate max value for transmissionDelay - if (finalConfig.metrics.transmissionDelay > transmissionDelayMaxValue) { + // Validate that transmissionDelay is one of the allowed values (in ms) + if (!allowedTransmissionDelayValues.includes(transmissionDelay)) { + const nearest = allowedTransmissionDelayValues.reduce((prev, curr) => + Math.abs(curr - transmissionDelay) < Math.abs(prev - transmissionDelay) ? curr : prev + ); logger.warn( // eslint-disable-next-line max-len - `The value of config.metrics.transmissionDelay (or INSTANA_METRICS_TRANSMISSION_DELAY) (${finalConfig.metrics.transmissionDelay}) exceeds the maximum allowed value of ${transmissionDelayMaxValue}. Assuming the max value ${transmissionDelayMaxValue}.` + `The value of config.metrics.transmissionDelay (or INSTANA_METRICS_TRANSMISSION_DELAY) (${transmissionDelay}) is not one of the allowed values (${allowedTransmissionDelayValues.join(', ')} ms). Assuming the nearest allowed value ${nearest} ms.` ); - finalConfig.metrics.transmissionDelay = transmissionDelayMaxValue; + finalConfig.metrics.transmissionDelay = nearest; + } else { + finalConfig.metrics.transmissionDelay = transmissionDelay; } configStore.set('config.metrics.transmissionDelay', { source: transmissionDelaySource }); diff --git a/packages/core/test/config/normalizeConfig_test.js b/packages/core/test/config/normalizeConfig_test.js index 0e3b170584..cc5815b81d 100644 --- a/packages/core/test/config/normalizeConfig_test.js +++ b/packages/core/test/config/normalizeConfig_test.js @@ -93,7 +93,7 @@ describe('config.normalizeConfig', () => { }); describe('metrics configuration', () => { - it('should use custom metrics transmission settings from config', () => { + it('should snap to nearest allowed value when config transmissionDelay is not in allowed list', () => { const config = coreConfig.normalize({ userConfig: { metrics: { @@ -101,46 +101,37 @@ describe('config.normalizeConfig', () => { } } }); - expect(config.metrics.transmissionDelay).to.equal(4753); + // nearest allowed value to 4753 ms is 5000 ms + expect(config.metrics.transmissionDelay).to.equal(5000); }); - it('should use custom metrics transmission settings from env vars', () => { + it('should snap to nearest allowed value when INSTANA_METRICS_TRANSMISSION_DELAY is not in allowed list', () => { process.env.INSTANA_METRICS_TRANSMISSION_DELAY = '2500'; const config = coreConfig.normalize(); - expect(config.metrics.transmissionDelay).to.equal(2500); + // nearest allowed value to 2500 ms is 1000 ms + expect(config.metrics.transmissionDelay).to.equal(1000); }); - it('should use default metrics transmission settings when env vars are non-numerical', () => { + it('should use default transmissionDelay when INSTANA_METRICS_TRANSMISSION_DELAY is non-numerical', () => { process.env.INSTANA_METRICS_TRANSMISSION_DELAY = 'x2500'; const config = coreConfig.normalize(); - expect(config.metrics.transmissionDelay).to.equal(1000); - }); - - it('should accept metrics transmission delay of 5s', () => { - process.env.INSTANA_METRICS_TRANSMISSION_DELAY = String(5 * 1000); - const normalizedConfig = coreConfig.normalize(); - expect(normalizedConfig.metrics.transmissionDelay).to.equal(5 * 1000); + expect(config.metrics.transmissionDelay).to.equal(30000); }); - it('should accept metrics transmission delay of 30s', () => { - process.env.INSTANA_METRICS_TRANSMISSION_DELAY = String(30 * 1000); + it('should snap to nearest allowed value when INSTANA_METRICS_TRANSMISSION_DELAY is 6000', () => { + process.env.INSTANA_METRICS_TRANSMISSION_DELAY = '6000'; const normalizedConfig = coreConfig.normalize(); - expect(normalizedConfig.metrics.transmissionDelay).to.equal(30 * 1000); + // nearest allowed value to 6000 ms is 5000 ms + expect(normalizedConfig.metrics.transmissionDelay).to.equal(5000); }); - it('should cap metrics transmission delay of 120s to max of 60s', () => { - process.env.INSTANA_METRICS_TRANSMISSION_DELAY = String(120 * 1000); + it('should accept transmissionDelay of 5000 as it is in the allowed list', () => { + process.env.INSTANA_METRICS_TRANSMISSION_DELAY = '5000'; const normalizedConfig = coreConfig.normalize(); - expect(normalizedConfig.metrics.transmissionDelay).to.equal(60 * 1000); + expect(normalizedConfig.metrics.transmissionDelay).to.equal(5000); }); - it('should accept metrics transmission delay at max value of 60s', () => { - process.env.INSTANA_METRICS_TRANSMISSION_DELAY = String(60 * 1000); - const normalizedConfig = coreConfig.normalize(); - expect(normalizedConfig.metrics.transmissionDelay).to.equal(60 * 1000); - }); - - it('should cap metrics transmission delay from config exceeding 60s', () => { + it('should snap config transmissionDelay of 90000 to nearest allowed value of 60000', () => { const config = coreConfig.normalize({ userConfig: { metrics: { @@ -148,30 +139,55 @@ describe('config.normalizeConfig', () => { } } }); - expect(config.metrics.transmissionDelay).to.equal(60 * 1000); + // nearest allowed value to 90000 ms is 60000 ms (tie broken by first match) + expect(config.metrics.transmissionDelay).to.equal(60000); }); - it('should use default (1000) for transmissionDelay when neither env nor config is set', () => { + it('should use default (30000) for transmissionDelay when neither env nor config is set', () => { const config = coreConfig.normalize({}); - expect(config.metrics.transmissionDelay).to.equal(1000); + expect(config.metrics.transmissionDelay).to.equal(30000); }); it('should give precedence to INSTANA_METRICS_TRANSMISSION_DELAY env var over config', () => { - process.env.INSTANA_METRICS_TRANSMISSION_DELAY = '3000'; + process.env.INSTANA_METRICS_TRANSMISSION_DELAY = '30000'; const config = coreConfig.normalize({ userConfig: { metrics: { transmissionDelay: 5000 } } }); - expect(config.metrics.transmissionDelay).to.equal(3000); + expect(config.metrics.transmissionDelay).to.equal(30000); }); - it('should fall back to config when env var is invalid', () => { + it('should fall back to config when env var is invalid for transmissionDelay', () => { process.env.INSTANA_METRICS_TRANSMISSION_DELAY = 'invalid'; const config = coreConfig.normalize({ userConfig: { metrics: { transmissionDelay: 5000 } } }); expect(config.metrics.transmissionDelay).to.equal(5000); }); - it('should fall back to default when both env and config are invalid', () => { + it('should fall back to default when both env and config are invalid for transmissionDelay', () => { process.env.INSTANA_METRICS_TRANSMISSION_DELAY = 'invalid'; const config = coreConfig.normalize({ userConfig: { metrics: { transmissionDelay: 'also-invalid' } } }); - expect(config.metrics.transmissionDelay).to.equal(1000); + expect(config.metrics.transmissionDelay).to.equal(30000); + }); + + it('should accept transmissionDelay of 60000 as it is in the allowed list', () => { + process.env.INSTANA_METRICS_TRANSMISSION_DELAY = '60000'; + const config = coreConfig.normalize(); + expect(config.metrics.transmissionDelay).to.equal(60000); + }); + + it('should accept config transmissionDelay of 60000 as it is in the allowed list', () => { + const config = coreConfig.normalize({ userConfig: { metrics: { transmissionDelay: 60000 } } }); + expect(config.metrics.transmissionDelay).to.equal(60000); + }); + + it('should snap 72000 to nearest allowed value of 60000 via env var', () => { + process.env.INSTANA_METRICS_TRANSMISSION_DELAY = '72000'; + const config = coreConfig.normalize(); + // nearest allowed value to 72000 ms is 60000 ms + expect(config.metrics.transmissionDelay).to.equal(60000); + }); + + it('should snap 72000 to nearest allowed value of 60000 via config', () => { + const config = coreConfig.normalize({ userConfig: { metrics: { transmissionDelay: 72000 } } }); + // nearest allowed value to 72000 ms is 60000 ms + expect(config.metrics.transmissionDelay).to.equal(60000); }); it('should use custom config.metrics.timeBetweenHealthcheckCalls', () => { @@ -2688,7 +2704,7 @@ describe('config.normalizeConfig', () => { expect(config.packageJsonPath).to.not.exist; expect(config.metrics).to.be.an('object'); - expect(config.metrics.transmissionDelay).to.equal(1000); + expect(config.metrics.transmissionDelay).to.equal(30000); expect(config.metrics.timeBetweenHealthcheckCalls).to.equal(3000); expect(config.tracing).to.be.an('object');