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
@@ -12,6 +12,7 @@ const isNewTestCh = channel('ci:vitest:test:is-new')
12
12
  const isAttemptToFixCh = channel('ci:vitest:test:is-attempt-to-fix')
13
13
  const isDisabledCh = channel('ci:vitest:test:is-disabled')
14
14
  const isQuarantinedCh = channel('ci:vitest:test:is-quarantined')
15
+ const isModifiedCh = channel('ci:vitest:test:is-modified')
15
16
 
16
17
  // test suite hooks
17
18
  const testSuiteStartCh = channel('ci:vitest:test-suite:start')
@@ -25,13 +26,15 @@ const libraryConfigurationCh = channel('ci:vitest:library-configuration')
25
26
  const knownTestsCh = channel('ci:vitest:known-tests')
26
27
  const isEarlyFlakeDetectionFaultyCh = channel('ci:vitest:is-early-flake-detection-faulty')
27
28
  const testManagementTestsCh = channel('ci:vitest:test-management-tests')
29
+ const impactedTestsCh = channel('ci:vitest:modified-tests')
28
30
 
29
- const taskToAsync = new WeakMap()
31
+ const taskToCtx = new WeakMap()
30
32
  const taskToStatuses = new WeakMap()
31
33
  const newTasks = new WeakSet()
32
34
  const disabledTasks = new WeakSet()
33
35
  const quarantinedTasks = new WeakSet()
34
36
  const attemptToFixTasks = new WeakSet()
37
+ const modifiedTasks = new WeakSet()
35
38
  let isRetryReasonEfd = false
36
39
  let isRetryReasonAttemptToFix = false
37
40
  const switchedStatuses = new WeakSet()
@@ -58,7 +61,9 @@ function getProvidedContext () {
58
61
  _ddIsTestManagementTestsEnabled: isTestManagementTestsEnabled,
59
62
  _ddTestManagementAttemptToFixRetries: testManagementAttemptToFixRetries,
60
63
  _ddTestManagementTests: testManagementTests,
61
- _ddIsFlakyTestRetriesEnabled: isFlakyTestRetriesEnabled
64
+ _ddIsFlakyTestRetriesEnabled: isFlakyTestRetriesEnabled,
65
+ _ddIsImpactedTestsEnabled: isImpactedTestsEnabled,
66
+ _ddModifiedTests: modifiedTests
62
67
  } = globalThis.__vitest_worker__.providedContext
63
68
 
64
69
  return {
@@ -70,9 +75,11 @@ function getProvidedContext () {
70
75
  isTestManagementTestsEnabled,
71
76
  testManagementAttemptToFixRetries,
72
77
  testManagementTests,
73
- isFlakyTestRetriesEnabled
78
+ isFlakyTestRetriesEnabled,
79
+ isImpactedTestsEnabled,
80
+ modifiedTests
74
81
  }
75
- } catch (e) {
82
+ } catch {
76
83
  log.error('Vitest workers could not parse provided context, so some features will not work.')
77
84
  return {
78
85
  isDiEnabled: false,
@@ -83,7 +90,9 @@ function getProvidedContext () {
83
90
  isTestManagementTestsEnabled: false,
84
91
  testManagementAttemptToFixRetries: 0,
85
92
  testManagementTests: {},
86
- isFlakyTestRetriesEnabled: false
93
+ isFlakyTestRetriesEnabled: false,
94
+ isImpactedTestsEnabled: false,
95
+ modifiedTests: {}
87
96
  }
88
97
  }
89
98
  }
@@ -123,7 +132,6 @@ function getSessionStatus (state) {
123
132
  return 'pass'
124
133
  }
125
134
 
126
- // eslint-disable-next-line
127
135
  // From https://github.com/vitest-dev/vitest/blob/51c04e2f44d91322b334f8ccbcdb368facc3f8ec/packages/runner/src/run.ts#L243-L250
