Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
ecb5199
refactor(core): normalized numeric config resolution with env precede…
aryamohanan Mar 26, 2026
bb42711
fix: removed deprecated INSTANA_DEV_MIN_DELAY_BEFORE_SENDING_SPANS en…
aryamohanan Mar 27, 2026
baba0f7
refactor(core): normalized boolean config resolution (#2433)
aryamohanan Mar 27, 2026
5409165
refactor(core): enabled eslint in config (#2435)
aryamohanan Mar 27, 2026
fb17958
refactor(core): added TODO comments explaining resolver complexity(#2…
aryamohanan Mar 30, 2026
3866bf0
test: restructured config tests with logical grouping (#2445)
aryamohanan Mar 30, 2026
384e49a
test: extended tests to include precedence cases (#2447)
aryamohanan Mar 31, 2026
91f67de
test(config): improved overall test coverage (#2451)
aryamohanan Mar 31, 2026
e0591a9
test(collector): extended config tests for full coverage (#2456)
aryamohanan Apr 1, 2026
84f6475
refactor: standardized config logging format (#2446)
aryamohanan Apr 6, 2026
dea25c8
refactor(core): made config resolution explicit (#2448)
aryamohanan Apr 8, 2026
7493040
refactor(core): adapted optional object parameters in config normaliz…
abhilash-sivan Apr 8, 2026
d67b0df
refactor(collector): refcatored config module (#2457)
aryamohanan Apr 8, 2026
89f8f8e
refactor(config): cleanup normalize http header config (#2477)
aryamohanan Apr 8, 2026
38bd856
refactor(collector): moved resolve string config to core utility (#2479)
aryamohanan Apr 10, 2026
9084b2f
fix(core): ensured env vars take precedence over in-code config (#2478)
aryamohanan Apr 10, 2026
7059a40
test(collector): enabled config precedence tests (#2480)
aryamohanan Apr 10, 2026
0b71784
test: only set INSTANA_TRACING_DISABLE when tracing is actually disabled
aryamohanan Apr 13, 2026
a808ba2
chore: only parse INSTANA_TRACING_DISABLE as boolean when value is bo…
aryamohanan Apr 13, 2026
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
4 changes: 2 additions & 2 deletions packages/aws-lambda/src/wrapper.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ const latestRuntime = semver.gte(process.version, '24.0.0');

const logger = serverlessLogger.init();
coreConfig.init(logger);
let config = coreConfig.normalize({}, lambdaConfigDefaults);
let config = coreConfig.normalize({ defaultsOverride: lambdaConfigDefaults });
let coldStart = true;

// Initialize instrumentations early to allow for require statements after our
Expand Down Expand Up @@ -286,7 +286,7 @@ function init(event, arnInfo, _config) {
// - late env variables (less likely)
// - custom logger
// - we always renormalize unconditionally to ensure safety.
config = coreConfig.normalize(userConfig, lambdaConfigDefaults);
config = coreConfig.normalize({ userConfig, defaultsOverride: lambdaConfigDefaults });

if (!config.tracing.enabled) {
return false;
Expand Down
9 changes: 6 additions & 3 deletions packages/collector/src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down Expand Up @@ -158,8 +158,11 @@ function init(userConfig = {}) {
log.init(userConfig);
}

config = normalizeCollectorConfig(userConfig);
config = instanaNodeJsCore.coreConfig.normalize(config);
const finalCollectorConfig = normalizeConfig(userConfig);
config = instanaNodeJsCore.coreConfig.normalize({
userConfig,
finalConfigBase: finalCollectorConfig
});

agentConnection = require('./agentConnection');
const agentOpts = require('./agent/opts');
Expand Down
2 changes: 1 addition & 1 deletion packages/collector/src/types/collector.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export interface CollectorConfig {
stackTraceLength?: number;
[key: string]: any;
};
autoProfile?: boolean | string;
autoProfile?: boolean;
reportUnhandledPromiseRejections?: boolean;
logger?: GenericLogger;
level?: string | number;
Expand Down
102 changes: 75 additions & 27 deletions packages/collector/src/util/normalizeConfig.js
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -16,38 +16,86 @@ 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);

config.autoProfile = config.autoProfile || process.env.INSTANA_AUTO_PROFILE || defaults.autoProfile;
config.tracing = config.tracing || {};
module.exports = function normalizeConfig(userConfig = {}) {
const finalConfig = {};

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 util.resolveStringConfig({
envVar: 'INSTANA_AGENT_HOST',
configValue: userConfig.agentHost,
defaultValue: defaultConfig.agentHost,
configPath: 'config.agentHost'
});
}

/**
* @param {import('../types/collector').CollectorConfig} userConfig
* @param {{ agentPort: number }} defaultConfig
* @returns {number}
*/
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 parseToPositiveInteger(value, defaultValue) {
if (typeof value !== 'string') {
return defaultValue;
}
value = parseInt(value, 10);
if (!isNaN(value)) {
return Math.abs(Math.round(value));
}
return defaultValue;
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: boolean }} defaultConfig
* @returns {boolean}
*/
function normalizeAutoProfile(userConfig, defaultConfig) {
return util.resolveBooleanConfig({
envVar: 'INSTANA_AUTO_PROFILE',
configValue: userConfig.autoProfile,
defaultValue: defaultConfig.autoProfile,
configPath: 'config.autoProfile'
});
}

/**
* @param {import('../types/collector').CollectorConfig} userConfig
* @returns {boolean}
*/
function normalizeUnhandledRejections(userConfig) {
return userConfig.reportUnhandledPromiseRejections ?? false;
}
8 changes: 7 additions & 1 deletion packages/collector/test/test_util/ProcessControls.js
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,6 @@ class ProcessControls {
APP_CWD: this.cwd,
INSTANA_AGENT_PORT: agentPort,
INSTANA_LOG_LEVEL: 'warn',
INSTANA_TRACING_DISABLE: !this.tracingEnabled,
INSTANA_FORCE_TRANSMISSION_STARTING_AT: '1',
INSTANA_FULL_METRICS_INTERNAL_IN_S: 1,
INSTANA_FIRE_MONITORING_EVENT_DURATION_IN_MS: 500,
Expand All @@ -164,6 +163,13 @@ class ProcessControls {
opts.env
);

// Only set INSTANA_TRACING_DISABLE when tracing is actually disabled to avoid
// overriding other disable environment variables (INSTANA_TRACING_DISABLE_INSTRUMENTATIONS, etc.)
// See packages/core/src/config/configNormalizers/disable.js for precedence rules
if (!this.tracingEnabled) {
this.env.INSTANA_TRACING_DISABLE = 'true';
}

if (this.usePreInit) {
this.env.INSTANA_EARLY_INSTRUMENTATION = 'true';
}
Expand Down
Loading