dd-trace 5.100.0 → 5.102.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 (189) hide show
  1. package/index.d.ts +14 -0
  2. package/package.json +11 -9
  3. package/packages/datadog-instrumentations/src/aerospike.js +2 -2
  4. package/packages/datadog-instrumentations/src/ai.js +8 -8
  5. package/packages/datadog-instrumentations/src/amqplib.js +6 -7
  6. package/packages/datadog-instrumentations/src/anthropic.js +10 -10
  7. package/packages/datadog-instrumentations/src/apollo-server-core.js +3 -3
  8. package/packages/datadog-instrumentations/src/apollo-server.js +5 -5
  9. package/packages/datadog-instrumentations/src/avsc.js +6 -6
  10. package/packages/datadog-instrumentations/src/aws-sdk.js +151 -67
  11. package/packages/datadog-instrumentations/src/azure-durable-functions.js +8 -8
  12. package/packages/datadog-instrumentations/src/bluebird.js +2 -2
  13. package/packages/datadog-instrumentations/src/body-parser.js +2 -2
  14. package/packages/datadog-instrumentations/src/cassandra-driver.js +7 -7
  15. package/packages/datadog-instrumentations/src/child_process.js +12 -12
  16. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +9 -9
  17. package/packages/datadog-instrumentations/src/connect.js +7 -7
  18. package/packages/datadog-instrumentations/src/cookie-parser.js +4 -4
  19. package/packages/datadog-instrumentations/src/cookie.js +2 -2
  20. package/packages/datadog-instrumentations/src/couchbase.js +16 -30
  21. package/packages/datadog-instrumentations/src/crypto.js +4 -4
  22. package/packages/datadog-instrumentations/src/cucumber.js +77 -16
  23. package/packages/datadog-instrumentations/src/cypress.js +5 -3
  24. package/packages/datadog-instrumentations/src/dns.js +0 -3
  25. package/packages/datadog-instrumentations/src/elasticsearch.js +8 -11
  26. package/packages/datadog-instrumentations/src/express-mongo-sanitize.js +6 -6
  27. package/packages/datadog-instrumentations/src/express-session.js +4 -4
  28. package/packages/datadog-instrumentations/src/express.js +10 -11
  29. package/packages/datadog-instrumentations/src/fastify.js +2 -2
  30. package/packages/datadog-instrumentations/src/fs.js +14 -14
  31. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +5 -7
  32. package/packages/datadog-instrumentations/src/google-genai.js +4 -4
  33. package/packages/datadog-instrumentations/src/grpc/server.js +2 -2
  34. package/packages/datadog-instrumentations/src/hapi.js +2 -2
  35. package/packages/datadog-instrumentations/src/helpers/callback-instrumentor.js +8 -8
  36. package/packages/datadog-instrumentations/src/helpers/promise.js +2 -2
  37. package/packages/datadog-instrumentations/src/hono.js +2 -2
  38. package/packages/datadog-instrumentations/src/http/client.js +26 -9
  39. package/packages/datadog-instrumentations/src/http/server.js +9 -9
  40. package/packages/datadog-instrumentations/src/jest.js +93 -63
  41. package/packages/datadog-instrumentations/src/kafkajs.js +9 -9
  42. package/packages/datadog-instrumentations/src/knex.js +17 -17
  43. package/packages/datadog-instrumentations/src/koa.js +12 -12
  44. package/packages/datadog-instrumentations/src/ldapjs.js +5 -5
  45. package/packages/datadog-instrumentations/src/light-my-request.js +2 -2
  46. package/packages/datadog-instrumentations/src/limitd-client.js +4 -4
  47. package/packages/datadog-instrumentations/src/lodash.js +4 -4
  48. package/packages/datadog-instrumentations/src/mariadb.js +13 -13
  49. package/packages/datadog-instrumentations/src/memcached.js +2 -2
  50. package/packages/datadog-instrumentations/src/microgateway-core.js +2 -2
  51. package/packages/datadog-instrumentations/src/mocha/common.js +7 -4
  52. package/packages/datadog-instrumentations/src/mocha/main.js +37 -14
  53. package/packages/datadog-instrumentations/src/mocha/utils.js +133 -16
  54. package/packages/datadog-instrumentations/src/mocha/worker.js +12 -7
  55. package/packages/datadog-instrumentations/src/mongodb-core.js +9 -22
  56. package/packages/datadog-instrumentations/src/mongodb.js +5 -5
  57. package/packages/datadog-instrumentations/src/mongoose.js +21 -21
  58. package/packages/datadog-instrumentations/src/mquery.js +5 -5
  59. package/packages/datadog-instrumentations/src/multer.js +4 -4
  60. package/packages/datadog-instrumentations/src/mysql.js +16 -16
  61. package/packages/datadog-instrumentations/src/mysql2.js +4 -4
  62. package/packages/datadog-instrumentations/src/net.js +14 -8
  63. package/packages/datadog-instrumentations/src/nyc.js +5 -5
  64. package/packages/datadog-instrumentations/src/openai.js +19 -19
  65. package/packages/datadog-instrumentations/src/oracledb.js +6 -6
  66. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +11 -6
  67. package/packages/datadog-instrumentations/src/passport-utils.js +5 -5
  68. package/packages/datadog-instrumentations/src/pg.js +15 -15
  69. package/packages/datadog-instrumentations/src/pino.js +6 -10
  70. package/packages/datadog-instrumentations/src/playwright.js +20 -15
  71. package/packages/datadog-instrumentations/src/protobufjs.js +16 -16
  72. package/packages/datadog-instrumentations/src/redis.js +1 -2
  73. package/packages/datadog-instrumentations/src/restify.js +2 -2
  74. package/packages/datadog-instrumentations/src/router.js +12 -12
  75. package/packages/datadog-instrumentations/src/stripe.js +12 -12
  76. package/packages/datadog-instrumentations/src/vitest.js +107 -26
  77. package/packages/datadog-instrumentations/src/winston.js +4 -4
  78. package/packages/datadog-instrumentations/src/ws.js +7 -7
  79. package/packages/datadog-plugin-aws-sdk/src/base.js +52 -4
  80. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +19 -12
  81. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +45 -35
  82. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +33 -22
  83. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +12 -13
  84. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +73 -54
  85. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +19 -17
  86. package/packages/datadog-plugin-aws-sdk/src/util.js +22 -0
  87. package/packages/datadog-plugin-bullmq/src/consumer.js +2 -2
  88. package/packages/datadog-plugin-bullmq/src/producer.js +14 -20
  89. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +6 -6
  90. package/packages/datadog-plugin-cucumber/src/index.js +4 -0
  91. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +18 -4
  92. package/packages/datadog-plugin-cypress/src/plugin.js +5 -14
  93. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +1 -5
  94. package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +3 -1
  95. package/packages/datadog-plugin-http/src/client.js +1 -5
  96. package/packages/datadog-plugin-jest/src/util.js +1 -2
  97. package/packages/datadog-plugin-kafkajs/src/consumer.js +2 -9
  98. package/packages/datadog-plugin-kafkajs/src/producer.js +2 -8
  99. package/packages/datadog-plugin-mocha/src/index.js +4 -0
  100. package/packages/datadog-plugin-mongodb-core/src/index.js +2 -1
  101. package/packages/datadog-plugin-openai/src/tracing.js +12 -23
  102. package/packages/datadog-plugin-playwright/src/index.js +1 -1
  103. package/packages/datadog-plugin-vitest/src/index.js +8 -1
  104. package/packages/datadog-shimmer/src/shimmer.js +7 -1
  105. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +1 -1
  106. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +81 -81
  107. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +2 -2
  108. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +2 -2
  109. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +2 -2
  110. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  111. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +2 -0
  112. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +1 -3
  113. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +83 -48
  114. package/packages/dd-trace/src/appsec/index.js +21 -24
  115. package/packages/dd-trace/src/appsec/reporter.js +7 -2
  116. package/packages/dd-trace/src/appsec/rule_manager.js +4 -2
  117. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +31 -16
  118. package/packages/dd-trace/src/ci-visibility/lage.js +2 -1
  119. package/packages/dd-trace/src/ci-visibility/requests/request.js +11 -33
  120. package/packages/dd-trace/src/config/config-types.d.ts +0 -2
  121. package/packages/dd-trace/src/config/git_properties.js +2 -2
  122. package/packages/dd-trace/src/config/index.js +1 -55
  123. package/packages/dd-trace/src/datastreams/checkpointer.js +4 -10
  124. package/packages/dd-trace/src/datastreams/encoding.js +39 -28
  125. package/packages/dd-trace/src/datastreams/index.js +2 -1
  126. package/packages/dd-trace/src/datastreams/pathway.js +29 -26
  127. package/packages/dd-trace/src/datastreams/processor.js +18 -17
  128. package/packages/dd-trace/src/datastreams/size.js +6 -2
  129. package/packages/dd-trace/src/debugger/config.js +5 -2
  130. package/packages/dd-trace/src/debugger/devtools_client/index.js +2 -5
  131. package/packages/dd-trace/src/debugger/devtools_client/send.js +2 -1
  132. package/packages/dd-trace/src/debugger/devtools_client/snapshot-pruner.js +1 -0
  133. package/packages/dd-trace/src/dogstatsd.js +10 -7
  134. package/packages/dd-trace/src/encode/0.4.js +759 -234
  135. package/packages/dd-trace/src/encode/0.5.js +15 -9
  136. package/packages/dd-trace/src/encode/agentless-json.js +2 -2
  137. package/packages/dd-trace/src/encode/tags-processors.js +2 -27
  138. package/packages/dd-trace/src/exporters/common/request.js +22 -11
  139. package/packages/dd-trace/src/exporters/common/retry.js +104 -0
  140. package/packages/dd-trace/src/git_metadata.js +66 -0
  141. package/packages/dd-trace/src/git_metadata_tagger.js +13 -5
  142. package/packages/dd-trace/src/id.js +15 -26
  143. package/packages/dd-trace/src/llmobs/constants/tags.js +2 -0
  144. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +1 -2
  145. package/packages/dd-trace/src/llmobs/plugins/anthropic/index.js +27 -16
  146. package/packages/dd-trace/src/llmobs/plugins/anthropic/util.js +3 -0
  147. package/packages/dd-trace/src/llmobs/plugins/genai/util.js +33 -13
  148. package/packages/dd-trace/src/llmobs/plugins/openai/index.js +20 -50
  149. package/packages/dd-trace/src/llmobs/sdk.js +29 -27
  150. package/packages/dd-trace/src/llmobs/span_processor.js +52 -6
  151. package/packages/dd-trace/src/llmobs/tagger.js +42 -0
  152. package/packages/dd-trace/src/llmobs/telemetry.js +29 -0
  153. package/packages/dd-trace/src/llmobs/util.js +81 -5
  154. package/packages/dd-trace/src/msgpack/chunk.js +6 -3
  155. package/packages/dd-trace/src/openfeature/noop.js +40 -36
  156. package/packages/dd-trace/src/openfeature/writers/exposures.js +33 -52
  157. package/packages/dd-trace/src/opentelemetry/active-span-proxy.js +42 -0
  158. package/packages/dd-trace/src/opentelemetry/bridge-span-base.js +106 -0
  159. package/packages/dd-trace/src/opentelemetry/context_manager.js +11 -2
  160. package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +1 -2
  161. package/packages/dd-trace/src/opentelemetry/span-helpers.js +188 -50
  162. package/packages/dd-trace/src/opentelemetry/span.js +42 -80
  163. package/packages/dd-trace/src/opentelemetry/tracer.js +0 -22
  164. package/packages/dd-trace/src/opentracing/propagation/text_map.js +65 -27
  165. package/packages/dd-trace/src/opentracing/propagation/text_map_dsm.js +2 -11
  166. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +58 -22
  167. package/packages/dd-trace/src/opentracing/span.js +56 -48
  168. package/packages/dd-trace/src/opentracing/span_context.js +1 -0
  169. package/packages/dd-trace/src/plugins/util/ci.js +1 -1
  170. package/packages/dd-trace/src/plugins/util/git-cache.js +3 -5
  171. package/packages/dd-trace/src/plugins/util/test.js +19 -7
  172. package/packages/dd-trace/src/plugins/util/url.js +1 -3
  173. package/packages/dd-trace/src/plugins/util/user-provided-git.js +1 -1
  174. package/packages/dd-trace/src/plugins/util/web.js +5 -7
  175. package/packages/dd-trace/src/priority_sampler.js +6 -4
  176. package/packages/dd-trace/src/profiling/config.js +5 -4
  177. package/packages/dd-trace/src/profiling/profilers/events.js +3 -23
  178. package/packages/dd-trace/src/profiling/profilers/wall.js +4 -5
  179. package/packages/dd-trace/src/remote_config/index.js +5 -3
  180. package/packages/dd-trace/src/runtime_metrics/index.js +2 -2
  181. package/packages/dd-trace/src/scope.js +3 -10
  182. package/packages/dd-trace/src/serverless.js +1 -4
  183. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +7 -1
  184. package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +4 -0
  185. package/packages/dd-trace/src/span_format.js +52 -5
  186. package/packages/dd-trace/src/span_processor.js +0 -4
  187. package/packages/dd-trace/src/spanleak.js +0 -1
  188. package/packages/dd-trace/src/tracer.js +7 -7
  189. package/packages/dd-trace/src/util.js +17 -0
