Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 15 additions & 8 deletions packages/core/src/config/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,11 @@ let currentConfig;
/** @type {String[]} */
const allowedSecretMatchers = ['equals', 'equals-ignore-case', 'contains', 'contains-ignore-case', 'regex', 'none'];

const transmissionDelayMaxValue = 5000;
// 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
Expand All @@ -156,7 +160,7 @@ let defaults = {
packageJsonPath: null,

metrics: {
transmissionDelay: 1000,
transmissionDelay: 30000,
timeBetweenHealthcheckCalls: 3000
},

Expand Down Expand Up @@ -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 });
Expand Down
66 changes: 47 additions & 19 deletions packages/core/test/config/normalizeConfig_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -93,73 +93,101 @@ 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: {
transmissionDelay: 4753
}
}
});
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);
expect(config.metrics.transmissionDelay).to.equal(30000);
});

it('should use max metrics transmission settings when value exceeds max of 5000', () => {
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();
// nearest allowed value to 6000 ms is 5000 ms
expect(normalizedConfig.metrics.transmissionDelay).to.equal(5000);
});

it('should accept metrics transmission delay at max value of 5000', () => {
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(5000);
});

it('should use max metrics transmission settings when value exceeds max 5000', () => {
it('should snap config transmissionDelay of 90000 to nearest allowed value of 60000', () => {
const config = coreConfig.normalize({
userConfig: {
metrics: {
transmissionDelay: 9753
transmissionDelay: 90 * 1000
}
}
});
expect(config.metrics.transmissionDelay).to.equal(5000);
// 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', () => {
Expand Down Expand Up @@ -2676,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');
Expand Down