Skip to content
Merged
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
6 changes: 3 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,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');
Expand Down
105 changes: 81 additions & 24 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,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);
Comment thread
kirrg001 marked this conversation as resolved.
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) {
Comment thread
kirrg001 marked this conversation as resolved.
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;
}
15 changes: 6 additions & 9 deletions packages/collector/test/unit/src/util/normalizeConfig.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -84,14 +89,6 @@ describe('util.normalizeConfig', () => {
expect(config.agentPort).to.equal(42699);
});

it('should normalize negative env values', () => {
Comment thread
kirrg001 marked this conversation as resolved.
process.env.INSTANA_AGENT_PORT = '-3000';

const config = normalizeConfig();

expect(config.agentPort).to.equal(3000);
});
Comment thread
kirrg001 marked this conversation as resolved.

it('should fallback to default for invalid env value', () => {
process.env.INSTANA_AGENT_PORT = 'invalid';

Expand Down