dd-trace 5.102.0 → 5.103.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/ext/exporters.js +1 -0
- package/package.json +12 -11
- package/packages/datadog-esbuild/src/utils.js +2 -2
- package/packages/datadog-instrumentations/src/ai.js +1 -1
- package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +32 -15
- package/packages/datadog-instrumentations/src/couchbase.js +69 -220
- package/packages/datadog-instrumentations/src/cucumber.js +1 -1
- package/packages/datadog-instrumentations/src/electron/preload.js +42 -0
- package/packages/datadog-instrumentations/src/electron.js +240 -0
- package/packages/datadog-instrumentations/src/fetch.js +5 -5
- package/packages/datadog-instrumentations/src/graphql.js +13 -12
- package/packages/datadog-instrumentations/src/helpers/callback-instrumentor.js +1 -1
- package/packages/datadog-instrumentations/src/helpers/hook.js +4 -1
- package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -0
- package/packages/datadog-instrumentations/src/helpers/instrument.js +2 -2
- package/packages/datadog-instrumentations/src/helpers/kafka.js +41 -0
- package/packages/datadog-instrumentations/src/ioredis.js +16 -12
- package/packages/datadog-instrumentations/src/jest.js +351 -50
- package/packages/datadog-instrumentations/src/kafkajs.js +164 -173
- package/packages/datadog-instrumentations/src/mocha/main.js +73 -1
- package/packages/datadog-instrumentations/src/mongodb-core.js +33 -8
- package/packages/datadog-instrumentations/src/pg.js +24 -10
- package/packages/datadog-instrumentations/src/playwright.js +427 -55
- package/packages/datadog-instrumentations/src/redis.js +19 -10
- package/packages/datadog-plugin-apollo/src/gateway/request.js +1 -21
- package/packages/datadog-plugin-aws-sdk/src/base.js +18 -24
- package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/s3.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/sns.js +2 -2
- package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +1 -1
- package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
- package/packages/datadog-plugin-couchbase/src/index.js +58 -52
- package/packages/datadog-plugin-cucumber/src/index.js +1 -0
- package/packages/datadog-plugin-cypress/src/cypress-plugin.js +214 -22
- package/packages/datadog-plugin-cypress/src/support.js +13 -1
- package/packages/datadog-plugin-electron/src/index.js +17 -0
- package/packages/datadog-plugin-electron/src/ipc.js +143 -0
- package/packages/datadog-plugin-electron/src/net.js +82 -0
- package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +27 -18
- package/packages/datadog-plugin-graphql/src/execute.js +6 -28
- package/packages/datadog-plugin-graphql/src/resolve.js +30 -35
- package/packages/datadog-plugin-graphql/src/tools/signature.js +32 -7
- package/packages/datadog-plugin-graphql/src/tools/transforms.js +118 -100
- package/packages/datadog-plugin-graphql/src/utils.js +29 -0
- package/packages/datadog-plugin-grpc/src/client.js +6 -7
- package/packages/datadog-plugin-grpc/src/util.js +57 -22
- package/packages/datadog-plugin-http/src/client.js +2 -2
- package/packages/datadog-plugin-jest/src/index.js +92 -50
- package/packages/datadog-plugin-mocha/src/index.js +1 -0
- package/packages/datadog-plugin-mongodb-core/src/index.js +36 -70
- package/packages/datadog-plugin-mysql/src/index.js +1 -1
- package/packages/datadog-plugin-openai/src/services.js +2 -1
- package/packages/datadog-plugin-pg/src/index.js +3 -3
- package/packages/datadog-plugin-playwright/src/index.js +4 -0
- package/packages/datadog-plugin-redis/src/index.js +18 -23
- package/packages/dd-trace/src/aiguard/index.js +3 -1
- package/packages/dd-trace/src/aiguard/sdk.js +36 -30
- package/packages/dd-trace/src/aiguard/tags.js +20 -11
- package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +2 -2
- package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +1 -1
- package/packages/dd-trace/src/azure_metadata.js +17 -6
- package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +4 -4
- package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +4 -2
- package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +6 -4
- package/packages/dd-trace/src/ci-visibility/requests/fs-cache.js +1 -1
- package/packages/dd-trace/src/config/defaults.js +3 -14
- package/packages/dd-trace/src/config/generated-config-types.d.ts +3 -1
- package/packages/dd-trace/src/config/helper.js +4 -0
- package/packages/dd-trace/src/config/index.js +2 -2
- package/packages/dd-trace/src/config/major-overrides.js +98 -0
- package/packages/dd-trace/src/config/parsers.js +7 -1
- package/packages/dd-trace/src/config/supported-configurations.json +51 -38
- package/packages/dd-trace/src/datastreams/checkpointer.js +2 -2
- package/packages/dd-trace/src/datastreams/manager.js +1 -1
- package/packages/dd-trace/src/datastreams/processor.js +2 -2
- package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +2 -2
- package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +1 -1
- package/packages/dd-trace/src/debugger/devtools_client/state.js +2 -1
- package/packages/dd-trace/src/debugger/index.js +7 -7
- package/packages/dd-trace/src/dogstatsd.js +2 -2
- package/packages/dd-trace/src/encode/0.4.js +45 -54
- package/packages/dd-trace/src/encode/0.5.js +34 -3
- package/packages/dd-trace/src/encode/agentless-json.js +1 -1
- package/packages/dd-trace/src/exporter.js +2 -0
- package/packages/dd-trace/src/exporters/agent/index.js +2 -1
- package/packages/dd-trace/src/exporters/agentless/index.js +3 -2
- package/packages/dd-trace/src/exporters/agentless/writer.js +2 -2
- package/packages/dd-trace/src/exporters/common/buffering-exporter.js +2 -1
- package/packages/dd-trace/src/exporters/common/request.js +1 -1
- package/packages/dd-trace/src/exporters/electron/index.js +49 -0
- package/packages/dd-trace/src/external-logger/src/index.js +2 -1
- package/packages/dd-trace/src/git_metadata.js +10 -8
- package/packages/dd-trace/src/lambda/handler-paths.js +52 -0
- package/packages/dd-trace/src/lambda/index.js +62 -14
- package/packages/dd-trace/src/lambda/runtime/patch.js +21 -46
- package/packages/dd-trace/src/llmobs/index.js +13 -2
- package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +45 -15
- package/packages/dd-trace/src/llmobs/writers/base.js +2 -1
- package/packages/dd-trace/src/openfeature/writers/base.js +2 -1
- package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +2 -1
- package/packages/dd-trace/src/opentracing/propagation/text_map.js +20 -9
- package/packages/dd-trace/src/payload-tagging/config/index.js +2 -2
- package/packages/dd-trace/src/plugins/ci_plugin.js +49 -4
- package/packages/dd-trace/src/plugins/database.js +54 -12
- package/packages/dd-trace/src/plugins/index.js +1 -0
- package/packages/dd-trace/src/plugins/plugin.js +2 -4
- package/packages/dd-trace/src/plugins/util/ci.js +8 -8
- package/packages/dd-trace/src/plugins/util/git-cache.js +20 -18
- package/packages/dd-trace/src/plugins/util/stacktrace.js +2 -2
- package/packages/dd-trace/src/plugins/util/test.js +37 -5
- package/packages/dd-trace/src/plugins/util/user-provided-git.js +17 -15
- package/packages/dd-trace/src/priority_sampler.js +1 -1
- package/packages/dd-trace/src/profiling/profiler.js +1 -1
- package/packages/dd-trace/src/profiling/profilers/wall.js +1 -1
- package/packages/dd-trace/src/profiling/ssi-heuristics.js +1 -1
- package/packages/dd-trace/src/rate_limiter.js +1 -1
- package/packages/dd-trace/src/remote_config/scheduler.js +1 -1
- package/packages/dd-trace/src/ritm.js +2 -1
- package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +5 -8
- package/packages/dd-trace/src/serverless.js +5 -2
- package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +20 -0
- package/packages/dd-trace/src/service-naming/schemas/v0/web.js +4 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +20 -0
- package/packages/dd-trace/src/service-naming/schemas/v1/web.js +4 -0
- package/packages/dd-trace/src/span_stats.js +1 -1
- package/packages/dd-trace/src/telemetry/dependencies.js +1 -1
- package/packages/dd-trace/src/telemetry/endpoints.js +1 -1
- package/packages/dd-trace/src/telemetry/telemetry.js +2 -2
- package/packages/dd-trace/src/lambda/runtime/ritm.js +0 -133
|
@@ -13,6 +13,7 @@ const errorCh = channel('apm:redis:command:error')
|
|
|
13
13
|
let createClientUrl
|
|
14
14
|
let createClientName
|
|
15
15
|
const instanceInfo = new WeakMap()
|
|
16
|
+
const connectionInfoCache = new WeakMap()
|
|
16
17
|
|
|
17
18
|
function wrapAddCommand (addCommand) {
|
|
18
19
|
return function (command) {
|
|
@@ -20,10 +21,7 @@ function wrapAddCommand (addCommand) {
|
|
|
20
21
|
return addCommand.apply(this, arguments)
|
|
21
22
|
}
|
|
22
23
|
|
|
23
|
-
const
|
|
24
|
-
const args = command.slice(1)
|
|
25
|
-
|
|
26
|
-
const ctx = getStartCtx(this, name, args)
|
|
24
|
+
const ctx = getStartCtx(this, command[0], command, 1)
|
|
27
25
|
return startCh.runStores(ctx, () => {
|
|
28
26
|
const res = addCommand.apply(this, arguments)
|
|
29
27
|
|
|
@@ -136,22 +134,33 @@ addHook({ name: 'redis', versions: ['>=0.12 <2.6'] }, redis => {
|
|
|
136
134
|
return redis
|
|
137
135
|
})
|
|
138
136
|
|
|
139
|
-
function getStartCtx (client, command, args) {
|
|
140
|
-
|
|
137
|
+
function getStartCtx (client, command, args, argsStartIndex) {
|
|
138
|
+
let cached = connectionInfoCache.get(client)
|
|
139
|
+
if (cached === undefined) {
|
|
140
|
+
const info = instanceInfo.get(client)
|
|
141
|
+
cached = {
|
|
142
|
+
connectionOptions:
|
|
143
|
+
client.connection_options || client.connection_option || client.connectionOption || info?.url,
|
|
144
|
+
connectionName: info?.connectionName,
|
|
145
|
+
}
|
|
146
|
+
connectionInfoCache.set(client, cached)
|
|
147
|
+
}
|
|
141
148
|
|
|
142
149
|
return {
|
|
143
150
|
db: client.selected_db,
|
|
144
151
|
command,
|
|
145
152
|
args,
|
|
146
|
-
|
|
147
|
-
|
|
153
|
+
argsStartIndex,
|
|
154
|
+
connectionOptions: cached.connectionOptions,
|
|
155
|
+
connectionName: cached.connectionName,
|
|
148
156
|
}
|
|
149
157
|
}
|
|
150
158
|
|
|
151
159
|
function wrapCallback (finishCh, errorCh, ctx, callback) {
|
|
152
|
-
|
|
160
|
+
if (typeof callback !== 'function') return callback
|
|
161
|
+
return function (err) {
|
|
153
162
|
return finish(finishCh, errorCh, ctx, err, callback, this, arguments)
|
|
154
|
-
}
|
|
163
|
+
}
|
|
155
164
|
}
|
|
156
165
|
|
|
157
166
|
function finish (finishCh, errorCh, ctx, error, callback, thisArg, args) {
|
|
@@ -2,8 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
const { storage } = require('../../../datadog-core')
|
|
4
4
|
const ApolloBasePlugin = require('../../../dd-trace/src/plugins/apollo')
|
|
5
|
-
|
|
6
|
-
let tools
|
|
5
|
+
const { getSignature } = require('../../../datadog-plugin-graphql/src/utils')
|
|
7
6
|
|
|
8
7
|
const OPERATION_DEFINITION = 'OperationDefinition'
|
|
9
8
|
const FRAGMENT_DEFINITION = 'FragmentDefinition'
|
|
@@ -100,23 +99,4 @@ function buildOperationContext (schema, operationDocument, operationName) {
|
|
|
100
99
|
}
|
|
101
100
|
}
|
|
102
101
|
|
|
103
|
-
function getSignature (document, operationName, operationType, calculate) {
|
|
104
|
-
if (calculate !== false && tools !== false) {
|
|
105
|
-
try {
|
|
106
|
-
try {
|
|
107
|
-
tools = tools || require('../../../datadog-plugin-graphql/src/tools')
|
|
108
|
-
} catch (e) {
|
|
109
|
-
tools = false
|
|
110
|
-
throw e
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
return tools.defaultEngineReportingSignature(document, operationName)
|
|
114
|
-
} catch {
|
|
115
|
-
// safety net
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
return [operationType, operationName].filter(Boolean).join(' ')
|
|
120
|
-
}
|
|
121
|
-
|
|
122
102
|
module.exports = ApolloGatewayRequestPlugin
|
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
const analyticsSampler = require('../../dd-trace/src/analytics_sampler')
|
|
4
4
|
const ClientPlugin = require('../../dd-trace/src/plugins/client')
|
|
5
5
|
const { storage } = require('../../datadog-core')
|
|
6
|
-
const { isTrue } = require('../../dd-trace/src/util')
|
|
7
6
|
const { tagsFromRequest, tagsFromResponse } = require('../../dd-trace/src/payload-tagging')
|
|
8
|
-
const
|
|
7
|
+
const getConfig = require('../../dd-trace/src/config')
|
|
9
8
|
const { IS_SERVERLESS } = require('../../dd-trace/src/serverless')
|
|
10
9
|
|
|
11
10
|
const RESPONSE_SKIP_KEYS = new Set(['request', 'requestId', 'error', '$metadata'])
|
|
@@ -245,16 +244,15 @@ class BaseAwsSdkPlugin extends ClientPlugin {
|
|
|
245
244
|
if (!span || !response.request) return
|
|
246
245
|
const params = response.request.params
|
|
247
246
|
const operation = response.request.operation
|
|
248
|
-
const extraTags = this.generateTags(params, operation, response) || {}
|
|
249
247
|
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
'span.kind': 'client',
|
|
254
|
-
...extraTags,
|
|
255
|
-
}
|
|
248
|
+
// `'span.kind': 'client'` is already set by the start-meta; SQS overrides via `generateTags`.
|
|
249
|
+
span.setTag('aws.response.request_id', response.requestId)
|
|
250
|
+
span.setTag('resource.name', operation)
|
|
256
251
|
|
|
257
|
-
|
|
252
|
+
const extraTags = this.generateTags(params, operation, response)
|
|
253
|
+
if (extraTags) {
|
|
254
|
+
span.addTags(extraTags)
|
|
255
|
+
}
|
|
258
256
|
|
|
259
257
|
if (this.constructor.isPayloadReporter && this.cloudTaggingConfig.response) {
|
|
260
258
|
const maxDepth = this.cloudTaggingConfig.maxDepth
|
|
@@ -314,29 +312,25 @@ function normalizeConfig (config, serviceIdentifier) {
|
|
|
314
312
|
const hooks = getHooks(config)
|
|
315
313
|
|
|
316
314
|
let specificConfig = config[serviceIdentifier]
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
specificConfig = {}
|
|
320
|
-
break
|
|
321
|
-
case 'boolean':
|
|
322
|
-
specificConfig = { enabled: specificConfig }
|
|
323
|
-
break
|
|
315
|
+
if (typeof specificConfig === 'boolean') {
|
|
316
|
+
specificConfig = { enabled: specificConfig }
|
|
324
317
|
}
|
|
325
318
|
|
|
326
|
-
//
|
|
319
|
+
// Check if AWS batch propagation or AWS_[SERVICE] batch propagation is enabled via env variable
|
|
320
|
+
const tracerConfig = getConfig()
|
|
327
321
|
const serviceId = serviceIdentifier.toUpperCase()
|
|
328
|
-
const
|
|
329
|
-
|
|
330
|
-
getValueFromEnvSources(`DD_TRACE_AWS_SDK_${serviceId}_BATCH_PROPAGATION_ENABLED`) ??
|
|
331
|
-
config.batchPropagationEnabled ??
|
|
332
|
-
getValueFromEnvSources('DD_TRACE_AWS_SDK_BATCH_PROPAGATION_ENABLED')
|
|
322
|
+
const serviceBatchKey = /** @type {import('../../dd-trace/src/config/config-types').ConfigPath} */(
|
|
323
|
+
`DD_TRACE_AWS_SDK_${serviceId}_BATCH_PROPAGATION_ENABLED`
|
|
333
324
|
)
|
|
325
|
+
const batchPropagationEnabled = tracerConfig.getOrigin(serviceBatchKey) === 'default'
|
|
326
|
+
? tracerConfig.DD_TRACE_AWS_SDK_BATCH_PROPAGATION_ENABLED
|
|
327
|
+
: tracerConfig[serviceBatchKey]
|
|
334
328
|
|
|
335
329
|
// Merge the specific config back into the main config
|
|
336
330
|
return {
|
|
331
|
+
batchPropagationEnabled,
|
|
337
332
|
...config,
|
|
338
333
|
...specificConfig,
|
|
339
|
-
batchPropagationEnabled,
|
|
340
334
|
hooks,
|
|
341
335
|
}
|
|
342
336
|
}
|
|
@@ -6,7 +6,7 @@ class CloudwatchLogs extends BaseAwsSdkPlugin {
|
|
|
6
6
|
static id = 'cloudwatchlogs'
|
|
7
7
|
|
|
8
8
|
generateTags (params, operation) {
|
|
9
|
-
if (!params?.logGroupName) return
|
|
9
|
+
if (!params?.logGroupName) return
|
|
10
10
|
|
|
11
11
|
return {
|
|
12
12
|
'resource.name': `${operation} ${params.logGroupName}`,
|
|
@@ -7,7 +7,7 @@ class EventBridge extends BaseAwsSdkPlugin {
|
|
|
7
7
|
static isPayloadReporter = true
|
|
8
8
|
|
|
9
9
|
generateTags (params, operation, response) {
|
|
10
|
-
if (!params?.source) return
|
|
10
|
+
if (!params?.source) return
|
|
11
11
|
const rulename = params.Name ?? ''
|
|
12
12
|
return {
|
|
13
13
|
'resource.name': operation ? `${operation} ${params.source}` : params.source,
|
|
@@ -68,7 +68,7 @@ class Kinesis extends BaseAwsSdkPlugin {
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
generateTags (params, operation, response) {
|
|
71
|
-
if (!params || !params.StreamName) return
|
|
71
|
+
if (!params || !params.StreamName) return
|
|
72
72
|
|
|
73
73
|
return {
|
|
74
74
|
'resource.name': `${operation} ${params.StreamName}`,
|
|
@@ -6,7 +6,7 @@ class Redshift extends BaseAwsSdkPlugin {
|
|
|
6
6
|
static id = 'redshift'
|
|
7
7
|
|
|
8
8
|
generateTags (params, operation, response) {
|
|
9
|
-
if (!params?.ClusterIdentifier) return
|
|
9
|
+
if (!params?.ClusterIdentifier) return
|
|
10
10
|
|
|
11
11
|
return {
|
|
12
12
|
'resource.name': `${operation} ${params.ClusterIdentifier}`,
|
|
@@ -10,9 +10,9 @@ class Sns extends BaseAwsSdkPlugin {
|
|
|
10
10
|
static isPayloadReporter = true
|
|
11
11
|
|
|
12
12
|
generateTags (params, operation, response) {
|
|
13
|
-
if (!params) return
|
|
13
|
+
if (!params) return
|
|
14
14
|
|
|
15
|
-
if (!params.TopicArn && !(response.data && response.data.TopicArn)) return
|
|
15
|
+
if (!params.TopicArn && !(response.data && response.data.TopicArn)) return
|
|
16
16
|
const TopicArn = params.TopicArn || response.data.TopicArn
|
|
17
17
|
|
|
18
18
|
// Get the topic name from the last `:`-delimited segment of the ARN
|
|
@@ -99,7 +99,7 @@ class Sqs extends BaseAwsSdkPlugin {
|
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
generateTags (params, operation, response) {
|
|
102
|
-
if (!params || (!params.QueueName && !params.QueueUrl)) return
|
|
102
|
+
if (!params || (!params.QueueName && !params.QueueUrl)) return
|
|
103
103
|
|
|
104
104
|
const queueMetadata = extractQueueMetadata(params.QueueUrl)
|
|
105
105
|
const queueName = queueMetadata?.queueName || params.QueueName
|
|
@@ -28,7 +28,7 @@ class Stepfunctions extends BaseAwsSdkPlugin {
|
|
|
28
28
|
// }
|
|
29
29
|
|
|
30
30
|
generateTags (params, operation, response) {
|
|
31
|
-
if (!params) return
|
|
31
|
+
if (!params) return
|
|
32
32
|
const tags = { 'resource.name': params.name ? `${operation} ${params.name}` : `${operation}` }
|
|
33
33
|
if (operation === 'startExecution' || operation === 'startSyncExecution') {
|
|
34
34
|
tags.statemachinearn = `${params.stateMachineArn}`
|
|
@@ -1,18 +1,49 @@
|
|
|
1
1
|
'use strict'
|
|
2
2
|
|
|
3
3
|
const StoragePlugin = require('../../dd-trace/src/plugins/storage')
|
|
4
|
-
const { storage } = require('../../datadog-core')
|
|
5
4
|
|
|
6
5
|
class CouchBasePlugin extends StoragePlugin {
|
|
7
6
|
static id = 'couchbase'
|
|
8
7
|
static peerServicePrecursors = ['db.couchbase.seed.nodes']
|
|
9
8
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
this
|
|
14
|
-
|
|
15
|
-
|
|
9
|
+
constructor (...args) {
|
|
10
|
+
super(...args)
|
|
11
|
+
|
|
12
|
+
this.#addOpSubs('query', (ctx) => {
|
|
13
|
+
const { resource, bucket, seedNodes } = ctx
|
|
14
|
+
this.startSpan(
|
|
15
|
+
'query',
|
|
16
|
+
{
|
|
17
|
+
'span.type': 'sql',
|
|
18
|
+
'resource.name': resource,
|
|
19
|
+
'span.kind': this.constructor.kind,
|
|
20
|
+
},
|
|
21
|
+
{ bucket, seedNodes },
|
|
22
|
+
ctx
|
|
23
|
+
)
|
|
24
|
+
return ctx.currentStore
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
for (const op of ['upsert', 'insert', 'replace']) {
|
|
28
|
+
this.#addOpSubs(op, (ctx) => {
|
|
29
|
+
const { bucket, collection, seedNodes } = ctx
|
|
30
|
+
this.startSpan(op, {}, { bucket, collection, seedNodes }, ctx)
|
|
31
|
+
return ctx.currentStore
|
|
32
|
+
})
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* @param {string} op Operation name (`query`, `upsert`, ...).
|
|
38
|
+
* @param {(ctx: object) => object} bindStart Operation-specific span starter.
|
|
39
|
+
*/
|
|
40
|
+
#addOpSubs (op, bindStart) {
|
|
41
|
+
const prefix = `tracing:apm:couchbase:${op}`
|
|
42
|
+
this.addBind(`${prefix}:start`, bindStart)
|
|
43
|
+
this.addBind(`${prefix}:asyncStart`, bindAsyncStart)
|
|
44
|
+
this.addSub(`${prefix}:asyncEnd`, finishSpan)
|
|
45
|
+
this.addSub(`${prefix}:end`, finishSpanIfSync)
|
|
46
|
+
this.addSub(`${prefix}:error`, setSpanError)
|
|
16
47
|
}
|
|
17
48
|
|
|
18
49
|
startSpan (operation, customTags, { bucket, collection, seedNodes }, ctx) {
|
|
@@ -27,8 +58,8 @@ class CouchBasePlugin extends StoragePlugin {
|
|
|
27
58
|
if (bucket) tags['couchbase.bucket.name'] = bucket.name
|
|
28
59
|
if (collection) tags['couchbase.collection.name'] = collection.name
|
|
29
60
|
|
|
30
|
-
for (const
|
|
31
|
-
tags[
|
|
61
|
+
for (const key of Object.keys(customTags)) {
|
|
62
|
+
tags[key] = customTags[key]
|
|
32
63
|
}
|
|
33
64
|
|
|
34
65
|
return super.startSpan(
|
|
@@ -40,55 +71,30 @@ class CouchBasePlugin extends StoragePlugin {
|
|
|
40
71
|
ctx
|
|
41
72
|
)
|
|
42
73
|
}
|
|
74
|
+
}
|
|
43
75
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
this.addBinds('query', (ctx) => {
|
|
48
|
-
const { resource, bucket, seedNodes } = ctx
|
|
49
|
-
|
|
50
|
-
this.startSpan(
|
|
51
|
-
'query',
|
|
52
|
-
{
|
|
53
|
-
'span.type': 'sql',
|
|
54
|
-
'resource.name': resource,
|
|
55
|
-
'span.kind': this.constructor.kind,
|
|
56
|
-
},
|
|
57
|
-
{ bucket, seedNodes },
|
|
58
|
-
ctx
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
return ctx.currentStore
|
|
62
|
-
})
|
|
63
|
-
this.addBind('apm:couchbase:bucket:maybeInvoke:callback:start', callbackStart)
|
|
64
|
-
this.addBind('apm:couchbase:bucket:maybeInvoke:callback:finish', callbackFinish)
|
|
65
|
-
this.addBind('apm:couchbase:cluster:maybeInvoke:callback:start', callbackStart)
|
|
66
|
-
this.addBind('apm:couchbase:cluster:maybeInvoke:callback:finish', callbackFinish)
|
|
67
|
-
|
|
68
|
-
this._addCommandSubs('upsert')
|
|
69
|
-
this._addCommandSubs('insert')
|
|
70
|
-
this._addCommandSubs('replace')
|
|
71
|
-
this._addCommandSubs('append')
|
|
72
|
-
this._addCommandSubs('prepend')
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
_addCommandSubs (name) {
|
|
76
|
-
this.addBinds(name, (ctx) => {
|
|
77
|
-
const { bucket, collection, seedNodes } = ctx
|
|
76
|
+
function bindAsyncStart (ctx) {
|
|
77
|
+
return ctx.parentStore
|
|
78
|
+
}
|
|
78
79
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
})
|
|
82
|
-
}
|
|
80
|
+
function finishSpan (ctx) {
|
|
81
|
+
ctx.currentStore?.span?.finish()
|
|
83
82
|
}
|
|
84
83
|
|
|
85
|
-
function
|
|
86
|
-
|
|
87
|
-
|
|
84
|
+
// `end` fires synchronously after the wrapped function returns. For async
|
|
85
|
+
// resolutions ctx.result and ctx.error are still unset at that point and the
|
|
86
|
+
// span is closed later via asyncEnd. For a sync throw or sync-resolved
|
|
87
|
+
// callback, this is the only finalization signal.
|
|
88
|
+
function finishSpanIfSync (ctx) {
|
|
89
|
+
if ((ctx.error !== undefined || ctx.result !== undefined) && ctx.currentStore?.span) {
|
|
90
|
+
ctx.currentStore.span.finish()
|
|
91
|
+
}
|
|
88
92
|
}
|
|
89
93
|
|
|
90
|
-
function
|
|
91
|
-
|
|
94
|
+
function setSpanError (ctx) {
|
|
95
|
+
if (ctx.error && ctx.currentStore?.span) {
|
|
96
|
+
ctx.currentStore.span.setTag('error', ctx.error)
|
|
97
|
+
}
|
|
92
98
|
}
|
|
93
99
|
|
|
94
100
|
module.exports = CouchBasePlugin
|
|
@@ -141,6 +141,7 @@ class CucumberPlugin extends CiPlugin {
|
|
|
141
141
|
'cucumber'
|
|
142
142
|
),
|
|
143
143
|
...this.getSessionRequestErrorTags(),
|
|
144
|
+
...this.getSessionItrSkippingEnabledTags(),
|
|
144
145
|
}
|
|
145
146
|
if (isUnskippable) {
|
|
146
147
|
this.telemetry.count(TELEMETRY_ITR_UNSKIPPABLE, { testLevel: 'suite' })
|