dd-trace 5.55.0 → 5.57.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 (150) hide show
  1. package/LICENSE-3rdparty.csv +1 -0
  2. package/index.d.ts +44 -2
  3. package/init.js +4 -1
  4. package/package.json +24 -23
  5. package/packages/datadog-core/src/utils/src/set.js +8 -10
  6. package/packages/datadog-esbuild/index.js +22 -0
  7. package/packages/datadog-instrumentations/src/cassandra-driver.js +43 -60
  8. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +12 -12
  9. package/packages/datadog-instrumentations/src/cucumber.js +4 -6
  10. package/packages/datadog-instrumentations/src/elasticsearch.js +16 -19
  11. package/packages/datadog-instrumentations/src/fastify.js +91 -9
  12. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +20 -5
  13. package/packages/datadog-instrumentations/src/helpers/check-require-cache.js +2 -2
  14. package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -0
  15. package/packages/datadog-instrumentations/src/helpers/register.js +17 -5
  16. package/packages/datadog-instrumentations/src/ioredis.js +8 -13
  17. package/packages/datadog-instrumentations/src/iovalkey.js +10 -14
  18. package/packages/datadog-instrumentations/src/jest.js +423 -325
  19. package/packages/datadog-instrumentations/src/memcached.js +17 -24
  20. package/packages/datadog-instrumentations/src/mocha/main.js +7 -6
  21. package/packages/datadog-instrumentations/src/moleculer/client.js +9 -10
  22. package/packages/datadog-instrumentations/src/moleculer/server.js +12 -13
  23. package/packages/datadog-instrumentations/src/openai.js +30 -2
  24. package/packages/datadog-instrumentations/src/playwright.js +4 -1
  25. package/packages/datadog-instrumentations/src/prisma.js +116 -0
  26. package/packages/datadog-instrumentations/src/redis.js +32 -43
  27. package/packages/datadog-instrumentations/src/router.js +1 -1
  28. package/packages/datadog-instrumentations/src/sharedb.js +10 -16
  29. package/packages/datadog-instrumentations/src/vitest.js +4 -4
  30. package/packages/datadog-plugin-aws-sdk/src/base.js +6 -1
  31. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +9 -4
  32. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +3 -2
  33. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +2 -1
  34. package/packages/datadog-plugin-aws-sdk/src/util.js +2 -2
  35. package/packages/datadog-plugin-azure-functions/src/index.js +5 -4
  36. package/packages/datadog-plugin-bunyan/src/index.js +2 -2
  37. package/packages/datadog-plugin-cassandra-driver/src/index.js +6 -2
  38. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/batch-consumer.js +1 -1
  39. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/consumer.js +1 -1
  40. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/index.js +1 -1
  41. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/producer.js +1 -1
  42. package/packages/datadog-plugin-cucumber/src/index.js +4 -2
  43. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +9 -5
  44. package/packages/datadog-plugin-elasticsearch/src/index.js +12 -4
  45. package/packages/datadog-plugin-http/src/client.js +1 -0
  46. package/packages/datadog-plugin-http/src/server.js +2 -1
  47. package/packages/datadog-plugin-http2/src/client.js +1 -0
  48. package/packages/datadog-plugin-http2/src/server.js +1 -0
  49. package/packages/datadog-plugin-jest/src/index.js +4 -3
  50. package/packages/datadog-plugin-memcached/src/index.js +6 -2
  51. package/packages/datadog-plugin-mocha/src/index.js +3 -2
  52. package/packages/datadog-plugin-moleculer/src/client.js +15 -9
  53. package/packages/datadog-plugin-moleculer/src/server.js +9 -5
  54. package/packages/datadog-plugin-next/src/index.js +2 -1
  55. package/packages/datadog-plugin-openai/src/tracing.js +127 -80
  56. package/packages/datadog-plugin-oracledb/src/index.js +2 -1
  57. package/packages/datadog-plugin-pino/src/index.js +2 -2
  58. package/packages/datadog-plugin-prisma/src/client.js +62 -0
  59. package/packages/datadog-plugin-prisma/src/engine.js +81 -0
  60. package/packages/datadog-plugin-prisma/src/index.js +22 -0
  61. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +1 -1
  62. package/packages/datadog-plugin-redis/src/index.js +9 -3
  63. package/packages/datadog-plugin-router/src/index.js +1 -0
  64. package/packages/datadog-plugin-sharedb/src/index.js +13 -5
  65. package/packages/datadog-plugin-winston/src/index.js +2 -2
  66. package/packages/dd-trace/src/appsec/channels.js +26 -21
  67. package/packages/dd-trace/src/appsec/iast/analyzers/sql-injection-analyzer.js +1 -1
  68. package/packages/dd-trace/src/appsec/iast/analyzers/unvalidated-redirect-analyzer.js +13 -20
  69. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +1 -1
  70. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +44 -1
  71. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +2 -1
  72. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +7 -2
  73. package/packages/dd-trace/src/appsec/iast/taint-tracking/source-types.js +0 -1
  74. package/packages/dd-trace/src/appsec/index.js +28 -2
  75. package/packages/dd-trace/src/appsec/rasp/utils.js +0 -5
  76. package/packages/dd-trace/src/appsec/reporter.js +6 -4
  77. package/packages/dd-trace/src/baggage.js +2 -2
  78. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +3 -3
  79. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
  80. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
  81. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
  82. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +2 -2
  83. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +6 -6
  84. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -3
  85. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +3 -3
  86. package/packages/dd-trace/src/config.js +334 -312
  87. package/packages/dd-trace/src/constants.js +2 -1
  88. package/packages/dd-trace/src/crashtracking/crashtracker.js +12 -14
  89. package/packages/dd-trace/src/datastreams/context.js +1 -1
  90. package/packages/dd-trace/src/datastreams/processor.js +1 -1
  91. package/packages/dd-trace/src/datastreams/writer.js +3 -3
  92. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +6 -3
  93. package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -1
  94. package/packages/dd-trace/src/debugger/devtools_client/index.js +2 -3
  95. package/packages/dd-trace/src/debugger/devtools_client/send.js +5 -1
  96. package/packages/dd-trace/src/debugger/devtools_client/state.js +7 -4
  97. package/packages/dd-trace/src/debugger/devtools_client/status.js +5 -1
  98. package/packages/dd-trace/src/dogstatsd.js +3 -3
  99. package/packages/dd-trace/src/exporters/agent/index.js +10 -5
  100. package/packages/dd-trace/src/exporters/agent/writer.js +4 -2
  101. package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +2 -2
  102. package/packages/dd-trace/src/exporters/log/index.js +1 -1
  103. package/packages/dd-trace/src/exporters/span-stats/writer.js +2 -2
  104. package/packages/dd-trace/src/guardrails/index.js +3 -1
  105. package/packages/dd-trace/src/guardrails/telemetry.js +1 -1
  106. package/packages/dd-trace/src/llmobs/index.js +11 -5
  107. package/packages/dd-trace/src/llmobs/plugins/base.js +2 -2
  108. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +1 -1
  109. package/packages/dd-trace/src/llmobs/tagger.js +13 -13
  110. package/packages/dd-trace/src/llmobs/writers/base.js +2 -2
  111. package/packages/dd-trace/src/llmobs/writers/spans.js +2 -2
  112. package/packages/dd-trace/src/opentelemetry/tracer.js +1 -1
  113. package/packages/dd-trace/src/opentracing/propagation/text_map.js +22 -28
  114. package/packages/dd-trace/src/opentracing/span.js +1 -0
  115. package/packages/dd-trace/src/plugin_manager.js +3 -3
  116. package/packages/dd-trace/src/plugins/cache.js +2 -2
  117. package/packages/dd-trace/src/plugins/ci_plugin.js +11 -7
  118. package/packages/dd-trace/src/plugins/database.js +3 -1
  119. package/packages/dd-trace/src/plugins/index.js +1 -0
  120. package/packages/dd-trace/src/plugins/log_plugin.js +5 -1
  121. package/packages/dd-trace/src/plugins/outbound.js +8 -6
  122. package/packages/dd-trace/src/plugins/structured_log_plugin.js +9 -0
  123. package/packages/dd-trace/src/plugins/tracing.js +1 -1
  124. package/packages/dd-trace/src/plugins/util/ci.js +83 -30
  125. package/packages/dd-trace/src/plugins/util/git.js +1 -0
  126. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +3 -2
  127. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -0
  128. package/packages/dd-trace/src/plugins/util/tags.js +4 -1
  129. package/packages/dd-trace/src/plugins/util/test.js +80 -10
  130. package/packages/dd-trace/src/plugins/util/web.js +1 -0
  131. package/packages/dd-trace/src/profiler.js +0 -2
  132. package/packages/dd-trace/src/profiling/exporter_cli.js +1 -3
  133. package/packages/dd-trace/src/profiling/profilers/events.js +10 -2
  134. package/packages/dd-trace/src/profiling/ssi-heuristics.js +18 -126
  135. package/packages/dd-trace/src/proxy.js +12 -27
  136. package/packages/dd-trace/src/runtime_metrics/index.js +1 -1
  137. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +14 -45
  138. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +2 -2
  139. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +4 -0
  140. package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +2 -2
  141. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +4 -0
  142. package/packages/dd-trace/src/supported-configurations.json +13 -3
  143. package/packages/dd-trace/src/telemetry/telemetry.js +11 -4
  144. package/packages/dd-trace/src/tracer.js +11 -0
  145. package/packages/dd-trace/src/tracer_metadata.js +25 -0
  146. package/packages/dd-trace/src/util.js +11 -4
  147. package/version.js +3 -1
  148. package/packages/datadog-core/src/utils/src/get.js +0 -11
  149. package/packages/datadog-core/src/utils/src/has.js +0 -14
  150. package/packages/dd-trace/src/profiling/ssi-telemetry-mock-profiler.js +0 -30
