From e121b6429de8821d16d9f51db76292dcc602626a Mon Sep 17 00:00:00 2001 From: kirrg001 Date: Mon, 15 Sep 2025 15:18:03 +0200 Subject: [PATCH 1/4] refactor(collector): removed agent opts file --- packages/collector/src/agent/opts.js | 34 --------- packages/collector/src/agentConnection.js | 37 ++++----- .../src/announceCycle/agentHostLookup.js | 64 ++++++++-------- .../collector/src/announceCycle/agentready.js | 26 +++---- .../src/announceCycle/unannounced.js | 37 ++++----- packages/collector/src/index.js | 8 +- packages/collector/src/pidStore/index.js | 13 ++-- packages/collector/src/types/collector.d.ts | 3 + .../collector/src/util/normalizeConfig.js | 11 ++- .../collector/test/agentConnection_test.js | 8 -- .../announceCycle/agentHostLookup_test.js | 19 ----- .../test/announceCycle/agentready_test.js | 13 +--- .../test/announceCycle/unannounced_test.js | 75 ++++++++++--------- packages/core/src/tracing/index.js | 1 + 14 files changed, 147 insertions(+), 202 deletions(-) delete mode 100644 packages/collector/src/agent/opts.js diff --git a/packages/collector/src/agent/opts.js b/packages/collector/src/agent/opts.js deleted file mode 100644 index 575888085a..0000000000 --- a/packages/collector/src/agent/opts.js +++ /dev/null @@ -1,34 +0,0 @@ -/* - * (c) Copyright IBM Corp. 2021 - * (c) Copyright Instana Inc. and contributors 2016 - */ - -'use strict'; - -// max time spend waiting for an agent response -exports.requestTimeout = 5000; -// @ts-ignore - Cannot redeclare exported variable -exports.host = '127.0.0.1'; -// @ts-ignore - Cannot redeclare exported variable -exports.port = 42699; -/** @type {string} */ -exports.agentUuid = undefined; -// @ts-ignore - Cannot redeclare exported variable -exports.autoProfile = false; - -/** @type {import('@instana/collector/src/types/collector').AgentConfig} config */ -exports.config = {}; - -/** - * @param {import('../types/collector').CollectorConfig} config - */ -exports.init = function init(config) { - // @ts-ignore - Cannot redeclare exported variable - exports.host = config.agentHost; - // @ts-ignore - Cannot redeclare exported variable - exports.port = config.agentPort; - - // TODO: Why is autoProfile part of agentOpts? O_o - // @ts-ignore - Cannot redeclare exported variable - exports.autoProfile = config.autoProfile; -}; diff --git a/packages/collector/src/agentConnection.js b/packages/collector/src/agentConnection.js index 7996406268..b58d3b2cb8 100644 --- a/packages/collector/src/agentConnection.js +++ b/packages/collector/src/agentConnection.js @@ -8,7 +8,6 @@ const { util, uninstrumentedHttp, uninstrumentedFs: fs } = require('@instana/core'); const pathUtil = require('path'); const circularReferenceRemover = require('./util/removeCircular'); -const agentOpts = require('./agent/opts'); const cmdline = require('./cmdline'); /** @typedef {import('@instana/core/src/core').InstanaBaseSpan} InstanaBaseSpan */ @@ -34,14 +33,18 @@ let isConnected = false; /** @type {string | null} */ let cpuSetFileContent = null; +/** @type {import('./types/collector').CollectorConfig} */ +let config; + /** - * @param {import('@instana/core/src/config').InstanaConfig} config + * @param {import('./types/collector').CollectorConfig} _config * @param {any} _pidStore */ -exports.init = function init(config, _pidStore) { - logger = config.logger; +exports.init = function init(_config, _pidStore) { + config = _config; pidStore = _pidStore; + logger = config.logger; cmdline.init(config); cpuSetFileContent = getCpuSetFileContent(); }; @@ -133,8 +136,8 @@ exports.announceNodeCollector = function announceNodeCollector(callback) { const req = http.request( { - host: agentOpts.host, - port: agentOpts.port, + host: config.agentHost, + port: config.agentPort, path: '/com.instana.plugin.nodejs.discovery', method: 'PUT', agent: http.agent, @@ -161,7 +164,7 @@ exports.announceNodeCollector = function announceNodeCollector(callback) { } ); - req.setTimeout(agentOpts.requestTimeout, function onTimeout() { + req.setTimeout(config.requestTimeout, function onTimeout() { handleCallback(new Error('Announce request to agent failed due to timeout')); req.destroy(); }); @@ -235,8 +238,8 @@ exports.sendLogToAgent = function sendLogToAgent(logLevel, message, stackTrace) const req = http.request( { - host: agentOpts.host, - port: agentOpts.port, + host: config.agentHost, + port: config.agentPort, path: '/com.instana.agent.logger', method: 'POST', agent: http.agent, @@ -255,7 +258,7 @@ exports.sendLogToAgent = function sendLogToAgent(logLevel, message, stackTrace) // swallow all errors } - req.setTimeout(agentOpts.requestTimeout, swallow); + req.setTimeout(config.requestTimeout, swallow); req.on('error', swallow); req.write(payload); @@ -271,8 +274,8 @@ function checkWhetherResponseForPathIsOkay(path, cb) { const req = http.request( { - host: agentOpts.host, - port: agentOpts.port, + host: config.agentHost, + port: config.agentPort, path, agent: http.agent, method: 'HEAD' @@ -284,7 +287,7 @@ function checkWhetherResponseForPathIsOkay(path, cb) { } ); - req.setTimeout(agentOpts.requestTimeout, function onTimeout() { + req.setTimeout(config.requestTimeout, function onTimeout() { isConnected = false; cb(isConnected); req.destroy(); @@ -440,7 +443,7 @@ function sendData(path, data, cb, ignore404 = false) { if (typeof logger.trace === 'function') { logger.trace(`Sending data to ${path}.`); } else { - logger.debug(`Sending data to ${path}, ${agentOpts}`); + logger.debug(`Sending data to ${path}, ${config.agentHost}:${config.agentPort}`); } // Convert payload to a buffer to correctly identify content-length ahead of time. @@ -452,8 +455,8 @@ function sendData(path, data, cb, ignore404 = false) { const req = http.request( { - host: agentOpts.host, - port: agentOpts.port, + host: config.agentHost, + port: config.agentPort, path, method: 'POST', agent: http.agent, @@ -486,7 +489,7 @@ function sendData(path, data, cb, ignore404 = false) { } ); - req.setTimeout(agentOpts.requestTimeout, function onTimeout() { + req.setTimeout(config.requestTimeout, function onTimeout() { cb(new Error(`Failed to send data to agent via POST ${path}. Ran into a timeout.`)); req.destroy(); }); diff --git a/packages/collector/src/announceCycle/agentHostLookup.js b/packages/collector/src/announceCycle/agentHostLookup.js index 1d7a07be6f..920592c357 100644 --- a/packages/collector/src/announceCycle/agentHostLookup.js +++ b/packages/collector/src/announceCycle/agentHostLookup.js @@ -9,17 +9,20 @@ const { callbackify } = require('util'); const { atMostOnce } = require('@instana/core').util; const { http } = require('@instana/core').uninstrumentedHttp; -const agentOpts = require('../agent/opts'); const defaultGatewayParser = require('./defaultGatewayParser'); const readDefaultGateway = callbackify(defaultGatewayParser.parseProcSelfNetRouteFile); /** @type {import('@instana/core/src/core').GenericLogger} */ let logger; +/** @type {import('@instana/collector/src/types/collector').CollectorConfig} */ +let config; /** - * @param {import('@instana/core/src/config').InstanaConfig} config + * @param {import('@instana/collector/src/types/collector').CollectorConfig} _config */ -const init = config => { +const init = _config => { + config = _config; + logger = config.logger; defaultGatewayParser.init(config); }; @@ -52,25 +55,24 @@ const retryTimeoutMillis = process.env.INSTANA_RETRY_AGENT_CONNECTION_IN_MS * @param {import('./').AnnounceCycleContext} ctx */ function enter(ctx) { - const agentHost = agentOpts.host; - - checkHost(agentHost, function onCheckHost(localhostCheckErr) { + checkHost(config.agentHost, function onCheckHost(localhostCheckErr) { if (!localhostCheckErr) { - setAgentHost(agentHost); + logger.info(`Found an agent on ${config.agentHost}:${config.agentPort}, proceeding to announce request.`); ctx.transitionTo('unannounced'); return; } logger.debug( - `No Instana host agent is running on ${agentHost}:${agentOpts.port}: ${localhostCheckErr}. Trying the default ` + - 'gateway next.' + `No Instana host agent is running on ${config.agentHost}:${config.agentPort}: ${localhostCheckErr}.` + + ' Trying the default gateway next.' ); readDefaultGateway(function onReadDefaultGateway(getDefaultGatewayErr, defaultGateway) { if (getDefaultGatewayErr) { logger.warn( - `The Instana host agent cannot be reached via ${agentHost}:${agentOpts.port} and the default gateway ` + - `cannot be determined. Details: Error for the connection attempt: ${safelyExtractErrorMessage( + `The Instana host agent cannot be reached via ${config.agentHost}:${config.agentPort} ` + + 'and the default gateway cannot be determined. ' + + `Details: Error for the connection attempt: ${safelyExtractErrorMessage( localhostCheckErr )}; error for determining the gateway: ${safelyExtractErrorMessage( getDefaultGatewayErr @@ -84,14 +86,16 @@ function enter(ctx) { checkHost(defaultGateway, function onCheckHostDefaultGateway(defaultGatewayCheckErr) { if (!defaultGatewayCheckErr) { - setAgentHost(defaultGateway); + config.agentHost = defaultGateway; + logger.info(`Found an agent on ${config.agentHost}:${config.agentPort}, proceeding to announce request.`); ctx.transitionTo('unannounced'); return; } logger.warn( - `The Instana host agent can neither be reached via ${agentHost}:${agentOpts.port} nor via the default ` + - `gateway ${defaultGateway}:${agentOpts.port}. Details: Error for the first attempt: ` + + `The Instana host agent can neither be reached via ${config.agentHost}:${config.agentPort} ` + + `nor via the default gateway ${defaultGateway}:${config.agentPort}. ` + + 'Details: Error for the first attempt: ' + `${safelyExtractErrorMessage(localhostCheckErr)}; error for the second attempt: ${safelyExtractErrorMessage( defaultGatewayCheckErr )}. The Instana host agent might not be ready yet, scheduling another attempt to establish a connection ` + @@ -139,7 +143,7 @@ function checkHost(host, cb) { req = http.request( { host, - port: agentOpts.port, + port: config.agentPort, path: '/', agent: http.agent, method: 'GET', @@ -155,7 +159,7 @@ function checkHost(host, cb) { res.resume(); handleCallback( new Error( - `The attempt to connect to the Instana host agent on ${host}:${agentOpts.port} has failed with an ` + + `The attempt to connect to the Instana host agent on ${host}:${config.agentPort} has failed with an ` + `unexpected status code. Expected HTTP 200 but received: ${res.statusCode}` ) ); @@ -165,8 +169,8 @@ function checkHost(host, cb) { } catch (e) { handleCallback( new Error( - `The attempt to connect to the Instana host agent on ${host}:${agentOpts.port} has failed with the following ` + - `error: ${e.message}` + `The attempt to connect to the Instana host agent on ${host}:${config.agentPort} ` + + `has failed with the following error: ${e.message}` ) ); return; @@ -174,7 +178,7 @@ function checkHost(host, cb) { req.on('timeout', function onTimeout() { handleCallback( - new Error(`The attempt to connect to the Instana host agent on ${host}:${agentOpts.port} has timed out`) + new Error(`The attempt to connect to the Instana host agent on ${host}:${config.agentPort} has timed out`) ); }); @@ -184,8 +188,8 @@ function checkHost(host, cb) { req.on('error', err => { handleCallback( new Error( - `The attempt to connect to the Instana host agent on ${host}:${agentOpts.port} has failed with the following ` + - `error: ${err.message}` + `The attempt to connect to the Instana host agent on ${host}:${config.agentPort} ` + + `has failed with the following error: ${err.message}` ) ); }); @@ -219,8 +223,8 @@ function handleResponse(host, res, cb) { } catch (e) { cb( new Error( - `The attempt to connect to the Instana host agent on ${host}:${agentOpts.port} has failed, the response ` + - `cannot be parsed as JSON. The party listening on ${host}:${agentOpts.port} does not seem to be an ` + + `The attempt to connect to the Instana host agent on ${host}:${config.agentPort} has failed, the response ` + + `cannot be parsed as JSON. The party listening on ${host}:${config.agentPort} does not seem to be an ` + `Instana host agent. Full response: ${responsePayload}` ) ); @@ -231,9 +235,9 @@ function handleResponse(host, res, cb) { } else { cb( new Error( - `The attempt to connect to the Instana host agent on ${host}:${agentOpts.port} has failed, the response did` + - ` not have a "version" property. The party listening on ${host}:${agentOpts.port} does not seem to be an ` + - `Instana host agent. Full response: ${responsePayload}` + `The attempt to connect to the Instana host agent on ${host}:${config.agentPort} ` + + ' has failed, the response did not have a "version" property. The party listening on ' + + `${host}:${config.agentPort} does not seem to be an Instana host agent. Full response: ${responsePayload}` ) ); } @@ -253,14 +257,6 @@ function safelyExtractErrorMessage(error) { return error; } -/** - * @param {string} host - */ -function setAgentHost(host) { - logger.info(`Found an agent on ${host}:${agentOpts.port}, proceeding to announce request.`); - agentOpts.host = host; -} - module.exports = { init, enter, diff --git a/packages/collector/src/announceCycle/agentready.js b/packages/collector/src/announceCycle/agentready.js index 02926756cd..910c89e5ec 100644 --- a/packages/collector/src/announceCycle/agentready.js +++ b/packages/collector/src/announceCycle/agentready.js @@ -14,7 +14,6 @@ try { const { tracing } = require('@instana/core'); const agentConnection = require('../agentConnection'); -const agentOpts = require('../agent/opts'); const initializedTooLate = require('../util/initializedTooLate'); const metrics = require('../metrics'); const requestHandler = require('../agent/requestHandler'); @@ -55,24 +54,23 @@ let tracingMetricsTimeout = null; /** @type {{ pid: number, getEntityId: Function }} */ let pidStore; -/** - * @type {boolean} - */ -let disableEOLEvents; +/** @type {import('@instana/collector/src/types/collector').CollectorConfig} */ +let config; /** - * @param {import('@instana/core/src/config').InstanaConfig} config + * @param {import('@instana/collector/src/types/collector').CollectorConfig} _config * @param {any} _pidStore */ -function init(config, _pidStore) { +function init(_config, _pidStore) { + config = _config; + logger = config.logger; pidStore = _pidStore; - disableEOLEvents = config.tracing?.disableEOLEvents; + initializedTooLate.init(config); requestHandler.init(config); - // TODO: Why is autoProfile part of agentOpts? O_o Please refactor this away in next major release. - if (agentOpts.autoProfile) { + if (config.autoProfile) { try { // @ts-ignore - TS cannot find @instana/profile. // TODO: @instana/autoprofile is not linted or typed @@ -122,14 +120,14 @@ function enter(_ctx) { } ); scheduleTracingMetrics(); - if (!disableEOLEvents) { + if (!config.tracing?.disableEOLEvents) { detectEOLNodeVersion(); } } - tracing.activate(agentOpts.config); + tracing.activate(config.agentConfig); - if (agentOpts.autoProfile && autoprofile) { + if (config.autoProfile && autoprofile) { profiler = autoprofile.start(); /** * @param {*} profiles @@ -236,7 +234,7 @@ function sendEOLEvent() { timestamp: Date.now(), duration: EOL_EVENT_DURATION, severity: agentConnection.AgentEventSeverity.WARNING, - path: `${agentOpts.agentUuid}/${pid}/nodejs-eol` + path: `${config.agentUuid}/${pid}/nodejs-eol` }, err => { if (err) { diff --git a/packages/collector/src/announceCycle/unannounced.js b/packages/collector/src/announceCycle/unannounced.js index a7d83c0fc9..6c025fd1e2 100644 --- a/packages/collector/src/announceCycle/unannounced.js +++ b/packages/collector/src/announceCycle/unannounced.js @@ -14,13 +14,15 @@ const { const { constants: tracingConstants } = tracing; const agentConnection = require('../agentConnection'); -const agentOpts = require('../agent/opts'); /** @type {import('@instana/core/src/core').GenericLogger} */ let logger; /** @type {{ pid: number }} */ let pidStore; +/** @type {import('@instana/collector/src/types/collector').CollectorConfig} */ +let config; + const initialRetryDelay = 10 * 1000; // 10 seconds const backoffFactor = 1.5; const maxRetryDelay = 60 * 1000; // one minute @@ -54,11 +56,12 @@ const maxRetryDelay = 60 * 1000; // one minute */ /** - * @param {import('@instana/core/src/config').InstanaConfig} config + * @param {import('@instana/collector/src/types/collector').CollectorConfig} _config * @param {any} _pidStore */ -function init(config, _pidStore) { - logger = config.logger; +function init(_config, _pidStore) { + logger = _config.logger; + config = _config; pidStore = _pidStore; } @@ -106,7 +109,7 @@ function tryToAnnounce(ctx, retryDelay = initialRetryDelay) { pidStore.pid = agentResponse.pid; } - agentOpts.agentUuid = agentResponse.agentUuid; + config.agentUuid = agentResponse.agentUuid; applyAgentConfiguration(agentResponse); ctx.transitionTo('announced'); }); @@ -169,9 +172,9 @@ function applyExtraHttpHeaderConfiguration(agentResponse) { */ function actuallyApplyExtraHttpHeaderConfiguration(extraHeaders) { if (Array.isArray(extraHeaders)) { - ensureNestedObjectExists(agentOpts.config, ['tracing', 'http']); + ensureNestedObjectExists(config.agentConfig, ['tracing', 'http']); // The Node.js HTTP API converts all incoming HTTP headers into lowercase. - agentOpts.config.tracing.http.extraHttpHeadersToCapture = extraHeaders.map((/** @type {string} */ s) => + config.agentConfig.tracing.http.extraHttpHeadersToCapture = extraHeaders.map((/** @type {string} */ s) => s.toLowerCase() ); } @@ -189,8 +192,8 @@ function applyKafkaTracingConfiguration(agentResponse) { ? kafkaTracingConfigFromAgent['trace-correlation'] : tracingConstants.kafkaTraceCorrelationDefault }; - ensureNestedObjectExists(agentOpts.config, ['tracing', 'kafka']); - agentOpts.config.tracing.kafka = kafkaTracingConfig; + ensureNestedObjectExists(config.agentConfig, ['tracing', 'kafka']); + config.agentConfig.tracing.kafka = kafkaTracingConfig; } // There is no fallback because there is are no legacy agent response attributes for the Kafka tracing config, those // were only introduced with the Node.js discovery version 1.2.18. @@ -202,8 +205,8 @@ function applyKafkaTracingConfiguration(agentResponse) { function applySpanBatchingConfiguration(agentResponse) { if (agentResponse.tracing) { if (agentResponse.tracing['span-batching-enabled'] === true) { - ensureNestedObjectExists(agentOpts.config, ['tracing']); - agentOpts.config.tracing.spanBatchingEnabled = true; + ensureNestedObjectExists(config.agentConfig, ['tracing']); + config.agentConfig.tracing.spanBatchingEnabled = true; } return; } @@ -212,8 +215,8 @@ function applySpanBatchingConfiguration(agentResponse) { // common tracing options section. We can remove this legacy fallback approximately in May 2023. if (agentResponse.spanBatchingEnabled === true || agentResponse.spanBatchingEnabled === 'true') { logger.info('Enabling span batching via Instana host agent configuration.'); - ensureNestedObjectExists(agentOpts.config, ['tracing']); - agentOpts.config.tracing.spanBatchingEnabled = true; + ensureNestedObjectExists(config.agentConfig, ['tracing']); + config.agentConfig.tracing.spanBatchingEnabled = true; } } @@ -236,8 +239,8 @@ function applyIgnoreEndpointsConfiguration(agentResponse) { const ignoreEndpointsConfig = agentResponse?.tracing?.['ignore-endpoints']; if (!ignoreEndpointsConfig) return; - ensureNestedObjectExists(agentOpts.config, ['tracing', 'ignoreEndpoints']); - agentOpts.config.tracing.ignoreEndpoints = configNormalizers.ignoreEndpoints.normalizeConfig(ignoreEndpointsConfig); + ensureNestedObjectExists(config.agentConfig, ['tracing', 'ignoreEndpoints']); + config.agentConfig.tracing.ignoreEndpoints = configNormalizers.ignoreEndpoints.normalizeConfig(ignoreEndpointsConfig); } /** @@ -252,8 +255,8 @@ function applyDisableConfiguration(agentResponse) { const disablingConfig = agentResponse?.tracing?.disable; if (!disablingConfig) return; - ensureNestedObjectExists(agentOpts.config, ['tracing', 'disable']); - agentOpts.config.tracing.disable = configNormalizers.disable.normalizeExternalConfig({ + ensureNestedObjectExists(config.agentConfig, ['tracing', 'disable']); + config.agentConfig.tracing.disable = configNormalizers.disable.normalizeExternalConfig({ tracing: { disable: disablingConfig } }); } diff --git a/packages/collector/src/index.js b/packages/collector/src/index.js index 3c2c96954d..b766641899 100644 --- a/packages/collector/src/index.js +++ b/packages/collector/src/index.js @@ -107,20 +107,18 @@ function init(userConfig = {}) { config = instanaNodeJsCore.coreConfig.normalize(config); agentConnection = require('./agentConnection'); - const agentOpts = require('./agent/opts'); const pidStore = require('./pidStore'); const uncaught = require('./uncaught'); const announceCycle = require('./announceCycle'); const metrics = require('./metrics'); - log.setDownstreamConnection(agentConnection); - + agentConnection.init(config, pidStore); pidStore.init(config); - agentOpts.init(config); announceCycle.init(config, pidStore); - agentConnection.init(config, pidStore); instanaNodeJsCore.init(config, agentConnection, pidStore); + log.setDownstreamConnection(agentConnection); + if (isMainThread) { uncaught.init(config, agentConnection, pidStore); metrics.init(config, pidStore); diff --git a/packages/collector/src/pidStore/index.js b/packages/collector/src/pidStore/index.js index 14ffd6fb09..b293ce9d18 100644 --- a/packages/collector/src/pidStore/index.js +++ b/packages/collector/src/pidStore/index.js @@ -9,7 +9,6 @@ const EventEmitter = require('events').EventEmitter; const { uninstrumentedFs: fs } = require('@instana/core'); const internalPidStore = require('./internalPidStore'); -const agentOpts = require('../agent/opts'); /** @type {import('@instana/core/src/core').GenericLogger} */ let logger; @@ -19,10 +18,15 @@ const eventName = 'pidChanged'; /** @type {import('events').EventEmitter} */ let eventEmitter; +/** @type {import('@instana/collector/src/types/collector').CollectorConfig} */ +let config; + /** - * @param {import('@instana/core/src/config').InstanaConfig} config + * @param {import('@instana/collector/src/types/collector').CollectorConfig} _config */ -exports.init = function init(config) { +exports.init = function init(_config) { + config = _config; + logger = config.logger; eventEmitter = new EventEmitter(); @@ -67,8 +71,7 @@ exports.getEntityId = function getEntityId() { exports.getFrom = function getFrom() { return { e: String(exports.pid), - /** @type {string} */ - h: agentOpts.agentUuid + h: config.agentUuid }; }; diff --git a/packages/collector/src/types/collector.d.ts b/packages/collector/src/types/collector.d.ts index f121b78044..1fdbde5343 100644 --- a/packages/collector/src/types/collector.d.ts +++ b/packages/collector/src/types/collector.d.ts @@ -20,6 +20,9 @@ export interface AgentConfig { export interface CollectorConfig { agentPort?: number; agentHost?: string; + agentUuid?: string | undefined; + requestTimeout?: number; + agentConfig?: AgentConfig; tracing?: { stackTraceLength?: number; [key: string]: any; diff --git a/packages/collector/src/util/normalizeConfig.js b/packages/collector/src/util/normalizeConfig.js index f3a3dc6a4c..9ccc2d8675 100644 --- a/packages/collector/src/util/normalizeConfig.js +++ b/packages/collector/src/util/normalizeConfig.js @@ -7,13 +7,17 @@ 'use strict'; +/** @type {import('../types/collector').CollectorConfig} */ const defaults = { agentHost: '127.0.0.1', agentPort: 42699, tracing: { stackTraceLength: 10 }, - autoProfile: false + agentConfig: {}, + agentUuid: undefined, + autoProfile: false, + requestTimeout: 1000 * 5 }; /** @@ -24,8 +28,11 @@ const defaults = { 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.autoProfile = config.autoProfile || process.env.INSTANA_AUTO_PROFILE || defaults.autoProfile; + config.agentConfig = defaults.agentConfig; + config.agentUuid = defaults.agentUuid; + config.requestTimeout = defaults.requestTimeout; + config.tracing = config.tracing || {}; if (config.tracing.stackTraceLength == null) { diff --git a/packages/collector/test/agentConnection_test.js b/packages/collector/test/agentConnection_test.js index 0158ac1da2..18d99e9929 100644 --- a/packages/collector/test/agentConnection_test.js +++ b/packages/collector/test/agentConnection_test.js @@ -62,9 +62,6 @@ mochaSuiteFn('agent connection', function () { const { AgentStubControls } = require('./apps/agentStubControls'); const agentControls = new AgentStubControls(); - const agentOpts = require('../src/agent/opts'); - const originalPort = agentOpts.port; - const config = { logger: testUtils.createFakeLogger() }; const pidStore = require('../src/pidStore'); let agentConnection; @@ -77,7 +74,6 @@ mochaSuiteFn('agent connection', function () { }); beforeEach(async () => { - agentOpts.port = agentControls.getPort(); agentConnection = require('../src/agentConnection'); pidStore.init(config); agentConnection.init(config, pidStore); @@ -86,10 +82,6 @@ mochaSuiteFn('agent connection', function () { await agentControls.clearReceivedData(); }); - afterEach(() => { - agentOpts.port = originalPort; - }); - it('should send traces to agent', done => { agentConnection.sendSpans(dummySpans, () => { agentControls diff --git a/packages/collector/test/announceCycle/agentHostLookup_test.js b/packages/collector/test/announceCycle/agentHostLookup_test.js index b492daaeb9..b85aebae6c 100644 --- a/packages/collector/test/announceCycle/agentHostLookup_test.js +++ b/packages/collector/test/announceCycle/agentHostLookup_test.js @@ -23,13 +23,6 @@ describe('agent host lookup state', () => { const port = 12345; let fakeRequest; - - const agentOptsMock = { - '@noCallThru': true, - host, - port - }; - const hostAndPort = { host, port }; const defaultGatewayIpPort = { host: defaultGatewayIp, port }; @@ -97,7 +90,6 @@ describe('agent host lookup state', () => { }; agentHostLookupState = proxyquire('../../src/announceCycle/agentHostLookup', { - '../agent/opts': agentOptsMock, '@instana/core': { uninstrumentedHttp: { http: httpStub @@ -124,9 +116,6 @@ describe('agent host lookup state', () => { fakeRequest = new FakeRequest([configuredHostLookupOk], opt, cb); return fakeRequest; }); - - agentOptsMock.host = hostAndPort.host; - agentOptsMock.port = hostAndPort.port; }); it('should find the agent at the configured IP and port', done => { @@ -142,8 +131,6 @@ describe('agent host lookup state', () => { describe('via default gateway IP', () => { before(() => { - agentOptsMock.host = hostAndPort.host; - agentOptsMock.port = hostAndPort.port; parseProcSelfNetRouteFileStub.callsFake(async () => defaultGatewayIp); requestStub.callsFake((opt, cb) => { fakeRequest = new FakeRequest( @@ -174,8 +161,6 @@ describe('agent host lookup state', () => { describe('via default gateway IP when something else listens on 127.0.0.1:42699', () => { before(() => { - agentOptsMock.host = hostAndPort.host; - agentOptsMock.port = hostAndPort.port; parseProcSelfNetRouteFileStub.callsFake(async () => defaultGatewayIp); requestStub.callsFake((opt, cb) => { fakeRequest = new FakeRequest( @@ -208,8 +193,6 @@ describe('agent host lookup state', () => { let sinonFakeTimers; before(() => { - agentOptsMock.host = hostAndPort.host; - agentOptsMock.port = hostAndPort.port; parseProcSelfNetRouteFileStub.callsFake(async () => { throw new Error('Failed to determine the default gateway: The file /proc/self/net/route does not exist'); }); @@ -251,8 +234,6 @@ describe('agent host lookup state', () => { const configuredHostLookupConnectionRefusedSecondAttempt = configuredHostLookupConnectionRefused.clone(); before(() => { - agentOptsMock.host = hostAndPort.host; - agentOptsMock.port = hostAndPort.port; parseProcSelfNetRouteFileStub.callsFake(async () => defaultGatewayIp); requestStub.callsFake((opt, cb) => { fakeRequest = new FakeRequest( diff --git a/packages/collector/test/announceCycle/agentready_test.js b/packages/collector/test/announceCycle/agentready_test.js index 8896db4c50..9cf8853b11 100644 --- a/packages/collector/test/announceCycle/agentready_test.js +++ b/packages/collector/test/announceCycle/agentready_test.js @@ -25,7 +25,6 @@ const eol = require('../../src/util/eol'); describe('agent ready state', () => { let agentReadyState; - let agentOptsStub; let tracingStub; let agentConnectionStub; let initializedTooLateStub; @@ -34,11 +33,8 @@ describe('agent ready state', () => { let transmissionCycleStub; let uncaughtStub; let eolStub; + beforeEach(() => { - agentOptsStub = { - config: {}, - agentUuid: 'test-uuid' - }; tracingStub = sinon.stub(tracing); agentConnectionStub = sinon.stub(agentConnection); initializedTooLateStub = sinon.stub(initializedTooLate); @@ -52,7 +48,6 @@ describe('agent ready state', () => { '@instana/core': { tracing: tracingStub }, - '../agent/opts': agentOptsStub, '../agentConnection': agentConnectionStub, '../util/initializedTooLate': initializedTooLateStub, '../metrics': metricsStub, @@ -63,7 +58,7 @@ describe('agent ready state', () => { }); agentReadyState.init( - { logger: testUtils.createFakeLogger() }, + { logger: testUtils.createFakeLogger(), agentConfig: { foo: { bar: 'baz' } } }, { pid: 12345, getEntityId: () => 'test-entity-id' @@ -88,9 +83,7 @@ describe('agent ready state', () => { }); it('should forward agent config to tracing component', () => { - agentOptsStub.config = { foo: { bar: 'baz' } }; - agentReadyState.enter(); - expect(tracingStub.activate).to.have.been.calledWith(agentOptsStub.config); + expect(tracingStub.activate).to.have.been.calledWith({ foo: { bar: 'baz' } }); }); }); diff --git a/packages/collector/test/announceCycle/unannounced_test.js b/packages/collector/test/announceCycle/unannounced_test.js index 797991b7ce..d885db1434 100644 --- a/packages/collector/test/announceCycle/unannounced_test.js +++ b/packages/collector/test/announceCycle/unannounced_test.js @@ -14,21 +14,24 @@ chai.use(sinonChai); const { secrets, tracing } = require('@instana/core'); const { constants } = tracing; +const collectorConfig = require('../../src/util/normalizeConfig'); const agentConnection = require('../../src/agentConnection'); const testUtils = require('@instana/core/test/test_util'); describe('unannounced state', () => { let unannouncedState; - let agentOptsStub; let agentConnectionStub; let tracingStub; let secretsStub; let pidStoreStub; describe('enter', () => { - before(() => { - agentOptsStub = {}; + let configObj; + + beforeEach(() => { + configObj = collectorConfig(); + agentConnectionStub = sinon.stub(agentConnection); tracingStub = sinon.stub(tracing); secretsStub = sinon.stub(secrets); @@ -39,22 +42,20 @@ describe('unannounced state', () => { secrets: secretsStub, tracing: tracingStub }, - '../agent/opts': agentOptsStub, '../agentConnection': agentConnectionStub }); - unannouncedState.init({ logger: testUtils.createFakeLogger() }, pidStoreStub); + configObj.logger = testUtils.createFakeLogger(); + unannouncedState.init(configObj, pidStoreStub); }); afterEach(() => { agentConnectionStub.announceNodeCollector.reset(); tracingStub.activate.reset(); secretsStub.setMatcher.reset(); - agentOptsStub.agentUuid = undefined; - agentOptsStub.config = {}; }); - after(() => { + afterEach(() => { sinon.restore(); }); @@ -84,7 +85,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.agentUuid).to.equal('some agent uuid'); + expect(configObj.agentUuid).to.equal('some agent uuid'); done(); } }); @@ -113,7 +114,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { http: { extraHttpHeadersToCapture: ['x-extra-header-1', 'x-extra-header-2'] @@ -131,7 +132,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { http: { extraHttpHeadersToCapture: ['x-extra-header-3', 'x-extra-header-4'] @@ -151,7 +152,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { kafka: { traceCorrelation: constants.kafkaTraceCorrelationDefault @@ -173,7 +174,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { kafka: { traceCorrelation: false @@ -191,7 +192,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { spanBatchingEnabled: true } @@ -205,7 +206,7 @@ describe('unannounced state', () => { prepareAnnounceResponse({ spanBatchingEnabled: true }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { spanBatchingEnabled: true } @@ -224,7 +225,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { ignoreEndpoints: { redis: [{ methods: ['get'] }] @@ -246,7 +247,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { ignoreEndpoints: { redis: [{ methods: ['set', 'get'] }] @@ -269,7 +270,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { ignoreEndpoints: { redis: [ @@ -301,7 +302,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { ignoreEndpoints: { redis: [], @@ -335,7 +336,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { ignoreEndpoints: { kafka: [ @@ -377,7 +378,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { ignoreEndpoints: { kafka: [ @@ -411,7 +412,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { ignoreEndpoints: { kafka: [ @@ -440,7 +441,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { ignoreEndpoints: { kafka: [{ endpoints: ['topic1', 'topic2'] }] @@ -466,7 +467,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { ignoreEndpoints: { kafka: [{ methods: ['publish'] }] @@ -492,7 +493,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { ignoreEndpoints: { kafka: [{ methods: ['publish'] }] @@ -519,7 +520,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { ignoreEndpoints: { kafka: [{ methods: ['publish'], endpoints: ['topic1'] }] @@ -542,7 +543,7 @@ describe('unannounced state', () => { unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { ignoreEndpoints: { kafka: [] @@ -570,7 +571,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { ignoreEndpoints: { kafka: [{ methods: ['publish'], endpoints: ['topic1'] }] @@ -593,7 +594,7 @@ describe('unannounced state', () => { unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { ignoreEndpoints: { kafka: [] } } @@ -619,7 +620,7 @@ describe('unannounced state', () => { unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { ignoreEndpoints: {} } @@ -640,7 +641,7 @@ describe('unannounced state', () => { unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { disable: { groups: ['logging'] } } @@ -655,7 +656,7 @@ describe('unannounced state', () => { unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({}); + expect(configObj.agentConfig).to.deep.equal({}); done(); } }); @@ -673,7 +674,7 @@ describe('unannounced state', () => { unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { disable: { groups: ['logging'], instrumentations: ['redis'] } } @@ -691,7 +692,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { disable: {} } }); done(); @@ -710,7 +711,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { disable: { groups: ['logging'], instrumentations: ['!redis'] } } }); done(); @@ -730,7 +731,7 @@ describe('unannounced state', () => { }); unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { disable: { groups: ['!databases', 'logging'], instrumentations: ['http'] } } }); done(); @@ -747,7 +748,7 @@ describe('unannounced state', () => { unannouncedState.enter({ transitionTo: () => { - expect(agentOptsStub.config).to.deep.equal({ + expect(configObj.agentConfig).to.deep.equal({ tracing: { disable: {} } diff --git a/packages/core/src/tracing/index.js b/packages/core/src/tracing/index.js index cf572ed838..9d4c3f1a20 100644 --- a/packages/core/src/tracing/index.js +++ b/packages/core/src/tracing/index.js @@ -270,6 +270,7 @@ function initInstrumenations(_config) { } } +// extraConfig = agentConfig exports.activate = function activate(extraConfig = {}) { if (tracingEnabled && !tracingActivated) { tracingActivated = true; From f874ffa87a50e20d7ad4137843a98c5ac13068bd Mon Sep 17 00:00:00 2001 From: kirrg001 Date: Fri, 19 Sep 2025 12:20:02 +0200 Subject: [PATCH 2/4] chore: fixes --- packages/collector/src/agentConnection.js | 1 - packages/collector/test/agentConnection_test.js | 16 +++++++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/collector/src/agentConnection.js b/packages/collector/src/agentConnection.js index b58d3b2cb8..d6c1a69894 100644 --- a/packages/collector/src/agentConnection.js +++ b/packages/collector/src/agentConnection.js @@ -438,7 +438,6 @@ exports.sendTracingMetricsToAgent = function sendTracingMetricsToAgent(tracingMe */ function sendData(path, data, cb, ignore404 = false) { cb = util.atMostOnce(`callback for sendData: ${path}`, cb); - const payloadAsString = JSON.stringify(data, circularReferenceRemover()); if (typeof logger.trace === 'function') { logger.trace(`Sending data to ${path}.`); diff --git a/packages/collector/test/agentConnection_test.js b/packages/collector/test/agentConnection_test.js index 18d99e9929..eb28c30461 100644 --- a/packages/collector/test/agentConnection_test.js +++ b/packages/collector/test/agentConnection_test.js @@ -10,6 +10,7 @@ const expect = require('chai').expect; const constants = require('@instana/core').tracing.constants; const supportedVersion = require('@instana/core').tracing.supportedVersion; const testConfig = require('../../core/test/config'); +const normalizeConfig = require('../src/util/normalizeConfig'); const testUtils = require('../../core/test/test_util'); const dummyEntry = { @@ -62,7 +63,6 @@ mochaSuiteFn('agent connection', function () { const { AgentStubControls } = require('./apps/agentStubControls'); const agentControls = new AgentStubControls(); - const config = { logger: testUtils.createFakeLogger() }; const pidStore = require('../src/pidStore'); let agentConnection; @@ -74,6 +74,9 @@ mochaSuiteFn('agent connection', function () { }); beforeEach(async () => { + const config = normalizeConfig({ agentPort: agentControls.getPort() }); + config.logger = testUtils.createFakeLogger(); + agentConnection = require('../src/agentConnection'); pidStore.init(config); agentConnection.init(config, pidStore); @@ -83,7 +86,11 @@ mochaSuiteFn('agent connection', function () { }); it('should send traces to agent', done => { - agentConnection.sendSpans(dummySpans, () => { + agentConnection.sendSpans(dummySpans, err => { + if (err) { + return done(err); + } + agentControls .getSpans() .then(spans => { @@ -98,7 +105,10 @@ mochaSuiteFn('agent connection', function () { const circularSpanWithoutCircularReference = Object.assign({}, circularSpan); delete circularSpanWithoutCircularReference.data.c.circular; - agentConnection.sendSpans(dummySpansWithCircularReference, () => { + agentConnection.sendSpans(dummySpansWithCircularReference, err => { + if (err) { + return done(err); + } agentControls .getSpans() .then(spans => { From 9e46ed563b3cd1e4d8652643d94b1783a3c02dd0 Mon Sep 17 00:00:00 2001 From: kirrg001 Date: Thu, 25 Sep 2025 09:32:53 +0200 Subject: [PATCH 3/4] chore: fixes --- .../src/announceCycle/agentHostLookup.js | 1 + .../announceCycle/agentHostLookup_test.js | 48 +++++++++++-------- packages/core/test/test_util/index.js | 8 +++- 3 files changed, 36 insertions(+), 21 deletions(-) diff --git a/packages/collector/src/announceCycle/agentHostLookup.js b/packages/collector/src/announceCycle/agentHostLookup.js index 920592c357..4e29649072 100644 --- a/packages/collector/src/announceCycle/agentHostLookup.js +++ b/packages/collector/src/announceCycle/agentHostLookup.js @@ -230,6 +230,7 @@ function handleResponse(host, res, cb) { ); return; } + if (responseJson.version !== undefined) { cb(null); } else { diff --git a/packages/collector/test/announceCycle/agentHostLookup_test.js b/packages/collector/test/announceCycle/agentHostLookup_test.js index b85aebae6c..0dddf974c8 100644 --- a/packages/collector/test/announceCycle/agentHostLookup_test.js +++ b/packages/collector/test/announceCycle/agentHostLookup_test.js @@ -11,6 +11,7 @@ const sinonChai = require('sinon-chai'); const { FakeRequestHandler, FakeRequest, FakeResponse } = require('../test_util/fake_http'); const testUtils = require('@instana/core/test/test_util'); +const normalizeConfig = require('../../src/util/normalizeConfig'); const { expect } = chai; chai.use(sinonChai); @@ -72,10 +73,13 @@ describe('agent host lookup state', () => { let defaultGatewayParserMock; let transitionTo; let ctxStub; + let config; - before(() => { - // set up stubs for HTTP communication and file system access (for reading from /proc/self/net/route). + beforeEach(() => { + config = normalizeConfig({ agentHost: host, agentPort: port }); + config.logger = testUtils.createFakeLogger(); + // set up stubs for HTTP communication and file system access (for reading from /proc/self/net/route). requestStub = sinon.stub(); httpStub = { request: requestStub, @@ -99,19 +103,27 @@ describe('agent host lookup state', () => { './defaultGatewayParser': defaultGatewayParserMock }); - agentHostLookupState.init({ logger: testUtils.createFakeLogger() }); + agentHostLookupState.init(config); transitionTo = sinon.stub(); ctxStub = { transitionTo }; }); afterEach(() => { - // reset stubs after each test - sinon.restore(); - fakeRequest.reset(); + requestStub.reset(); + parseProcSelfNetRouteFileStub.reset(); + configuredHostLookupOk.reset(); + configuredHostLookupConnectionRefused.reset(); + configuredHostLookupNotAnAgent.reset(); + defaultGatewayLookupOk.reset(); + defaultGatewayLookupConnectionRefused.reset(); + + // the agentHostLookup overrides agentHost! We have to reset it. + config.agentHost = host; + config.agentPort = port; }); describe('via configured IP/configured port', () => { - before(() => { + beforeEach(() => { requestStub.callsFake((opt, cb) => { fakeRequest = new FakeRequest([configuredHostLookupOk], opt, cb); return fakeRequest; @@ -130,7 +142,7 @@ describe('agent host lookup state', () => { }); describe('via default gateway IP', () => { - before(() => { + beforeEach(() => { parseProcSelfNetRouteFileStub.callsFake(async () => defaultGatewayIp); requestStub.callsFake((opt, cb) => { fakeRequest = new FakeRequest( @@ -160,7 +172,7 @@ describe('agent host lookup state', () => { }); describe('via default gateway IP when something else listens on 127.0.0.1:42699', () => { - before(() => { + beforeEach(() => { parseProcSelfNetRouteFileStub.callsFake(async () => defaultGatewayIp); requestStub.callsFake((opt, cb) => { fakeRequest = new FakeRequest( @@ -189,10 +201,11 @@ describe('agent host lookup state', () => { }); }); - describe('retry when default gateway IP cannot be determined', () => { + describe('retry when default gateway IP cannot be determined', function () { let sinonFakeTimers; + this.timeout(5000); - before(() => { + beforeEach(() => { parseProcSelfNetRouteFileStub.callsFake(async () => { throw new Error('Failed to determine the default gateway: The file /proc/self/net/route does not exist'); }); @@ -200,9 +213,7 @@ describe('agent host lookup state', () => { fakeRequest = new FakeRequest([configuredHostLookupConnectionRefused, configuredHostLookupOk], opt, cb); return fakeRequest; }); - }); - beforeEach(() => { sinonFakeTimers = sinon.useFakeTimers(); }); @@ -229,11 +240,12 @@ describe('agent host lookup state', () => { })); }); - describe('retry when default gateway IP can be determined', () => { + describe('retry when default gateway IP can be determined', function () { let sinonFakeTimers; - + this.timeout(5000); const configuredHostLookupConnectionRefusedSecondAttempt = configuredHostLookupConnectionRefused.clone(); - before(() => { + + beforeEach(() => { parseProcSelfNetRouteFileStub.callsFake(async () => defaultGatewayIp); requestStub.callsFake((opt, cb) => { fakeRequest = new FakeRequest( @@ -249,10 +261,8 @@ describe('agent host lookup state', () => { ); return fakeRequest; }); - }); - beforeEach(() => { - sinonFakeTimers = sinon.useFakeTimers(); + sinonFakeTimers = sinon.useFakeTimers({ shouldClearNativeTimers: true }); }); afterEach(() => { diff --git a/packages/core/test/test_util/index.js b/packages/core/test/test_util/index.js index 65ab5f791f..ebea1ee3f3 100644 --- a/packages/core/test/test_util/index.js +++ b/packages/core/test/test_util/index.js @@ -20,9 +20,13 @@ module.exports = { getTestAppLogger: require('./log').getLogger, createFakeLogger: () => { return { - debug: () => {}, + debug: msg => { + console.log(msg); + }, info: () => {}, - warn: () => {}, + warn: msg => { + console.log(msg); + }, error: () => {}, trace: () => {} }; From 97ecdc94f7ea6cc98f833e71d954e5e77f4f559c Mon Sep 17 00:00:00 2001 From: kirrg001 Date: Tue, 30 Sep 2025 10:07:12 +0200 Subject: [PATCH 4/4] chore: lint --- packages/core/test/test_util/index.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/packages/core/test/test_util/index.js b/packages/core/test/test_util/index.js index ebea1ee3f3..65ab5f791f 100644 --- a/packages/core/test/test_util/index.js +++ b/packages/core/test/test_util/index.js @@ -20,13 +20,9 @@ module.exports = { getTestAppLogger: require('./log').getLogger, createFakeLogger: () => { return { - debug: msg => { - console.log(msg); - }, + debug: () => {}, info: () => {}, - warn: msg => { - console.log(msg); - }, + warn: () => {}, error: () => {}, trace: () => {} };