128
136
  function getVitestTestStatus (test, retryCount) {
129
137
  if (test.result.state !== 'fail') {
@@ -183,10 +191,12 @@ function getSortWrapper (sort) {
183
191
  let isEarlyFlakeDetectionFaulty = false
184
192
  let isKnownTestsEnabled = false
185
193
  let isTestManagementTestsEnabled = false
194
+ let isImpactedTestsEnabled = false
186
195
  let testManagementAttemptToFixRetries = 0
187
196
  let isDiEnabled = false
188
197
  let knownTests = {}
189
198
  let testManagementTests = {}
199
+ let modifiedTests = {}
190
200
 
191
201
  try {
192
202
  const { err, libraryConfig } = await getChannelPromise(libraryConfigurationCh)
@@ -199,12 +209,14 @@ function getSortWrapper (sort) {
199
209
  isKnownTestsEnabled = libraryConfig.isKnownTestsEnabled
200
210
  isTestManagementTestsEnabled = libraryConfig.isTestManagementEnabled
201
211
  testManagementAttemptToFixRetries = libraryConfig.testManagementAttemptToFixRetries
212
+ isImpactedTestsEnabled = libraryConfig.isImpactedTestsEnabled
202
213
  }
203
- } catch (e) {
214
+ } catch {
204
215
  isFlakyTestRetriesEnabled = false
205
216
  isEarlyFlakeDetectionEnabled = false
206
217
  isDiEnabled = false
207
218
  isKnownTestsEnabled = false
219
+ isImpactedTestsEnabled = false
208
220
  }
209
221
 
210
222
  if (isFlakyTestRetriesEnabled && !this.ctx.config.retry && flakyTestRetriesCount > 0) {
@@ -212,14 +224,17 @@ function getSortWrapper (sort) {
212
224
  try {
213
225
  const workspaceProject = this.ctx.getCoreWorkspaceProject()
214
226
  workspaceProject._provided._ddIsFlakyTestRetriesEnabled = isFlakyTestRetriesEnabled
215
- } catch (e) {
227
+ } catch {
216
228
  log.warn('Could not send library configuration to workers.')
217
229
  }
218
230
  }
219
231
 
220
232
  if (isKnownTestsEnabled) {
221
233
  const knownTestsResponse = await getChannelPromise(knownTestsCh)
222
- if (!knownTestsResponse.err) {
234
+ if (knownTestsResponse.err) {
235
+ isEarlyFlakeDetectionEnabled = false
236
+ isKnownTestsEnabled = false
237
+ } else {
223
238
  knownTests = knownTestsResponse.knownTests
224
239
  const getFilePaths = this.ctx.getTestFilepaths || this.ctx._globTestFilepaths
225
240
 
@@ -245,13 +260,10 @@ function getSortWrapper (sort) {
245
260
  workspaceProject._provided._ddKnownTests = knownTests.vitest || {}
246
261
  workspaceProject._provided._ddIsEarlyFlakeDetectionEnabled = isEarlyFlakeDetectionEnabled
247
262
  workspaceProject._provided._ddEarlyFlakeDetectionNumRetries = earlyFlakeDetectionNumRetries
248
- } catch (e) {
263
+ } catch {
249
264
  log.warn('Could not send known tests to workers so Early Flake Detection will not work.')
250
265
  }
251
266
  }
252
- } else {
253
- isEarlyFlakeDetectionEnabled = false
254
- isKnownTestsEnabled = false
255
267
  }
256
268
  }
257
269
 
@@ -259,26 +271,43 @@ function getSortWrapper (sort) {
259
271
  try {
260
272
  const workspaceProject = this.ctx.getCoreWorkspaceProject()
261
273
  workspaceProject._provided._ddIsDiEnabled = isDiEnabled
262
- } catch (e) {
274
+ } catch {
263
275
  log.warn('Could not send Dynamic Instrumentation configuration to workers.')
264
276
  }
265
277
  }
266
278
 
267
279
  if (isTestManagementTestsEnabled) {
268
280
  const { err, testManagementTests: receivedTestManagementTests } = await getChannelPromise(testManagementTestsCh)
269
- if (!err) {
281
+ if (err) {
282
+ isTestManagementTestsEnabled = false
283
+ log.error('Could not get test management tests.')
284
+ } else {
270
285
  testManagementTests = receivedTestManagementTests
271
286
  try {
272
287
  const workspaceProject = this.ctx.getCoreWorkspaceProject()
273
288
  workspaceProject._provided._ddIsTestManagementTestsEnabled = isTestManagementTestsEnabled
274
289
  workspaceProject._provided._ddTestManagementAttemptToFixRetries = testManagementAttemptToFixRetries
275
290
  workspaceProject._provided._ddTestManagementTests = testManagementTests
276
- } catch (e) {
291
+ } catch {
277
292
  log.warn('Could not send test management tests to workers so Test Management will not work.')
278
293
  }
294
+ }
295
+ }
296
+
297
+ if (isImpactedTestsEnabled) {
298
+ const { err, modifiedTests: receivedModifiedTests } = await getChannelPromise(impactedTestsCh)
299
+ if (err) {
300
+ isImpactedTestsEnabled = false
301
+ log.error('Could not get modified tests.')
279
302
  } else {
280
- isTestManagementTestsEnabled = false
281
- log.error('Could not get test management tests.')
303
+ modifiedTests = receivedModifiedTests
304
+ try {
305
+ const workspaceProject = this.ctx.getCoreWorkspaceProject()
306
+ workspaceProject._provided._ddIsImpactedTestsEnabled = isImpactedTestsEnabled
307
+ workspaceProject._provided._ddModifiedTests = modifiedTests
308
+ } catch {
309
+ log.warn('Could not send modified tests to workers so Impacted Tests will not work.')
310
+ }
282
311
  }
283
312
  }
284
313
 
@@ -290,7 +319,7 @@ function getSortWrapper (sort) {
290
319
 
291
320
  try {
292
321
  testCodeCoverageLinesTotal = totalCodeCoverage.getCoverageSummary().lines.pct
293
- } catch (e) {
322
+ } catch {
294
323
  // ignore errors
295
324
  }
296
325
  return totalCodeCoverage
@@ -364,7 +393,9 @@ addHook({
364
393
  numRepeats,
365
394
  isTestManagementTestsEnabled,
366
395
  testManagementAttemptToFixRetries,
367
- testManagementTests
396
+ testManagementTests,
397
+ isImpactedTestsEnabled,
398
+ modifiedTests
368
399
  } = getProvidedContext()
369
400
 
370
401
  if (isTestManagementTestsEnabled) {
@@ -397,6 +428,23 @@ addHook({
397
428
  })
398
429
  }
399
430
 
431
+ if (isImpactedTestsEnabled) {
432
+ isModifiedCh.publish({
433
+ modifiedTests,
434
+ testSuiteAbsolutePath: task.file.filepath,
435
+ onDone: (isImpacted) => {
436
+ if (isImpacted) {
437
+ if (isEarlyFlakeDetectionEnabled) {
438
+ isRetryReasonEfd = task.repeats !== numRepeats
439
+ task.repeats = numRepeats
440
+ }
441
+ modifiedTasks.add(task)
442
+ taskToStatuses.set(task, [])
443
+ }
444
+ }
445
+ })
446
+ }
447
+
400
448
  if (isKnownTestsEnabled) {
401
449
  isNewTestCh.publish({
402
450
  knownTests,
@@ -404,7 +452,7 @@ addHook({
404
452
  testName,
405
453
  onDone: (isNew) => {
406
454
  if (isNew && !attemptToFixTasks.has(task)) {
407
- if (isEarlyFlakeDetectionEnabled) {
455
+ if (isEarlyFlakeDetectionEnabled && !modifiedTasks.has(task)) {
408
456
  isRetryReasonEfd = task.repeats !== numRepeats
409
457
  task.repeats = numRepeats
410
458
  }
@@ -455,7 +503,7 @@ addHook({
455
503
  // test start (only tests that are not marked as skip or todo)
456
504
  // `onBeforeTryTask` is run for every repetition and attempt of the test
457
505
  shimmer.wrap(VitestTestRunner.prototype, 'onBeforeTryTask', onBeforeTryTask => async function (task, retryInfo) {
458
- if (!testStartCh.hasSubscribers) {
506
+ if (!testPassCh.hasSubscribers && !testErrorCh.hasSubscribers && !testSkipCh.hasSubscribers) {
459
507
  return onBeforeTryTask.apply(this, arguments)
460
508
  }
461
509
  const testName = getTestName(task)
@@ -500,15 +548,14 @@ addHook({
500
548
 
501
549
  const promises = {}
502
550
  const shouldSetProbe = isDiEnabled && numAttempt === 1
503
- const asyncResource = taskToAsync.get(task)
551
+ const ctx = taskToCtx.get(task)
504
552
  const testError = task.result?.errors?.[0]
505
- if (asyncResource) {
506
- asyncResource.runInAsyncScope(() => {
507
- testErrorCh.publish({
508
- error: testError,
509
- shouldSetProbe,
510
- promises
511
- })
553
+ if (ctx) {
554
+ testErrorCh.publish({
555
+ error: testError,
556
+ shouldSetProbe,
557
+ promises,
558
+ ...ctx.currentStore
512
559
  })
513
560
  // We wait for the probe to be set
514
561
  if (promises.setProbePromise) {
@@ -528,17 +575,13 @@ addHook({
528
575
  // as long as it's not the _last_ iteration (which will be finished normally)
529
576
 
530
577
  // TODO: check test duration (not to repeat if it's too slow)
531
- const asyncResource = taskToAsync.get(task)
532
- if (asyncResource) {
578
+ const ctx = taskToCtx.get(task)
579
+ if (ctx) {
533
580
  if (lastExecutionStatus === 'fail') {
534
581
  const testError = task.result?.errors?.[0]
535
- asyncResource.runInAsyncScope(() => {
536
- testErrorCh.publish({ error: testError })
537
- })
582
+ testErrorCh.publish({ error: testError, ...ctx.currentStore })
538
583
  } else {
539
- asyncResource.runInAsyncScope(() => {
540
- testPassCh.publish({ task })
541
- })
584
+ testPassCh.publish({ task, ...ctx.currentStore })
542
585
  }
543
586
  if (shouldFlipStatus) {
544
587
  statuses.push(lastExecutionStatus)
@@ -555,16 +598,12 @@ addHook({
555
598
  statuses.push(lastExecutionStatus)
556
599
  }
557
600
 
558
- const asyncResource = taskToAsync.get(task)
601
+ const ctx = taskToCtx.get(task)
559
602
  if (lastExecutionStatus === 'fail') {
560
603
  const testError = task.result?.errors?.[0]
561
- asyncResource.runInAsyncScope(() => {
562
- testErrorCh.publish({ error: testError })
563
- })
604
+ testErrorCh.publish({ error: testError, ...ctx.currentStore })
564
605
  } else {
565
- asyncResource.runInAsyncScope(() => {
566
- testPassCh.publish({ task })
567
- })
606
+ testPassCh.publish({ task, ...ctx.currentStore })
568
607
  }
569
608
  }
570
609
 
@@ -573,31 +612,30 @@ addHook({
573
612
  !isRetryReasonAttemptToFix &&
574
613
  !isRetryReasonEfd
575
614
 
576
- const asyncResource = new AsyncResource('bound-anonymous-fn')
577
- taskToAsync.set(task, asyncResource)
615
+ const ctx = {
616
+ testName,
617
+ testSuiteAbsolutePath: task.file.filepath,
618
+ isRetry: numAttempt > 0 || numRepetition > 0,
619
+ isRetryReasonEfd,
620
+ isRetryReasonAttemptToFix: isRetryReasonAttemptToFix && numRepetition > 0,
621
+ isNew,
622
+ mightHitProbe: isDiEnabled && numAttempt > 0,
623
+ isAttemptToFix: attemptToFixTasks.has(task),
624
+ isDisabled: disabledTasks.has(task),
625
+ isQuarantined,
626
+ isRetryReasonAtr,
627
+ isModified: modifiedTasks.has(task)
628
+ }
629
+ taskToCtx.set(task, ctx)
578
630
 
579
- asyncResource.runInAsyncScope(() => {
580
- testStartCh.publish({
581
- testName,
582
- testSuiteAbsolutePath: task.file.filepath,
583
- isRetry: numAttempt > 0 || numRepetition > 0,
584
- isRetryReasonEfd,
585
- isRetryReasonAttemptToFix: isRetryReasonAttemptToFix && numRepetition > 0,
586
- isNew,
587
- mightHitProbe: isDiEnabled && numAttempt > 0,
588
- isAttemptToFix: attemptToFixTasks.has(task),
589
- isDisabled: disabledTasks.has(task),
590
- isQuarantined,
591
- isRetryReasonAtr
592
- })
593
- })
631
+ testStartCh.runStores(ctx, () => {})
594
632
  return onBeforeTryTask.apply(this, arguments)
595
633
  })
596
634
 
597
635
  // test finish (only passed tests)
598
636
  shimmer.wrap(VitestTestRunner.prototype, 'onAfterTryTask', onAfterTryTask =>
599
637
  async function (task, { retry: retryCount }) {
600
- if (!testFinishTimeCh.hasSubscribers) {
638
+ if (!testPassCh.hasSubscribers && !testErrorCh.hasSubscribers && !testSkipCh.hasSubscribers) {
601
639
  return onAfterTryTask.apply(this, arguments)
602
640
  }
603
641
  const result = await onAfterTryTask.apply(this, arguments)
@@ -605,7 +643,7 @@ addHook({
605
643
  const { testManagementAttemptToFixRetries } = getProvidedContext()
606
644
 
607
645
  const status = getVitestTestStatus(task, retryCount)
608
- const asyncResource = taskToAsync.get(task)
646
+ const ctx = taskToCtx.get(task)
609
647
 
610
648
  const { isDiEnabled } = getProvidedContext()
611
649
 
@@ -620,17 +658,19 @@ addHook({
620
658
  if (statuses.length === testManagementAttemptToFixRetries) {
621
659
  if (statuses.every(status => status === 'pass')) {
622
660
  attemptToFixPassed = true
623
- } else if (statuses.some(status => status === 'fail')) {
661
+ } else if (statuses.includes('fail')) {
624
662
  attemptToFixFailed = true
625
663
  }
626
664
  }
627
665
  }
628
666
 
629
- if (asyncResource) {
667
+ if (ctx) {
630
668
  // We don't finish here because the test might fail in a later hook (afterEach)
631
- asyncResource.runInAsyncScope(() => {
632
- testFinishTimeCh.publish({ status, task, attemptToFixPassed, attemptToFixFailed })
633
- })
669
+ ctx.status = status
670
+ ctx.task = task
671
+ ctx.attemptToFixPassed = attemptToFixPassed
672
+ ctx.attemptToFixFailed = attemptToFixFailed
673
+ testFinishTimeCh.runStores(ctx, () => {})
634
674
  }
635
675
 
636
676
  return result
@@ -728,19 +768,14 @@ addHook({
728
768
  }, (vitestPackage, frameworkVersion) => {
729
769
  shimmer.wrap(vitestPackage, 'startTests', startTests => async function (testPaths) {
730
770
  let testSuiteError = null
731
- if (!testSuiteStartCh.hasSubscribers) {
771
+ if (!testSuiteFinishCh.hasSubscribers) {
732
772
  return startTests.apply(this, arguments)
733
773
  }
734
774
  // From >=3.0.1, the first arguments changes from a string to an object containing the filepath
735
775
  const testSuiteAbsolutePath = testPaths[0]?.filepath || testPaths[0]
736
776
 
737
- const testSuiteAsyncResource = new AsyncResource('bound-anonymous-fn')
738
- testSuiteAsyncResource.runInAsyncScope(() => {
739
- testSuiteStartCh.publish({
740
- testSuiteAbsolutePath,
741
- frameworkVersion
742
- })
743
- })
777
+ const testSuiteCtx = { testSuiteAbsolutePath, frameworkVersion }
778
+ testSuiteStartCh.runStores(testSuiteCtx, () => {})
744
779
  const startTestsResponse = await startTests.apply(this, arguments)
745
780
 
746
781
  let onFinish = null
@@ -752,7 +787,7 @@ addHook({
752
787
 
753
788
  // Only one test task per test, even if there are retries
754
789
  testTasks.forEach(task => {
755
- const testAsyncResource = taskToAsync.get(task)
790
+ const testCtx = taskToCtx.get(task)
756
791
  const { result } = task
757
792
  // We have to trick vitest into thinking that the test has passed
758
793
  // but we want to report it as failed if it did fail
@@ -768,10 +803,8 @@ addHook({
768
803
  isDisabled: disabledTasks.has(task)
769
804
  })
770
805
  } else if (state === 'pass' && !isSwitchedStatus) {
771
- if (testAsyncResource) {
772
- testAsyncResource.runInAsyncScope(() => {
773
- testPassCh.publish({ task })
774
- })
806
+ if (testCtx) {
807
+ testPassCh.publish({ task, ...testCtx.currentStore })
775
808
  }
776
809
  } else if (state === 'fail' || isSwitchedStatus) {
777
810
  let testError
@@ -784,7 +817,7 @@ addHook({
784
817
  let attemptToFixFailed = false
785
818
  if (attemptToFixTasks.has(task)) {
786
819
  const statuses = taskToStatuses.get(task)
787
- if (statuses.some(status => status === 'fail')) {
820
+ if (statuses.includes('fail')) {
788
821
  attemptToFixFailed = true
789
822
  }
790
823
  if (statuses.every(status => status === 'fail')) {
@@ -792,16 +825,15 @@ addHook({
792
825
  }
793
826
  }
794
827
 
795
- if (testAsyncResource) {
828
+ if (testCtx) {
796
829
  const isRetry = task.result?.retryCount > 0
797
830
  // `duration` is the duration of all the retries, so it can't be used if there are retries
798
- testAsyncResource.runInAsyncScope(() => {
799
- testErrorCh.publish({
800
- duration: !isRetry ? duration : undefined,
801
- error: testError,
802
- hasFailedAllRetries,
803
- attemptToFixFailed
804
- })
831
+ testErrorCh.publish({
832
+ duration: isRetry ? undefined : duration,
833
+ error: testError,
834
+ hasFailedAllRetries,
835
+ attemptToFixFailed,
836
+ ...testCtx.currentStore
805
837
  })
806
838
  }
807
839
  if (errors?.length) {
@@ -831,14 +863,11 @@ addHook({
831
863
  }
832
864
 
833
865
  if (testSuiteError) {
834
- testSuiteAsyncResource.runInAsyncScope(() => {
835
- testSuiteErrorCh.publish({ error: testSuiteError })
836
- })
866
+ testSuiteCtx.error = testSuiteError
867
+ testSuiteErrorCh.runStores(testSuiteCtx, () => {})
837
868
  }
838
869
 
839
- testSuiteAsyncResource.runInAsyncScope(() => {
840
- testSuiteFinishCh.publish({ status: testSuiteResult.state, onFinish })
841
- })
870
+ testSuiteFinishCh.publish({ status: testSuiteResult.state, onFinish, ...testSuiteCtx.currentStore })
842
871
 
843
872
  // TODO: fix too frequent flushes
844
873
  await onFinishPromise
@@ -7,12 +7,14 @@ class Amqp10ConsumerPlugin extends ConsumerPlugin {
7
7
  static get id () { return 'amqp10' }
8
8
  static get system () { return 'amqp' }
9
9
 
10
- start ({ link }) {
10
+ bindStart (ctx) {
11
+ const { link } = ctx
12
+
11
13
  const source = getShortName(link)
12
14
  const address = getAddress(link)
13
15
 
14
16
  this.startSpan({
15
- resource: ['receive', source].filter(v => v).join(' '),
17
+ resource: ['receive', source].filter(Boolean).join(' '),
16
18
  type: 'worker',
17
19
  meta: {
18
20
  'amqp.link.source.address': source,
@@ -23,7 +25,9 @@ class Amqp10ConsumerPlugin extends ConsumerPlugin {
23
25
  'amqp.connection.port': address.port,
24
26
  'amqp.connection.user': address.user
25
27
  }
26
- })
28
+ }, ctx)
29
+
30
+ return ctx.currentStore
27
31
  }
28
32
  }
29
33
 
@@ -9,12 +9,14 @@ class Amqp10ProducerPlugin extends ProducerPlugin {
9
9
  static get operation () { return 'send' }
10
10
  static get system () { return 'amqp' }
11
11
 
12
- start ({ link }) {
12
+ bindStart (ctx) {
13
+ const { link } = ctx
14
+
13
15
  const address = getAddress(link)
14
16
  const target = getShortName(link)
15
17
 
16
18
  this.startSpan({
17
- resource: ['send', target].filter(v => v).join(' '),
19
+ resource: ['send', target].filter(Boolean).join(' '),
18
20
  meta: {
19
21
  'amqp.link.target.address': target,
20
22
  'amqp.link.role': 'sender',
@@ -26,7 +28,9 @@ class Amqp10ProducerPlugin extends ProducerPlugin {
26
28
  'amqp.connection.port': address.port,
27
29
  'amqp.connection.user': address.user
28
30
  }
29
- })
31
+ }, ctx)
32
+
33
+ return ctx.currentStore
30
34
  }
31
35
  }
32
36
 
@@ -10,7 +10,9 @@ class AmqplibClientPlugin extends ClientPlugin {
10
10
  static get type () { return 'messaging' }
11
11
  static get operation () { return 'command' }
12
12
 
13
- start ({ channel = {}, method, fields }) {
13
+ bindStart (ctx) {
14
+ const { channel = {}, method, fields } = ctx
15
+
14
16
  if (method === 'basic.deliver' || method === 'basic.get') return
15
17
  if (method === 'basic.publish') return
16
18
 
@@ -29,11 +31,13 @@ class AmqplibClientPlugin extends ClientPlugin {
29
31
  'amqp.source': fields.source,
30
32
  'amqp.destination': fields.destination
31
33
  }
32
- })
34
+ }, ctx)
33
35
 
34
36
  fields.headers = fields.headers || {}
35
37
 
36
38
  this.tracer.inject(span, TEXT_MAP, fields.headers)
39
+
40
+ return ctx.currentStore
37
41
  }
38
42
  }
39
43
 
@@ -7,9 +7,11 @@ const { getResourceName } = require('./util')
7
7
 
8
8
  class AmqplibConsumerPlugin extends ConsumerPlugin {
9
9
  static get id () { return 'amqplib' }
10
- static get operation () { return 'command' }
10
+ static get operation () { return 'consume' }
11
+
12
+ bindStart (ctx) {
13
+ const { method, fields, message, queue } = ctx
11
14
 
12
- start ({ method, fields, message, queue }) {
13
15
  if (method !== 'basic.deliver' && method !== 'basic.get') return
14
16
 
15
17
  const childOf = extract(this.tracer, message)
@@ -27,7 +29,7 @@ class AmqplibConsumerPlugin extends ConsumerPlugin {
27
29
  'amqp.source': fields.source,
28
30
  'amqp.destination': fields.destination
29
31
  }
30
- })
32
+ }, ctx)
31
33
 
32
34
  if (
33
35
  this.config.dsmEnabled && message?.properties?.headers
@@ -37,6 +39,8 @@ class AmqplibConsumerPlugin extends ConsumerPlugin {
37
39
  this.tracer
38
40
  .setCheckpoint(['direction:in', `topic:${queueName}`, 'type:rabbitmq'], span, payloadSize)
39
41
  }
42
+
43
+ return ctx.currentStore
40
44
  }
41
45
  }
42
46
 
@@ -8,9 +8,11 @@ const { getResourceName } = require('./util')
8
8
 
9
9
  class AmqplibProducerPlugin extends ProducerPlugin {
10
10
  static get id () { return 'amqplib' }
11
- static get operation () { return 'command' }
11
+ static get operation () { return 'publish' }
12
+
13
+ bindStart (ctx) {
14
+ const { channel = {}, method, fields, message } = ctx
12
15
 
13
- start ({ channel = {}, method, fields, message }) {
14
16
  if (method !== 'basic.publish') return
15
17
 
16
18
  const stream = (channel.connection && channel.connection.stream) || {}
@@ -26,7 +28,7 @@ class AmqplibProducerPlugin extends ProducerPlugin {
26
28
  'amqp.source': fields.source,
27
29
  'amqp.destination': fields.destination
28
30
  }
29
- })
31
+ }, ctx)
30
32
 
31
33
  fields.headers = fields.headers || {}
32
34
 
@@ -49,6 +51,8 @@ class AmqplibProducerPlugin extends ProducerPlugin {
49
51
  , span, payloadSize)
50
52
  DsmPathwayCodec.encode(dataStreamsContext, fields.headers)
51
53
  }
54
+
55
+ return ctx.currentStore
52
56
  }
53
57
  }
54
58
 
@@ -8,7 +8,7 @@ function getResourceName (method, fields = {}) {
8
8
  fields.queue,
9
9
  fields.source,
10
10
  fields.destination
11
- ].filter(val => val).join(' ')
11
+ ].filter(Boolean).join(' ')
12
12
  }
13
13
 
14
14
  module.exports = { getResourceName }
@@ -58,9 +58,8 @@ class ApolloGatewayRequestPlugin extends ApolloBasePlugin {
58
58
  const errors = ctx?.result?.errors
59
59
  // apollo gateway catches certain errors and returns them in the result object
60
60
  // we want to capture these errors as spans
61
- if (errors instanceof Array &&
62
- errors[errors.length - 1] && errors[errors.length - 1].stack && errors[errors.length - 1].message) {
63
- ctx.currentStore.span.setTag('error', errors[errors.length - 1])
61
+ if (Array.isArray(errors) && errors.at(-1)?.stack && errors.at(-1).message) {
62
+ ctx.currentStore.span.setTag('error', errors.at(-1))
64
63
  }
65
64
  ctx.currentStore.span.finish()
66
65
  return ctx.parentStore
@@ -91,7 +90,7 @@ function buildOperationContext (schema, operationDocument, operationName) {
91
90
  break
92
91
  }
93
92
  })
94
- } catch (e) {
93
+ } catch {
95
94
  // safety net
96
95
  }
97
96
 
@@ -113,12 +112,12 @@ function getSignature (document, operationName, operationType, calculate) {
113
112
  }
114
113
 
115
114
  return tools.defaultEngineReportingSignature(document, operationName)
116
- } catch (e) {
115
+ } catch {
117
116
  // safety net
118
117
  }
119
118
  }
120
119
 
121
- return [operationType, operationName].filter(val => val).join(' ')
120
+ return [operationType, operationName].filter(Boolean).join(' ')
122
121
  }
123
122
 
124
123
  module.exports = ApolloGatewayRequestPlugin