@@ -6,8 +6,14 @@ const { addHook, channel, AsyncResource } = require('./helpers/instrument')
6
6
  const errorChannel = channel('apm:fastify:middleware:error')
7
7
  const handleChannel = channel('apm:fastify:request:handle')
8
8
  const routeAddedChannel = channel('apm:fastify:route:added')
9
+ const bodyParserReadCh = channel('datadog:fastify:body-parser:finish')
10
+ const queryParamsReadCh = channel('datadog:fastify:query-params:finish')
11
+ const cookieParserReadCh = channel('datadog:fastify-cookie:read:finish')
12
+ const responsePayloadReadCh = channel('datadog:fastify:response:finish')
13
+ const pathParamsReadCh = channel('datadog:fastify:path-params:finish')
9
14
 
10
15
  const parsingResources = new WeakMap()
16
+ const cookiesPublished = new WeakSet()
11
17
 
12
18
  function wrapFastify (fastify, hasParsingEvents) {
13
19
  if (typeof fastify !== 'function') return fastify
@@ -45,26 +51,46 @@ function wrapAddHook (addHook) {
45
51
  const req = getReq(request)
46
52
 
47
53
  try {
48
- if (typeof done === 'function') {
49
- done = arguments[arguments.length - 1]
54
+ // done callback is always the last argument
55
+ const doneCallback = arguments[arguments.length - 1]
50
56
 
57
+ if (typeof doneCallback === 'function') {
51
58
  arguments[arguments.length - 1] = function (err) {
52
59
  publishError(err, req)
53
60
 
61
+ const hasCookies = request.cookies && Object.keys(request.cookies).length > 0
62
+
63
+ if (cookieParserReadCh.hasSubscribers && hasCookies && !cookiesPublished.has(req)) {
64
+ const res = getRes(reply)
65
+ const abortController = new AbortController()
66
+
67
+ cookieParserReadCh.publish({
68
+ req,
69
+ res,
70
+ abortController,
71
+ cookies: request.cookies
72
+ })
73
+
74
+ cookiesPublished.add(req)
75
+
76
+ if (abortController.signal.aborted) return
77
+ }
78
+
54
79
  if (name === 'onRequest' || name === 'preParsing') {
55
80
  const parsingResource = new AsyncResource('bound-anonymous-fn')
56
81
 
57
82
  parsingResources.set(req, parsingResource)
58
83
 
59
84
  return parsingResource.runInAsyncScope(() => {
60
- return done.apply(this, arguments)
85
+ return doneCallback.apply(this, arguments)
61
86
  })
62
87
  }
63
- return done.apply(this, arguments)
88
+ return doneCallback.apply(this, arguments)
64
89
  }
65
90
 
66
91
  return fn.apply(this, arguments)
67
92
  }
93
+
68
94
  const promise = fn.apply(this, arguments)
69
95
 
70
96
  if (promise && typeof promise.catch === 'function') {
@@ -106,11 +132,52 @@ function preHandler (request, reply, done) {
106
132
 
107
133
  function preValidation (request, reply, done) {
108
134
  const req = getReq(request)
135
+ const res = getRes(reply)
109
136
  const parsingResource = parsingResources.get(req)
110
137
 
111
- if (!parsingResource) return done()
138
+ const processInContext = () => {
139
+ let abortController
112
140
 
113
- parsingResource.runInAsyncScope(() => done())
141
+ if (queryParamsReadCh.hasSubscribers && request.query) {
142
+ abortController ??= new AbortController()
143
+
144
+ queryParamsReadCh.publish({
145
+ req,
146
+ res,
147
+ abortController,
148
+ query: request.query
149
+ })
150
+
151
+ if (abortController.signal.aborted) return
152
+ }
153
+
154
+ if (bodyParserReadCh.hasSubscribers && request.body) {
155
+ abortController ??= new AbortController()
156
+
157
+ bodyParserReadCh.publish({ req, res, body: request.body, abortController })
158
+
159
+ if (abortController.signal.aborted) return
160
+ }
161
+
162
+ if (pathParamsReadCh.hasSubscribers && request.params) {
163
+ abortController ??= new AbortController()
164
+
165
+ pathParamsReadCh.publish({
166
+ req,
167
+ res,
168
+ abortController,
169
+ params: request.params
170
+ })
171
+
172
+ if (abortController.signal.aborted) return
173
+ }
174
+
175
+ done()
176
+ }
177
+
178
+ if (!parsingResource) return processInContext()
179
+
180
+ parsingResource.runInAsyncScope(processInContext)
114
181
  }
115
182
 
116
183
  function preParsing (request, reply, payload, done) {
@@ -126,9 +193,12 @@ function preParsing (request, reply, payload, done) {
126
193
  }
127
194
 
128
195
  function wrapSend (send, req) {
129
- return function sendWithTrace (error) {
130
- if (error instanceof Error) {
131
- errorChannel.publish({ req, error })
196
+ return function sendWithTrace (payload) {
197
+ if (payload instanceof Error) {
198
+ errorChannel.publish({ req, error: payload })
199
+ } else if (canPublishResponsePayload(payload)) {
200
+ const res = getRes(this)
201
+ responsePayloadReadCh.publish({ req, res, body: payload })
132
202
  }
133
203
 
134
204
  return send.apply(this, arguments)
@@ -159,6 +229,18 @@ function onRoute (routeOptions) {
159
229
  routeAddedChannel.publish({ routeOptions, onRoute })
160
230
  }
161
231
 
232
+ // send() payload types: https://fastify.dev/docs/latest/Reference/Reply/#senddata
233
+ function canPublishResponsePayload (payload) {
234
+ return responsePayloadReadCh.hasSubscribers &&
235
+ payload &&
236
+ typeof payload === 'object' &&
237
+ typeof payload.pipe !== 'function' && // Node streams
238
+ typeof payload.body?.pipe !== 'function' && // Response with body stream
239
+ !Buffer.isBuffer(payload) && // Buffer
240
+ !(payload instanceof ArrayBuffer) && // ArrayBuffer
241
+ !ArrayBuffer.isView(payload) // TypedArray
242
+ }
243
+
162
244
  addHook({ name: 'fastify', versions: ['>=3'] }, fastify => {
163
245
  const wrapped = shimmer.wrapFunction(fastify, fastify => wrapFastify(fastify, true))
164
246
 
@@ -26,14 +26,29 @@ if (!dc.unsubscribe) {
26
26
  }
27
27
  }
28
28
 
29
- dc.subscribe(CHANNEL, (payload) => {
30
- try {
31
- hooks[payload.package]()
32
- } catch (err) {
29
+ function doHook (payload) {
30
+ const hook = hooks[payload.package]
31
+ if (!hook) {
33
32
  log.error('esbuild-wrapped %s missing in list of hooks', payload.package)
34
- throw err
33
+ return
34
+ }
35
+
36
+ const hookFn = hook.fn ?? hook
37
+ if (typeof hookFn !== 'function') {
38
+ log.error('esbuild-wrapped hook %s is not a function', payload.package)
39
+ return
35
40
  }
36
41
 
42
+ try {
43
+ hookFn()
44
+ } catch {
45
+ log.error('esbuild-wrapped %s hook failed', payload.package)
46
+ }
47
+ }
48
+
49
+ dc.subscribe(CHANNEL, (payload) => {
50
+ doHook(payload)
51
+
37
52
  if (!instrumentations[payload.package]) {
38
53
  log.error('esbuild-wrapped %s missing in list of instrumentations', payload.package)
39
54
  return
@@ -55,7 +55,7 @@ module.exports.checkForRequiredModules = function () {
55
55
  if (naughties.has(pkg)) continue
56
56
  if (!(pkg in packages)) continue
57
57
 
58
- warnings.push(`Warning: Package '${pkg}' was loaded before dd-trace! This may break instrumentation.`)
58
+ warnings.push(() => `Warning: Package '${pkg}' was loaded before dd-trace! This may break instrumentation.`)
59
59
 
60
60
  naughties.add(pkg)
61
61
  didWarn = true
@@ -87,7 +87,7 @@ module.exports.checkForPotentialConflicts = function () {
87
87
  if (naughties.has(pkg)) continue
88
88
  if (!potentialConflicts.has(pkg)) continue
89
89
 
90
- warnings.push(`Warning: Package '${pkg}' may cause conflicts with dd-trace.`)
90
+ warnings.push(() => `Warning: Package '${pkg}' may cause conflicts with dd-trace.`)
91
91
 
92
92
  naughties.add(pkg)
93
93
  didWarn = true
@@ -24,6 +24,7 @@ module.exports = {
24
24
  '@node-redis/client': () => require('../redis'),
25
25
  '@opensearch-project/opensearch': () => require('../opensearch'),
26
26
  '@opentelemetry/sdk-trace-node': () => require('../otel-sdk-trace'),
27
+ '@prisma/client': () => require('../prisma'),
27
28
  '@redis/client': () => require('../redis'),
28
29
  '@smithy/smithy-client': () => require('../aws-sdk'),
29
30
  '@vitest/runner': { esmFirst: true, fn: () => require('../vitest') },
@@ -9,6 +9,7 @@ const log = require('../../../dd-trace/src/log')
9
9
  const checkRequireCache = require('./check-require-cache')
10
10
  const telemetry = require('../../../dd-trace/src/guardrails/telemetry')
11
11
  const { isInServerlessEnvironment } = require('../../../dd-trace/src/serverless')
12
+ const { isFalse, isTrue, normalizePluginEnvName } = require('../../../dd-trace/src/util')
12
13
  const { getEnvironmentVariables } = require('../../../dd-trace/src/config-helper')
13
14
 
14
15
  const envs = getEnvironmentVariables()
@@ -22,16 +23,22 @@ const hooks = require('./hooks')
22
23
  const instrumentations = require('./instrumentations')
23
24
  const names = Object.keys(hooks)
24
25
  const pathSepExpr = new RegExp(`\\${path.sep}`, 'g')
26
+
25
27
  const disabledInstrumentations = new Set(
26
- DD_TRACE_DISABLED_INSTRUMENTATIONS ? DD_TRACE_DISABLED_INSTRUMENTATIONS.split(',') : []
28
+ DD_TRACE_DISABLED_INSTRUMENTATIONS?.split(',').map(name => normalizePluginEnvName(name, true)) ?? []
27
29
  )
30
+ const reenabledInstrumentations = new Set()
28
31
 
29
32
  // Check for DD_TRACE_<INTEGRATION>_ENABLED environment variables
30
33
  for (const [key, value] of Object.entries(envs)) {
31
34
  const match = key.match(/^DD_TRACE_(.+)_ENABLED$/)
32
- if (match && (value?.toLowerCase() === 'false' || value === '0')) {
33
- const integration = match[1].toLowerCase()
34
- disabledInstrumentations.add(integration)
35
+ if (match && value) {
36
+ const integration = normalizePluginEnvName(match[1], true)
37
+ if (isFalse(value)) {
38
+ disabledInstrumentations.add(integration)
39
+ } else if (isTrue(value)) {
40
+ reenabledInstrumentations.add(integration)
41
+ }
35
42
  }
36
43
  }
37
44
 
@@ -58,7 +65,8 @@ const allInstrumentations = {}
58
65
 
59
66
  // TODO: make this more efficient
60
67
  for (const packageName of names) {
61
- if (disabledInstrumentations.has(packageName)) continue
68
+ const normalizedPackageName = normalizePluginEnvName(packageName, true)
69
+ if (disabledInstrumentations.has(normalizedPackageName)) continue
62
70
 
63
71
  const hookOptions = {}
64
72
 
@@ -67,6 +75,10 @@ for (const packageName of names) {
67
75
  if (typeof hook === 'object') {
68
76
  if (hook.serverless === false && isInServerlessEnvironment()) continue
69
77
 
78
+ // some integrations are disabled by default, but can be enabled by setting
79
+ // the DD_TRACE_<INTEGRATION>_ENABLED environment variable to true
80
+ if (hook.disabled && !reenabledInstrumentations.has(normalizedPackageName)) continue
81
+
70
82
  hookOptions.internals = hook.esmFirst
71
83
  hook = hook.fn
72
84
  }
@@ -2,8 +2,7 @@
2
2
 
3
3
  const {
4
4
  channel,
5
- addHook,
6
- AsyncResource
5
+ addHook
7
6
  } = require('./helpers/instrument')
8
7
  const shimmer = require('../../datadog-shimmer')
9
8
 
@@ -22,14 +21,9 @@ addHook({ name: 'ioredis', versions: ['>=2'] }, Redis => {
22
21
  const db = options.db
23
22
  const connectionOptions = { host: options.host, port: options.port }
24
23
 
25
- const asyncResource = new AsyncResource('bound-anonymous-fn')
26
- return asyncResource.runInAsyncScope(() => {
27
- startCh.publish({ db, command: command.name, args: command.args, connectionOptions, connectionName })
28
-
29
- const onResolve = asyncResource.bind(() => finish(finishCh, errorCh))
30
- const onReject = asyncResource.bind(err => finish(finishCh, errorCh, err))
31
-
32
- command.promise.then(onResolve, onReject)
24
+ const ctx = { db, command: command.name, args: command.args, connectionOptions, connectionName }
25
+ return startCh.runStores(ctx, () => {
26
+ command.promise.then(() => finish(finishCh, errorCh, ctx), err => finish(finishCh, errorCh, ctx, err))
33
27
 
34
28
  try {
35
29
  return sendCommand.apply(this, arguments)
@@ -43,9 +37,10 @@ addHook({ name: 'ioredis', versions: ['>=2'] }, Redis => {
43
37
  return Redis
44
38
  })
45
39
 
46
- function finish (finishCh, errorCh, error) {
40
+ function finish (finishCh, errorCh, ctx, error) {
47
41
  if (error) {
48
- errorCh.publish(error)
42
+ ctx.error = error
43
+ errorCh.publish(ctx)
49
44
  }
50
- finishCh.publish()
45
+ finishCh.publish(ctx)
51
46
  }
@@ -2,8 +2,7 @@
2
2
 
3
3
  const {
4
4
  channel,
5
- addHook,
6
- AsyncResource
5
+ addHook
7
6
  } = require('./helpers/instrument')
8
7
  const shimmer = require('../../datadog-shimmer')
9
8
 
@@ -22,19 +21,15 @@ addHook({ name: 'iovalkey', versions: ['>=0.0.1'] }, Valkey => {
22
21
  const db = options.db
23
22
  const connectionOptions = { host: options.host, port: options.port }
24
23
 
25
- const asyncResource = new AsyncResource('bound-anonymous-fn')
26
- return asyncResource.runInAsyncScope(() => {
27
- startCh.publish({ db, command: command.name, args: command.args, connectionOptions, connectionName })
28
-
29
- const onResolve = asyncResource.bind(() => finishCh.publish())
30
- const onReject = asyncResource.bind(err => finish(finishCh, errorCh, err))
31
-
32
- command.promise.then(onResolve, onReject)
24
+ const ctx = { db, command: command.name, args: command.args, connectionOptions, connectionName }
25
+ return startCh.runStores(ctx, () => {
26
+ command.promise.then(() => finish(finishCh, errorCh, ctx), err => finish(finishCh, errorCh, ctx, err))
33
27
 
34
28
  try {
35
29
  return sendCommand.apply(this, arguments)
36
30
  } catch (err) {
37
- errorCh.publish(err)
31
+ ctx.error = err
32
+ errorCh.publish(ctx)
38
33
 
39
34
  throw err
40
35
  }
@@ -43,9 +38,10 @@ addHook({ name: 'iovalkey', versions: ['>=0.0.1'] }, Valkey => {
43
38
  return Valkey
44
39
  })
45
40
 
46
- function finish (finishCh, errorCh, error) {
41
+ function finish (finishCh, errorCh, ctx, error) {
47
42
  if (error) {
48
- errorCh.publish(error)
43
+ ctx.error = error
44
+ errorCh.publish(ctx)
49
45
  }
50
- finishCh.publish()
46
+ finishCh.publish(ctx)
51
47
  }