Skip to content

Commit

Permalink
fix: improved how to disable aws sdk instrumentation (#866)
Browse files Browse the repository at this point in the history
refs 139073
  • Loading branch information
kirrg001 authored Sep 21, 2023
1 parent 5283e88 commit d0483c2
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 17 deletions.
28 changes: 18 additions & 10 deletions packages/core/src/tracing/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -101,6 +101,7 @@ const instrumentations = [
* @property {Function} [updateConfig]
* @property {boolean} [batchable]
* @property {string} [spanName]
* @property {string} [instrumentationName]
*/

/**
Expand All @@ -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.<InstanaInstrumentedModule>} _additionalInstrumentationModules
*/
Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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);
}
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ awsProducts.forEach(awsProduct => {

let isActive = false;

exports.instrumentationName = 'aws-sdk/v2';

exports.isActive = function () {
return isActive;
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ awsProducts.forEach(awsProduct => {

let isActive = false;

exports.instrumentationName = 'aws-sdk/v3';

exports.init = function init() {
sqsConsumer.init();

Expand Down
62 changes: 55 additions & 7 deletions packages/core/test/tracing/index_test.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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(() => {
Expand All @@ -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;
});

Expand All @@ -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;
});

Expand All @@ -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) {
Expand Down

0 comments on commit d0483c2

Please sign in to comment.