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.
Files changed (133) hide show
  1. package/ext/exporters.js +1 -0
  2. package/package.json +12 -11
  3. package/packages/datadog-esbuild/src/utils.js +2 -2
  4. package/packages/datadog-instrumentations/src/ai.js +1 -1
  5. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +32 -15
  6. package/packages/datadog-instrumentations/src/couchbase.js +69 -220
  7. package/packages/datadog-instrumentations/src/cucumber.js +1 -1
  8. package/packages/datadog-instrumentations/src/electron/preload.js +42 -0
  9. package/packages/datadog-instrumentations/src/electron.js +240 -0
  10. package/packages/datadog-instrumentations/src/fetch.js +5 -5
  11. package/packages/datadog-instrumentations/src/graphql.js +13 -12
  12. package/packages/datadog-instrumentations/src/helpers/callback-instrumentor.js +1 -1
  13. package/packages/datadog-instrumentations/src/helpers/hook.js +4 -1
  14. package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -0
  15. package/packages/datadog-instrumentations/src/helpers/instrument.js +2 -2
  16. package/packages/datadog-instrumentations/src/helpers/kafka.js +41 -0
  17. package/packages/datadog-instrumentations/src/ioredis.js +16 -12
  18. package/packages/datadog-instrumentations/src/jest.js +351 -50
  19. package/packages/datadog-instrumentations/src/kafkajs.js +164 -173
  20. package/packages/datadog-instrumentations/src/mocha/main.js +73 -1
  21. package/packages/datadog-instrumentations/src/mongodb-core.js +33 -8
  22. package/packages/datadog-instrumentations/src/pg.js +24 -10
  23. package/packages/datadog-instrumentations/src/playwright.js +427 -55
  24. package/packages/datadog-instrumentations/src/redis.js +19 -10
  25. package/packages/datadog-plugin-apollo/src/gateway/request.js +1 -21
  26. package/packages/datadog-plugin-aws-sdk/src/base.js +18 -24
  27. package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +1 -1
  28. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +1 -1
  29. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +1 -1
  30. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
  31. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +1 -1
  32. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +1 -1
  33. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +2 -2
  34. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +1 -1
  35. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  36. package/packages/datadog-plugin-couchbase/src/index.js +58 -52
  37. package/packages/datadog-plugin-cucumber/src/index.js +1 -0
  38. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +214 -22
  39. package/packages/datadog-plugin-cypress/src/support.js +13 -1
  40. package/packages/datadog-plugin-electron/src/index.js +17 -0
  41. package/packages/datadog-plugin-electron/src/ipc.js +143 -0
  42. package/packages/datadog-plugin-electron/src/net.js +82 -0
  43. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +27 -18
  44. package/packages/datadog-plugin-graphql/src/execute.js +6 -28
  45. package/packages/datadog-plugin-graphql/src/resolve.js +30 -35
  46. package/packages/datadog-plugin-graphql/src/tools/signature.js +32 -7
  47. package/packages/datadog-plugin-graphql/src/tools/transforms.js +118 -100
  48. package/packages/datadog-plugin-graphql/src/utils.js +29 -0
  49. package/packages/datadog-plugin-grpc/src/client.js +6 -7
  50. package/packages/datadog-plugin-grpc/src/util.js +57 -22
  51. package/packages/datadog-plugin-http/src/client.js +2 -2
  52. package/packages/datadog-plugin-jest/src/index.js +92 -50
  53. package/packages/datadog-plugin-mocha/src/index.js +1 -0
  54. package/packages/datadog-plugin-mongodb-core/src/index.js +36 -70
  55. package/packages/datadog-plugin-mysql/src/index.js +1 -1
  56. package/packages/datadog-plugin-openai/src/services.js +2 -1
  57. package/packages/datadog-plugin-pg/src/index.js +3 -3
  58. package/packages/datadog-plugin-playwright/src/index.js +4 -0
  59. package/packages/datadog-plugin-redis/src/index.js +18 -23
  60. package/packages/dd-trace/src/aiguard/index.js +3 -1
  61. package/packages/dd-trace/src/aiguard/sdk.js +36 -30
  62. package/packages/dd-trace/src/aiguard/tags.js +20 -11
  63. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +2 -2
  64. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +1 -1
  65. package/packages/dd-trace/src/azure_metadata.js +17 -6
  66. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +4 -4
  67. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +4 -2
  68. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +6 -4
  69. package/packages/dd-trace/src/ci-visibility/requests/fs-cache.js +1 -1
  70. package/packages/dd-trace/src/config/defaults.js +3 -14
  71. package/packages/dd-trace/src/config/generated-config-types.d.ts +3 -1
  72. package/packages/dd-trace/src/config/helper.js +4 -0
  73. package/packages/dd-trace/src/config/index.js +2 -2
  74. package/packages/dd-trace/src/config/major-overrides.js +98 -0
  75. package/packages/dd-trace/src/config/parsers.js +7 -1
  76. package/packages/dd-trace/src/config/supported-configurations.json +51 -38
  77. package/packages/dd-trace/src/datastreams/checkpointer.js +2 -2
  78. package/packages/dd-trace/src/datastreams/manager.js +1 -1
  79. package/packages/dd-trace/src/datastreams/processor.js +2 -2
  80. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +2 -2
  81. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +1 -1
  82. package/packages/dd-trace/src/debugger/devtools_client/state.js +2 -1
  83. package/packages/dd-trace/src/debugger/index.js +7 -7
  84. package/packages/dd-trace/src/dogstatsd.js +2 -2
  85. package/packages/dd-trace/src/encode/0.4.js +45 -54
  86. package/packages/dd-trace/src/encode/0.5.js +34 -3
  87. package/packages/dd-trace/src/encode/agentless-json.js +1 -1
  88. package/packages/dd-trace/src/exporter.js +2 -0
  89. package/packages/dd-trace/src/exporters/agent/index.js +2 -1
  90. package/packages/dd-trace/src/exporters/agentless/index.js +3 -2
  91. package/packages/dd-trace/src/exporters/agentless/writer.js +2 -2
  92. package/packages/dd-trace/src/exporters/common/buffering-exporter.js +2 -1
  93. package/packages/dd-trace/src/exporters/common/request.js +1 -1
  94. package/packages/dd-trace/src/exporters/electron/index.js +49 -0
  95. package/packages/dd-trace/src/external-logger/src/index.js +2 -1
  96. package/packages/dd-trace/src/git_metadata.js +10 -8
  97. package/packages/dd-trace/src/lambda/handler-paths.js +52 -0
  98. package/packages/dd-trace/src/lambda/index.js +62 -14
  99. package/packages/dd-trace/src/lambda/runtime/patch.js +21 -46
  100. package/packages/dd-trace/src/llmobs/index.js +13 -2
  101. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +45 -15
  102. package/packages/dd-trace/src/llmobs/writers/base.js +2 -1
  103. package/packages/dd-trace/src/openfeature/writers/base.js +2 -1
  104. package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +2 -1
  105. package/packages/dd-trace/src/opentracing/propagation/text_map.js +20 -9
  106. package/packages/dd-trace/src/payload-tagging/config/index.js +2 -2
  107. package/packages/dd-trace/src/plugins/ci_plugin.js +49 -4
  108. package/packages/dd-trace/src/plugins/database.js +54 -12
  109. package/packages/dd-trace/src/plugins/index.js +1 -0
  110. package/packages/dd-trace/src/plugins/plugin.js +2 -4
  111. package/packages/dd-trace/src/plugins/util/ci.js +8 -8
  112. package/packages/dd-trace/src/plugins/util/git-cache.js +20 -18
  113. package/packages/dd-trace/src/plugins/util/stacktrace.js +2 -2
  114. package/packages/dd-trace/src/plugins/util/test.js +37 -5
  115. package/packages/dd-trace/src/plugins/util/user-provided-git.js +17 -15
  116. package/packages/dd-trace/src/priority_sampler.js +1 -1
  117. package/packages/dd-trace/src/profiling/profiler.js +1 -1
  118. package/packages/dd-trace/src/profiling/profilers/wall.js +1 -1
  119. package/packages/dd-trace/src/profiling/ssi-heuristics.js +1 -1
  120. package/packages/dd-trace/src/rate_limiter.js +1 -1
  121. package/packages/dd-trace/src/remote_config/scheduler.js +1 -1
  122. package/packages/dd-trace/src/ritm.js +2 -1
  123. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +5 -8
  124. package/packages/dd-trace/src/serverless.js +5 -2
  125. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +20 -0
  126. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +4 -0
  127. package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +20 -0
  128. package/packages/dd-trace/src/service-naming/schemas/v1/web.js +4 -0
  129. package/packages/dd-trace/src/span_stats.js +1 -1
  130. package/packages/dd-trace/src/telemetry/dependencies.js +1 -1
  131. package/packages/dd-trace/src/telemetry/endpoints.js +1 -1
  132. package/packages/dd-trace/src/telemetry/telemetry.js +2 -2
  133. 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 name = command[0]
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
- const { url, connectionName } = instanceInfo.get(client) || {}
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
- connectionOptions: client.connection_options || client.connection_option || client.connectionOption || url,
147
- connectionName,
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
- return shimmer.wrapFunction(callback, callback => function (err) {
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 { getValueFromEnvSources } = require('../../dd-trace/src/config/helper')
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
- const tags = {
251
- 'aws.response.request_id': response.requestId,
252
- 'resource.name': operation,
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
- span.addTags(tags)
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
- switch (typeof specificConfig) {
318
- case 'undefined':
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
- // check if AWS batch propagation or AWS_[SERVICE] batch propagation is enabled via env variable
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 batchPropagationEnabled = isTrue(
329
- specificConfig.batchPropagationEnabled ??
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}`,
@@ -7,7 +7,7 @@ class Lambda extends BaseAwsSdkPlugin {
7
7
  static id = 'lambda'
8
8
 
9
9
  generateTags (params, operation, response) {
10
- if (!params?.FunctionName) return {}
10
+ if (!params?.FunctionName) return
11
11
 
12
12
  return {
13
13
  'resource.name': `${operation} ${params.FunctionName}`,
@@ -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}`,
@@ -11,7 +11,7 @@ class S3 extends BaseAwsSdkPlugin {
11
11
  static isPayloadReporter = true
12
12
 
13
13
  generateTags (params, operation, response) {
14
- if (!params?.Bucket) return {}
14
+ if (!params?.Bucket) return
15
15
 
16
16
  return {
17
17
  'resource.name': `${operation} ${params.Bucket}`,
@@ -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
- addBinds (func, start) {
11
- this.addBind(`apm:couchbase:${func}:start`, start)
12
- this.addSub(`apm:couchbase:${func}:error`, ({ error }) => this.addError(error))
13
- this.addSub(`apm:couchbase:${func}:finish`, ctx => this.finish(ctx))
14
- this.addBind(`apm:couchbase:${func}:callback:start`, callbackStart)
15
- this.addBind(`apm:couchbase:${func}:callback:finish`, callbackFinish)
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 tag in customTags) {
31
- tags[tag] = customTags[tag]
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
- constructor (...args) {
45
- super(...args)
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
- this.startSpan(name, {}, { bucket, collection, seedNodes }, ctx)
80
- return ctx.currentStore
81
- })
82
- }
80
+ function finishSpan (ctx) {
81
+ ctx.currentStore?.span?.finish()
83
82
  }
84
83
 
85
- function callbackStart (ctx) {
86
- ctx.parentStore = storage('legacy').getStore()
87
- return ctx.parentStore
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 callbackFinish (ctx) {
91
- return ctx.parentStore
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' })