diff --git a/packages/core/src/tracing/cls.js b/packages/core/src/tracing/cls.js index 9e3c14b80f..beefb58411 100644 --- a/packages/core/src/tracing/cls.js +++ b/packages/core/src/tracing/cls.js @@ -569,7 +569,11 @@ function skipExitTracing(options) { } if (!opts.skipParentSpanCheck && (!parentSpan || isExitSpanResult)) { - if (opts.log) { + // NOTE: We need to check for `isActive` otherwise we flood this warning in case the collector is not + // yet connected to the agent, but the application receives traffic already + // The underlying problem is that all instrumentations are already "working" before the collector + // is successfully connected with the agent, but they are skipped with the `isActive` flag. + if (opts.log && opts.isActive) { logger.warn( // eslint-disable-next-line max-len `Cannot start an exit span as this requires an active entry (or intermediate) span as parent. ${ diff --git a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/dynamodb.js b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/dynamodb.js index 071a9782d9..e2d2921a68 100644 --- a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/dynamodb.js +++ b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/dynamodb.js @@ -27,9 +27,8 @@ const operations = Object.keys(operationsInfo); const SPAN_NAME = 'dynamodb'; class InstanaAWSDynamoDB extends InstanaAWSProduct { - instrumentedMakeRequest(ctx, originalMakeRequest, originalArgs) { - // NOTE: `shimMakeRequest` in index.js is already checking the result of `isActive` - if (cls.skipExitTracing()) { + instrumentedMakeRequest(ctx, isActive, originalMakeRequest, originalArgs) { + if (cls.skipExitTracing({ isActive })) { return originalMakeRequest.apply(ctx, originalArgs); } 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 93af58b6b5..471bcf50c9 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 @@ -49,21 +49,17 @@ function instrumentAWS(AWS) { function shimMakeRequest(originalMakeRequest) { return function () { - if (isActive) { - const originalArgs = new Array(arguments.length); - for (let i = 0; i < originalArgs.length; i++) { - originalArgs[i] = arguments[i]; - } + const originalArgs = new Array(arguments.length); + for (let i = 0; i < originalArgs.length; i++) { + originalArgs[i] = arguments[i]; + } - const awsProduct = operationMap[originalArgs[0]]; + const awsProduct = operationMap[originalArgs[0]]; - // to match operation + reference (S3, Dynamo, etc) - if (awsProduct) { - return awsProduct.instrumentedMakeRequest(this, originalMakeRequest, originalArgs); - } - return originalMakeRequest.apply(this, originalArgs); + // to match operation + reference (S3, Dynamo, etc) + if (awsProduct) { + return awsProduct.instrumentedMakeRequest(this, isActive, originalMakeRequest, originalArgs); } - - return originalMakeRequest.apply(this, arguments); + return originalMakeRequest.apply(this, originalArgs); }; } diff --git a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/kinesis.js b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/kinesis.js index fb1fc0e095..1ad08dc63f 100644 --- a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/kinesis.js +++ b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/kinesis.js @@ -42,11 +42,10 @@ const operationsInfo = { const operations = Object.keys(operationsInfo); class InstanaAWSKinesis extends InstanaAWSProduct { - instrumentedMakeRequest(ctx, originalMakeRequest, originalArgs) { + instrumentedMakeRequest(ctx, isActive, originalMakeRequest, originalArgs) { const self = this; - // NOTE: `shimMakeRequest` in index.js is already checking the result of `isActive` - if (cls.skipExitTracing()) { + if (cls.skipExitTracing({ isActive })) { return originalMakeRequest.apply(ctx, originalArgs); } diff --git a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/lambda.js b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/lambda.js index edf30c3045..9d81f1e9f2 100644 --- a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/lambda.js +++ b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/lambda.js @@ -64,11 +64,10 @@ class InstanaAWSLambda extends InstanaAWSProduct { } } - instrumentedMakeRequest(ctx, originalMakeRequest, originalArgs) { + instrumentedMakeRequest(ctx, isActive, originalMakeRequest, originalArgs) { const self = this; - const skipTracingResult = cls.skipExitTracing({ extendedResponse: true }); + const skipTracingResult = cls.skipExitTracing({ isActive, extendedResponse: true }); - // NOTE: `shimMakeRequest` in index.js is already checking the result of `isActive` if (skipTracingResult.skip) { if (skipTracingResult.suppressed) { this.propagateInstanaHeaders(originalArgs, null, skipTracingResult.suppressed); diff --git a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/s3.js b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/s3.js index 815579fd96..c19b72e6d2 100644 --- a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/s3.js +++ b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/s3.js @@ -56,11 +56,10 @@ class InstanaAWSS3 extends InstanaAWSProduct { /** * Original args for ALL AWS SDK Requets: [method, params, callback] */ - instrumentedMakeRequest(ctx, originalMakeRequest, originalArgs) { + instrumentedMakeRequest(ctx, isActive, originalMakeRequest, originalArgs) { const self = this; - // NOTE: `shimMakeRequest` in index.js is already checking the result of `isActive` - if (cls.skipExitTracing()) { + if (cls.skipExitTracing({ isActive })) { return originalMakeRequest.apply(ctx, originalArgs); } diff --git a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/sns.js b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/sns.js index 90e91a6c30..2d01012050 100644 --- a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/sns.js +++ b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/sns.js @@ -28,14 +28,14 @@ const operations = Object.keys(operationsInfo); const SPAN_NAME = 'sns'; class InstanaAWSSNS extends InstanaAWSProduct { - instrumentedMakeRequest(ctx, originalMakeRequest, originalArgs) { + instrumentedMakeRequest(ctx, isActive, originalMakeRequest, originalArgs) { const messageBody = originalArgs[1]; if (!messageBody.MessageAttributes) { messageBody.MessageAttributes = {}; } - const skipTracingResult = cls.skipExitTracing({ isActive: true, extendedResponse: true }); + const skipTracingResult = cls.skipExitTracing({ isActive, extendedResponse: true }); if (skipTracingResult.skip) { if (skipTracingResult.suppressed) { this.propagateSuppression(messageBody.MessageAttributes); diff --git a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/dynamodb.js b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/dynamodb.js index aa0d1e02ac..53cc5fd688 100644 --- a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/dynamodb.js +++ b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/dynamodb.js @@ -27,9 +27,8 @@ const operations = Object.keys(operationsInfo); const SPAN_NAME = 'dynamodb'; class InstanaAWSDynamoDB extends InstanaAWSProduct { - instrumentedSmithySend(ctx, originalSend, smithySendArgs) { - // NOTE: `shimSmithySend` in index.js is already checking the result of `isActive` - if (cls.skipExitTracing()) { + instrumentedSmithySend(ctx, isActive, originalSend, smithySendArgs) { + if (cls.skipExitTracing({ isActive })) { return originalSend.apply(ctx, smithySendArgs); } 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 56ab42dea4..ad411d4f5c 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 @@ -56,6 +56,7 @@ exports.isActive = function () { return isActive; }; +// NOTE: you currently can only disable the whole AWS SDK v3 exports.activate = function activate() { isActive = true; }; @@ -74,27 +75,24 @@ function shimSmithySend(originalSend) { const smithySendArgs = getFunctionArguments(arguments); const command = smithySendArgs[0]; - if (isActive) { - const serviceId = self.config && self.config.serviceId; - let awsProduct = serviceId && awsProducts.find(aws => aws.spanName === serviceId.toLowerCase()); - - if (awsProduct && awsProduct.supportsOperation(command.constructor.name)) { - return awsProduct.instrumentedSmithySend(self, originalSend, smithySendArgs); - } else { - // This code can be removed once all AWS SDK v3 instrumentations have been refactored to use the new approach - // introduced in https://github.com/instana/nodejs/pull/838 for kinesis. That is: Do not use an explicit - // operationsInfo/operationsMap map that restricts the traced operations to a subset of possible operations, but - // instead allow _all_ operations to be traced, using the operation name from `command.constructor.name` for - // span.data.$spanName.op. We plan to finish this refactoring before or with the next major release (3.x) of the - // @instana packages. - awsProduct = operationMap[smithySendArgs[0].constructor.name]; - if (awsProduct) { - return awsProduct.instrumentedSmithySend(this, originalSend, smithySendArgs); - } - - return originalSend.apply(this, smithySendArgs); + const serviceId = self.config && self.config.serviceId; + let awsProduct = serviceId && awsProducts.find(aws => aws.spanName === serviceId.toLowerCase()); + + if (awsProduct && awsProduct.supportsOperation(command.constructor.name)) { + return awsProduct.instrumentedSmithySend(self, isActive, originalSend, smithySendArgs); + } else { + // This code can be removed once all AWS SDK v3 instrumentations have been refactored to use the new approach + // introduced in https://github.com/instana/nodejs/pull/838 for kinesis. That is: Do not use an explicit + // operationsInfo/operationsMap map that restricts the traced operations to a subset of possible operations, but + // instead allow _all_ operations to be traced, using the operation name from `command.constructor.name` for + // span.data.$spanName.op. We plan to finish this refactoring before or with the next major release (3.x) of the + // @instana packages. + awsProduct = operationMap[smithySendArgs[0].constructor.name]; + if (awsProduct) { + return awsProduct.instrumentedSmithySend(self, isActive, originalSend, smithySendArgs); } + + return originalSend.apply(self, smithySendArgs); } - return originalSend.apply(self, smithySendArgs); }; } diff --git a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/kinesis.js b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/kinesis.js index ef08e19712..c958b2c3e0 100644 --- a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/kinesis.js +++ b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/kinesis.js @@ -12,8 +12,8 @@ const { InstanaAWSProduct } = require('./instana_aws_product'); const SPAN_NAME = 'kinesis'; class InstanaAWSKinesis extends InstanaAWSProduct { - instrumentedSmithySend(ctx, originalSend, smithySendArgs) { - if (cls.skipExitTracing()) { + instrumentedSmithySend(ctx, isActive, originalSend, smithySendArgs) { + if (cls.skipExitTracing({ isActive })) { return originalSend.apply(ctx, smithySendArgs); } diff --git a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/s3.js b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/s3.js index 20a51141db..5f9fcea42f 100644 --- a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/s3.js +++ b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/s3.js @@ -54,9 +54,8 @@ const operations = Object.keys(operationsInfo); const SPAN_NAME = 's3'; class InstanaAWSS3 extends InstanaAWSProduct { - instrumentedSmithySend(ctx, originalSend, smithySendArgs) { - // NOTE: `shimSmithySend` in index.js is already checking the result of `isActive` - if (cls.skipExitTracing()) { + instrumentedSmithySend(ctx, isActive, originalSend, smithySendArgs) { + if (cls.skipExitTracing({ isActive })) { return originalSend.apply(ctx, smithySendArgs); } diff --git a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/sqs.js b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/sqs.js index 0d89b75cd5..77fde7c962 100644 --- a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/sqs.js +++ b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/sqs.js @@ -64,12 +64,12 @@ class InstanaAWSSQS extends InstanaAWSProduct { }); } - instrumentedSmithySend(ctx, originalSend, smithySendArgs) { + instrumentedSmithySend(ctx, isActive, originalSend, smithySendArgs) { const commandName = smithySendArgs[0].constructor.name; const operation = operationsInfo[commandName]; if (operation && operation.sort === 'exit') { - return this.instrumentExit(ctx, originalSend, smithySendArgs, operation); + return this.instrumentExit(ctx, isActive, originalSend, smithySendArgs, operation); } else if (operation && operation.sort === 'entry') { return this.instrumentEntry(ctx, originalSend, smithySendArgs, operation); } @@ -77,7 +77,7 @@ class InstanaAWSSQS extends InstanaAWSProduct { return originalSend.apply(ctx, smithySendArgs); } - instrumentExit(ctx, originalSend, smithySendArgs, operation) { + instrumentExit(ctx, isActive, originalSend, smithySendArgs, operation) { const command = smithySendArgs[0]; const sendMessageInput = command.input; @@ -109,8 +109,7 @@ class InstanaAWSSQS extends InstanaAWSProduct { attributes = sendMessageInput.MessageAttributes = {}; } - // NOTE: `shimSmithySend` in index.js is already checking the result of `isActive` - const skipTracingResult = cls.skipExitTracing({ extendedResponse: true }); + const skipTracingResult = cls.skipExitTracing({ extendedResponse: true, isActive }); if (skipTracingResult.skip) { if (skipTracingResult.suppressed) {