dd-trace 5.54.0 → 5.56.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 (191) hide show
  1. package/LICENSE-3rdparty.csv +1 -0
  2. package/ci/cypress/plugin.js +8 -0
  3. package/ci/cypress/polyfills.js +23 -0
  4. package/ci/init.js +8 -7
  5. package/initialize.mjs +2 -2
  6. package/package.json +10 -9
  7. package/packages/datadog-code-origin/index.js +22 -4
  8. package/packages/datadog-core/src/utils/src/kebabcase.js +3 -3
  9. package/packages/datadog-core/src/utils/src/set.js +8 -10
  10. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -6
  11. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +2 -3
  12. package/packages/datadog-instrumentations/src/cookie-parser.js +1 -1
  13. package/packages/datadog-instrumentations/src/couchbase.js +3 -6
  14. package/packages/datadog-instrumentations/src/cucumber.js +21 -28
  15. package/packages/datadog-instrumentations/src/dns.js +4 -4
  16. package/packages/datadog-instrumentations/src/elasticsearch.js +9 -10
  17. package/packages/datadog-instrumentations/src/fastify.js +7 -9
  18. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +14 -16
  19. package/packages/datadog-instrumentations/src/hapi.js +10 -11
  20. package/packages/datadog-instrumentations/src/helpers/fetch.js +4 -5
  21. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -2
  22. package/packages/datadog-instrumentations/src/helpers/register.js +6 -5
  23. package/packages/datadog-instrumentations/src/jest.js +421 -376
  24. package/packages/datadog-instrumentations/src/koa.js +2 -3
  25. package/packages/datadog-instrumentations/src/mariadb.js +11 -4
  26. package/packages/datadog-instrumentations/src/mocha/main.js +79 -75
  27. package/packages/datadog-instrumentations/src/mocha.js +3 -1
  28. package/packages/datadog-instrumentations/src/mysql.js +11 -2
  29. package/packages/datadog-instrumentations/src/nyc.js +2 -1
  30. package/packages/datadog-instrumentations/src/openai.js +2 -2
  31. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +4 -3
  32. package/packages/datadog-instrumentations/src/pg.js +2 -3
  33. package/packages/datadog-instrumentations/src/playwright.js +19 -22
  34. package/packages/datadog-instrumentations/src/protobufjs.js +3 -4
  35. package/packages/datadog-instrumentations/src/redis.js +1 -1
  36. package/packages/datadog-instrumentations/src/restify.js +9 -13
  37. package/packages/datadog-instrumentations/src/router.js +12 -11
  38. package/packages/datadog-instrumentations/src/tedious.js +1 -2
  39. package/packages/datadog-instrumentations/src/vitest.js +15 -29
  40. package/packages/datadog-plugin-avsc/src/schema_iterator.js +12 -12
  41. package/packages/datadog-plugin-aws-sdk/src/base.js +12 -8
  42. package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +3 -5
  43. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +12 -20
  44. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +4 -5
  45. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +3 -5
  46. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +3 -5
  47. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +3 -5
  48. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -2
  49. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +7 -10
  50. package/packages/datadog-plugin-azure-functions/src/index.js +5 -4
  51. package/packages/datadog-plugin-cucumber/src/index.js +3 -2
  52. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +2 -1
  53. package/packages/datadog-plugin-dd-trace-api/src/index.js +2 -1
  54. package/packages/datadog-plugin-elasticsearch/src/index.js +1 -1
  55. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +1 -1
  56. package/packages/datadog-plugin-graphql/src/index.js +3 -2
  57. package/packages/datadog-plugin-graphql/src/resolve.js +17 -10
  58. package/packages/datadog-plugin-http/src/client.js +5 -6
  59. package/packages/datadog-plugin-http2/src/client.js +7 -8
  60. package/packages/datadog-plugin-jest/src/index.js +3 -2
  61. package/packages/datadog-plugin-mocha/src/index.js +6 -1
  62. package/packages/datadog-plugin-mongodb-core/src/index.js +2 -1
  63. package/packages/datadog-plugin-mysql/src/index.js +11 -0
  64. package/packages/datadog-plugin-next/src/index.js +1 -1
  65. package/packages/datadog-plugin-openai/src/tracing.js +2 -4
  66. package/packages/datadog-plugin-oracledb/src/index.js +2 -1
  67. package/packages/datadog-plugin-playwright/src/index.js +3 -2
  68. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +8 -9
  69. package/packages/datadog-plugin-redis/src/index.js +1 -3
  70. package/packages/datadog-plugin-vitest/src/index.js +5 -4
  71. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +0 -1
  72. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +0 -1
  73. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +0 -1
  74. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +0 -1
  75. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +1 -2
  76. package/packages/dd-trace/src/appsec/iast/analyzers/sql-injection-analyzer.js +1 -1
  77. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +12 -13
  78. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +44 -1
  79. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +2 -1
  80. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +8 -3
  81. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +2 -1
  82. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +1 -1
  83. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -2
  84. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/range-utils.js +10 -11
  85. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +0 -4
  86. package/packages/dd-trace/src/appsec/iast/vulnerabilities.js +0 -1
  87. package/packages/dd-trace/src/appsec/index.js +16 -5
  88. package/packages/dd-trace/src/appsec/reporter.js +11 -11
  89. package/packages/dd-trace/src/appsec/sdk/set_user.js +2 -2
  90. package/packages/dd-trace/src/appsec/sdk/track_event.js +3 -3
  91. package/packages/dd-trace/src/appsec/telemetry/index.js +31 -1
  92. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +6 -2
  93. package/packages/dd-trace/src/azure_metadata.js +8 -3
  94. package/packages/dd-trace/src/baggage.js +2 -2
  95. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +8 -7
  96. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +2 -1
  97. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +2 -1
  98. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +2 -1
  99. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +2 -1
  100. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +4 -3
  101. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +7 -6
  102. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -1
  103. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +4 -3
  104. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +4 -3
  105. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +2 -1
  106. package/packages/dd-trace/src/config-helper.js +89 -0
  107. package/packages/dd-trace/src/config.js +120 -115
  108. package/packages/dd-trace/src/config_stable.js +7 -4
  109. package/packages/dd-trace/src/datastreams/fnv.js +1 -1
  110. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +6 -6
  111. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +1 -2
  112. package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -2
  113. package/packages/dd-trace/src/debugger/devtools_client/index.js +2 -1
  114. package/packages/dd-trace/src/debugger/devtools_client/send.js +8 -3
  115. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +1 -2
  116. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +3 -4
  117. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +1 -1
  118. package/packages/dd-trace/src/debugger/devtools_client/status.js +5 -1
  119. package/packages/dd-trace/src/debugger/index.js +1 -0
  120. package/packages/dd-trace/src/dogstatsd.js +2 -2
  121. package/packages/dd-trace/src/encode/0.4.js +5 -2
  122. package/packages/dd-trace/src/encode/0.5.js +3 -5
  123. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +5 -5
  124. package/packages/dd-trace/src/exporter.js +2 -1
  125. package/packages/dd-trace/src/exporters/agent/writer.js +3 -1
  126. package/packages/dd-trace/src/exporters/common/docker.js +3 -2
  127. package/packages/dd-trace/src/exporters/common/request.js +4 -1
  128. package/packages/dd-trace/src/exporters/common/util.js +3 -1
  129. package/packages/dd-trace/src/id.js +3 -3
  130. package/packages/dd-trace/src/index.js +4 -3
  131. package/packages/dd-trace/src/lambda/handler.js +2 -1
  132. package/packages/dd-trace/src/lambda/index.js +2 -1
  133. package/packages/dd-trace/src/lambda/runtime/patch.js +3 -2
  134. package/packages/dd-trace/src/lambda/runtime/ritm.js +3 -2
  135. package/packages/dd-trace/src/llmobs/constants/tags.js +1 -0
  136. package/packages/dd-trace/src/llmobs/index.js +21 -5
  137. package/packages/dd-trace/src/llmobs/noop.js +18 -20
  138. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/index.js +11 -13
  139. package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -2
  140. package/packages/dd-trace/src/llmobs/sdk.js +2 -1
  141. package/packages/dd-trace/src/llmobs/span_processor.js +1 -1
  142. package/packages/dd-trace/src/llmobs/tagger.js +19 -6
  143. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  144. package/packages/dd-trace/src/log/index.js +5 -4
  145. package/packages/dd-trace/src/log/writer.js +1 -2
  146. package/packages/dd-trace/src/msgpack/encoder.js +3 -3
  147. package/packages/dd-trace/src/noop/span.js +1 -1
  148. package/packages/dd-trace/src/opentelemetry/tracer.js +1 -1
  149. package/packages/dd-trace/src/opentracing/propagation/log.js +4 -5
  150. package/packages/dd-trace/src/opentracing/propagation/text_map.js +35 -42
  151. package/packages/dd-trace/src/opentracing/span.js +7 -6
  152. package/packages/dd-trace/src/payload-tagging/config/index.js +17 -21
  153. package/packages/dd-trace/src/plugin_manager.js +4 -3
  154. package/packages/dd-trace/src/plugins/ci_plugin.js +25 -1
  155. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  156. package/packages/dd-trace/src/plugins/util/ci.js +7 -7
  157. package/packages/dd-trace/src/plugins/util/git.js +1 -1
  158. package/packages/dd-trace/src/plugins/util/llm.js +2 -2
  159. package/packages/dd-trace/src/plugins/util/stacktrace.js +8 -1
  160. package/packages/dd-trace/src/plugins/util/test.js +4 -3
  161. package/packages/dd-trace/src/plugins/util/user-provided-git.js +2 -1
  162. package/packages/dd-trace/src/plugins/util/web.js +3 -4
  163. package/packages/dd-trace/src/priority_sampler.js +46 -35
  164. package/packages/dd-trace/src/profiling/config.js +12 -32
  165. package/packages/dd-trace/src/profiling/exporter_cli.js +20 -20
  166. package/packages/dd-trace/src/profiling/exporters/agent.js +1 -1
  167. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +2 -1
  168. package/packages/dd-trace/src/profiling/index.js +2 -1
  169. package/packages/dd-trace/src/profiling/profiler.js +7 -4
  170. package/packages/dd-trace/src/profiling/profilers/events.js +10 -2
  171. package/packages/dd-trace/src/profiling/ssi-telemetry-mock-profiler.js +3 -1
  172. package/packages/dd-trace/src/profiling/tagger.js +22 -12
  173. package/packages/dd-trace/src/proxy.js +2 -1
  174. package/packages/dd-trace/src/ritm.js +4 -4
  175. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +3 -2
  176. package/packages/dd-trace/src/sampler.js +10 -2
  177. package/packages/dd-trace/src/serverless.js +11 -4
  178. package/packages/dd-trace/src/span_processor.js +2 -1
  179. package/packages/dd-trace/src/standalone/tracesource.js +1 -2
  180. package/packages/dd-trace/src/standalone/tracesource_priority_sampler.js +1 -2
  181. package/packages/dd-trace/src/startup-log.js +5 -17
  182. package/packages/dd-trace/src/supported-configurations.json +440 -0
  183. package/packages/dd-trace/src/telemetry/dependencies.js +62 -57
  184. package/packages/dd-trace/src/telemetry/send-data.js +7 -6
  185. package/packages/dd-trace/src/telemetry/telemetry.js +16 -26
  186. package/packages/dd-trace/src/tracer.js +3 -7
  187. package/packages/dd-trace/src/util.js +0 -5
  188. package/packages/datadog-core/src/utils/src/get.js +0 -11
  189. package/packages/datadog-core/src/utils/src/has.js +0 -14
  190. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +0 -120
  191. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/header-sensitive-analyzer.js +0 -20