@@ -28,12 +28,12 @@ function wrapServer (server) {
28
28
  }
29
29
 
30
30
  function wrapStart (start) {
31
- return shimmer.wrapFunction(start, start => function () {
31
+ return shimmer.wrapFunction(start, start => function (...args) {
32
32
  if (this && typeof this.ext === 'function') {
33
33
  this.ext('onPreResponse', onPreResponse)
34
34
  }
35
35
 
36
- return start.apply(this, arguments)
36
+ return start.apply(this, args)
37
37
  })
38
38
  }
39
39
 
@@ -32,20 +32,20 @@ function createCallbackInstrumentor (prefix, { captureResult = false } = {}) {
32
32
 
33
33
  return function instrument (buildContext) {
34
34
  return function wrap (fn) {
35
- return function () {
36
- const lastIndex = arguments.length - 1
37
- const cb = arguments[lastIndex]
35
+ return function (...args) {
36
+ const lastIndex = args.length - 1
37
+ const cb = args[lastIndex]
38
38
  if (!startCh.hasSubscribers || typeof cb !== 'function') {
39
- return fn.apply(this, arguments)
39
+ return fn.apply(this, args)
40
40
  }
41
41
 
42
- const ctx = buildContext(this, arguments)
42
+ const ctx = buildContext(this, args)
43
43
  if (ctx === undefined) {
44
- return fn.apply(this, arguments)
44
+ return fn.apply(this, args)
45
45
  }
46
46
 
47
47
  return startCh.runStores(ctx, () => {
48
- arguments[lastIndex] = shimmer.wrapFunction(cb, cb => function (error, ...rest) {
48
+ args[lastIndex] = shimmer.wrapFunction(cb, cb => function (error, ...rest) {
49
49
  if (error) {
50
50
  ctx.error = error
51
51
  errorCh.publish(ctx)
@@ -57,7 +57,7 @@ function createCallbackInstrumentor (prefix, { captureResult = false } = {}) {
57
57
  })
58
58
 
59
59
  try {
60
- return fn.apply(this, arguments)
60
+ return fn.apply(this, args)
61
61
  } catch (error) {
62
62
  void error.stack // trigger getting the stack at the original throwing point
63
63
  ctx.error = error
@@ -21,9 +21,9 @@ exports.wrapThen = function wrapThen (origThen) {
21
21
  function wrapCallback (ar, callback) {
22
22
  if (typeof callback !== 'function') return callback
23
23
 
24
- return function () {
24
+ return function (...args) {
25
25
  return ar.runInAsyncScope(() => {
26
- return callback.apply(this, arguments)
26
+ return callback.apply(this, args)
27
27
  })
28
28
  }
29
29
  }
@@ -56,10 +56,10 @@ function wrapNext (req, route, next) {
56
56
  return shimmer.wrapFunction(
57
57
  next,
58
58
  (next) =>
59
- function () {
59
+ function (...args) {
60
60
  nextChannel.publish({ req, route })
61
61
 
62
- return next.apply(this, arguments)
62
+ return next.apply(this, args)
63
63
  }
64
64
  )
65
65
  }
@@ -26,10 +26,27 @@ function hookFn (http) {
26
26
  return http
27
27
  }
28
28
 
29
+ // `inputURL` may be the user's options object (for the `http.request(options)`
30
+ // shape); never write directly into it. The result is later mutated by
31
+ // `normalizeHeaders` and read by `url.format`, so the merged object must be
32
+ // owned by the tracer. `undefined` means "no URL supplied" — Node merges
33
+ // with the options object or its defaults, so build a tracer-owned
34
+ // options-only shape and let tracing proceed. `null`/primitive first args
35
+ // are returned as-is so `normalizeHeaders` throws and the surrounding
36
+ // try/catch in `instrumentRequest` falls through to the native request;
37
+ // spreading a primitive yields `{}`, which would silently turn an invalid
38
+ // `http.request(123)` into a synthesized localhost request.
29
39
  function combineOptions (inputURL, inputOptions) {
30
- return inputOptions !== null && typeof inputOptions === 'object'
31
- ? Object.assign(inputURL || {}, inputOptions)
32
- : inputURL
40
+ if (inputURL === undefined) {
41
+ return inputOptions !== null && typeof inputOptions === 'object' ? { ...inputOptions } : {}
42
+ }
43
+ if (inputURL === null || (typeof inputURL !== 'object' && typeof inputURL !== 'function')) {
44
+ return inputURL
45
+ }
46
+ if (inputOptions !== null && typeof inputOptions === 'object') {
47
+ return { ...inputURL, ...inputOptions }
48
+ }
49
+ return { ...inputURL }
33
50
  }
34
51
  function normalizeHeaders (options) {
35
52
  options.headers ??= {}
@@ -90,8 +107,8 @@ function setupResponseInstrumentation (ctx, res) {
90
107
  // For 'readable' events, wrap the read() method
91
108
  if (eventName === 'readable' && !originalRead && !dataListenerAdded && typeof res.read === 'function') {
92
109
  originalRead = res.read
93
- res.read = function () {
94
- const chunk = originalRead.apply(this, arguments)
110
+ res.read = function (...args) {
111
+ const chunk = originalRead.apply(this, args)
95
112
  if (!dataListenerAdded) {
96
113
  dataReadStarted = true
97
114
  collectChunk(chunk)
@@ -172,9 +189,9 @@ function patch (http, methodName) {
172
189
  let callback = args.callback
173
190
 
174
191
  if (callback) {
175
- callback = shimmer.wrapFunction(args.callback, cb => function () {
192
+ callback = shimmer.wrapFunction(args.callback, cb => function (...args) {
176
193
  return asyncStartChannel.runStores(ctx, () => {
177
- return cb.apply(this, arguments)
194
+ return cb.apply(this, args)
178
195
  })
179
196
  })
180
197
  }
@@ -197,9 +214,9 @@ function patch (http, methodName) {
197
214
 
198
215
  // tracked to accurately discern custom request socket timeout
199
216
  let customRequestTimeout = false
200
- req.setTimeout = function () {
217
+ req.setTimeout = function (...args) {
201
218
  customRequestTimeout = true
202
- return setTimeout.apply(this, arguments)
219
+ return setTimeout.apply(this, args)
203
220
  }
204
221
 
205
222
  req.emit = function (eventName, arg) {
@@ -126,9 +126,9 @@ function wrapWriteHead (writeHead) {
126
126
  }
127
127
 
128
128
  function wrapWrite (write) {
129
- return function wrappedWrite () {
129
+ return function wrappedWrite (...args) {
130
130
  if (!startWriteHeadCh.hasSubscribers) {
131
- return write.apply(this, arguments)
131
+ return write.apply(this, args)
132
132
  }
133
133
 
134
134
  const abortController = new AbortController()
@@ -147,7 +147,7 @@ function wrapWrite (write) {
147
147
  return true
148
148
  }
149
149
 
150
- return write.apply(this, arguments)
150
+ return write.apply(this, args)
151
151
  }
152
152
  }
153
153
 
@@ -177,9 +177,9 @@ function wrapSetHeader (setHeader) {
177
177
  }
178
178
 
179
179
  function wrapAppendOrRemoveHeader (originalMethod) {
180
- return function wrappedAppendOrRemoveHeader () {
180
+ return function wrappedAppendOrRemoveHeader (...args) {
181
181
  if (!startSetHeaderCh.hasSubscribers) {
182
- return originalMethod.apply(this, arguments)
182
+ return originalMethod.apply(this, args)
183
183
  }
184
184
 
185
185
  const abortController = new AbortController()
@@ -189,14 +189,14 @@ function wrapAppendOrRemoveHeader (originalMethod) {
189
189
  return this
190
190
  }
191
191
 
192
- return originalMethod.apply(this, arguments)
192
+ return originalMethod.apply(this, args)
193
193
  }
194
194
  }
195
195
 
196
196
  function wrapEnd (end) {
197
- return function wrappedEnd () {
197
+ return function wrappedEnd (...args) {
198
198
  if (!startWriteHeadCh.hasSubscribers) {
199
- return end.apply(this, arguments)
199
+ return end.apply(this, args)
200
200
  }
201
201
 
202
202
  const abortController = new AbortController()
@@ -215,6 +215,6 @@ function wrapEnd (end) {
215
215
  return this
216
216
  }
217
217
 
218
- return end.apply(this, arguments)
218
+ return end.apply(this, args)
219
219
  }
220
220
  }
@@ -4,6 +4,8 @@
4
4
  const realSetTimeout = setTimeout
5
5
 
6
6
  const path = require('path')
7
+ const satisfies = require('../../../vendor/dist/semifies')
8
+ const { DD_MAJOR } = require('../../../version')
7
9
  const shimmer = require('../../datadog-shimmer')
8
10
  const log = require('../../dd-trace/src/log')
9
11
  const {
@@ -24,13 +26,13 @@ const {
24
26
  recordAttemptToFixExecution,
25
27
  logAttemptToFixTestExecution,
26
28
  logTestOptimizationSummary,
29
+ getEfdRetryCount,
27
30
  } = require('../../dd-trace/src/plugins/util/test')
28
31
  const {
29
32
  SEED_SUFFIX_RE,
30
33
  getFormattedJestTestParameters,
31
34
  getJestTestName,
32
35
  getJestSuitesToRun,
33
- getEfdRetryCount,
34
36
  } = require('../../datadog-plugin-jest/src/util')
35
37
  const { addHook, channel } = require('./helpers/instrument')
36
38
 
@@ -126,7 +128,13 @@ const testSuiteJestObjects = new Map()
126
128
 
127
129
  const BREAKPOINT_HIT_GRACE_PERIOD_MS = 200
128
130
  const ATR_RETRY_SUPPRESSION_FLAG = '_ddDisableAtrRetry'
131
+ const MINIMUM_JEST_VERSION = DD_MAJOR >= 6 ? '>=28.0.0' : '>=24.8.0'
132
+ const MINIMUM_JEST_VERSION_BEFORE_30 = DD_MAJOR >= 6 ? '>=28.0.0 <30.0.0' : '>=24.8.0 <30.0.0'
133
+ const MINIMUM_JEST_WORKER_VERSION_BEFORE_30 = DD_MAJOR >= 6 ? '>=28.0.0 <30.0.0' : '>=24.9.0 <30.0.0'
134
+ const MINIMUM_JEST_CONFIG_ASYNC_VERSION = DD_MAJOR >= 6 ? '>=28.0.0' : '>=25.1.0'
135
+ const MINIMUM_JEST_TEST_SCHEDULER_VERSION = DD_MAJOR >= 6 ? '>=28.0.0' : '>=27.0.0'
129
136
  const atrSuppressedErrors = new Map()
137
+ let hasWarnedDeprecatedJestVersion = false
130
138
 
131
139
  // Track quarantined tests whose errors were suppressed, keyed by "suite › testName"
132
140
  const quarantinedFailingTests = new Set()
@@ -177,6 +185,20 @@ function formatJestError (errors) {
177
185
  return error
178
186
  }
179
187
 
188
+ function warnDeprecatedJestVersion (frameworkVersion) {
189
+ if (DD_MAJOR >= 6 || hasWarnedDeprecatedJestVersion || !frameworkVersion ||
190
+ !satisfies(frameworkVersion, '<28.0.0')) {
191
+ return
192
+ }
193
+
194
+ hasWarnedDeprecatedJestVersion = true
195
+ // eslint-disable-next-line no-console
196
+ console.warn(
197
+ 'dd-trace support for Jest<28.0.0 is deprecated and will be removed in dd-trace v6. ' +
198
+ 'Please upgrade Jest to >=28.0.0.'
199
+ )
200
+ }
201
+
180
202
  function getTestEnvironmentOptions (config) {
181
203
  if (config.projectConfig && config.projectConfig.testEnvironmentOptions) { // newer versions
182
204
  return config.projectConfig.testEnvironmentOptions
@@ -499,13 +521,13 @@ function getWrappedEnvironment (BaseEnvironment, jestVersion) {
499
521
  const setNameToParams = (name, params) => { this.nameToParams[name] = [...params] }
500
522
 
501
523
  if (event.name === 'setup' && this.global.test) {
502
- shimmer.wrap(this.global.test, 'each', each => function () {
503
- const testParameters = getFormattedJestTestParameters(arguments)
504
- const eachBind = each.apply(this, arguments)
505
- return function () {
506
- const [testName] = arguments
524
+ shimmer.wrap(this.global.test, 'each', each => function (...args) {
525
+ const testParameters = getFormattedJestTestParameters(args)
526
+ const eachBind = each.apply(this, args)
527
+ return function (...args) {
528
+ const [testName] = args
507
529
  setNameToParams(testName, testParameters)
508
- return eachBind.apply(this, arguments)
530
+ return eachBind.apply(this, args)
509
531
  }
510
532
  })
511
533
  }
@@ -602,16 +624,16 @@ function getWrappedEnvironment (BaseEnvironment, jestVersion) {
602
624
  } else {
603
625
  originalHookFns.set(hook, hookFn)
604
626
  }
605
- const newHookFn = shimmer.wrapFunction(hookFn, hookFn => function () {
606
- return testFnCh.runStores(ctx, () => hookFn.apply(this, arguments))
627
+ const newHookFn = shimmer.wrapFunction(hookFn, hookFn => function (...args) {
628
+ return testFnCh.runStores(ctx, () => hookFn.apply(this, args))
607
629
  })
608
630
  hook.fn = newHookFn
609
631
  }
610
632
  const originalFn = event.test.fn
611
633
  originalTestFns.set(event.test, originalFn)
612
634
 
613
- const newFn = shimmer.wrapFunction(event.test.fn, testFn => function () {
614
- return testFnCh.runStores(ctx, () => testFn.apply(this, arguments))
635
+ const newFn = shimmer.wrapFunction(event.test.fn, testFn => function (...args) {
636
+ return testFnCh.runStores(ctx, () => testFn.apply(this, args))
615
637
  })
616
638
 
617
639
  event.test.fn = newFn
@@ -626,8 +648,8 @@ function getWrappedEnvironment (BaseEnvironment, jestVersion) {
626
648
  } else {
627
649
  originalHookFns.set(event.hook, hookFn)
628
650
  }
629
- event.hook.fn = shimmer.wrapFunction(hookFn, hookFn => function () {
630
- return testSuiteHookFnCh.runStores(ctx, () => hookFn.apply(this, arguments))
651
+ event.hook.fn = shimmer.wrapFunction(hookFn, hookFn => function (...args) {
652
+ return testSuiteHookFnCh.runStores(ctx, () => hookFn.apply(this, args))
631
653
  })
632
654
  }
633
655
 
@@ -1073,12 +1095,12 @@ function applySuiteSkipping (originalTests, rootDir, frameworkVersion) {
1073
1095
 
1074
1096
  addHook({
1075
1097
  name: 'jest-environment-node',
1076
- versions: ['>=24.8.0'],
1098
+ versions: [MINIMUM_JEST_VERSION],
1077
1099
  }, getTestEnvironment)
1078
1100
 
1079
1101
  addHook({
1080
1102
  name: 'jest-environment-jsdom',
1081
- versions: ['>=24.8.0'],
1103
+ versions: [MINIMUM_JEST_VERSION],
1082
1104
  }, getTestEnvironment)
1083
1105
 
1084
1106
  addHook({
@@ -1150,6 +1172,8 @@ function searchSourceWrapper (searchSourcePackage, frameworkVersion) {
1150
1172
 
1151
1173
  function getCliWrapper (isNewJestVersion) {
1152
1174
  return function cliWrapper (cli, jestVersion) {
1175
+ warnDeprecatedJestVersion(jestVersion)
1176
+
1153
1177
  if (isNewJestVersion) {
1154
1178
  cli = shimmer.wrap(
1155
1179
  cli,
@@ -1520,14 +1544,14 @@ function coverageReporterWrapper (coverageReporter) {
1520
1544
  * in which case we'll leave it.
1521
1545
  */
1522
1546
  // `_addUntestedFiles` is an async function
1523
- shimmer.wrap(CoverageReporter.prototype, '_addUntestedFiles', addUntestedFiles => function () {
1547
+ shimmer.wrap(CoverageReporter.prototype, '_addUntestedFiles', addUntestedFiles => function (...args) {
1524
1548
  if (DD_TEST_TIA_KEEP_COV_CONFIG) {
1525
- return addUntestedFiles.apply(this, arguments)
1549
+ return addUntestedFiles.apply(this, args)
1526
1550
  }
1527
1551
  if (isCodeCoverageEnabledBecauseOfUs) {
1528
1552
  return Promise.resolve()
1529
1553
  }
1530
- return addUntestedFiles.apply(this, arguments)
1554
+ return addUntestedFiles.apply(this, args)
1531
1555
  })
1532
1556
 
1533
1557
  return coverageReporter
@@ -1536,7 +1560,7 @@ function coverageReporterWrapper (coverageReporter) {
1536
1560
  addHook({
1537
1561
  name: '@jest/core',
1538
1562
  file: 'build/TestScheduler.js',
1539
- versions: ['>=27.0.0'],
1563
+ versions: [MINIMUM_JEST_TEST_SCHEDULER_VERSION],
1540
1564
  }, (testSchedulerPackage, frameworkVersion) => {
1541
1565
  const oldCreateTestScheduler = testSchedulerPackage.createTestScheduler
1542
1566
  const newCreateTestScheduler = async function () {
@@ -1552,24 +1576,26 @@ addHook({
1552
1576
  return testSchedulerPackage
1553
1577
  })
1554
1578
 
1555
- addHook({
1556
- name: '@jest/core',
1557
- file: 'build/TestScheduler.js',
1558
- versions: ['>=24.8.0 <27.0.0'],
1559
- }, (testSchedulerPackage, frameworkVersion) => {
1560
- shimmer.wrap(
1561
- testSchedulerPackage.default.prototype,
1562
- 'scheduleTests', scheduleTests => getWrappedScheduleTests(scheduleTests, frameworkVersion)
1563
- )
1564
- return testSchedulerPackage
1565
- })
1579
+ if (DD_MAJOR < 6) {
1580
+ addHook({
1581
+ name: '@jest/core',
1582
+ file: 'build/TestScheduler.js',
1583
+ versions: ['>=24.8.0 <27.0.0'],
1584
+ }, (testSchedulerPackage, frameworkVersion) => {
1585
+ shimmer.wrap(
1586
+ testSchedulerPackage.default.prototype,
1587
+ 'scheduleTests', scheduleTests => getWrappedScheduleTests(scheduleTests, frameworkVersion)
1588
+ )
1589
+ return testSchedulerPackage
1590
+ })
1591
+ }
1566
1592
 
1567
1593
  addHook({
1568
1594
  name: '@jest/test-sequencer',
1569
1595
  versions: ['>=28'],
1570
1596
  }, (sequencerPackage, frameworkVersion) => {
1571
- shimmer.wrap(sequencerPackage.default.prototype, 'shard', shard => function () {
1572
- const shardedTests = shard.apply(this, arguments)
1597
+ shimmer.wrap(sequencerPackage.default.prototype, 'shard', shard => function (...args) {
1598
+ const shardedTests = shard.apply(this, args)
1573
1599
 
1574
1600
  if (!shardedTests.length || !isSuitesSkippingEnabled || !skippableSuites.length) {
1575
1601
  return shardedTests
@@ -1582,16 +1608,18 @@ addHook({
1582
1608
  return sequencerPackage
1583
1609
  })
1584
1610
 
1585
- addHook({
1586
- name: '@jest/reporters',
1587
- file: 'build/coverage_reporter.js',
1588
- versions: ['>=24.8.0 <26.6.2'],
1589
- }, coverageReporterWrapper)
1611
+ if (DD_MAJOR < 6) {
1612
+ addHook({
1613
+ name: '@jest/reporters',
1614
+ file: 'build/coverage_reporter.js',
1615
+ versions: ['>=24.8.0 <26.6.2'],
1616
+ }, coverageReporterWrapper)
1617
+ }
1590
1618
 
1591
1619
  addHook({
1592
1620
  name: '@jest/reporters',
1593
1621
  file: 'build/CoverageReporter.js',
1594
- versions: ['>=26.6.2'],
1622
+ versions: [DD_MAJOR >= 6 ? '>=28.0.0' : '>=26.6.2'],
1595
1623
  }, coverageReporterWrapper)
1596
1624
 
1597
1625
  addHook({
@@ -1604,7 +1632,7 @@ addHook({
1604
1632
  addHook({
1605
1633
  name: '@jest/core',
1606
1634
  file: 'build/cli/index.js',
1607
- versions: ['>=24.8.0 <30.0.0'],
1635
+ versions: [MINIMUM_JEST_VERSION_BEFORE_30],
1608
1636
  }, getCliWrapper(false))
1609
1637
 
1610
1638
  addHook({
@@ -1614,10 +1642,10 @@ addHook({
1614
1642
 
1615
1643
  function jestAdapterWrapper (jestAdapter, jestVersion) {
1616
1644
  const adapter = jestAdapter.default ?? jestAdapter
1617
- const newAdapter = shimmer.wrapFunction(adapter, adapter => function () {
1618
- const environment = arguments[2]
1645
+ const newAdapter = shimmer.wrapFunction(adapter, adapter => function (...args) {
1646
+ const environment = args[2]
1619
1647
  if (!environment || !environment.testEnvironmentOptions) {
1620
- return adapter.apply(this, arguments)
1648
+ return adapter.apply(this, args)
1621
1649
  }
1622
1650
  testSuiteStartCh.publish({
1623
1651
  testSuite: environment.testSuite,
@@ -1627,7 +1655,7 @@ function jestAdapterWrapper (jestAdapter, jestVersion) {
1627
1655
  frameworkVersion: jestVersion,
1628
1656
  testSuiteAbsolutePath: environment.testSuiteAbsolutePath,
1629
1657
  })
1630
- return adapter.apply(this, arguments).then(suiteResults => {
1658
+ return adapter.apply(this, args).then(suiteResults => {
1631
1659
  const { numFailingTests, skipped, failureMessage: errorMessage } = suiteResults
1632
1660
  let status = 'pass'
1633
1661
  if (skipped) {
@@ -1691,7 +1719,7 @@ addHook({
1691
1719
  addHook({
1692
1720
  name: 'jest-circus',
1693
1721
  file: 'build/legacy-code-todo-rewrite/jestAdapter.js',
1694
- versions: ['>=24.8.0'],
1722
+ versions: [MINIMUM_JEST_VERSION],
1695
1723
  }, jestAdapterWrapper)
1696
1724
 
1697
1725
  function configureTestEnvironment (readConfigsResult) {
@@ -1745,8 +1773,8 @@ function jestConfigAsyncWrapper (jestConfig) {
1745
1773
  }
1746
1774
 
1747
1775
  function jestConfigSyncWrapper (jestConfig) {
1748
- return shimmer.wrap(jestConfig, 'readConfigs', readConfigs => function () {
1749
- const readConfigsResult = readConfigs.apply(this, arguments)
1776
+ return shimmer.wrap(jestConfig, 'readConfigs', readConfigs => function (...args) {
1777
+ const readConfigsResult = readConfigs.apply(this, args)
1750
1778
  configureTestEnvironment(readConfigsResult)
1751
1779
  return readConfigsResult
1752
1780
  })
@@ -1828,7 +1856,7 @@ function wrapCreateScriptTransformer (createScriptTransformer) {
1828
1856
 
1829
1857
  addHook({
1830
1858
  name: '@jest/transform',
1831
- versions: ['>=24.8.0 <30.0.0'],
1859
+ versions: [MINIMUM_JEST_VERSION_BEFORE_30],
1832
1860
  file: 'build/ScriptTransformer.js',
1833
1861
  }, transformPackage => {
1834
1862
  transformPackage.createScriptTransformer = wrapCreateScriptTransformer(transformPackage.createScriptTransformer)
@@ -1848,20 +1876,22 @@ addHook({
1848
1876
  */
1849
1877
  addHook({
1850
1878
  name: '@jest/core',
1851
- versions: ['>=24.8.0 <30.0.0'],
1879
+ versions: [MINIMUM_JEST_VERSION_BEFORE_30],
1852
1880
  file: 'build/SearchSource.js',
1853
1881
  }, searchSourceWrapper)
1854
1882
 
1855
1883
  // from 25.1.0 on, readConfigs becomes async
1856
1884
  addHook({
1857
1885
  name: 'jest-config',
1858
- versions: ['>=25.1.0'],
1886
+ versions: [MINIMUM_JEST_CONFIG_ASYNC_VERSION],
1859
1887
  }, jestConfigAsyncWrapper)
1860
1888
 
1861
- addHook({
1862
- name: 'jest-config',
1863
- versions: ['24.8.0 - 24.9.0'],
1864
- }, jestConfigSyncWrapper)
1889
+ if (DD_MAJOR < 6) {
1890
+ addHook({
1891
+ name: 'jest-config',
1892
+ versions: ['24.8.0 - 24.9.0'],
1893
+ }, jestConfigSyncWrapper)
1894
+ }
1865
1895
 
1866
1896
  const LIBRARIES_BYPASSING_JEST_REQUIRE_ENGINE = new Set([
1867
1897
  'selenium-webdriver',
@@ -1876,7 +1906,7 @@ const LIBRARIES_BYPASSING_JEST_REQUIRE_ENGINE = new Set([
1876
1906
 
1877
1907
  addHook({
1878
1908
  name: 'jest-runtime',
1879
- versions: ['>=24.8.0'],
1909
+ versions: [MINIMUM_JEST_VERSION],
1880
1910
  }, (runtimePackage) => {
1881
1911
  const Runtime = runtimePackage.default ?? runtimePackage
1882
1912
 
@@ -1953,10 +1983,10 @@ addHook({
1953
1983
  })
1954
1984
 
1955
1985
  function onMessageWrapper (onMessage) {
1956
- return function () {
1957
- const response = arguments[0]
1986
+ return function (...args) {
1987
+ const response = args[0]
1958
1988
  if (!Array.isArray(response)) {
1959
- return onMessage.apply(this, arguments)
1989
+ return onMessage.apply(this, args)
1960
1990
  }
1961
1991
 
1962
1992
  const [code, data] = response
@@ -1983,7 +2013,7 @@ function onMessageWrapper (onMessage) {
1983
2013
  }
1984
2014
  return
1985
2015
  }
1986
- return onMessage.apply(this, arguments)
2016
+ return onMessage.apply(this, args)
1987
2017
  }
1988
2018
  }
1989
2019
 
@@ -2047,8 +2077,8 @@ function wrapWorker (worker) {
2047
2077
  }
2048
2078
 
2049
2079
  function enqueueWrapper (enqueue) {
2050
- return function () {
2051
- shimmer.wrap(arguments[0], 'onStart', onStart => function (worker) {
2080
+ return function (...args) {
2081
+ shimmer.wrap(args[0], 'onStart', onStart => function (worker) {
2052
2082
  if (worker) {
2053
2083
  const currentChannel = worker._child || worker._worker
2054
2084
  const previousChannel = wrappedWorkerChannels.get(worker)
@@ -2065,7 +2095,7 @@ function enqueueWrapper (enqueue) {
2065
2095
  }
2066
2096
  return onStart.apply(this, arguments)
2067
2097
  })
2068
- return enqueue.apply(this, arguments)
2098
+ return enqueue.apply(this, args)
2069
2099
  }
2070
2100
  }
2071
2101
 
@@ -2077,7 +2107,7 @@ function enqueueWrapper (enqueue) {
2077
2107
  */
2078
2108
  addHook({
2079
2109
  name: 'jest-worker',
2080
- versions: ['>=24.9.0 <30.0.0'],
2110
+ versions: [MINIMUM_JEST_WORKER_VERSION_BEFORE_30],
2081
2111
  file: 'build/workers/ChildProcessWorker.js',
2082
2112
  }, (childProcessWorker) => {
2083
2113
  const ChildProcessWorker = childProcessWorker.default
@@ -2092,7 +2122,7 @@ addHook({
2092
2122
 
2093
2123
  addHook({
2094
2124
  name: 'jest-worker',
2095
- versions: ['>=24.9.0 <30.0.0'],
2125
+ versions: [MINIMUM_JEST_WORKER_VERSION_BEFORE_30],
2096
2126
  file: 'build/workers/NodeThreadsWorker.js',
2097
2127
  }, (nodeThreadsWorker) => {
2098
2128
  const ExperimentalWorker = nodeThreadsWorker.default
@@ -34,16 +34,16 @@ addHook({ name: 'kafkajs', file: 'src/index.js', versions: ['>=1.4'] }, (BaseKaf
34
34
  }
35
35
  }
36
36
 
37
- shimmer.wrap(Kafka.prototype, 'producer', createProducer => function () {
38
- const producer = createProducer.apply(this, arguments)
37
+ shimmer.wrap(Kafka.prototype, 'producer', createProducer => function (...args) {
38
+ const producer = createProducer.apply(this, args)
39
39
  const send = producer.send
40
40
  const bootstrapServers = this._brokers
41
41
 
42
42
  const kafkaClusterIdPromise = getKafkaClusterId(this)
43
43
 
44
- producer.send = function () {
44
+ producer.send = function (...args) {
45
45
  const wrappedSend = (clusterId) => {
46
- const { topic, messages = [] } = arguments[0]
46
+ const { topic, messages = [] } = args[0]
47
47
 
48
48
  const ctx = {
49
49
  bootstrapServers,
@@ -61,7 +61,7 @@ addHook({ name: 'kafkajs', file: 'src/index.js', versions: ['>=1.4'] }, (BaseKaf
61
61
 
62
62
  return producerStartCh.runStores(ctx, () => {
63
63
  try {
64
- const result = send.apply(this, arguments)
64
+ const result = send.apply(this, args)
65
65
  result.then(
66
66
  (res) => {
67
67
  ctx.result = res
@@ -110,9 +110,9 @@ addHook({ name: 'kafkajs', file: 'src/index.js', versions: ['>=1.4'] }, (BaseKaf
110
110
  return producer
111
111
  })
112
112
 
113
- shimmer.wrap(Kafka.prototype, 'consumer', createConsumer => function () {
113
+ shimmer.wrap(Kafka.prototype, 'consumer', createConsumer => function (...args) {
114
114
  if (!consumerStartCh.hasSubscribers) {
115
- return createConsumer.apply(this, arguments)
115
+ return createConsumer.apply(this, args)
116
116
  }
117
117
 
118
118
  const kafkaClusterIdPromise = getKafkaClusterId(this)
@@ -129,7 +129,7 @@ addHook({ name: 'kafkajs', file: 'src/index.js', versions: ['>=1.4'] }, (BaseKaf
129
129
  return { topic, partition, messages, groupId, clusterId }
130
130
  }
131
131
 
132
- const consumer = createConsumer.apply(this, arguments)
132
+ const consumer = createConsumer.apply(this, args)
133
133
 
134
134
  consumer.on(consumer.events.COMMIT_OFFSETS, (event) => {
135
135
  const { payload: { groupId: commitGroupId, topics } } = event
@@ -149,7 +149,7 @@ addHook({ name: 'kafkajs', file: 'src/index.js', versions: ['>=1.4'] }, (BaseKaf
149
149
  })
150
150
 
151
151
  const run = consumer.run
152
- const groupId = arguments[0].groupId
152
+ const groupId = args[0].groupId
153
153
 
154
154
  consumer.run = function ({ eachMessage, eachBatch, ...runArgs }) {
155
155
  const wrapConsume = (clusterId) => {