dd-trace 5.52.0 → 5.54.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 (332) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/README.md +5 -0
  3. package/index.d.ts +87 -22
  4. package/initialize.mjs +3 -4
  5. package/package.json +36 -34
  6. package/packages/datadog-core/src/utils/src/get.js +1 -1
  7. package/packages/datadog-core/src/utils/src/has.js +1 -1
  8. package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
  9. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  10. package/packages/datadog-core/src/utils/src/pick.js +2 -2
  11. package/packages/datadog-core/src/utils/src/set.js +1 -1
  12. package/packages/datadog-core/src/utils/src/uniq.js +1 -1
  13. package/packages/datadog-instrumentations/src/amqp10.js +19 -17
  14. package/packages/datadog-instrumentations/src/amqplib.js +57 -37
  15. package/packages/datadog-instrumentations/src/apollo.js +2 -2
  16. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  17. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -4
  18. package/packages/datadog-instrumentations/src/child_process.js +3 -3
  19. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +92 -62
  20. package/packages/datadog-instrumentations/src/couchbase.js +5 -4
  21. package/packages/datadog-instrumentations/src/cucumber.js +126 -84
  22. package/packages/datadog-instrumentations/src/cypress.js +2 -1
  23. package/packages/datadog-instrumentations/src/dns.js +1 -1
  24. package/packages/datadog-instrumentations/src/express.js +2 -6
  25. package/packages/datadog-instrumentations/src/fs.js +7 -6
  26. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +28 -34
  27. package/packages/datadog-instrumentations/src/graphql.js +7 -10
  28. package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
  29. package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
  30. package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
  31. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
  32. package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -1
  33. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
  34. package/packages/datadog-instrumentations/src/helpers/register.js +21 -18
  35. package/packages/datadog-instrumentations/src/http/client.js +16 -21
  36. package/packages/datadog-instrumentations/src/iovalkey.js +51 -0
  37. package/packages/datadog-instrumentations/src/jest.js +184 -87
  38. package/packages/datadog-instrumentations/src/kafkajs.js +65 -44
  39. package/packages/datadog-instrumentations/src/knex.js +4 -4
  40. package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
  41. package/packages/datadog-instrumentations/src/mariadb.js +38 -61
  42. package/packages/datadog-instrumentations/src/mocha/main.js +85 -59
  43. package/packages/datadog-instrumentations/src/mocha/utils.js +103 -82
  44. package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
  45. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  46. package/packages/datadog-instrumentations/src/mysql.js +20 -36
  47. package/packages/datadog-instrumentations/src/mysql2.js +55 -47
  48. package/packages/datadog-instrumentations/src/net.js +4 -2
  49. package/packages/datadog-instrumentations/src/next.js +7 -14
  50. package/packages/datadog-instrumentations/src/nyc.js +1 -1
  51. package/packages/datadog-instrumentations/src/openai.js +21 -23
  52. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  53. package/packages/datadog-instrumentations/src/pg.js +6 -13
  54. package/packages/datadog-instrumentations/src/playwright.js +170 -136
  55. package/packages/datadog-instrumentations/src/redis.js +3 -3
  56. package/packages/datadog-instrumentations/src/restify.js +2 -2
  57. package/packages/datadog-instrumentations/src/rhea.js +42 -54
  58. package/packages/datadog-instrumentations/src/router.js +22 -25
  59. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  60. package/packages/datadog-instrumentations/src/url.js +9 -17
  61. package/packages/datadog-instrumentations/src/vitest.js +126 -97
  62. package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
  63. package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
  64. package/packages/datadog-plugin-amqplib/src/client.js +6 -2
  65. package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
  66. package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
  67. package/packages/datadog-plugin-amqplib/src/util.js +1 -1
  68. package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
  69. package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
  70. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -2
  71. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  72. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
  73. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +24 -31
  74. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  75. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +6 -6
  76. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
  77. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -1
  78. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +4 -5
  79. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  80. package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
  81. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  82. package/packages/datadog-plugin-child_process/src/index.js +4 -4
  83. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
  84. package/packages/datadog-plugin-cucumber/src/index.js +86 -20
  85. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +97 -27
  86. package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
  87. package/packages/datadog-plugin-cypress/src/support.js +24 -5
  88. package/packages/datadog-plugin-express/src/code_origin.js +30 -0
  89. package/packages/datadog-plugin-express/src/index.js +10 -12
  90. package/packages/datadog-plugin-express/src/tracing.js +19 -0
  91. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
  92. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
  93. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
  94. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +26 -9
  95. package/packages/datadog-plugin-graphql/src/execute.js +2 -2
  96. package/packages/datadog-plugin-graphql/src/index.js +7 -6
  97. package/packages/datadog-plugin-graphql/src/resolve.js +2 -2
  98. package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
  99. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
  100. package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
  101. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  102. package/packages/datadog-plugin-grpc/src/util.js +2 -2
  103. package/packages/datadog-plugin-http/src/client.js +18 -7
  104. package/packages/datadog-plugin-http2/src/client.js +20 -20
  105. package/packages/datadog-plugin-iovalkey/src/index.js +18 -0
  106. package/packages/datadog-plugin-jest/src/index.js +36 -28
  107. package/packages/datadog-plugin-jest/src/util.js +8 -8
  108. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
  109. package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
  110. package/packages/datadog-plugin-kafkajs/src/producer.js +15 -7
  111. package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
  112. package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
  113. package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
  114. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
  115. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
  116. package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
  117. package/packages/datadog-plugin-mariadb/src/index.js +3 -9
  118. package/packages/datadog-plugin-mocha/src/index.js +88 -48
  119. package/packages/datadog-plugin-mongodb-core/src/index.js +1 -1
  120. package/packages/datadog-plugin-mysql/src/index.js +11 -9
  121. package/packages/datadog-plugin-mysql2/src/index.js +16 -0
  122. package/packages/datadog-plugin-net/src/tcp.js +1 -1
  123. package/packages/datadog-plugin-next/src/index.js +6 -5
  124. package/packages/datadog-plugin-openai/src/services.js +6 -10
  125. package/packages/datadog-plugin-openai/src/tracing.js +10 -14
  126. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  127. package/packages/datadog-plugin-playwright/src/index.js +48 -22
  128. package/packages/datadog-plugin-redis/src/index.js +9 -4
  129. package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
  130. package/packages/datadog-plugin-rhea/src/producer.js +5 -2
  131. package/packages/datadog-plugin-router/src/index.js +1 -1
  132. package/packages/datadog-plugin-selenium/src/index.js +1 -6
  133. package/packages/datadog-plugin-vitest/src/index.js +99 -72
  134. package/packages/datadog-shimmer/src/shimmer.js +163 -36
  135. package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
  136. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  137. package/packages/dd-trace/src/appsec/blocking.js +6 -20
  138. package/packages/dd-trace/src/appsec/graphql.js +2 -2
  139. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +1 -1
  140. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +1 -1
  141. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +1 -1
  142. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +4 -6
  143. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
  144. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +4 -6
  145. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
  146. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
  147. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
  148. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
  149. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  150. package/packages/dd-trace/src/appsec/iast/index.js +1 -0
  151. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
  152. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
  153. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +6 -13
  154. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
  155. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
  156. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
  157. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
  158. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -7
  159. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
  160. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  161. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +5 -7
  162. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  163. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +6 -6
  164. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -1
  165. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  166. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
  167. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
  168. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -24
  169. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
  170. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
  171. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
  172. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
  173. package/packages/dd-trace/src/appsec/index.js +15 -12
  174. package/packages/dd-trace/src/appsec/rasp/index.js +19 -17
  175. package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
  176. package/packages/dd-trace/src/appsec/rasp/utils.js +11 -6
  177. package/packages/dd-trace/src/appsec/reporter.js +233 -40
  178. package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
  179. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -2
  180. package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
  181. package/packages/dd-trace/src/appsec/telemetry/index.js +1 -2
  182. package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -14
  183. package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
  184. package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
  185. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +8 -8
  186. package/packages/dd-trace/src/azure_metadata.js +2 -7
  187. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +1 -1
  188. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
  189. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
  190. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
  191. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
  192. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
  193. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +1 -1
  194. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
  195. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +2 -2
  196. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
  197. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +1 -1
  198. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +1 -1
  199. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +8 -5
  200. package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
  201. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +1 -1
  202. package/packages/dd-trace/src/config.js +82 -51
  203. package/packages/dd-trace/src/config_stable.js +3 -3
  204. package/packages/dd-trace/src/datastreams/encoding.js +9 -9
  205. package/packages/dd-trace/src/datastreams/fnv.js +1 -1
  206. package/packages/dd-trace/src/datastreams/pathway.js +4 -4
  207. package/packages/dd-trace/src/datastreams/processor.js +5 -7
  208. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
  209. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
  210. package/packages/dd-trace/src/datastreams/size.js +1 -1
  211. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +131 -72
  212. package/packages/dd-trace/src/debugger/devtools_client/condition.js +6 -8
  213. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
  214. package/packages/dd-trace/src/debugger/devtools_client/index.js +17 -27
  215. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
  216. package/packages/dd-trace/src/debugger/devtools_client/send.js +8 -7
  217. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +16 -8
  218. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +8 -10
  219. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +3 -3
  220. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
  221. package/packages/dd-trace/src/debugger/devtools_client/state.js +31 -4
  222. package/packages/dd-trace/src/dogstatsd.js +7 -4
  223. package/packages/dd-trace/src/encode/0.4.js +9 -9
  224. package/packages/dd-trace/src/encode/0.5.js +1 -1
  225. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +3 -3
  226. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  227. package/packages/dd-trace/src/encode/tags-processors.js +1 -1
  228. package/packages/dd-trace/src/exporter.js +6 -6
  229. package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
  230. package/packages/dd-trace/src/exporters/common/docker.js +1 -1
  231. package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
  232. package/packages/dd-trace/src/exporters/common/request.js +1 -1
  233. package/packages/dd-trace/src/exporters/common/util.js +1 -1
  234. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  235. package/packages/dd-trace/src/flare/file.js +1 -5
  236. package/packages/dd-trace/src/format.js +1 -1
  237. package/packages/dd-trace/src/git_properties.js +1 -1
  238. package/packages/dd-trace/src/id.js +12 -6
  239. package/packages/dd-trace/src/iitm.js +10 -22
  240. package/packages/dd-trace/src/lambda/handler.js +6 -6
  241. package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
  242. package/packages/dd-trace/src/lambda/runtime/ritm.js +1 -1
  243. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
  244. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
  245. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
  246. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
  247. package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -1
  248. package/packages/dd-trace/src/llmobs/sdk.js +2 -2
  249. package/packages/dd-trace/src/llmobs/tagger.js +113 -99
  250. package/packages/dd-trace/src/llmobs/util.js +9 -9
  251. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  252. package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
  253. package/packages/dd-trace/src/log/index.js +4 -4
  254. package/packages/dd-trace/src/log/log.js +1 -1
  255. package/packages/dd-trace/src/log/writer.js +2 -2
  256. package/packages/dd-trace/src/msgpack/chunk.js +3 -3
  257. package/packages/dd-trace/src/msgpack/encoder.js +28 -28
  258. package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
  259. package/packages/dd-trace/src/noop/span.js +3 -5
  260. package/packages/dd-trace/src/noop/tracer.js +1 -2
  261. package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
  262. package/packages/dd-trace/src/opentelemetry/tracer.js +6 -5
  263. package/packages/dd-trace/src/opentracing/propagation/log.js +6 -8
  264. package/packages/dd-trace/src/opentracing/propagation/text_map.js +27 -23
  265. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
  266. package/packages/dd-trace/src/opentracing/span.js +9 -14
  267. package/packages/dd-trace/src/opentracing/tracer.js +9 -6
  268. package/packages/dd-trace/src/payload-tagging/index.js +1 -1
  269. package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
  270. package/packages/dd-trace/src/pkg.js +1 -1
  271. package/packages/dd-trace/src/plugins/ci_plugin.js +62 -10
  272. package/packages/dd-trace/src/plugins/consumer.js +2 -2
  273. package/packages/dd-trace/src/plugins/inbound.js +5 -1
  274. package/packages/dd-trace/src/plugins/index.js +1 -1
  275. package/packages/dd-trace/src/plugins/outbound.js +4 -5
  276. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  277. package/packages/dd-trace/src/plugins/producer.js +2 -2
  278. package/packages/dd-trace/src/plugins/storage.js +2 -2
  279. package/packages/dd-trace/src/plugins/util/ci.js +23 -15
  280. package/packages/dd-trace/src/plugins/util/git.js +165 -11
  281. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
  282. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  283. package/packages/dd-trace/src/plugins/util/llm.js +27 -10
  284. package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
  285. package/packages/dd-trace/src/plugins/util/test.js +311 -48
  286. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  287. package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
  288. package/packages/dd-trace/src/plugins/util/user-provided-git.js +12 -3
  289. package/packages/dd-trace/src/plugins/util/web.js +5 -4
  290. package/packages/dd-trace/src/priority_sampler.js +22 -22
  291. package/packages/dd-trace/src/profiling/config.js +44 -8
  292. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +5 -5
  293. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  294. package/packages/dd-trace/src/profiling/profiler.js +37 -2
  295. package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
  296. package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
  297. package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
  298. package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
  299. package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
  300. package/packages/dd-trace/src/profiling/tagger.js +3 -5
  301. package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
  302. package/packages/dd-trace/src/proxy.js +7 -13
  303. package/packages/dd-trace/src/random_sampler.js +40 -0
  304. package/packages/dd-trace/src/rate_limiter.js +4 -4
  305. package/packages/dd-trace/src/remote_config/index.js +3 -7
  306. package/packages/dd-trace/src/remote_config/manager.js +25 -13
  307. package/packages/dd-trace/src/require-package-json.js +1 -1
  308. package/packages/dd-trace/src/ritm.js +4 -4
  309. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +2 -2
  310. package/packages/dd-trace/src/sampler.js +33 -4
  311. package/packages/dd-trace/src/sampling_rule.js +12 -3
  312. package/packages/dd-trace/src/scope.js +1 -1
  313. package/packages/dd-trace/src/serverless.js +0 -48
  314. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  315. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +8 -0
  316. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
  317. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +4 -0
  318. package/packages/dd-trace/src/span_processor.js +3 -3
  319. package/packages/dd-trace/src/span_sampler.js +4 -1
  320. package/packages/dd-trace/src/standalone/tracesource.js +1 -1
  321. package/packages/dd-trace/src/startup-log.js +2 -2
  322. package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
  323. package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
  324. package/packages/dd-trace/src/telemetry/metrics.js +10 -5
  325. package/packages/dd-trace/src/telemetry/send-data.js +1 -1
  326. package/packages/dd-trace/src/telemetry/telemetry.js +23 -24
  327. package/packages/dd-trace/src/util.js +1 -1
  328. package/version.js +1 -0
  329. package/packages/datadog-instrumentations/src/paperplane.js +0 -77
  330. package/packages/datadog-plugin-paperplane/src/index.js +0 -25
  331. package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
  332. package/packages/datadog-plugin-paperplane/src/server.js +0 -24
