diff --git a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/sqs.js b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/sqs.js index 0590f65c54..fc457ce284 100644 --- a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/sqs.js +++ b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v2/sqs.js @@ -37,6 +37,8 @@ let logger; let isActive = false; +const technology = 'sqs'; + exports.init = function init(config) { logger = config.logger; @@ -392,7 +394,8 @@ function finishSpan(err, data, span) { function addErrorToSpan(err, span) { if (err) { span.ec = 1; - span.data.sqs.error = err.message || err.code || JSON.stringify(err); + const errorDetails = err.message || err.code || JSON.stringify(err); + span.data[technology].error = errorDetails; } } diff --git a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/sqs-consumer.js b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/sqs-consumer.js index 28c3ce826d..3021f125c1 100644 --- a/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/sqs-consumer.js +++ b/packages/core/src/tracing/instrumentation/cloud/aws-sdk/v3/sqs-consumer.js @@ -8,6 +8,8 @@ const shimmer = require('../../../../shimmer'); const hook = require('../../../../../util/hook'); const cls = require('../../../../cls'); +const technology = 'sqs'; + function init() { hook.onModuleLoad('sqs-consumer', instrument); } @@ -30,7 +32,8 @@ function instrument(SQSConsumer) { }) .catch(err => { span.ec = 1; - span.data.sqs.error = err.message || err.code || JSON.stringify(err); + const errorDetails = err.message || err.code || JSON.stringify(err); + span.data[technology].error = errorDetails; span.d = Date.now() - span.ts; span.transmitManual(); }); @@ -62,7 +65,8 @@ function instrument(SQSConsumer) { }) .catch(err => { span.ec = 1; - span.data.sqs.error = err.message || err.code || JSON.stringify(err); + const errorDetails = err.message || err.code || JSON.stringify(err); + span.data[technology].error = errorDetails; span.d = Date.now() - span.ts; span.transmitManual(); }); diff --git a/packages/core/src/tracing/instrumentation/cloud/azure/blob.js b/packages/core/src/tracing/instrumentation/cloud/azure/blob.js index 2ecd9f97ab..ec1a3980a0 100644 --- a/packages/core/src/tracing/instrumentation/cloud/azure/blob.js +++ b/packages/core/src/tracing/instrumentation/cloud/azure/blob.js @@ -15,6 +15,8 @@ let isActive = false; exports.spanName = 'azstorage'; +const technology = exports.spanName; + exports.init = function init() { // Starting from v12.28.0, the package has been migrated to ESM. // To support ESM-based applications, we now utilize the IITM hook. @@ -105,7 +107,8 @@ function instrumentingOperation({ function finishSpan(error, span) { if (error) { span.ec = 1; - span.data.azstorage.error = tracingUtil.getErrorDetails(error); + const errorDetails = tracingUtil.getErrorDetails(error); + span.data[technology].error = errorDetails; } span.d = Date.now() - span.ts; span.transmit(); diff --git a/packages/core/src/tracing/instrumentation/cloud/gcp/pubsub.js b/packages/core/src/tracing/instrumentation/cloud/gcp/pubsub.js index 1e4a4f030f..9f7d569217 100644 --- a/packages/core/src/tracing/instrumentation/cloud/gcp/pubsub.js +++ b/packages/core/src/tracing/instrumentation/cloud/gcp/pubsub.js @@ -22,6 +22,8 @@ const subscriptionRegex = /^projects\/([^/]+)\/subscriptions\/(.+)$/; let logger; let isActive = false; +const technology = 'gcps'; + exports.init = function init(config) { logger = config.logger; @@ -255,9 +257,11 @@ function addErrorToSpan(err, span) { if (err) { span.ec = 1; if (err.message) { - span.data.gcps.error = err.message; + const errorDetails = err.message; + span.data[technology].error = errorDetails; } else if (typeof err === 'string') { - span.data.gcps.error = err; + const errorDetails = err; + span.data[technology].error = errorDetails; } } } diff --git a/packages/core/src/tracing/instrumentation/cloud/gcp/storage.js b/packages/core/src/tracing/instrumentation/cloud/gcp/storage.js index 733f15b2c5..633148f03d 100644 --- a/packages/core/src/tracing/instrumentation/cloud/gcp/storage.js +++ b/packages/core/src/tracing/instrumentation/cloud/gcp/storage.js @@ -14,6 +14,7 @@ const hook = require('../../../../util/hook'); const tracingUtil = require('../../../tracingUtil'); let isActive = false; +const technology = 'gcs'; exports.init = function init() { hook.onModuleLoad('@google-cloud/storage', instrument); @@ -458,7 +459,8 @@ function instrumentedCreateStream(operation, bindEvent, finalEvent, ctx, origina function finishSpan(error, result, span, extractorPost) { if (error) { span.ec = 1; - span.data.gcs.error = tracingUtil.getErrorDetails(error); + const errorDetails = tracingUtil.getErrorDetails(error); + span.data[technology].error = errorDetails; } if (extractorPost) { diff --git a/packages/core/src/tracing/instrumentation/databases/couchbase.js b/packages/core/src/tracing/instrumentation/databases/couchbase.js index cb10cd29ff..78eaade4c8 100644 --- a/packages/core/src/tracing/instrumentation/databases/couchbase.js +++ b/packages/core/src/tracing/instrumentation/databases/couchbase.js @@ -14,6 +14,7 @@ let isActive = false; const bucketLookup = {}; exports.spanName = 'couchbase'; +const technology = exports.spanName; exports.activate = function activate() { isActive = true; @@ -430,7 +431,8 @@ function instrumentTransactions(cluster, connectionStr) { result .catch(err => { span.ec = 1; - span.data.couchbase.error = tracingUtil.getErrorDetails(err); + const errorDetails = tracingUtil.getErrorDetails(err); + span.data[technology].error = errorDetails; }) .finally(() => { span.d = Date.now() - span.ts; @@ -497,7 +499,8 @@ function instrumentOperation({ connectionStr, bucketName, getBucketTypeFn, sql, }) .catch(err => { span.ec = 1; - span.data.couchbase.error = tracingUtil.getErrorDetails(err); + const errorDetails = tracingUtil.getErrorDetails(err); + span.data[technology].error = errorDetails; }) .finally(() => { span.d = Date.now() - span.ts; @@ -510,7 +513,8 @@ function instrumentOperation({ connectionStr, bucketName, getBucketTypeFn, sql, originalArgs[callbackIndex] = cls.ns.bind(function instanaCallback(err, result) { if (err) { span.ec = 1; - span.data.couchbase.error = tracingUtil.getErrorDetails(err); + const errorDetails = tracingUtil.getErrorDetails(err); + span.data[technology].error = errorDetails; } if (resultHandler) { diff --git a/packages/core/src/tracing/instrumentation/databases/db2.js b/packages/core/src/tracing/instrumentation/databases/db2.js index 2b163095bc..706c3c81a4 100644 --- a/packages/core/src/tracing/instrumentation/databases/db2.js +++ b/packages/core/src/tracing/instrumentation/databases/db2.js @@ -13,6 +13,8 @@ const cls = require('../../cls'); let isActive = false; +const technology = 'db2'; + const CLOSE_TIMEOUT_IN_MS = process.env.DB2_CLOSE_TIMEOUT_IN_MS || 1000 * 30; exports.spanName = 'ibmdb2'; @@ -222,7 +224,8 @@ function captureFetchError(result, span) { argsFetch[fetchIndex] = function instanaFetchCb(fetchCbErr) { if (fetchCbErr) { span.ec = 1; - span.data.db2.error = tracingUtil.getErrorDetails(fetchCbErr); + const errorDetails = tracingUtil.getErrorDetails(fetchCbErr); + span.data[technology].error = errorDetails; } return fetchCb.apply(this, arguments); @@ -232,7 +235,9 @@ function captureFetchError(result, span) { return originalFn.apply(this, arguments); } catch (caughtErr) { span.ec = 1; - span.data.db2.error = tracingUtil.getErrorDetails(caughtErr); + const errorDetails = tracingUtil.getErrorDetails(caughtErr); + + span.data[technology].error = errorDetails; throw caughtErr; } }; @@ -249,12 +254,14 @@ function captureFetchError(result, span) { if (res instanceof Error) { span.ec = 1; - span.data.db2.error = tracingUtil.getErrorDetails(res); + const errorDetails = tracingUtil.getErrorDetails(res); + span.data[technology].error = errorDetails; } return res; } catch (err) { span.ec = 1; - span.data.db2.error = tracingUtil.getErrorDetails(err); + const errorDetails = tracingUtil.getErrorDetails(err); + span.data[technology].error = errorDetails; return err; } @@ -278,14 +285,16 @@ function instrumentQueryHelper(ctx, originalArgs, originalFunction, stmt, isAsyn if (result instanceof Error) { span.ec = 1; - span.data.db2.error = tracingUtil.getErrorDetails(result); + const errorDetails = tracingUtil.getErrorDetails(result); + span.data[technology].error = errorDetails; } finishSpan(ctx, result, span); return result; } catch (e) { span.ec = 1; - span.data.db2.error = tracingUtil.getErrorDetails(e); + const errorDetails = tracingUtil.getErrorDetails(e); + span.data[technology].error = errorDetails; finishSpan(ctx, null, span); throw e; } @@ -304,7 +313,8 @@ function instrumentQueryHelper(ctx, originalArgs, originalFunction, stmt, isAsyn originalArgs[customerCallbackIndex] = function instanaCallback(err) { if (err) { span.ec = 1; - span.data.db2.error = tracingUtil.getErrorDetails(err); + const errorDetails = tracingUtil.getErrorDetails(err); + span.data[technology].error = errorDetails; } finishSpan(ctx, null, span); @@ -324,7 +334,8 @@ function instrumentQueryHelper(ctx, originalArgs, originalFunction, stmt, isAsyn }) .catch(err => { span.ec = 1; - span.data.db2.error = tracingUtil.getErrorDetails(err); + const errorDetails = tracingUtil.getErrorDetails(err); + span.data[technology].error = errorDetails; finishSpan(ctx, null, span); return err; }); @@ -394,7 +405,8 @@ function instrumentExecuteHelper(ctx, originalArgs, stmtObject, prepareCallParen return result; } catch (err) { span.ec = 1; - span.data.db2.error = tracingUtil.getErrorDetails(err); + const errorDetails = tracingUtil.getErrorDetails(err); + span.data[technology].error = errorDetails; finishSpan(ctx, null, span); return err; } @@ -441,7 +453,8 @@ function instrumentExecuteHelper(ctx, originalArgs, stmtObject, prepareCallParen args[origCallbackIndex] = function instanaExecuteCallback(executeErr, result) { if (executeErr) { span.ec = 1; - span.data.db2.error = tracingUtil.getErrorDetails(executeErr); + const errorDetails = tracingUtil.getErrorDetails(executeErr); + span.data[technology].error = errorDetails; finishSpan(ctx, null, span); return origCallback.apply(this, arguments); } @@ -470,7 +483,8 @@ function instrumentQueryResultHelper(ctx, originalArgs, originalFunction, stmt, return result; } catch (err) { span.ec = 1; - span.data.db2.error = tracingUtil.getErrorDetails(err); + const errorDetails = tracingUtil.getErrorDetails(err); + span.data[technology].error = errorDetails; finishSpan(ctx, null, span); return err; } @@ -489,7 +503,8 @@ function instrumentQueryResultHelper(ctx, originalArgs, originalFunction, stmt, originalArgs[customerCallbackIndex] = function instanaCallback(err) { if (err) { span.ec = 1; - span.data.db2.error = tracingUtil.getErrorDetails(err); + const errorDetails = tracingUtil.getErrorDetails(err); + span.data[technology].error = errorDetails; } const result = customerCallback.apply(this, arguments); @@ -550,7 +565,8 @@ function finishSpan(ctx, result, span) { if (!closeSyncCalled) { closeSyncCalled = true; span.ec = 1; - span.data.db2.error = `'result.closeSync' was not called within ${CLOSE_TIMEOUT_IN_MS}ms.`; + const errorDetails = `'result.closeSync' was not called within ${CLOSE_TIMEOUT_IN_MS}ms.`; + span.data[technology].error = errorDetails; span.d = Date.now() - span.ts; span.transmit(); } @@ -578,7 +594,8 @@ function handleTransaction(ctx, span) { arguments[1] = function instanaOnEndOverride(onEndErr) { if (onEndErr) { span.ec = 1; - span.data.db2.error = tracingUtil.getErrorDetails(onEndErr) || 'Error not available.'; + const errorDetails = tracingUtil.getErrorDetails(onEndErr) || 'Error not available.'; + span.data[technology].error = errorDetails; } span.d = Date.now() - span.ts; @@ -597,7 +614,8 @@ function handleTransaction(ctx, span) { return result; } catch (err) { span.ec = 1; - span.data.db2.error = tracingUtil.getErrorDetails(err) || 'Error not available.'; + const errorDetails = tracingUtil.getErrorDetails(err) || 'Error not available.'; + span.data[technology].error = errorDetails; span.transmit(); throw err; } diff --git a/packages/core/src/tracing/instrumentation/databases/elasticsearch.js b/packages/core/src/tracing/instrumentation/databases/elasticsearch.js index 5e04f941fd..739dd6f12c 100644 --- a/packages/core/src/tracing/instrumentation/databases/elasticsearch.js +++ b/packages/core/src/tracing/instrumentation/databases/elasticsearch.js @@ -20,6 +20,7 @@ let isActive = false; exports.spanName = 'elasticsearch'; exports.batchable = true; +const technology = exports.spanName; exports.init = function init(config) { logger = config.logger; @@ -200,7 +201,8 @@ function onError(span, error) { span.d = Date.now() - span.ts; span.ec = 1; if (error) { - span.data.elasticsearch.error = tracingUtil.getErrorDetails(error); + const errorDetails = tracingUtil.getErrorDetails(error); + span.data[technology].error = errorDetails; } if (error.meta && error.meta.meta) { getConnectionDetailsFromResultMeta(span, error.meta); diff --git a/packages/core/src/tracing/instrumentation/databases/ioredis.js b/packages/core/src/tracing/instrumentation/databases/ioredis.js index 8bbb02dea8..6080e15cba 100644 --- a/packages/core/src/tracing/instrumentation/databases/ioredis.js +++ b/packages/core/src/tracing/instrumentation/databases/ioredis.js @@ -16,6 +16,7 @@ let isActive = false; exports.spanName = 'redis'; exports.batchable = true; +const technology = exports.spanName; exports.activate = function activate() { isActive = true; @@ -115,7 +116,8 @@ function instrumentSendCommand(original) { if (error) { span.ec = 1; - span.data.redis.error = error.message; + const errorDetails = error.message; + span.data[technology].error = errorDetails; } span.transmit(); @@ -221,7 +223,8 @@ function multiCommandEndCallback(clsContextForMultiOrPipeline, span, error) { if (error) { span.ec = commandCount; - span.data.redis.error = error.message; + const errorDetails = error.message; + span.data[technology].error = errorDetails; } span.transmit(); @@ -241,7 +244,8 @@ function pipelineCommandEndCallback(clsContextForMultiOrPipeline, span, error, r if (error) { // ioredis docs mention that this should never be possible, but better be safe than sorry span.ec = commandCount; - span.data.redis.error = tracingUtil.getErrorDetails(error); + const errorDetails = tracingUtil.getErrorDetails(error); + span.data[technology].error = errorDetails; } else { let numberOfErrors = 0; let sampledError; @@ -257,7 +261,8 @@ function pipelineCommandEndCallback(clsContextForMultiOrPipeline, span, error, r if (numberOfErrors > 0) { span.ec = numberOfErrors; - span.data.redis.error = tracingUtil.getErrorDetails(sampledError); + const errorDetails = tracingUtil.getErrorDetails(sampledError); + span.data[technology].error = errorDetails; } } diff --git a/packages/core/src/tracing/instrumentation/databases/mongodb.js b/packages/core/src/tracing/instrumentation/databases/mongodb.js index 15ca92270c..1c72ea9b2e 100644 --- a/packages/core/src/tracing/instrumentation/databases/mongodb.js +++ b/packages/core/src/tracing/instrumentation/databases/mongodb.js @@ -32,6 +32,8 @@ const commands = [ exports.spanName = 'mongo'; exports.batchable = true; +const technology = exports.spanName; + exports.init = function init() { // unified topology layer hook.onFileLoad(/\/mongodb\/lib\/cmap\/connection\.js/, instrumentCmapConnection); @@ -438,7 +440,8 @@ function createWrappedCallback(span, originalCallback) { return cls.ns.bind(function (error) { if (error) { span.ec = 1; - span.data.mongo.error = tracingUtil.getErrorDetails(error); + const errorDetails = tracingUtil.getErrorDetails(error); + span.data[technology].error = errorDetails; } span.d = Date.now() - span.ts; @@ -466,7 +469,8 @@ function handleCallbackOrPromise(ctx, originalArgs, originalFunction, span) { }) .catch(err => { span.ec = 1; - span.data.mongo.error = tracingUtil.getErrorDetails(err); + const errorDetails = tracingUtil.getErrorDetails(err); + span.data[technology].error = errorDetails; span.d = Date.now() - span.ts; span.transmit(); return err; diff --git a/packages/core/src/tracing/instrumentation/databases/mssql.js b/packages/core/src/tracing/instrumentation/databases/mssql.js index 9fca976a40..678ec15b10 100644 --- a/packages/core/src/tracing/instrumentation/databases/mssql.js +++ b/packages/core/src/tracing/instrumentation/databases/mssql.js @@ -16,6 +16,8 @@ let isActive = false; exports.spanName = 'mssql'; exports.batchable = true; +const technology = exports.spanName; + exports.init = function init() { hook.onModuleLoad('mssql', instrumentMssql); }; @@ -161,7 +163,8 @@ function shimBeginTransaction(originalFunction) { function finishSpan(error, span) { if (error) { span.ec = 1; - span.data.mssql.error = tracingUtil.getErrorDetails(error); + const errorDetails = tracingUtil.getErrorDetails(error); + span.data[technology].error = errorDetails; } span.d = Date.now() - span.ts; diff --git a/packages/core/src/tracing/instrumentation/databases/mysql.js b/packages/core/src/tracing/instrumentation/databases/mysql.js index afee7877bc..204787c96f 100644 --- a/packages/core/src/tracing/instrumentation/databases/mysql.js +++ b/packages/core/src/tracing/instrumentation/databases/mysql.js @@ -17,6 +17,8 @@ let isActive = false; exports.spanName = 'mysql'; exports.batchable = true; +const technology = exports.spanName; + exports.init = function init() { hook.onModuleLoad('mysql', instrumentMysql); hook.onModuleLoad('mysql2', instrumentMysql2); @@ -190,7 +192,8 @@ function instrumentedAccessFunction( }) .catch(error => { span.ec = 1; - span.data.mysql.error = tracingUtil.getErrorDetails(error); + const errorDetails = tracingUtil.getErrorDetails(error); + span.data[technology].error = errorDetails; span.d = Date.now() - span.ts; span.transmit(); @@ -205,7 +208,8 @@ function instrumentedAccessFunction( function onResult(error) { if (error) { span.ec = 1; - span.data.mysql.error = tracingUtil.getErrorDetails(error); + const errorDetails = tracingUtil.getErrorDetails(error); + span.data[technology].error = errorDetails; } span.d = Date.now() - span.ts; diff --git a/packages/core/src/tracing/instrumentation/databases/pg.js b/packages/core/src/tracing/instrumentation/databases/pg.js index d0979c58da..17372d08ba 100644 --- a/packages/core/src/tracing/instrumentation/databases/pg.js +++ b/packages/core/src/tracing/instrumentation/databases/pg.js @@ -16,6 +16,7 @@ let isActive = false; exports.spanName = 'postgres'; exports.batchable = true; +const technology = 'pg'; exports.init = function init() { hook.onModuleLoad('pg', instrumentPg); @@ -103,7 +104,8 @@ function instrumentedQuery(ctx, originalQuery, argsForOriginalQuery) { function finishSpan(error, span) { if (error) { span.ec = 1; - span.data.pg.error = tracingUtil.getErrorDetails(error); + const errorDetails = tracingUtil.getErrorDetails(error); + span.data[technology].error = errorDetails; } span.d = Date.now() - span.ts; diff --git a/packages/core/src/tracing/instrumentation/databases/pgNative.js b/packages/core/src/tracing/instrumentation/databases/pgNative.js index ec75bde81e..761e304d7f 100644 --- a/packages/core/src/tracing/instrumentation/databases/pgNative.js +++ b/packages/core/src/tracing/instrumentation/databases/pgNative.js @@ -27,6 +27,8 @@ const connectionUriRegex = exports.spanName = 'postgres'; exports.batchable = true; +const technology = 'pg'; + exports.init = function init() { hook.onModuleLoad('pg-native', instrumentPgNative); }; @@ -197,7 +199,8 @@ function startSpanBeforeSync(ctx, originalFn, originalArgs, statement, stackTrac function finishSpan(error, span) { if (error) { span.ec = 1; - span.data.pg.error = tracingUtil.getErrorDetails(error); + const errorDetails = tracingUtil.getErrorDetails(error); + span.data[technology].error = errorDetails; } span.d = Date.now() - span.ts; diff --git a/packages/core/src/tracing/instrumentation/databases/prisma.js b/packages/core/src/tracing/instrumentation/databases/prisma.js index 781ba7f30d..169d6f52d4 100644 --- a/packages/core/src/tracing/instrumentation/databases/prisma.js +++ b/packages/core/src/tracing/instrumentation/databases/prisma.js @@ -14,6 +14,7 @@ let logger; let isActive = false; const providerAndDataSourceUriMap = new WeakMap(); +const technology = 'prisma'; exports.init = function init(config) { logger = config.logger; @@ -221,7 +222,8 @@ function redactPasswordFromMsSQLUrl(url) { function finishSpan(error, span) { if (error) { span.ec = 1; - span.data.prisma.error = getErrorDetails(error); + const errorDetails = getErrorDetails(error); + span.data[technology].error = errorDetails; } span.d = Date.now() - span.ts; diff --git a/packages/core/src/tracing/instrumentation/databases/redis.js b/packages/core/src/tracing/instrumentation/databases/redis.js index ddacf5ad57..a3af24690b 100644 --- a/packages/core/src/tracing/instrumentation/databases/redis.js +++ b/packages/core/src/tracing/instrumentation/databases/redis.js @@ -17,6 +17,8 @@ let isActive = false; exports.spanName = 'redis'; exports.batchable = true; +const technology = exports.spanName; + let isRedisClientInstrumented = false; exports.activate = function activate() { @@ -365,7 +367,8 @@ function instrumentCommand(original, command, address, cbStyle) { if (error) { span.ec = 1; - span.data.redis.error = tracingUtil.getErrorDetails(error); + const errorDetails = tracingUtil.getErrorDetails(error); + span.data[technology].error = errorDetails; } span.transmit(); @@ -502,18 +505,22 @@ function instrumentMultiExec(origCtx, origArgs, original, address, isAtomic, cbS if (err) { span.ec = 1; + let errorDetails; + if (err.message) { - span.data.redis.error = err.message; + errorDetails = err.message; } else if (Array.isArray(err) && err.length) { - span.data.redis.error = err[0].message; + errorDetails = err[0].message; } else { - span.data.redis.error = 'Unknown error'; + errorDetails = 'Unknown error'; } // v3 = provides sub errors if (err.errors && err.errors.length) { - span.data.redis.error = err.errors.map(subErr => subErr.message).join('\n'); + errorDetails = err.errors.map(subErr => subErr.message).join('\n'); } + + span.data[technology].error = errorDetails; } span.transmit(); @@ -533,7 +540,8 @@ function buildSubCommandCallback(span, userProvidedCallback) { span.ec++; if (!span.data.redis.error) { - span.data.redis.error = tracingUtil.getErrorDetails(err); + const errorDetails = tracingUtil.getErrorDetails(err); + span.data[technology].error = errorDetails; } } diff --git a/packages/core/src/tracing/instrumentation/frameworks/express.js b/packages/core/src/tracing/instrumentation/frameworks/express.js index 208daa0885..c87f044dff 100644 --- a/packages/core/src/tracing/instrumentation/frameworks/express.js +++ b/packages/core/src/tracing/instrumentation/frameworks/express.js @@ -15,6 +15,8 @@ const cls = require('../../cls'); let active = false; +const technology = 'http'; + exports.activate = function activate() { active = true; }; @@ -116,7 +118,8 @@ function annotateHttpEntrySpanWithError(err) { return; } - span.data.http.error = tracingUtil.getErrorDetails(err); + const errorDetails = tracingUtil.getErrorDetails(err); + span.data[technology].error = errorDetails; } function shimHandlerRegistration(original) { diff --git a/packages/core/src/tracing/instrumentation/messaging/bull.js b/packages/core/src/tracing/instrumentation/messaging/bull.js index 21115672a6..51fdfc314d 100644 --- a/packages/core/src/tracing/instrumentation/messaging/bull.js +++ b/packages/core/src/tracing/instrumentation/messaging/bull.js @@ -17,6 +17,8 @@ let isActive = false; exports.spanName = 'bull'; +const technology = exports.spanName; + exports.init = function init(config) { logger = config.logger; hook.onModuleLoad('bull', instrumentBull); @@ -326,9 +328,11 @@ function addErrorToSpan(err, span) { if (err) { span.ec = 1; if (err.code) { - span.data.bull.error = err.code; + const errorDetails = err.code; + span.data[technology].error = errorDetails; } else if (typeof err === 'string') { - span.data.bull.error = err; + const errorDetails = err; + span.data[technology].error = errorDetails; } } } diff --git a/packages/core/src/tracing/instrumentation/messaging/kafkaJs.js b/packages/core/src/tracing/instrumentation/messaging/kafkaJs.js index 16f44c27e3..701f0f264d 100644 --- a/packages/core/src/tracing/instrumentation/messaging/kafkaJs.js +++ b/packages/core/src/tracing/instrumentation/messaging/kafkaJs.js @@ -15,6 +15,7 @@ const cls = require('../../cls'); let traceCorrelationEnabled = constants.kafkaTraceCorrelationDefault; let logger; let isActive = false; +const technology = 'kafka'; exports.init = function init(config) { logger = config.logger; @@ -105,7 +106,8 @@ function instrumentedSend(ctx, originalSend, originalArgs, topic, messages) { }) .catch(error => { span.ec = 1; - span.data.kafka.error = error.message; + const errorDetails = error.message; + span.data[technology].error = errorDetails; span.d = Date.now() - span.ts; span.transmit(); throw error; @@ -184,7 +186,8 @@ function instrumentedSendBatch(ctx, originalSendBatch, originalArgs, topicMessag }) .catch(error => { span.ec = 1; - span.data.kafka.error = error.message; + const errorDetails = error.message; + span.data[technology].error = errorDetails; span.d = Date.now() - span.ts; span.transmit(); throw error; diff --git a/packages/core/src/tracing/instrumentation/messaging/kafkaNode.js b/packages/core/src/tracing/instrumentation/messaging/kafkaNode.js index a243cc3806..069da90688 100644 --- a/packages/core/src/tracing/instrumentation/messaging/kafkaNode.js +++ b/packages/core/src/tracing/instrumentation/messaging/kafkaNode.js @@ -14,6 +14,7 @@ const cls = require('../../cls'); let logger; let isActive = false; +const technology = 'kafka'; // FYI: officially deprecated. No release since 4 years. But still very // high usage on npm trends. We will drop it in any upcoming major release. @@ -81,7 +82,8 @@ function instrumentedSend(ctx, originalSend, produceRequests, cb) { cls.ns.bind(function onSendCompleted(err) { if (err) { span.ec = 1; - span.data.kafka.error = err.message; + const errorDetails = err.message; + span.data[technology].error = errorDetails; } span.d = Date.now() - span.ts; diff --git a/packages/core/src/tracing/instrumentation/messaging/nats.js b/packages/core/src/tracing/instrumentation/messaging/nats.js index 2f9a3e0465..de54402b96 100644 --- a/packages/core/src/tracing/instrumentation/messaging/nats.js +++ b/packages/core/src/tracing/instrumentation/messaging/nats.js @@ -15,6 +15,7 @@ const cls = require('../../cls'); let isActive = false; let clientHasBeenInstrumentedV1 = false; let clientHasBeenInstrumentedV2 = false; +const technology = 'nats'; exports.init = function init() { hook.onModuleLoad('nats', instrumentNats); @@ -404,9 +405,11 @@ function addErrorToSpan(err, span) { errMsg = err; } if (errMsg && span.data.nats.error) { - span.data.nats.error += `, ${errMsg}`; + const errorDetails = `${span.data.nats.error}, ${errMsg}`; + span.data[technology].error = errorDetails; } else if (errMsg) { - span.data.nats.error = errMsg; + const errorDetails = errMsg; + span.data[technology].error = errorDetails; } } } diff --git a/packages/core/src/tracing/instrumentation/messaging/natsStreaming.js b/packages/core/src/tracing/instrumentation/messaging/natsStreaming.js index cc72ff8777..ad0aa97b1d 100644 --- a/packages/core/src/tracing/instrumentation/messaging/natsStreaming.js +++ b/packages/core/src/tracing/instrumentation/messaging/natsStreaming.js @@ -17,6 +17,7 @@ const cls = require('../../cls'); let isActive = false; let clientHasBeenInstrumented = false; let logger; +const technology = 'nats'; exports.init = function init(config) { logger = config.logger; @@ -201,9 +202,11 @@ function addErrorToSpan(err, span) { errMsg = err; } if (errMsg && span.data.nats.error) { - span.data.nats.error += `, ${errMsg}`; + const errorDetails = `${span.data.nats.error}, ${errMsg}`; + span.data[technology].error = errorDetails; } else if (errMsg) { - span.data.nats.error = errMsg; + const errorDetails = errMsg; + span.data[technology].error = errorDetails; } } } diff --git a/packages/core/src/tracing/instrumentation/messaging/rdkafka.js b/packages/core/src/tracing/instrumentation/messaging/rdkafka.js index d756c6f4f1..12d53d281d 100644 --- a/packages/core/src/tracing/instrumentation/messaging/rdkafka.js +++ b/packages/core/src/tracing/instrumentation/messaging/rdkafka.js @@ -16,6 +16,7 @@ let traceCorrelationEnabled = constants.kafkaTraceCorrelationDefault; let logger; let isActive = false; +const technology = 'kafka'; exports.init = function init(config) { logger = config.logger; @@ -167,7 +168,8 @@ function instrumentedProduce(ctx, originalProduce, originalArgs) { if (err) { span.ec = 1; - span.data.kafka.error = err.message; + const errorDetails = err.message; + span.data[technology].error = errorDetails; } span.transmit(); @@ -187,7 +189,8 @@ function instrumentedProduce(ctx, originalProduce, originalArgs) { // e.g. cannot send message because format is byte // "Message must be a buffer or null" span.ec = 1; - span.data.kafka.error = error.message; + const errorDetails = error.message; + span.data[technology].error = errorDetails; if (!deliveryCb) { span.d = Date.now() - span.ts; @@ -305,7 +308,8 @@ function instrumentedConsumerEmit(ctx, originalEmit, originalArgs) { delete messageData.headers; span.ec = 1; - span.data.kafka.error = messageData.message; + const errorDetails = messageData.message; + span.data[technology].error = errorDetails; } setImmediate(() => { diff --git a/packages/core/src/tracing/instrumentation/protocols/grpcJs.js b/packages/core/src/tracing/instrumentation/protocols/grpcJs.js index 63c720a821..55c37ae59c 100644 --- a/packages/core/src/tracing/instrumentation/protocols/grpcJs.js +++ b/packages/core/src/tracing/instrumentation/protocols/grpcJs.js @@ -13,6 +13,7 @@ const cls = require('../../cls'); let logger; let Metadata; let isActive = false; +const technology = 'rpc'; const TYPES = { UNARY: 'unary', @@ -116,7 +117,8 @@ function modifyArgs(name, originalArgs, span) { } else { span.ec = 1; if (errorMessage) { - span.data.rpc.error = errorMessage; + const errorDetails = errorMessage; + span.data[technology].error = errorDetails; } } } @@ -345,7 +347,8 @@ function createInstrumentedServerHandler(name, type, originalHandler) { if (err) { span.ec = 1; if (err.message || err.details) { - span.data.rpc.error = err.message || err.details; + const errorDetails = err.message || err.details; + span.data[technology].error = errorDetails; } } span.d = Date.now() - span.ts; @@ -370,7 +373,8 @@ function createInstrumentedServerHandler(name, type, originalHandler) { call.on('error', err => { span.ec = 1; if (err.message || err.details) { - span.data.rpc.error = err.message || err.details; + const errorDetails = err.message || err.details; + span.data[technology].error = errorDetails; } }); @@ -432,7 +436,8 @@ function instrumentedClientMethod( } else { span.ec = 1; if (errorMessage) { - span.data.rpc.error = errorMessage; + const errorDetails = errorMessage; + span.data[technology].error = errorDetails; } } span.transmit(); diff --git a/packages/core/src/tracing/instrumentation/protocols/httpClient.js b/packages/core/src/tracing/instrumentation/protocols/httpClient.js index d3d3ba9ea4..ae5a2a8127 100644 --- a/packages/core/src/tracing/instrumentation/protocols/httpClient.js +++ b/packages/core/src/tracing/instrumentation/protocols/httpClient.js @@ -262,10 +262,12 @@ function instrument(coreModule, forceHttps) { } catch (e) { // A synchronous exception indicates a failure that is not covered by the listeners. Using a malformed URL for // example is a case that triggers a synchronous exception. - span.data.http = { - url: completeCallUrl, - error: e ? e.message : '' - }; + span.data.http.url = completeCallUrl; + + const errorValue = e ? e.message : ''; + const key = 'http'; + + span.data[key].error = errorValue; span.d = Date.now() - span.ts; span.ec = 1; span.transmit(); @@ -311,9 +313,12 @@ function instrument(coreModule, forceHttps) { } span.data.http = { method: clientRequest.method, - url: completeCallUrl, - error: errorMessage + url: completeCallUrl }; + const errorValue = errorMessage; + const key = 'http'; + + span.data[key].error = errorValue; span.d = Date.now() - span.ts; span.ec = 1; span.transmit(); diff --git a/packages/core/src/tracing/instrumentation/protocols/nativeFetch.js b/packages/core/src/tracing/instrumentation/protocols/nativeFetch.js index 342c217921..06155b311f 100644 --- a/packages/core/src/tracing/instrumentation/protocols/nativeFetch.js +++ b/packages/core/src/tracing/instrumentation/protocols/nativeFetch.js @@ -21,6 +21,7 @@ const originalFetch = global.fetch; let extraHttpHeadersToCapture; let isActive = false; +const technology = 'http'; // This determines whether we need to apply a workaround for a bug in Node.js fetch implementation (or rather, the // underlying dependency undici). @@ -184,7 +185,8 @@ function instrument() { }) .catch(err => { span.ec = 1; - span.data.http.error = err.message; + const errorDetails = err.message; + span.data[technology].error = errorDetails; }) .finally(() => { span.d = Date.now() - span.ts;