diff --git a/packages/collector/src/announceCycle/agentready.js b/packages/collector/src/announceCycle/agentready.js index 62c89dfd58..e2fe4c948b 100644 --- a/packages/collector/src/announceCycle/agentready.js +++ b/packages/collector/src/announceCycle/agentready.js @@ -109,7 +109,11 @@ function enter(_ctx) { if (isMainThread) { uncaught.activate(); - metrics.activate(); + + if (process.env.INSTANA_DISABLE_METRICS !== 'true') { + metrics.activate(); + } + requestHandler.activate(); transmissionCycle.activate( metrics, diff --git a/packages/collector/src/index.js b/packages/collector/src/index.js index 7b40eaa7ae..5f280d58f4 100644 --- a/packages/collector/src/index.js +++ b/packages/collector/src/index.js @@ -142,7 +142,12 @@ function init(userConfig = {}) { if (isMainThread) { uncaught.init(config, agentConnection, pidStore); - metrics.init(config, pidStore); + + if (process.env.INSTANA_DISABLE_METRICS !== 'true') { + metrics.init(config, pidStore); + } else { + logger.info('Metrics collection is disabled via INSTANA_DISABLE_METRICS.'); + } } logger.info(`@instana/collector module version: ${require(path.join(__dirname, '..', 'package.json')).version}`); diff --git a/packages/collector/src/metrics/transmissionCycle.js b/packages/collector/src/metrics/transmissionCycle.js index 41b88d7c13..2eab6e8b72 100644 --- a/packages/collector/src/metrics/transmissionCycle.js +++ b/packages/collector/src/metrics/transmissionCycle.js @@ -81,7 +81,10 @@ exports.activate = function activate(_metrics, _downstreamConnection, _onSuccess isActive = true; transmissionsSinceLastFullDataEmit = 0; - sendMetrics(); + + if (process.env.INSTANA_DISABLE_METRICS !== 'true') { + sendMetrics(); + } }; function sendMetrics() { diff --git a/packages/collector/test/tracing/misc/metrics_deactivated/app.js b/packages/collector/test/tracing/misc/metrics_deactivated/app.js new file mode 100644 index 0000000000..b203b5808c --- /dev/null +++ b/packages/collector/test/tracing/misc/metrics_deactivated/app.js @@ -0,0 +1,46 @@ +/* + * (c) Copyright IBM Corp. 2025 + */ + +'use strict'; + +// NOTE: c8 bug https://github.com/bcoe/c8/issues/166 +process.on('SIGTERM', () => { + process.disconnect(); + process.exit(0); +}); + +require('../../../..')(); +const express = require('express'); +const morgan = require('morgan'); +const bodyParser = require('body-parser'); +const port = require('../../../test_util/app-port')(); +const app = express(); +const logPrefix = `Metrics activation is off (${process.pid}):\t`; +const agentPort = process.env.INSTANA_AGENT_PORT; + +if (process.env.WITH_STDOUT) { + app.use(morgan(`${logPrefix}:method :url :status`)); +} + +app.use(bodyParser.json()); + +app.get('/', (req, res) => { + res.sendStatus(200); +}); + +app.post('/create-spans', async (req, res) => { + await fetch(`http://localhost:${agentPort}/ping`); + res.json({ message: 'OK' }); +}); + +app.listen(port, () => { + log(`Listening on port: ${port}`); +}); + +function log() { + /* eslint-disable no-console */ + const args = Array.prototype.slice.call(arguments); + args[0] = logPrefix + args[0]; + console.log.apply(console, args); +} diff --git a/packages/collector/test/tracing/misc/metrics_deactivated/test.js b/packages/collector/test/tracing/misc/metrics_deactivated/test.js new file mode 100644 index 0000000000..5af32940f0 --- /dev/null +++ b/packages/collector/test/tracing/misc/metrics_deactivated/test.js @@ -0,0 +1,60 @@ +/* + * (c) Copyright IBM Corp. 2025 + */ + +'use strict'; + +const expect = require('chai').expect; +const supportedVersion = require('@instana/core').tracing.supportedVersion; + +const config = require('../../../../../core/test/config'); +const testUtils = require('../../../../../core/test/test_util'); +const ProcessControls = require('../../../test_util/ProcessControls'); +const globalAgent = require('../../../globalAgent'); + +const mochaSuiteFn = supportedVersion(process.versions.node) ? describe : describe.skip; + +mochaSuiteFn('tracing/metrics_deactivated', function () { + this.timeout(config.getTestTimeout() * 2); + + globalAgent.setUpCleanUpHooks(); + const agentControls = globalAgent.instance; + + describe('when tracing is enabled', function () { + let controls; + + before(async () => { + controls = new ProcessControls({ + dirname: __dirname, + useGlobalAgent: true, + env: { + INSTANA_DISABLE_METRICS: 'true', + INSTANA_DEBUG: 'true' + } + }); + + await controls.startAndWaitForAgentConnection(); + }); + + beforeEach(async () => { + await agentControls.clearReceivedData(); + }); + + after(async () => { + await controls.stop(); + }); + + it('should still trace spans', async () => { + const response = await controls.sendRequest({ + method: 'POST', + path: '/create-spans' + }); + + expect(response.message).to.equal('OK'); + await testUtils.retry(async () => { + const spans = await agentControls.getSpans(); + expect(spans.length).to.equal(2); + }); + }); + }); +}); diff --git a/packages/core/src/util/iitmHook.js b/packages/core/src/util/iitmHook.js index d32fd1c694..7726571696 100644 --- a/packages/core/src/util/iitmHook.js +++ b/packages/core/src/util/iitmHook.js @@ -4,8 +4,6 @@ 'use strict'; -const iitmHook = require('import-in-the-middle'); - /** @type {import('../core').GenericLogger} */ let logger; @@ -27,6 +25,8 @@ exports.activate = function activate() { if (applicableTransformers) { applicableTransformers.forEach(transformerFn => { if (typeof transformerFn === 'function') { + const iitmHook = require('import-in-the-middle'); + // @ts-ignore iitmHook([moduleName], (exports, name) => { logger.debug(`iitm-hooking enabled for module ${name}`);