@@ -8,6 +8,7 @@ const {
8
8
  PLAYWRIGHT_WORKER_TRACE_PAYLOAD_CODE
9
9
  } = require('../../dd-trace/src/plugins/util/test')
10
10
  const log = require('../../dd-trace/src/log')
11
+ const { DD_MAJOR } = require('../../../version')
11
12
 
12
13
  const testStartCh = channel('ci:playwright:test:start')
13
14
  const testFinishCh = channel('ci:playwright:test:finish')
@@ -18,6 +19,8 @@ const testSessionFinishCh = channel('ci:playwright:session:finish')
18
19
  const libraryConfigurationCh = channel('ci:playwright:library-configuration')
19
20
  const knownTestsCh = channel('ci:playwright:known-tests')
20
21
  const testManagementTestsCh = channel('ci:playwright:test-management-tests')
22
+ const impactedTestsCh = channel('ci:playwright:modified-tests')
23
+ const isModifiedCh = channel('ci:playwright:test:is-modified')
21
24
 
22
25
  const testSuiteStartCh = channel('ci:playwright:test-suite:start')
23
26
  const testSuiteFinishCh = channel('ci:playwright:test-suite:finish')
@@ -25,8 +28,8 @@ const testSuiteFinishCh = channel('ci:playwright:test-suite:finish')
25
28
  const workerReportCh = channel('ci:playwright:worker:report')
