From d0483c2f80a5639f56cb95ef98ac8f5085aea5fc Mon Sep 17 00:00:00 2001 From: gurke Date: Thu, 21 Sep 2023 10:02:50 +0200 Subject: [PATCH] fix: improved how to disable aws sdk instrumentation (#866) refs 139073 --- packages/core/src/tracing/index.js | 28 ++++++--- .../instrumentation/cloud/aws-sdk/v2/index.js | 2 + .../instrumentation/cloud/aws-sdk/v3/index.js | 2 + packages/core/test/tracing/index_test.js | 62 ++++++++++++++++--- 4 files changed, 77 insertions(+), 17 deletions(-) diff --git a/packages/core/src/tracing/index.js b/packages/core/src/tracing/index.js index 658e79e077..f59246be7c 100644 --- a/packages/core/src/tracing/index.js +++ b/packages/core/src/tracing/index.js @@ -101,6 +101,7 @@ const instrumentations = [ * @property {Function} [updateConfig] * @property {boolean} [batchable] * @property {string} [spanName] + * @property {string} [instrumentationName] */ /** @@ -123,6 +124,20 @@ exports.supportedVersion = supportedVersion; exports.util = tracingUtil; exports.esmSupportedVersion = esmSupportedVersion; +/** + * @param {import('../util/normalizeConfig').InstanaConfig} cfg + * @param {string} instrumentationKey + */ +const isInstrumentationDisabled = (cfg, instrumentationKey) => { + const extractedInstrumentationName = instrumentationKey.match(/.\/instrumentation\/[^/]*\/(.*)/)[1]; + + return ( + cfg.tracing.disabledTracers.includes(extractedInstrumentationName.toLowerCase()) || + (instrumentationModules[instrumentationKey].instrumentationName && + cfg.tracing.disabledTracers.includes(instrumentationModules[instrumentationKey].instrumentationName)) + ); +}; + /** * @param {Array.} _additionalInstrumentationModules */ @@ -182,9 +197,8 @@ function initInstrumenations(_config) { if (!instrumenationsInitialized) { instrumentations.forEach(instrumentationKey => { instrumentationModules[instrumentationKey] = require(instrumentationKey); - const instrumentationName = instrumentationKey.match(/.\/instrumentation\/[^/]*\/(.*)/)[1]; - const isInstrumentationDisabled = _config.tracing.disabledTracers.includes(instrumentationName.toLowerCase()); - if (!isInstrumentationDisabled) { + + if (!isInstrumentationDisabled(_config, instrumentationKey)) { instrumentationModules[instrumentationKey].init(_config); } @@ -216,13 +230,7 @@ exports.activate = function activate(extraConfig = {}) { if (automaticTracingEnabled) { instrumentations.forEach(instrumentationKey => { - const instrumentationName = /.\/instrumentation\/[^/]*\/(.*)/.exec(instrumentationKey)[1]; - - const isDisabled = - config.tracing.disabledTracers.findIndex(disabledKey => instrumentationName.toLowerCase() === disabledKey) !== - -1; - - if (!isDisabled) { + if (!isInstrumentationDisabled(config, instrumentationKey)) { instrumentationModules[instrumentationKey].activate(extraConfig); } }); diff --git a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/index.js b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/index.js index 471bcf50c9..86a65deea8 100644 --- a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/index.js +++ b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/index.js @@ -27,6 +27,8 @@ awsProducts.forEach(awsProduct => { let isActive = false; +exports.instrumentationName = 'aws-sdk/v2'; + exports.isActive = function () { return isActive; }; diff --git a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/index.js b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/index.js index cea1231e23..7ca02f7216 100644 --- a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/index.js +++ b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/index.js @@ -30,6 +30,8 @@ awsProducts.forEach(awsProduct => { let isActive = false; +exports.instrumentationName = 'aws-sdk/v3'; + exports.init = function init() { sqsConsumer.init(); diff --git a/packages/core/test/tracing/index_test.js b/packages/core/test/tracing/index_test.js index db916bea8e..bec812948c 100644 --- a/packages/core/test/tracing/index_test.js +++ b/packages/core/test/tracing/index_test.js @@ -15,6 +15,8 @@ const kafkaJs = require('../../src/tracing/instrumentation/messaging/kafkaJs'); const rdKafka = require('../../src/tracing/instrumentation/messaging/rdkafka'); const grpc = require('../../src/tracing/instrumentation/protocols/grpc'); const grpcJs = require('../../src/tracing/instrumentation/protocols/grpcJs'); +const awsSdkv2 = require('../../src/tracing/instrumentation/cloud/aws-sdk/v2/index'); +const awsSdkv3 = require('../../src/tracing/instrumentation/cloud/aws-sdk/v3/index'); const testConfig = require('../config'); const expect = chai.expect; @@ -31,18 +33,30 @@ mochaSuiteFn('[UNIT] tracing/index', function () { let activateStubGrpcJs; let activateStubKafkaJs; let activateStubRdKafka; + let activateAwsSdkv2; + let activateAwsSdkv3; + let initStubGrpc; let initStubGrpcJs; let initStubKafkaJs; + let initStubRdKafka; + let initAwsSdkv2; + let initAwsSdkv3; before(() => { activateStubGrpc = sinon.stub(grpc, 'activate'); activateStubGrpcJs = sinon.stub(grpcJs, 'activate'); activateStubKafkaJs = sinon.stub(kafkaJs, 'activate'); activateStubRdKafka = sinon.stub(rdKafka, 'activate'); + activateAwsSdkv2 = sinon.stub(awsSdkv2, 'activate'); + activateAwsSdkv3 = sinon.stub(awsSdkv3, 'activate'); + initStubGrpc = sinon.stub(grpc, 'init'); initStubGrpcJs = sinon.stub(grpcJs, 'init'); initStubKafkaJs = sinon.stub(kafkaJs, 'init'); + initStubRdKafka = sinon.stub(rdKafka, 'init'); + initAwsSdkv2 = sinon.stub(awsSdkv2, 'init'); + initAwsSdkv3 = sinon.stub(awsSdkv3, 'init'); }); beforeEach(() => { @@ -56,9 +70,16 @@ mochaSuiteFn('[UNIT] tracing/index', function () { activateStubGrpcJs.reset(); activateStubKafkaJs.reset(); activateStubRdKafka.reset(); + activateAwsSdkv2.reset(); + activateAwsSdkv3.reset(); + initStubGrpc.reset(); initStubGrpcJs.reset(); initStubKafkaJs.reset(); + initStubRdKafka.reset(); + initAwsSdkv2.reset(); + initAwsSdkv3.reset(); + delete process.env.INSTANA_DISABLED_TRACERS; }); @@ -67,21 +88,43 @@ mochaSuiteFn('[UNIT] tracing/index', function () { }); it('deactivate instrumentation via config', () => { - initAndActivate({ tracing: { disabledTracers: ['grpc', 'kafkajs'] } }); + initAndActivate({ tracing: { disabledTracers: ['grpc', 'kafkajs', 'aws-sdk/v2'] } }); + + // grpc instrumentation has been disabled, make sure neither its init nor its activate method are called + expect(initStubGrpc).not.to.have.been.called; expect(activateStubGrpc).to.not.have.been.called; + + // grpcJs instrumentation has not been disabled, make sure its init and activate are called + expect(initStubGrpcJs).to.have.been.called; expect(activateStubGrpcJs).to.have.been.called; + + // kafkajs has been disabled... + expect(initStubKafkaJs).to.not.have.been.called; expect(activateStubKafkaJs).to.not.have.been.called; + + // ...but rdkafka has not been disabled + expect(initStubRdKafka).to.have.been.called; expect(activateStubRdKafka).to.have.been.called; - expect(initStubGrpc).not.to.have.been.called; + + // aws-sdk/v2 has been disabled (via aws-sdk/v2) + expect(initAwsSdkv2).not.to.have.been.called; + expect(activateAwsSdkv2).not.to.have.been.called; + + // aws-sdk/v3 has not been disabled + expect(initAwsSdkv3).to.have.been.called; + expect(activateAwsSdkv3).to.have.been.called; }); it('deactivate instrumentation via env', () => { process.env.INSTANA_DISABLED_TRACERS = 'grpc'; initAndActivate({}); + expect(activateStubGrpc).to.not.have.been.called; expect(activateStubGrpcJs).to.have.been.called; expect(activateStubKafkaJs).to.have.been.called; expect(activateStubRdKafka).to.have.been.called; + expect(activateAwsSdkv2).to.have.been.called; + expect(initStubGrpc).not.to.have.been.called; }); @@ -99,11 +142,16 @@ mochaSuiteFn('[UNIT] tracing/index', function () { expect(activateStubRdKafka).to.have.been.calledWith(extraConfigFromAgent); }); - it('skip init step when instrumentation disabled', () => { - initAndActivate({ tracing: { disabledTracers: ['grpcjs', 'kafkajs'] } }); - expect(initStubKafkaJs).not.to.have.been.called; - expect(initStubGrpcJs).not.to.have.been.called; - expect(initStubGrpc).to.have.been.called; + it('[deprecated] aws-sdk/v2/index', () => { + initAndActivate({ tracing: { disabledTracers: ['aws-sdk/v2/index'] } }); + + // aws-sdk/v2 has been disabled (via aws-sdk/v2/index) + expect(initAwsSdkv2).not.to.have.been.called; + expect(activateAwsSdkv2).not.to.have.been.called; + + // aws-sdk/v3 has not been disabled + expect(initAwsSdkv3).to.have.been.called; + expect(activateAwsSdkv3).to.have.been.called; }); function initAndActivate(initConfig, extraConfigForActivate) {