@@ -112,10 +112,9 @@ function wrapMiddleware (fn, layer) {
112
112
  throw err
113
113
  }
114
114
  )
115
- } else {
116
- fulfill(ctx)
117
- return result
118
115
  }
116
+ fulfill(ctx)
117
+ return result
119
118
  } catch (e) {
120
119
  fulfill(ctx, e)
121
120
  throw e
@@ -1,10 +1,12 @@
1
1
  'use strict'
2
2
 
3
- const { channel, addHook, AsyncResource } = require('./helpers/instrument')
3
+ const { channel, addHook } = require('./helpers/instrument')
4
4
 
5
5
  const shimmer = require('../../datadog-shimmer')
6
6
 
7
7
  const commandAddCh = channel('apm:mariadb:command:add')
8
+ const connectionStartCh = channel('apm:mariadb:connection:start')
9
+ const connectionFinishCh = channel('apm:mariadb:connection:finish')
8
10
  const startCh = channel('apm:mariadb:query:start')
9
11
  const finishCh = channel('apm:mariadb:query:finish')
10
12
  const errorCh = channel('apm:mariadb:query:error')
@@ -82,7 +84,7 @@ function createWrapQueryCallback (options) {
82
84
  const ctx = { sql, conf: options }
83
85
 
84
86
  if (typeof cb !== 'function') {
85
- arguments.length = arguments.length + 1
87
+ arguments.length += 1
86
88
  }
87
89
 
88
90
  arguments[arguments.length - 1] = shimmer.wrapFunction(cb, cb => function (err) {
@@ -135,8 +137,13 @@ function wrapPoolGetConnectionMethod (getConnection) {
135
137
  const cb = arguments[arguments.length - 1]
136
138
  if (typeof cb !== 'function') return getConnection.apply(this, arguments)
137
139
 
138
- const callbackResource = new AsyncResource('bound-anonymous-fn')
139
- arguments[arguments.length - 1] = callbackResource.bind(cb)
140
+ const ctx = {}
141
+
142
+ arguments[arguments.length - 1] = function () {
143
+ return connectionFinishCh.runStores(ctx, cb, this, ...arguments)
144
+ }
145
+
146
+ connectionStartCh.publish(ctx)
140
147
 
141
148
  return getConnection.apply(this, arguments)
142
149
  }
@@ -1,10 +1,11 @@
1
1
  'use strict'
2
2
 
3
3
  const { createCoverageMap } = require('istanbul-lib-coverage')
4
- const { addHook, channel, AsyncResource } = require('../helpers/instrument')
4
+ const { addHook, channel } = require('../helpers/instrument')
5
5
  const shimmer = require('../../../datadog-shimmer')
6
6
  const { isMarkedAsUnskippable } = require('../../../datadog-plugin-jest/src/util')
7
7
  const log = require('../../../dd-trace/src/log')
8
+ const { getEnvironmentVariable } = require('../../../dd-trace/src/config-helper')
8
9
  const {
9
10
  getTestSuitePath,
10
11
  MOCHA_WORKER_TRACE_PAYLOAD_CODE,
@@ -37,7 +38,6 @@ const {
37
38
 
38
39
  require('./common')
39
40
 
40
- const testSessionAsyncResource = new AsyncResource('bound-anonymous-fn')
41
41
  const patched = new WeakSet()
42
42
 
43
43
  const unskippableSuites = []
@@ -65,6 +65,8 @@ const testSuiteCodeCoverageCh = channel('ci:mocha:test-suite:code-coverage')
65
65
  const libraryConfigurationCh = channel('ci:mocha:library-configuration')
66
66
  const knownTestsCh = channel('ci:mocha:known-tests')
67
67
  const skippableSuitesCh = channel('ci:mocha:test-suite:skippable')
68
+ const mochaGlobalRunCh = channel('ci:mocha:global:run')
69
+
68
70
  const testManagementTestsCh = channel('ci:mocha:test-management-tests')
69
71
  const impactedTestsCh = channel('ci:mocha:modified-tests')
70
72
  const workerReportTraceCh = channel('ci:mocha:worker-report:trace')
@@ -100,18 +102,18 @@ function getFilteredSuites (originalSuites) {
100
102
  }
101
103
 
102
104
  function getOnStartHandler (isParallel, frameworkVersion) {
103
- return testSessionAsyncResource.bind(function () {
105
+ return function () {
104
106
  const processArgv = process.argv.slice(2).join(' ')
105
107
  const command = `mocha ${processArgv}`
106
108
  testSessionStartCh.publish({ command, frameworkVersion })
107
109
  if (!isParallel && skippedSuites.length) {
108
110
  itrSkippedSuitesCh.publish({ skippedSuites, frameworkVersion })
109
111
  }
110
- })
112
+ }
111
113
  }
112
114
 
113
115
  function getOnEndHandler (isParallel) {
114
- return testSessionAsyncResource.bind(function () {
116
+ return function () {
115
117
  let status = 'pass'
116
118
  let error
117
119
  if (this.stats) {
@@ -196,47 +198,12 @@ function getOnEndHandler (isParallel) {
196
198
  isTestManagementEnabled: config.isTestManagementTestsEnabled,
197
199
  isParallel
198
200
  })
199
- })
201
+ }
200
202
  }
201
203
 
202
204
  function getExecutionConfiguration (runner, isParallel, onFinishRequest) {
203
- const mochaRunAsyncResource = new AsyncResource('bound-anonymous-fn')
204
-
205
- const onReceivedTestManagementTests = ({ err, testManagementTests: receivedTestManagementTests }) => {
206
- if (err) {
207
- config.testManagementTests = {}
208
- config.isTestManagementTestsEnabled = false
209
- config.testManagementAttemptToFixRetries = 0
210
- } else {
211
- config.testManagementTests = receivedTestManagementTests
212
- }
213
- if (config.isImpactedTestsEnabled) {
214
- impactedTestsCh.publish({
215
- onDone: mochaRunAsyncResource.bind(onReceivedImpactedTests)
216
- })
217
- } else if (config.isSuitesSkippingEnabled) {
218
- skippableSuitesCh.publish({
219
- onDone: mochaRunAsyncResource.bind(onReceivedSkippableSuites)
220
- })
221
- } else {
222
- onFinishRequest()
223
- }
224
- }
225
-
226
- const onReceivedImpactedTests = ({ err, modifiedTests: receivedModifiedTests }) => {
227
- if (err) {
228
- config.modifiedTests = []
229
- config.isImpactedTestsEnabled = false
230
- } else {
231
- config.modifiedTests = receivedModifiedTests
232
- }
233
- if (config.isSuitesSkippingEnabled) {
234
- skippableSuitesCh.publish({
235
- onDone: mochaRunAsyncResource.bind(onReceivedSkippableSuites)
236
- })
237
- } else {
238
- onFinishRequest()
239
- }
205
+ const ctx = {
206
+ isParallel
240
207
  }
241
208
 
242
209
  const onReceivedSkippableSuites = ({ err, skippableSuites, itrCorrelationId: responseItrCorrelationId }) => {
@@ -260,7 +227,47 @@ function getExecutionConfiguration (runner, isParallel, onFinishRequest) {
260
227
 
261
228
  skippedSuites = [...filteredSuites.skippedSuites]
262
229
 
263
- onFinishRequest()
230
+ mochaGlobalRunCh.runStores(ctx, () => {
231
+ onFinishRequest()
232
+ })
233
+ }
234
+
235
+ const onReceivedImpactedTests = ({ err, modifiedTests: receivedModifiedTests }) => {
236
+ if (err) {
237
+ config.modifiedTests = []
238
+ config.isImpactedTestsEnabled = false
239
+ } else {
240
+ config.modifiedTests = receivedModifiedTests
241
+ }
242
+ if (config.isSuitesSkippingEnabled) {
243
+ ctx.onDone = onReceivedSkippableSuites
244
+ skippableSuitesCh.runStores(ctx, () => {})
245
+ } else {
246
+ mochaGlobalRunCh.runStores(ctx, () => {
247
+ onFinishRequest()
248
+ })
249
+ }
250
+ }
251
+
252
+ const onReceivedTestManagementTests = ({ err, testManagementTests: receivedTestManagementTests }) => {
253
+ if (err) {
254
+ config.testManagementTests = {}
255
+ config.isTestManagementTestsEnabled = false
256
+ config.testManagementAttemptToFixRetries = 0
257
+ } else {
258
+ config.testManagementTests = receivedTestManagementTests
259
+ }
260
+ if (config.isImpactedTestsEnabled) {
261
+ ctx.onDone = onReceivedImpactedTests
262
+ impactedTestsCh.runStores(ctx, () => {})
263
+ } else if (config.isSuitesSkippingEnabled) {
264
+ ctx.onDone = onReceivedSkippableSuites
265
+ skippableSuitesCh.runStores(ctx, () => {})
266
+ } else {
267
+ mochaGlobalRunCh.runStores(ctx, () => {
268
+ onFinishRequest()
269
+ })
270
+ }
264
271
  }
265
272
 
266
273
  const onReceivedKnownTests = ({ err, knownTests }) => {
@@ -272,27 +279,27 @@ function getExecutionConfiguration (runner, isParallel, onFinishRequest) {
272
279
  config.knownTests = knownTests
273
280
  }
274
281
  if (config.isTestManagementTestsEnabled) {
275
- testManagementTestsCh.publish({
276
- onDone: mochaRunAsyncResource.bind(onReceivedTestManagementTests)
277
- })
282
+ ctx.onDone = onReceivedTestManagementTests
283
+ testManagementTestsCh.runStores(ctx, () => {})
278
284
  } if (config.isImpactedTestsEnabled) {
279
- impactedTestsCh.publish({
280
- onDone: mochaRunAsyncResource.bind(onReceivedImpactedTests)
281
- })
285
+ ctx.onDone = onReceivedImpactedTests
286
+ impactedTestsCh.runStores(ctx, () => {})
282
287
  } else if (config.isSuitesSkippingEnabled) {
283
- skippableSuitesCh.publish({
284
- onDone: mochaRunAsyncResource.bind(onReceivedSkippableSuites)
285
- })
288
+ ctx.onDone = onReceivedSkippableSuites
289
+ skippableSuitesCh.runStores(ctx, () => {})
286
290
  } else {
287
- onFinishRequest()
291
+ mochaGlobalRunCh.runStores(ctx, () => {
292
+ onFinishRequest()
293
+ })
288
294
  }
289
295
  }
290
296
 
291
297
  const onReceivedConfiguration = ({ err, libraryConfig }) => {
292
298
  if (err || !skippableSuitesCh.hasSubscribers || !knownTestsCh.hasSubscribers) {
293
- return onFinishRequest()
299
+ return mochaGlobalRunCh.runStores(ctx, () => {
300
+ onFinishRequest()
301
+ })
294
302
  }
295
-
296
303
  config.isEarlyFlakeDetectionEnabled = libraryConfig.isEarlyFlakeDetectionEnabled
297
304
  config.earlyFlakeDetectionNumRetries = libraryConfig.earlyFlakeDetectionNumRetries
298
305
  config.earlyFlakeDetectionFaultyThreshold = libraryConfig.earlyFlakeDetectionFaultyThreshold
@@ -306,30 +313,27 @@ function getExecutionConfiguration (runner, isParallel, onFinishRequest) {
306
313
  config.flakyTestRetriesCount = !isParallel && libraryConfig.flakyTestRetriesCount
307
314
 
308
315
  if (config.isKnownTestsEnabled) {
309
- knownTestsCh.publish({
310
- onDone: mochaRunAsyncResource.bind(onReceivedKnownTests)
311
- })
316
+ ctx.onDone = onReceivedKnownTests
317
+ knownTestsCh.runStores(ctx, () => {})
312
318
  } else if (config.isTestManagementTestsEnabled) {
313
- testManagementTestsCh.publish({
314
- onDone: mochaRunAsyncResource.bind(onReceivedTestManagementTests)
315
- })
319
+ ctx.onDone = onReceivedTestManagementTests
320
+ testManagementTestsCh.runStores(ctx, () => {})
316
321
  } else if (config.isImpactedTestsEnabled) {
317
- impactedTestsCh.publish({
318
- onDone: mochaRunAsyncResource.bind(onReceivedImpactedTests)
319
- })
322
+ ctx.onDone = onReceivedImpactedTests
323
+ impactedTestsCh.runStores(ctx, () => {})
320
324
  } else if (config.isSuitesSkippingEnabled) {
321
- skippableSuitesCh.publish({
322
- onDone: mochaRunAsyncResource.bind(onReceivedSkippableSuites)
323
- })
325
+ ctx.onDone = onReceivedSkippableSuites
326
+ skippableSuitesCh.runStores(ctx, () => {})
324
327
  } else {
325
- onFinishRequest()
328
+ mochaGlobalRunCh.runStores(ctx, () => {
329
+ onFinishRequest()
330
+ })
326
331
  }
327
332
  }
328
333
 
329
- libraryConfigurationCh.publish({
330
- onDone: mochaRunAsyncResource.bind(onReceivedConfiguration),
331
- isParallel
332
- })
334
+ ctx.onDone = onReceivedConfiguration
335
+
336
+ libraryConfigurationCh.runStores(ctx, () => {})
333
337
  }
334
338
 
335
339
  // In this hook we delay the execution with options.delay to grab library configuration,
@@ -342,7 +346,7 @@ addHook({
342
346
  }, (Mocha) => {
343
347
  shimmer.wrap(Mocha.prototype, 'run', run => function () {
344
348
  // Workers do not need to request any data, just run the tests
345
- if (!testFinishCh.hasSubscribers || process.env.MOCHA_WORKER_ID || this.options.parallel) {
349
+ if (!testFinishCh.hasSubscribers || getEnvironmentVariable('MOCHA_WORKER_ID') || this.options.parallel) {
346
350
  return run.apply(this, arguments)
347
351
  }
348
352
 
@@ -517,7 +521,7 @@ addHook({
517
521
  if (ctx) {
518
522
  testSuiteFinishCh.publish({ status, ...ctx.currentStore }, () => {})
519
523
  } else {
520
- log.warn(() => `No AsyncResource found for suite ${suite.file}`)
524
+ log.warn(() => `No ctx found for suite ${suite.file}`)
521
525
  }
522
526
  })
523
527
 
@@ -1,4 +1,6 @@
1
- if (process.env.MOCHA_WORKER_ID) {
1
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
2
+
3
+ if (getEnvironmentVariable('MOCHA_WORKER_ID')) {
2
4
  require('./mocha/worker')
3
5
  } else {
4
6
  require('./mocha/main')
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const { channel, addHook, AsyncResource } = require('./helpers/instrument')
3
+ const { channel, addHook } = require('./helpers/instrument')
4
4
  const shimmer = require('../../datadog-shimmer')
5
5
 
6
6
  addHook({ name: 'mysql', file: 'lib/Connection.js', versions: ['>=2'] }, Connection => {
@@ -57,11 +57,20 @@ addHook({ name: 'mysql', file: 'lib/Connection.js', versions: ['>=2'] }, Connect
57
57
  })
58
58
 
59
59
  addHook({ name: 'mysql', file: 'lib/Pool.js', versions: ['>=2'] }, Pool => {
60
+ const connectionStartCh = channel('apm:mysql:connection:start')
61
+ const connectionFinishCh = channel('apm:mysql:connection:finish')
60
62
  const startPoolQueryCh = channel('datadog:mysql:pool:query:start')
61
63
  const finishPoolQueryCh = channel('datadog:mysql:pool:query:finish')
62
64
 
63
65
  shimmer.wrap(Pool.prototype, 'getConnection', getConnection => function (cb) {
64
- arguments[0] = AsyncResource.bind(cb)
66
+ arguments[0] = function () {
67
+ return connectionFinishCh.runStores(ctx, cb, this, ...arguments)
68
+ }
69
+
70
+ const ctx = {}
71
+
72
+ connectionStartCh.publish(ctx)
73
+
65
74
  return getConnection.apply(this, arguments)
66
75
  })
67
76
 
@@ -1,5 +1,6 @@
1
1
  const { addHook, channel } = require('./helpers/instrument')
2
2
  const shimmer = require('../../datadog-shimmer')
3
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
3
4
 
4
5
  const codeCoverageWrapCh = channel('ci:nyc:wrap')
5
6
 
@@ -11,7 +12,7 @@ addHook({
11
12
  shimmer.wrap(nycPackage.prototype, 'wrap', wrap => function () {
12
13
  // Only relevant if the config `all` is set to true
13
14
  try {
14
- if (JSON.parse(process.env.NYC_CONFIG).all) {
15
+ if (JSON.parse(getEnvironmentVariable('NYC_CONFIG')).all) {
15
16
  codeCoverageWrapCh.publish(this)
16
17
  }
17
18
  } catch {
@@ -187,12 +187,12 @@ function addStreamedChunk (content, chunk) {
187
187
  }
188
188
  }
189
189
 
190
- function convertBufferstoObjects (chunks = []) {
190
+ function convertBufferstoObjects (chunks) {
191
191
  return Buffer
192
192
  .concat(chunks) // combine the buffers
193
193
  .toString() // stringify
194
194
  .split(/(?=data:)/) // split on "data:"
195
- .map(chunk => chunk.replace(/\n/g, '').slice(6)) // remove newlines and 'data: ' from the front
195
+ .map(chunk => chunk.replaceAll('\n', '').slice(6)) // remove newlines and 'data: ' from the front
196
196
  .slice(0, -1) // remove the last [DONE] message
197
197
  .map(JSON.parse) // parse all of the returned objects
198
198
  }
@@ -3,10 +3,11 @@
3
3
  const { addHook } = require('./helpers/instrument')
4
4
  const shimmer = require('../../datadog-shimmer')
5
5
  const tracer = require('../../dd-trace')
6
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
6
7
 
7
- const otelSdkEnabled = process.env.DD_TRACE_OTEL_ENABLED ||
8
- process.env.OTEL_SDK_DISABLED
9
- ? !process.env.OTEL_SDK_DISABLED
8
+ const otelSdkEnabled = getEnvironmentVariable('DD_TRACE_OTEL_ENABLED') ||
9
+ getEnvironmentVariable('OTEL_SDK_DISABLED')
10
+ ? !getEnvironmentVariable('OTEL_SDK_DISABLED')
10
11
  : undefined
11
12
 
12
13
  if (otelSdkEnabled) {
@@ -178,9 +178,8 @@ function wrapPoolQuery (query) {
178
178
  cb(error)
179
179
 
180
180
  return
181
- } else {
182
- return Promise.reject(error)
183
181
  }
182
+ return Promise.reject(error)
184
183
  }
185
184
 
186
185
  if (typeof cb === 'function') {
@@ -192,7 +191,7 @@ function wrapPoolQuery (query) {
192
191
 
193
192
  const retval = query.apply(this, arguments)
194
193
 
195
- if (retval && retval.then) {
194
+ if (retval?.then) {
196
195
  retval.then(() => {
197
196
  finish()
198
197
  }).catch(() => {
@@ -1,6 +1,6 @@
1
1
  const satisfies = require('semifies')
2
2
 
3
- const { addHook, channel, AsyncResource } = require('./helpers/instrument')
3
+ const { addHook, channel } = require('./helpers/instrument')
4
4
  const shimmer = require('../../datadog-shimmer')
5
5
  const {
6
6
  parseAnnotations,
@@ -33,7 +33,6 @@ const testSuiteToCtx = new Map()
33
33
  const testSuiteToTestStatuses = new Map()
34
34
  const testSuiteToErrors = new Map()
35
35
  const testsToTestStatuses = new Map()
36
- const testSessionAsyncResource = new AsyncResource('bound-anonymous-fn')
37
36
 
38
37
  let applyRepeatEachIndex = null
39
38
 
@@ -109,7 +108,12 @@ function deepCloneSuite (suite, filterTest, tags = []) {
109
108
 
110
109
  function getTestsBySuiteFromTestGroups (testGroups) {
111
110
  return testGroups.reduce((acc, { requireFile, tests }) => {
112
- acc[requireFile] = acc[requireFile] ? acc[requireFile].concat(tests) : tests
111
+ if (acc[requireFile]) {
112
+ acc[requireFile].push(...tests)
113
+ } else {
114
+ // Copy the tests, otherwise we modify the original tests
115
+ acc[requireFile] = [...tests]
116
+ }
113
117
  return acc
114
118
  }, {})
115
119
  }
@@ -238,9 +242,7 @@ function getTestByTestId (dispatcher, testId) {
238
242
 
239
243
  function getChannelPromise (channelToPublishTo, params) {
240
244
  return new Promise(resolve => {
241
- testSessionAsyncResource.runInAsyncScope(() => {
242
- channelToPublishTo.publish({ onDone: resolve, ...params })
243
- })
245
+ channelToPublishTo.publish({ onDone: resolve, ...params })
244
246
  })
245
247
  }
246
248
 
@@ -417,7 +419,7 @@ function dispatcherRunWrapperNew (run) {
417
419
  // Not available from >=1.44.0
418
420
  this._ddAllTests = testGroups.flatMap(g => g.tests)
419
421
  }
420
- remainingTestsByFile = getTestsBySuiteFromTestGroups(arguments[0])
422
+ remainingTestsByFile = getTestsBySuiteFromTestGroups(testGroups)
421
423
  return run.apply(this, arguments)
422
424
  }
423
425
  }
@@ -511,9 +513,7 @@ function runnerHook (runnerExport, playwrightVersion) {
511
513
 
512
514
  const processArgv = process.argv.slice(2).join(' ')
513
515
  const command = `playwright ${processArgv}`
514
- testSessionAsyncResource.runInAsyncScope(() => {
515
- testSessionStartCh.publish({ command, frameworkVersion: playwrightVersion, rootDir })
516
- })
516
+ testSessionStartCh.publish({ command, frameworkVersion: playwrightVersion, rootDir })
517
517
 
518
518
  try {
519
519
  const { err, libraryConfig } = await getChannelPromise(libraryConfigurationCh)
@@ -630,13 +630,11 @@ function runnerHook (runnerExport, playwrightVersion) {
630
630
  const flushWait = new Promise(resolve => {
631
631
  onDone = resolve
632
632
  })
633
- testSessionAsyncResource.runInAsyncScope(() => {
634
- testSessionFinishCh.publish({
635
- status: STATUS_TO_TEST_STATUS[sessionStatus],
636
- isEarlyFlakeDetectionEnabled,
637
- isTestManagementTestsEnabled,
638
- onDone
639
- })
633
+ testSessionFinishCh.publish({
634
+ status: STATUS_TO_TEST_STATUS[sessionStatus],
635
+ isEarlyFlakeDetectionEnabled,
636
+ isTestManagementTestsEnabled,
637
+ onDone
640
638
  })
641
639
  await flushWait
642
640
 
@@ -754,8 +752,7 @@ addHook({
754
752
  }
755
753
 
756
754
  if (isImpactedTestsEnabled) {
757
- for (const test of allTests) {
758
- const isNew = isKnownTestsEnabled && isNewTest(test)
755
+ await Promise.all(allTests.map(async (test) => {
759
756
  const { isModified } = await getChannelPromise(isModifiedCh, {
760
757
  filePath: test._requireFile,
761
758
  modifiedTests
@@ -764,6 +761,7 @@ addHook({
764
761
  test._ddIsModified = true
765
762
  }
766
763
  if (isEarlyFlakeDetectionEnabled && test.expectedStatus !== 'skipped') {
764
+ const isNew = isKnownTestsEnabled && isNewTest(test)
767
765
  const fileSuite = getSuiteType(test, 'file')
768
766
  const projectSuite = getSuiteType(test, 'project')
769
767
  // If something change in the file, all tests in the file are impacted
@@ -778,7 +776,7 @@ addHook({
778
776
  projectSuite._addSuite(copyFileSuite)
779
777
  }
780
778
  }
781
- }
779
+ }))
782
780
  }
783
781
 
784
782
  if (isKnownTestsEnabled) {
@@ -939,9 +937,8 @@ addHook({
939
937
  if (window.DD_RUM && window.DD_RUM.stopSession) {
940
938
  window.DD_RUM.stopSession()
941
939
  return true
942
- } else {
943
- return false
944
940
  }
941
+ return false
945
942
  })
946
943
 
947
944
  if (isRumActive) {
@@ -102,11 +102,10 @@ addHook({
102
102
  wrapProtobufClasses(root)
103
103
  return root
104
104
  })
105
- } else {
106
- // If result is not a promise, directly wrap the protobuf classes
107
- wrapProtobufClasses(result)
108
- return result
109
105
  }
106
+ // If result is not a promise, directly wrap the protobuf classes
107
+ wrapProtobufClasses(result)
108
+ return result
110
109
  })
111
110
 
112
111
  shimmer.wrap(protobuf.Root.prototype, 'loadSync', original => function () {
@@ -45,7 +45,7 @@ function wrapCommandQueueClass (cls) {
45
45
  try {
46
46
  const parsed = new URL(createClientUrl)
47
47
  if (parsed) {
48
- this._url = { host: parsed.hostname, port: +parsed.port || 6379 }
48
+ this._url = { host: parsed.hostname, port: Number(parsed.port) || 6379 }
49
49
  }
50
50
  } catch {
51
51
  // ignore
@@ -20,25 +20,21 @@ function wrapSetupRequest (setupRequest) {
20
20
  }
21
21
 
22
22
  function wrapMethod (method) {
23
- return function (path, ...rest) {
24
- const middleware = wrapMiddleware(rest)
23
+ return function (path, ...middlewares) {
24
+ const wrappedMiddlewares = middlewares.map(wrapFn)
25
25
 
26
- return method.apply(this, [path].concat(middleware))
26
+ return method.apply(this, [path, ...wrappedMiddlewares])
27
27
  }
28
28
  }
29
29
 
30
30
  function wrapHandler (method) {
31
- return function () {
32
- return method.apply(this, wrapMiddleware(arguments))
31
+ return function (...middlewares) {
32
+ return method.apply(this, middlewares.map(wrapFn))
33
33
  }
34
34
  }
35
35
 
36
- function wrapMiddleware (middleware) {
37
- return Array.prototype.map.call(middleware, wrapFn)
38
- }
39
-
40
36
  function wrapFn (fn) {
41
- if (Array.isArray(fn)) return wrapMiddleware(fn)
37
+ if (Array.isArray(fn)) return fn.map(wrapFn)
42
38
 
43
39
  return shimmer.wrapFunction(fn, fn => function (req, res, next) {
44
40
  if (typeof next === 'function') {
@@ -51,11 +47,11 @@ function wrapFn (fn) {
51
47
 
52
48
  try {
53
49
  const result = fn.apply(this, arguments)
54
- if (result !== null && typeof result === 'object' && typeof result.then === 'function') {
55
- return result.then(function () {
50
+ if (typeof result?.then === 'function') {
51
+ return result.then(function (result) {
56
52
  nextChannel.publish({ req })
57
53
  finishChannel.publish({ req })
58
- return arguments[0]
54
+ return result
59
55
  }).catch(function (error) {
60
56
  errorChannel.publish({ req, error })
61
57
  nextChannel.publish({ req })
@@ -13,10 +13,6 @@ function isFastSlash (layer, matchers) {
13
13
  return layer.regexp?.fast_slash ?? matchers.some(matcher => matcher.path === '/')
14
14
  }
15
15
 
16
- function flatten (arr) {
17
- return arr.reduce((acc, val) => Array.isArray(val) ? acc.concat(flatten(val)) : acc.concat(val), [])
18
- }
19
-
20
16
  // TODO: Move this function to a shared file between Express and Router
21
17
  function createWrapRouterMethod (name) {
22
18
  const enterChannel = channel(`apm:${name}:middleware:enter`)
@@ -74,8 +70,8 @@ function createWrapRouterMethod (name) {
74
70
  })
75
71
  }
76
72
 
77
- function wrapStack (stack, offset, matchers) {
78
- [].concat(stack).slice(offset).forEach(layer => {
73
+ function wrapStack (layers, matchers) {
74
+ for (const layer of layers) {
79
75
  if (layer.__handle) { // express-async-errors
80
76
  layer.__handle = wrapLayerHandle(layer, layer.__handle)
81
77
  } else {
@@ -93,7 +89,7 @@ function createWrapRouterMethod (name) {
93
89
  layer.route[method] = wrapMethod(layer.route[method])
94
90
  })
95
91
  }
96
- })
92
+ }
97
93
  }
98
94
 
99
95
  function wrapNext (req, next) {
@@ -110,7 +106,7 @@ function createWrapRouterMethod (name) {
110
106
  }
111
107
 
112
108
  function extractMatchers (fn) {
113
- const arg = flatten([].concat(fn))
109
+ const arg = Array.isArray(fn) ? fn : [fn]
114
110
 
115
111
  if (typeof arg[0] === 'function') {
116
112
  return []
@@ -139,7 +135,10 @@ function createWrapRouterMethod (name) {
139
135
 
140
136
  function wrapMethod (original) {
141
137
  return shimmer.wrapFunction(original, original => function methodWithTrace (fn) {
142
- const offset = this.stack ? [].concat(this.stack).length : 0
138
+ let offset = 0
139
+ if (this.stack) {
140
+ offset = Array.isArray(this.stack) ? this.stack.length : 1
141
+ }
143
142
  const router = original.apply(this, arguments)
144
143
 
145
144
  if (typeof this.stack === 'function') {
@@ -150,7 +149,9 @@ function createWrapRouterMethod (name) {
150
149
  routeAddedChannel.publish({ topOfStackFunc: methodWithTrace, layer: this.stack[0] })
151
150
  }
152
151
 
153
- wrapStack(this.stack, offset, extractMatchers(fn))
152
+ if (this.stack.length > offset) {
153
+ wrapStack(this.stack.slice(offset), extractMatchers(fn))
154
+ }
154
155
 
155
156
  return router
156
157
  })
@@ -204,7 +205,7 @@ const visitedParams = new WeakSet()
204
205
 
205
206
  function wrapHandleRequest (original) {
206
207
  return function wrappedHandleRequest (req, res, next) {
207
- if (routerParamStartCh.hasSubscribers && Object.keys(req.params).length && !visitedParams.has(req.params)) {
208
+ if (routerParamStartCh.hasSubscribers && !visitedParams.has(req.params) && Object.keys(req.params).length) {
208
209
  visitedParams.add(req.params)
209
210
 
210
211
  const abortController = new AbortController()