26
29
  const testPageGotoCh = channel('ci:playwright:test:page-goto')
27
30
 
28
- const testToAr = new WeakMap()
29
- const testSuiteToAr = new Map()
31
+ const testToCtx = new WeakMap()
32
+ const testSuiteToCtx = new Map()
30
33
  const testSuiteToTestStatuses = new Map()
31
34
  const testSuiteToErrors = new Map()
32
35
  const testsToTestStatuses = new Map()
@@ -53,9 +56,11 @@ let knownTests = {}
53
56
  let isTestManagementTestsEnabled = false
54
57
  let testManagementAttemptToFixRetries = 0
55
58
  let testManagementTests = {}
59
+ let isImpactedTestsEnabled = false
60
+ let modifiedTests = {}
56
61
  const quarantinedOrDisabledTestsAttemptToFix = []
57
62
  let rootDir = ''
58
- const MINIMUM_SUPPORTED_VERSION_RANGE_EFD = '>=1.38.0'
63
+ const MINIMUM_SUPPORTED_VERSION_RANGE_EFD = '>=1.38.0' // TODO: remove this once we drop support for v5
59
64
 
60
65
  function getTestProperties (test) {
61
66
  const testName = getTestFullname(test)
@@ -104,11 +109,7 @@ function deepCloneSuite (suite, filterTest, tags = []) {
104
109
 
105
110
  function getTestsBySuiteFromTestGroups (testGroups) {
106
111
  return testGroups.reduce((acc, { requireFile, tests }) => {
107
- if (acc[requireFile]) {
108
- acc[requireFile] = acc[requireFile].concat(tests)
109
- } else {
110
- acc[requireFile] = tests
111
- }
112
+ acc[requireFile] = acc[requireFile] ? acc[requireFile].concat(tests) : tests
112
113
  return acc
113
114
  }, {})
114
115
  }
@@ -132,10 +133,10 @@ function getTestsBySuiteFromTestsById (testsById) {
132
133
  function getPlaywrightConfig (playwrightRunner) {
133
134
  try {
134
135
  return playwrightRunner._configLoader.fullConfig()
135
- } catch (e) {
136
+ } catch {
136
137
  try {
137
138
  return playwrightRunner._loader.fullConfig()
138
- } catch (e) {
139
+ } catch {
139
140
  return playwrightRunner._config || {}
140
141
  }
141
142
  }
@@ -235,14 +236,14 @@ function getTestByTestId (dispatcher, testId) {
235
236
  }
236
237
  }
237
238
 
238
- function getChannelPromise (channelToPublishTo) {
239
+ function getChannelPromise (channelToPublishTo, params) {
239
240
  return new Promise(resolve => {
240
241
  testSessionAsyncResource.runInAsyncScope(() => {
241
- channelToPublishTo.publish({ onDone: resolve })
242
+ channelToPublishTo.publish({ onDone: resolve, ...params })
242
243
  })
243
244
  })
244
245
  }
245
- // eslint-disable-next-line
246
+
246
247
  // Inspired by https://github.com/microsoft/playwright/blob/2b77ed4d7aafa85a600caa0b0d101b72c8437eeb/packages/playwright/src/reporters/base.ts#L293
247
248
  // We can't use test.outcome() directly because it's set on follow up handlers:
248
249
  // our `testEndHandler` is called before the outcome is set.
@@ -279,11 +280,9 @@ function testBeginHandler (test, browserName, isMainProcess) {
279
280
 
280
281
  if (isNewTestSuite) {
281
282
  startedSuites.push(testSuiteAbsolutePath)
282
- const testSuiteAsyncResource = new AsyncResource('bound-anonymous-fn')
283
- testSuiteToAr.set(testSuiteAbsolutePath, testSuiteAsyncResource)
284
- testSuiteAsyncResource.runInAsyncScope(() => {
285
- testSuiteStartCh.publish(testSuiteAbsolutePath)
286
- })
283
+ const testSuiteCtx = { testSuiteAbsolutePath }
284
+ testSuiteToCtx.set(testSuiteAbsolutePath, testSuiteCtx)
285
+ testSuiteStartCh.runStores(testSuiteCtx, () => {})
287
286
  }
288
287
 
289
288
  // We disable retries by default if attemptToFix is true
@@ -293,19 +292,17 @@ function testBeginHandler (test, browserName, isMainProcess) {
293
292
 
294
293
  // this handles tests that do not go through the worker process (because they're skipped)
295
294
  if (isMainProcess) {
296
- const testAsyncResource = new AsyncResource('bound-anonymous-fn')
297
- testToAr.set(test, testAsyncResource)
298
295
  const testName = getTestFullname(test)
296
+ const testCtx = {
297
+ testName,
298
+ testSuiteAbsolutePath,
299
+ testSourceLine,
300
+ browserName,
301
+ isDisabled: test._ddIsDisabled
302
+ }
303
+ testToCtx.set(test, testCtx)
299
304
 
300
- testAsyncResource.runInAsyncScope(() => {
301
- testStartCh.publish({
302
- testName,
303
- testSuiteAbsolutePath,
304
- testSourceLine,
305
- browserName,
306
- isDisabled: test._ddIsDisabled
307
- })
308
- })
305
+ testStartCh.runStores(testCtx, () => {})
309
306
  }
310
307
  }
311
308
 
@@ -337,7 +334,7 @@ function testEndHandler (test, annotations, testStatus, error, isTimeout, isMain
337
334
  }
338
335
 
339
336
  if (testStatuses.length === testManagementAttemptToFixRetries + 1) {
340
- if (testStatuses.some(status => status === 'fail')) {
337
+ if (testStatuses.includes('fail')) {
341
338
  test._ddHasFailedAttemptToFixRetries = true
342
339
  }
343
340
  if (testStatuses.every(status => status === 'fail')) {
@@ -349,29 +346,29 @@ function testEndHandler (test, annotations, testStatus, error, isTimeout, isMain
349
346
 
350
347
  // this handles tests that do not go through the worker process (because they're skipped)
351
348
  if (isMainProcess) {
352
- const testResult = results[results.length - 1]
353
- const testAsyncResource = testToAr.get(test)
349
+ const testResult = results.at(-1)
350
+ const testCtx = testToCtx.get(test)
354
351
  const isAtrRetry = testResult?.retry > 0 &&
355
352
  isFlakyTestRetriesEnabled &&
356
353
  !test._ddIsAttemptToFix &&
357
354
  !test._ddIsEfdRetry
358
- testAsyncResource.runInAsyncScope(() => {
359
- testFinishCh.publish({
360
- testStatus,
361
- steps: testResult?.steps || [],
362
- isRetry: testResult?.retry > 0,
363
- error,
364
- extraTags: annotationTags,
365
- isNew: test._ddIsNew,
366
- isAttemptToFix: test._ddIsAttemptToFix,
367
- isAttemptToFixRetry: test._ddIsAttemptToFixRetry,
368
- isQuarantined: test._ddIsQuarantined,
369
- isEfdRetry: test._ddIsEfdRetry,
370
- hasFailedAllRetries: test._ddHasFailedAllRetries,
371
- hasPassedAttemptToFixRetries: test._ddHasPassedAttemptToFixRetries,
372
- hasFailedAttemptToFixRetries: test._ddHasFailedAttemptToFixRetries,
373
- isAtrRetry
374
- })
355
+ testFinishCh.publish({
356
+ testStatus,
357
+ steps: testResult?.steps || [],
358
+ isRetry: testResult?.retry > 0,
359
+ error,
360
+ extraTags: annotationTags,
361
+ isNew: test._ddIsNew,
362
+ isAttemptToFix: test._ddIsAttemptToFix,
363
+ isAttemptToFixRetry: test._ddIsAttemptToFixRetry,
364
+ isQuarantined: test._ddIsQuarantined,
365
+ isEfdRetry: test._ddIsEfdRetry,
366
+ hasFailedAllRetries: test._ddHasFailedAllRetries,
367
+ hasPassedAttemptToFixRetries: test._ddHasPassedAttemptToFixRetries,
368
+ hasFailedAttemptToFixRetries: test._ddHasFailedAttemptToFixRetries,
369
+ isAtrRetry,
370
+ isModified: test._ddIsModified,
371
+ ...testCtx.currentStore
375
372
  })
376
373
  }
377
374
 
@@ -394,17 +391,15 @@ function testEndHandler (test, annotations, testStatus, error, isTimeout, isMain
394
391
  if (!remainingTestsByFile[testSuiteAbsolutePath].length) {
395
392
  const testStatuses = testSuiteToTestStatuses.get(testSuiteAbsolutePath)
396
393
  let testSuiteStatus = 'pass'
397
- if (testStatuses.some(status => status === 'fail')) {
394
+ if (testStatuses.includes('fail')) {
398
395
  testSuiteStatus = 'fail'
399
396
  } else if (testStatuses.every(status => status === 'skip')) {
400
397
  testSuiteStatus = 'skip'
401
398
  }
402
399
 
403
400
  const suiteError = getTestSuiteError(testSuiteAbsolutePath)
404
- const testSuiteAsyncResource = testSuiteToAr.get(testSuiteAbsolutePath)
405
- testSuiteAsyncResource.runInAsyncScope(() => {
406
- testSuiteFinishCh.publish({ status: testSuiteStatus, error: suiteError })
407
- })
401
+ const testSuiteCtx = testSuiteToCtx.get(testSuiteAbsolutePath)
402
+ testSuiteFinishCh.publish({ status: testSuiteStatus, error: suiteError, ...testSuiteCtx.currentStore })
408
403
  }
409
404
  }
410
405
 
@@ -420,7 +415,7 @@ function dispatcherRunWrapperNew (run) {
420
415
  if (!this._allTests) {
421
416
  // Removed in https://github.com/microsoft/playwright/commit/1e52c37b254a441cccf332520f60225a5acc14c7
422
417
  // Not available from >=1.44.0
423
- this._ddAllTests = testGroups.map(g => g.tests).flat()
418
+ this._ddAllTests = testGroups.flatMap(g => g.tests)
424
419
  }
425
420
  remainingTestsByFile = getTestsBySuiteFromTestGroups(arguments[0])
426
421
  return run.apply(this, arguments)
@@ -442,7 +437,7 @@ function dispatcherHook (dispatcherExport) {
442
437
  const { test } = dispatcher._testById.get(params.testId)
443
438
 
444
439
  const { results } = test
445
- const testResult = results[results.length - 1]
440
+ const testResult = results.at(-1)
446
441
 
447
442
  const isTimeout = testResult.status === 'timedOut'
448
443
  testEndHandler(
@@ -478,7 +473,7 @@ function dispatcherHookNew (dispatcherExport, runWrapper) {
478
473
 
479
474
  const isTimeout = status === 'timedOut'
480
475
  testEndHandler(test, annotations, STATUS_TO_TEST_STATUS[status], errors && errors[0], isTimeout, false)
481
- const testResult = test.results[test.results.length - 1]
476
+ const testResult = test.results.at(-1)
482
477
  const isAtrRetry = testResult?.retry > 0 &&
483
478
  isFlakyTestRetriesEnabled &&
484
479
  !test._ddIsAttemptToFix &&
@@ -497,7 +492,8 @@ function dispatcherHookNew (dispatcherExport, runWrapper) {
497
492
  _ddHasFailedAllRetries: test._ddHasFailedAllRetries,
498
493
  _ddHasPassedAttemptToFixRetries: test._ddHasPassedAttemptToFixRetries,
499
494
  _ddHasFailedAttemptToFixRetries: test._ddHasFailedAttemptToFixRetries,
500
- _ddIsAtrRetry: isAtrRetry
495
+ _ddIsAtrRetry: isAtrRetry,
496
+ _ddIsModified: test._ddIsModified
501
497
  }
502
498
  })
503
499
  })
@@ -529,22 +525,24 @@ function runnerHook (runnerExport, playwrightVersion) {
529
525
  flakyTestRetriesCount = libraryConfig.flakyTestRetriesCount
530
526
  isTestManagementTestsEnabled = libraryConfig.isTestManagementEnabled
531
527
  testManagementAttemptToFixRetries = libraryConfig.testManagementAttemptToFixRetries
528
+ isImpactedTestsEnabled = libraryConfig.isImpactedTestsEnabled
532
529
  }
533
530
  } catch (e) {
534
531
  isEarlyFlakeDetectionEnabled = false
535
532
  isKnownTestsEnabled = false
536
533
  isTestManagementTestsEnabled = false
534
+ isImpactedTestsEnabled = false
537
535
  log.error('Playwright session start error', e)
538
536
  }
539
537
 
540
538
  if (isKnownTestsEnabled && satisfies(playwrightVersion, MINIMUM_SUPPORTED_VERSION_RANGE_EFD)) {
541
539
  try {
542
540
  const { err, knownTests: receivedKnownTests } = await getChannelPromise(knownTestsCh)
543
- if (!err) {
544
- knownTests = receivedKnownTests
545
- } else {
541
+ if (err) {
546
542
  isEarlyFlakeDetectionEnabled = false
547
543
  isKnownTestsEnabled = false
544
+ } else {
545
+ knownTests = receivedKnownTests
548
546
  }
549
547
  } catch (err) {
550
548
  isEarlyFlakeDetectionEnabled = false
@@ -556,10 +554,10 @@ function runnerHook (runnerExport, playwrightVersion) {
556
554
  if (isTestManagementTestsEnabled && satisfies(playwrightVersion, MINIMUM_SUPPORTED_VERSION_RANGE_EFD)) {
557
555
  try {
558
556
  const { err, testManagementTests: receivedTestManagementTests } = await getChannelPromise(testManagementTestsCh)
559
- if (!err) {
560
- testManagementTests = receivedTestManagementTests
561
- } else {
557
+ if (err) {
562
558
  isTestManagementTestsEnabled = false
559
+ } else {
560
+ testManagementTests = receivedTestManagementTests
563
561
  }
564
562
  } catch (err) {
565
563
  isTestManagementTestsEnabled = false
@@ -567,6 +565,20 @@ function runnerHook (runnerExport, playwrightVersion) {
567
565
  }
568
566
  }
569
567
 
568
+ if (isImpactedTestsEnabled && satisfies(playwrightVersion, MINIMUM_SUPPORTED_VERSION_RANGE_EFD)) {
569
+ try {
570
+ const { err, modifiedTests: receivedModifiedTests } = await getChannelPromise(impactedTestsCh)
571
+ if (err) {
572
+ isImpactedTestsEnabled = false
573
+ } else {
574
+ modifiedTests = receivedModifiedTests
575
+ }
576
+ } catch (err) {
577
+ isImpactedTestsEnabled = false
578
+ log.error('Playwright impacted tests error', err)
579
+ }
580
+ }
581
+
570
582
  const projects = getProjectsFromRunner(this)
571
583
 
572
584
  const shouldSetRetries = isFlakyTestRetriesEnabled &&
@@ -610,7 +622,7 @@ function runnerHook (runnerExport, playwrightVersion) {
610
622
  totalAttemptToFixFailedTestCount += testStatuses.filter(status => status === 'fail').length
611
623
  }
612
624
 
613
- if (totalFailedTestCount === totalAttemptToFixFailedTestCount) {
625
+ if (totalFailedTestCount > 0 && totalFailedTestCount === totalAttemptToFixFailedTestCount) {
614
626
  runAllTestsReturn = 'passed'
615
627
  }
616
628
  }
@@ -639,37 +651,38 @@ function runnerHook (runnerExport, playwrightVersion) {
639
651
  return runnerExport
640
652
  }
641
653
 
642
- addHook({
643
- name: '@playwright/test',
644
- file: 'lib/runner.js',
645
- versions: ['>=1.18.0 <=1.30.0']
646
- }, runnerHook)
647
-
648
- addHook({
649
- name: '@playwright/test',
650
- file: 'lib/dispatcher.js',
651
- versions: ['>=1.18.0 <1.30.0']
652
- }, dispatcherHook)
653
-
654
- addHook({
655
- name: '@playwright/test',
656
- file: 'lib/dispatcher.js',
657
- versions: ['>=1.30.0 <1.31.0']
658
- }, (dispatcher) => dispatcherHookNew(dispatcher, dispatcherRunWrapper))
659
-
660
- addHook({
661
- name: '@playwright/test',
662
- file: 'lib/runner/dispatcher.js',
663
- versions: ['>=1.31.0 <1.38.0']
664
- }, (dispatcher) => dispatcherHookNew(dispatcher, dispatcherRunWrapperNew))
665
-
666
- addHook({
667
- name: '@playwright/test',
668
- file: 'lib/runner/runner.js',
669
- versions: ['>=1.31.0 <1.38.0']
670
- }, runnerHook)
654
+ if (DD_MAJOR < 6) { // <1.38.0 is only supported up to version 5
655
+ addHook({
656
+ name: '@playwright/test',
657
+ file: 'lib/runner.js',
658
+ versions: ['>=1.18.0 <=1.30.0']
659
+ }, runnerHook)
660
+
661
+ addHook({
662
+ name: '@playwright/test',
663
+ file: 'lib/dispatcher.js',
664
+ versions: ['>=1.18.0 <1.30.0']
665
+ }, dispatcherHook)
666
+
667
+ addHook({
668
+ name: '@playwright/test',
669
+ file: 'lib/dispatcher.js',
670
+ versions: ['>=1.30.0 <1.31.0']
671
+ }, (dispatcher) => dispatcherHookNew(dispatcher, dispatcherRunWrapper))
672
+
673
+ addHook({
674
+ name: '@playwright/test',
675
+ file: 'lib/runner/dispatcher.js',
676
+ versions: ['>=1.31.0 <1.38.0']
677
+ }, (dispatcher) => dispatcherHookNew(dispatcher, dispatcherRunWrapperNew))
678
+
679
+ addHook({
680
+ name: '@playwright/test',
681
+ file: 'lib/runner/runner.js',
682
+ versions: ['>=1.31.0 <1.38.0']
683
+ }, runnerHook)
684
+ }
671
685
 
672
- // From >=1.38.0
673
686
  addHook({
674
687
  name: 'playwright',
675
688
  file: 'lib/runner/runner.js',
@@ -682,11 +695,10 @@ addHook({
682
695
  versions: ['>=1.38.0']
683
696
  }, (dispatcher) => dispatcherHookNew(dispatcher, dispatcherRunWrapperNew))
684
697
 
685
- // Hook used for early flake detection. EFD only works from >=1.38.0
686
698
  addHook({
687
699
  name: 'playwright',
688
700
  file: 'lib/common/suiteUtils.js',
689
- versions: [MINIMUM_SUPPORTED_VERSION_RANGE_EFD]
701
+ versions: ['>=1.38.0']
690
702
  }, suiteUtilsPackage => {
691
703
  // We grab `applyRepeatEachIndex` to use it later
692
704
  // `applyRepeatEachIndex` needs to be applied to a cloned suite
@@ -694,16 +706,15 @@ addHook({
694
706
  return suiteUtilsPackage
695
707
  })
696
708
 
697
- // Hook used for early flake detection. EFD only works from >=1.38.0
698
709
  addHook({
699
710
  name: 'playwright',
700
711
  file: 'lib/runner/loadUtils.js',
701
- versions: [MINIMUM_SUPPORTED_VERSION_RANGE_EFD]
712
+ versions: ['>=1.38.0']
702
713
  }, (loadUtilsPackage) => {
703
714
  const oldCreateRootSuite = loadUtilsPackage.createRootSuite
704
715
 
705
716
  async function newCreateRootSuite () {
706
- if (!isKnownTestsEnabled && !isTestManagementTestsEnabled) {
717
+ if (!isKnownTestsEnabled && !isTestManagementTestsEnabled && !isImpactedTestsEnabled) {
707
718
  return oldCreateRootSuite.apply(this, arguments)
708
719
  }
709
720
  const rootSuite = await oldCreateRootSuite.apply(this, arguments)
@@ -742,13 +753,41 @@ addHook({
742
753
  }
743
754
  }
744
755
 
756
+ if (isImpactedTestsEnabled) {
757
+ for (const test of allTests) {
758
+ const isNew = isKnownTestsEnabled && isNewTest(test)
759
+ const { isModified } = await getChannelPromise(isModifiedCh, {
760
+ filePath: test._requireFile,
761
+ modifiedTests
762
+ })
763
+ if (isModified) {
764
+ test._ddIsModified = true
765
+ }
766
+ if (isEarlyFlakeDetectionEnabled && test.expectedStatus !== 'skipped') {
767
+ const fileSuite = getSuiteType(test, 'file')
768
+ const projectSuite = getSuiteType(test, 'project')
769
+ // If something change in the file, all tests in the file are impacted
770
+ const isModifiedTest = () => isModified
771
+ for (let repeatEachIndex = 1; repeatEachIndex <= earlyFlakeDetectionNumRetries; repeatEachIndex++) {
772
+ const copyFileSuite = deepCloneSuite(fileSuite, isModifiedTest, [
773
+ isNew && '_ddIsNew',
774
+ '_ddIsModified',
775
+ '_ddIsEfdRetry'
776
+ ])
777
+ applyRepeatEachIndex(projectSuite._fullProject, copyFileSuite, repeatEachIndex + 1)
778
+ projectSuite._addSuite(copyFileSuite)
779
+ }
780
+ }
781
+ }
782
+ }
783
+
745
784
  if (isKnownTestsEnabled) {
746
785
  const newTests = allTests.filter(isNewTest)
747
786
 
748
787
  for (const newTest of newTests) {
749
788
  // No need to filter out attempt to fix tests here because attempt to fix tests are never new
750
789
  newTest._ddIsNew = true
751
- if (isEarlyFlakeDetectionEnabled && newTest.expectedStatus !== 'skipped') {
790
+ if (isEarlyFlakeDetectionEnabled && newTest.expectedStatus !== 'skipped' && !newTest._ddIsModified) {
752
791
  const fileSuite = getSuiteType(newTest, 'file')
753
792
  const projectSuite = getSuiteType(newTest, 'project')
754
793
  for (let repeatEachIndex = 1; repeatEachIndex <= earlyFlakeDetectionNumRetries; repeatEachIndex++) {
@@ -821,11 +860,7 @@ addHook({
821
860
  try {
822
861
  if (page) {
823
862
  const isRumActive = await page.evaluate(() => {
824
- if (window.DD_RUM && window.DD_RUM.getInternalContext) {
825
- return !!window.DD_RUM.getInternalContext()
826
- } else {
827
- return false
828
- }
863
+ return window.DD_RUM && window.DD_RUM.getInternalContext ? !!window.DD_RUM.getInternalContext() : false
829
864
  })
830
865
 
831
866
  if (isRumActive) {
@@ -835,7 +870,7 @@ addHook({
835
870
  })
836
871
  }
837
872
  }
838
- } catch (e) {
873
+ } catch {
839
874
  // ignore errors such as redirects, context destroyed, etc
840
875
  }
841
876
 
@@ -873,17 +908,16 @@ addHook({
873
908
  // If test events are created in the worker process I need to stop creating it in the main process
874
909
  // Probably yet another test worker exporter is needed in addition to the ones for mocha, jest and cucumber
875
910
  // it's probably hard to tell that's a playwright worker though, as I don't think there is a specific env variable
876
- const testAsyncResource = new AsyncResource('bound-anonymous-fn')
911
+ const testCtx = {
912
+ testName,
913
+ testSuiteAbsolutePath,
914
+ testSourceLine,
915
+ browserName
916
+ }
917
+ testToCtx.set(test, testCtx)
877
918
  // TODO - In the future we may need to implement a mechanism to send test properties
878
919
  // to the worker process before _runTest is called
879
- testAsyncResource.runInAsyncScope(() => {
880
- testStartCh.publish({
881
- testName,
882
- testSuiteAbsolutePath,
883
- testSourceLine,
884
- browserName
885
- })
886
-
920
+ testStartCh.runStores(testCtx, () => {
887
921
  let existAfterEachHook = false
888
922
 
889
923
  // We try to find an existing afterEach hook with _ddHook to avoid adding a new one
@@ -924,7 +958,7 @@ addHook({
924
958
  }
925
959
  }
926
960
  }
927
- } catch (e) {
961
+ } catch {
928
962
  // ignore errors
929
963
  }
930
964
  },
@@ -976,25 +1010,25 @@ addHook({
976
1010
  // Wait for the properties to be received
977
1011
  await ddPropertiesPromise
978
1012
 
979
- testAsyncResource.runInAsyncScope(() => {
980
- testFinishCh.publish({
981
- testStatus: STATUS_TO_TEST_STATUS[status],
982
- steps: steps.filter(step => step.testId === testId),
983
- error,
984
- extraTags: annotationTags,
985
- isNew: test._ddIsNew,
986
- isRetry: retry > 0,
987
- isEfdRetry: test._ddIsEfdRetry,
988
- isAttemptToFix: test._ddIsAttemptToFix,
989
- isDisabled: test._ddIsDisabled,
990
- isQuarantined: test._ddIsQuarantined,
991
- isAttemptToFixRetry: test._ddIsAttemptToFixRetry,
992
- hasFailedAllRetries: test._ddHasFailedAllRetries,
993
- hasPassedAttemptToFixRetries: test._ddHasPassedAttemptToFixRetries,
994
- hasFailedAttemptToFixRetries: test._ddHasFailedAttemptToFixRetries,
995
- isAtrRetry: test._ddIsAtrRetry,
996
- onDone
997
- })
1013
+ testFinishCh.publish({
1014
+ testStatus: STATUS_TO_TEST_STATUS[status],
1015
+ steps: steps.filter(step => step.testId === testId),
1016
+ error,
1017
+ extraTags: annotationTags,
1018
+ isNew: test._ddIsNew,
1019
+ isRetry: retry > 0,
1020
+ isEfdRetry: test._ddIsEfdRetry,
1021
+ isAttemptToFix: test._ddIsAttemptToFix,
1022
+ isDisabled: test._ddIsDisabled,
1023
+ isQuarantined: test._ddIsQuarantined,
1024
+ isAttemptToFixRetry: test._ddIsAttemptToFixRetry,
1025
+ hasFailedAllRetries: test._ddHasFailedAllRetries,
1026
+ hasPassedAttemptToFixRetries: test._ddHasPassedAttemptToFixRetries,
1027
+ hasFailedAttemptToFixRetries: test._ddHasFailedAttemptToFixRetries,
1028
+ isAtrRetry: test._ddIsAtrRetry,
1029
+ isModified: test._ddIsModified,
1030
+ onDone,
1031
+ ...testCtx.currentStore
998
1032
  })
999
1033
 
1000
1034
  await flushPromise
@@ -47,7 +47,7 @@ function wrapCommandQueueClass (cls) {
47
47
  if (parsed) {
48
48
  this._url = { host: parsed.hostname, port: +parsed.port || 6379 }
49
49
  }
50
- } catch (error) {
50
+ } catch {
51
51
  // ignore
52
52
  }
53
53
  }
@@ -130,8 +130,8 @@ addHook({ name: 'redis', versions: ['>=0.12 <2.6'] }, redis => {
130
130
  if (typeof callback === 'function') {
131
131
  const cb = callbackResource.bind(callback)
132
132
  arguments[2] = asyncResource.bind(wrapCallback(finishCh, errorCh, cb))
133
- } else if (Array.isArray(args) && typeof args[args.length - 1] === 'function') {
134
- const cb = callbackResource.bind(args[args.length - 1])
133
+ } else if (Array.isArray(args) && typeof args.at(-1) === 'function') {
134
+ const cb = callbackResource.bind(args.at(-1))
135
135
  args[args.length - 1] = asyncResource.bind(wrapCallback(finishCh, errorCh, cb))
136
136
  } else {
137
137
  arguments[2] = asyncResource.bind(wrapCallback(finishCh, errorCh))
@@ -20,8 +20,8 @@ function wrapSetupRequest (setupRequest) {
20
20
  }
21
21
 
22
22
  function wrapMethod (method) {
23
- return function (path) {
24
- const middleware = wrapMiddleware(Array.prototype.slice.call(arguments, 1))
23
+ return function (path, ...rest) {
24
+ const middleware = wrapMiddleware(rest)
25
25
 
26
26
  return method.apply(this, [path].concat(middleware))
27
27
  }