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
@@ -20,7 +20,7 @@ class OracledbPlugin extends DatabasePlugin {
20
20
  kind: 'client',
21
21
  meta: {
22
22
  'db.user': this.config.user,
23
- 'db.instance': url.pathname && url.pathname.substring(1),
23
+ 'db.instance': url.pathname && url.pathname.slice(1),
24
24
  'db.hostname': url.hostname,
25
25
  [CLIENT_PORT_KEY]: url.port
26
26
  }
@@ -34,7 +34,9 @@ const {
34
34
  TEST_NAME,
35
35
  TEST_IS_RUM_ACTIVE,
36
36
  TEST_BROWSER_VERSION,
37
- TEST_RETRY_REASON_TYPES
37
+ TEST_RETRY_REASON_TYPES,
38
+ TEST_IS_MODIFIED,
39
+ isModifiedTest
38
40
  } = require('../../dd-trace/src/plugins/util/test')
39
41
  const { RESOURCE_NAME } = require('../../../ext/tags')
40
42
  const { COMPONENT } = require('../../dd-trace/src/constants')
@@ -56,6 +58,16 @@ class PlaywrightPlugin extends CiPlugin {
56
58
  this.numFailedTests = 0
57
59
  this.numFailedSuites = 0
58
60
 
61
+ this.addSub('ci:playwright:test:is-modified', ({
62
+ filePath,
63
+ modifiedTests,
64
+ onDone
65
+ }) => {
66
+ const testSuite = getTestSuitePath(filePath, this.repositoryRoot)
67
+ const isModified = isModifiedTest(testSuite, 0, 0, modifiedTests, this.constructor.id)
68
+ onDone({ isModified })
69
+ })
70
+
59
71
  this.addSub('ci:playwright:session:finish', ({
60
72
  status,
61
73
  isEarlyFlakeDetectionEnabled,
@@ -97,7 +109,9 @@ class PlaywrightPlugin extends CiPlugin {
97
109
  this.numFailedTests = 0
98
110
  })
99
111
 
100
- this.addSub('ci:playwright:test-suite:start', (testSuiteAbsolutePath) => {
112
+ this.addBind('ci:playwright:test-suite:start', (ctx) => {
113
+ const { testSuiteAbsolutePath } = ctx
114
+
101
115
  const store = storage('legacy').getStore()
102
116
  const testSuite = getTestSuitePath(testSuiteAbsolutePath, this.rootDir)
103
117
  const testSourceFile = getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
@@ -126,27 +140,28 @@ class PlaywrightPlugin extends CiPlugin {
126
140
  }
127
141
  })
128
142
  this.telemetry.ciVisEvent(TELEMETRY_EVENT_CREATED, 'suite')
129
- this.enter(testSuiteSpan, store)
143
+ ctx.parentStore = store
144
+ ctx.currentStore = { ...store, testSuiteSpan }
130
145
 
131
146
  this._testSuites.set(testSuiteAbsolutePath, testSuiteSpan)
147
+
148
+ return ctx.currentStore
132
149
  })
133
150
 
134
- this.addSub('ci:playwright:test-suite:finish', ({ status, error }) => {
135
- const store = storage('legacy').getStore()
136
- const span = store && store.span
137
- if (!span) return
151
+ this.addSub('ci:playwright:test-suite:finish', ({ testSuiteSpan, status, error }) => {
152
+ if (!testSuiteSpan) return
138
153
  if (error) {
139
- span.setTag('error', error)
140
- span.setTag(TEST_STATUS, 'fail')
154
+ testSuiteSpan.setTag('error', error)
155
+ testSuiteSpan.setTag(TEST_STATUS, 'fail')
141
156
  } else {
142
- span.setTag(TEST_STATUS, status)
157
+ testSuiteSpan.setTag(TEST_STATUS, status)
143
158
  }
144
159
 
145
160
  if (status === 'fail' || error) {
146
161
  this.numFailedSuites++
147
162
  }
148
163
 
149
- span.finish()
164
+ testSuiteSpan.finish()
150
165
  this.telemetry.ciVisEvent(TELEMETRY_EVENT_FINISHED, 'suite')
151
166
  })
152
167
 
@@ -180,13 +195,14 @@ class PlaywrightPlugin extends CiPlugin {
180
195
  }
181
196
  })
182
197
 
183
- this.addSub('ci:playwright:test:start', ({
184
- testName,
185
- testSuiteAbsolutePath,
186
- testSourceLine,
187
- browserName,
188
- isDisabled
189
- }) => {
198
+ this.addBind('ci:playwright:test:start', (ctx) => {
199
+ const {
200
+ testName,
201
+ testSuiteAbsolutePath,
202
+ testSourceLine,
203
+ browserName,
204
+ isDisabled
205
+ } = ctx
190
206
  const store = storage('legacy').getStore()
191
207
  const testSuite = getTestSuitePath(testSuiteAbsolutePath, this.rootDir)
192
208
  const testSourceFile = getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
@@ -203,7 +219,10 @@ class PlaywrightPlugin extends CiPlugin {
203
219
  span.setTag(TEST_MANAGEMENT_IS_DISABLED, 'true')
204
220
  }
205
221
 
206
- this.enter(span, store)
222
+ ctx.parentStore = store
223
+ ctx.currentStore = { ...store, span }
224
+
225
+ return ctx.currentStore
207
226
  })
208
227
 
209
228
  this.addSub('ci:playwright:worker:report', (serializedTraces) => {
@@ -254,6 +273,7 @@ class PlaywrightPlugin extends CiPlugin {
254
273
  })
255
274
 
256
275
  this.addSub('ci:playwright:test:finish', ({
276
+ span,
257
277
  testStatus,
258
278
  steps,
259
279
  error,
@@ -269,10 +289,9 @@ class PlaywrightPlugin extends CiPlugin {
269
289
  hasPassedAttemptToFixRetries,
270
290
  hasFailedAttemptToFixRetries,
271
291
  isAtrRetry,
292
+ isModified,
272
293
  onDone
273
294
  }) => {
274
- const store = storage('legacy').getStore()
275
- const span = store && store.span
276
295
  if (!span) return
277
296
 
278
297
  const isRUMActive = span.context()._tags[TEST_IS_RUM_ACTIVE]
@@ -321,6 +340,13 @@ class PlaywrightPlugin extends CiPlugin {
321
340
  if (isQuarantined) {
322
341
  span.setTag(TEST_MANAGEMENT_IS_QUARANTINED, 'true')
323
342
  }
343
+ if (isModified) {
344
+ span.setTag(TEST_IS_MODIFIED, 'true')
345
+ if (isEfdRetry) {
346
+ span.setTag(TEST_IS_RETRY, 'true')
347
+ span.setTag(TEST_RETRY_REASON, TEST_RETRY_REASON_TYPES.efd)
348
+ }
349
+ }
324
350
  steps.forEach(step => {
325
351
  const stepStartTime = step.startTime.getTime()
326
352
  const stepSpan = this.tracer.startSpan('playwright.step', {
@@ -336,7 +362,7 @@ class PlaywrightPlugin extends CiPlugin {
336
362
  stepSpan.setTag('error', step.error)
337
363
  }
338
364
  let stepDuration = step.duration
339
- if (stepDuration <= 0 || isNaN(stepDuration)) {
365
+ if (stepDuration <= 0 || Number.isNaN(stepDuration)) {
340
366
  stepDuration = 0
341
367
  }
342
368
  stepSpan.finish(stepStartTime + stepDuration)
@@ -8,6 +8,11 @@ class RedisPlugin extends CachePlugin {
8
8
  static get id () { return 'redis' }
9
9
  static get system () { return 'redis' }
10
10
 
11
+ constructor (...args) {
12
+ super(...args)
13
+ this._spanType = 'redis'
14
+ }
15
+
11
16
  start ({ db, command, args, connectionOptions = {}, connectionName }) {
12
17
  const resource = command
13
18
  const normalizedCommand = command.toUpperCase()
@@ -16,11 +21,11 @@ class RedisPlugin extends CachePlugin {
16
21
  this.startSpan({
17
22
  resource,
18
23
  service: this.serviceName({ pluginConfig: this.config, system: this.system, connectionName }),
19
- type: 'redis',
24
+ type: this._spanType,
20
25
  meta: {
21
- 'db.type': 'redis',
26
+ 'db.type': this._spanType,
22
27
  'db.name': db || '0',
23
- 'redis.raw_command': formatCommand(normalizedCommand, args),
28
+ [`${this._spanType}.raw_command`]: formatCommand(normalizedCommand, args),
24
29
  'out.host': connectionOptions.host,
25
30
  [CLIENT_PORT_KEY]: connectionOptions.port
26
31
  }
@@ -58,7 +63,7 @@ function formatArg (arg) {
58
63
 
59
64
  function trim (str, maxlen) {
60
65
  if (str.length > maxlen) {
61
- str = str.substr(0, maxlen - 3) + '...'
66
+ str = str.slice(0, maxlen - 3) + '...'
62
67
  }
63
68
 
64
69
  return str
@@ -1,7 +1,6 @@
1
1
  'use strict'
2
2
 
3
3
  const ConsumerPlugin = require('../../dd-trace/src/plugins/consumer')
4
- const { storage } = require('../../datadog-core')
5
4
  const { getAmqpMessageSize } = require('../../dd-trace/src/datastreams')
6
5
 
7
6
  class RheaConsumerPlugin extends ConsumerPlugin {
@@ -10,13 +9,14 @@ class RheaConsumerPlugin extends ConsumerPlugin {
10
9
  constructor (...args) {
11
10
  super(...args)
12
11
 
13
- this.addTraceSub('dispatch', ({ state }) => {
14
- const span = storage('legacy').getStore().span
15
- span.setTag('amqp.delivery.state', state)
12
+ this.addTraceSub('dispatch', (ctx) => {
13
+ const span = ctx.currentStore.span
14
+ span.setTag('amqp.delivery.state', ctx.state)
16
15
  })
17
16
  }
18
17
 
19
- start ({ msgObj }) {
18
+ bindStart (ctx) {
19
+ const { msgObj } = ctx
20
20
  const name = getResourceNameFromMessage(msgObj)
21
21
  const childOf = extractTextMap(msgObj, this.tracer)
22
22
 
@@ -29,7 +29,7 @@ class RheaConsumerPlugin extends ConsumerPlugin {
29
29
  'amqp.link.source.address': name,
30
30
  'amqp.link.role': 'receiver'
31
31
  }
32
- })
32
+ }, ctx)
33
33
 
34
34
  if (
35
35
  this.config.dsmEnabled &&
@@ -42,6 +42,8 @@ class RheaConsumerPlugin extends ConsumerPlugin {
42
42
  this.tracer
43
43
  .setCheckpoint(['direction:in', `topic:${name}`, 'type:rabbitmq'], span, payloadSize)
44
44
  }
45
+
46
+ return ctx.currentStore
45
47
  }
46
48
  }
47
49
 
@@ -13,7 +13,8 @@ class RheaProducerPlugin extends ProducerPlugin {
13
13
  this.addTraceSub('encode', this.encode.bind(this))
14
14
  }
15
15
 
16
- start ({ targetAddress, host, port }) {
16
+ bindStart (ctx) {
17
+ const { targetAddress, host, port } = ctx
17
18
  const name = targetAddress || 'amq.topic'
18
19
  this.startSpan({
19
20
  resource: name,
@@ -24,7 +25,9 @@ class RheaProducerPlugin extends ProducerPlugin {
24
25
  'out.host': host,
25
26
  [CLIENT_PORT_KEY]: port
26
27
  }
27
- })
28
+ }, ctx)
29
+
30
+ return ctx.currentStore
28
31
  }
29
32
 
30
33
  encode (msg) {
@@ -90,7 +90,7 @@ class RouterPlugin extends WebPlugin {
90
90
  if (!context) return
91
91
  if (context.middleware.length === 0) return context.span
92
92
 
93
- return context.middleware[context.middleware.length - 1]
93
+ return context.middleware.at(-1)
94
94
  }
95
95
 
96
96
  _getStoreSpan () {
@@ -44,12 +44,7 @@ class SeleniumPlugin extends CiPlugin {
44
44
  if (!span) {
45
45
  return
46
46
  }
47
- let testSpan
48
- if (isTestSpan(span)) {
49
- testSpan = span
50
- } else {
51
- testSpan = getTestSpanFromTrace(span.context()._trace)
52
- }
47
+ const testSpan = isTestSpan(span) ? span : getTestSpanFromTrace(span.context()._trace)
53
48
  if (!testSpan) {
54
49
  return
55
50
  }
@@ -26,7 +26,9 @@ const {
26
26
  TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
27
27
  TEST_HAS_FAILED_ALL_RETRIES,
28
28
  getLibraryCapabilitiesTags,
29
- TEST_RETRY_REASON_TYPES
29
+ TEST_RETRY_REASON_TYPES,
30
+ isModifiedTest,
31
+ TEST_IS_MODIFIED
30
32
  } = require('../../dd-trace/src/plugins/util/test')
31
33
  const { COMPONENT } = require('../../dd-trace/src/constants')
32
34
  const {
@@ -34,6 +36,7 @@ const {
34
36
  TELEMETRY_EVENT_FINISHED,
35
37
  TELEMETRY_TEST_SESSION
36
38
  } = require('../../dd-trace/src/ci-visibility/telemetry')
39
+ const { DD_MAJOR } = require('../../../version')
37
40
 
38
41
  // Milliseconds that we subtract from the error test duration
39
42
  // so that they do not overlap with the following test
@@ -82,6 +85,13 @@ class VitestPlugin extends CiPlugin {
82
85
  onDone(isQuarantined)
83
86
  })
84
87
 
88
+ this.addSub('ci:vitest:test:is-modified', ({ modifiedTests, testSuiteAbsolutePath, onDone }) => {
89
+ const testSuite = getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
90
+ const isModified = isModifiedTest(testSuite, 0, 0, modifiedTests, this.constructor.id)
91
+
92
+ onDone(isModified)
93
+ })
94
+
85
95
  this.addSub('ci:vitest:is-early-flake-detection-faulty', ({
86
96
  knownTests,
87
97
  testFilepaths,
@@ -95,19 +105,22 @@ class VitestPlugin extends CiPlugin {
95
105
  onDone(isFaulty)
96
106
  })
97
107
 
98
- this.addSub('ci:vitest:test:start', ({
99
- testName,
100
- testSuiteAbsolutePath,
101
- isRetry,
102
- isNew,
103
- isAttemptToFix,
104
- isQuarantined,
105
- isDisabled,
106
- mightHitProbe,
107
- isRetryReasonEfd,
108
- isRetryReasonAttemptToFix,
109
- isRetryReasonAtr
110
- }) => {
108
+ this.addBind('ci:vitest:test:start', (ctx) => {
109
+ const {
110
+ testName,
111
+ testSuiteAbsolutePath,
112
+ isRetry,
113
+ isNew,
114
+ isAttemptToFix,
115
+ isQuarantined,
116
+ isDisabled,
117
+ mightHitProbe,
118
+ isRetryReasonEfd,
119
+ isRetryReasonAttemptToFix,
120
+ isRetryReasonAtr,
121
+ isModified
122
+ } = ctx
123
+
111
124
  const testSuite = getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
112
125
  const store = storage('legacy').getStore()
113
126
 
@@ -138,6 +151,9 @@ class VitestPlugin extends CiPlugin {
138
151
  if (isDisabled) {
139
152
  extraTags[TEST_MANAGEMENT_IS_DISABLED] = 'true'
140
153
  }
154
+ if (isModified) {
155
+ extraTags[TEST_IS_MODIFIED] = 'true'
156
+ }
141
157
 
142
158
  const span = this.startTestSpan(
143
159
  testName,
@@ -146,18 +162,21 @@ class VitestPlugin extends CiPlugin {
146
162
  extraTags
147
163
  )
148
164
 
149
- this.enter(span, store)
165
+ ctx.parentStore = store
166
+ ctx.currentStore = { ...store, span }
150
167
 
151
168
  // TODO: there might be multiple tests for which mightHitProbe is true, so activeTestSpan
152
169
  // might be wrongly overwritten.
153
170
  if (mightHitProbe) {
154
171
  this.activeTestSpan = span
155
172
  }
173
+
174
+ return ctx.currentStore
156
175
  })
157
176
 
158
- this.addSub('ci:vitest:test:finish-time', ({ status, task, attemptToFixPassed, attemptToFixFailed }) => {
159
- const store = storage('legacy').getStore()
160
- const span = store?.span
177
+ this.addBind('ci:vitest:test:finish-time', (ctx) => {
178
+ const { status, task, attemptToFixPassed, attemptToFixFailed } = ctx
179
+ const span = ctx.currentStore?.span
161
180
 
162
181
  // we store the finish time to finish at a later hook
163
182
  // this is because the test might fail at a `afterEach` hook
@@ -171,13 +190,15 @@ class VitestPlugin extends CiPlugin {
171
190
  }
172
191
 
173
192
  this.taskToFinishTime.set(task, span._getTime())
193
+
194
+ ctx.parentStore = ctx.currentStore
195
+ ctx.currentStore = { ...ctx.currentStore, span }
174
196
  }
175
- })
176
197
 
177
- this.addSub('ci:vitest:test:pass', ({ task }) => {
178
- const store = storage('legacy').getStore()
179
- const span = store?.span
198
+ return ctx.currentStore
199
+ })
180
200
 
201
+ this.addSub('ci:vitest:test:pass', ({ span, task }) => {
181
202
  if (span) {
182
203
  this.telemetry.ciVisEvent(TELEMETRY_EVENT_FINISHED, 'test', {
183
204
  hasCodeowners: !!span.context()._tags[TEST_CODE_OWNERS]
@@ -189,6 +210,7 @@ class VitestPlugin extends CiPlugin {
189
210
  })
190
211
 
191
212
  this.addSub('ci:vitest:test:error', ({
213
+ span,
192
214
  duration,
193
215
  error,
194
216
  shouldSetProbe,
@@ -196,40 +218,38 @@ class VitestPlugin extends CiPlugin {
196
218
  hasFailedAllRetries,
197
219
  attemptToFixFailed
198
220
  }) => {
199
- const store = storage('legacy').getStore()
200
- const span = store?.span
201
-
202
- if (span) {
203
- if (shouldSetProbe && this.di) {
204
- const probeInformation = this.addDiProbe(error)
205
- if (probeInformation) {
206
- const { file, line, stackIndex, setProbePromise } = probeInformation
207
- this.runningTestProbe = { file, line }
208
- this.testErrorStackIndex = stackIndex
209
- promises.setProbePromise = setProbePromise
210
- }
221
+ if (!span) {
222
+ return
223
+ }
224
+ if (shouldSetProbe && this.di && error?.stack) {
225
+ const probeInformation = this.addDiProbe(error)
226
+ if (probeInformation) {
227
+ const { file, line, stackIndex, setProbePromise } = probeInformation
228
+ this.runningTestProbe = { file, line }
229
+ this.testErrorStackIndex = stackIndex
230
+ promises.setProbePromise = setProbePromise
211
231
  }
212
- this.telemetry.ciVisEvent(TELEMETRY_EVENT_FINISHED, 'test', {
213
- hasCodeowners: !!span.context()._tags[TEST_CODE_OWNERS]
214
- })
215
- span.setTag(TEST_STATUS, 'fail')
232
+ }
233
+ this.telemetry.ciVisEvent(TELEMETRY_EVENT_FINISHED, 'test', {
234
+ hasCodeowners: !!span.context()._tags[TEST_CODE_OWNERS]
235
+ })
236
+ span.setTag(TEST_STATUS, 'fail')
216
237
 
217
- if (error) {
218
- span.setTag('error', error)
219
- }
220
- if (hasFailedAllRetries) {
221
- span.setTag(TEST_HAS_FAILED_ALL_RETRIES, 'true')
222
- }
223
- if (attemptToFixFailed) {
224
- span.setTag(TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED, 'false')
225
- }
226
- if (duration) {
227
- span.finish(span._startTime + duration - MILLISECONDS_TO_SUBTRACT_FROM_FAILED_TEST_DURATION) // milliseconds
228
- } else {
229
- span.finish() // `duration` is empty for retries, so we'll use clock time
230
- }
231
- finishAllTraceSpans(span)
238
+ if (error) {
239
+ span.setTag('error', error)
240
+ }
241
+ if (hasFailedAllRetries) {
242
+ span.setTag(TEST_HAS_FAILED_ALL_RETRIES, 'true')
232
243
  }
244
+ if (attemptToFixFailed) {
245
+ span.setTag(TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED, 'false')
246
+ }
247
+ if (duration) {
248
+ span.finish(span._startTime + duration - MILLISECONDS_TO_SUBTRACT_FROM_FAILED_TEST_DURATION) // milliseconds
249
+ } else {
250
+ span.finish() // `duration` is empty for retries, so we'll use clock time
251
+ }
252
+ finishAllTraceSpans(span)
233
253
  })
234
254
 
235
255
  this.addSub('ci:vitest:test:skip', ({ testName, testSuiteAbsolutePath, isNew, isDisabled }) => {
@@ -252,10 +272,9 @@ class VitestPlugin extends CiPlugin {
252
272
  testSpan.finish()
253
273
  })
254
274
 
255
- this.addSub('ci:vitest:test-suite:start', ({
256
- testSuiteAbsolutePath,
257
- frameworkVersion
258
- }) => {
275
+ this.addBind('ci:vitest:test-suite:start', (ctx) => {
276
+ const { testSuiteAbsolutePath, frameworkVersion } = ctx
277
+
259
278
  this.command = process.env.DD_CIVISIBILITY_TEST_COMMAND
260
279
  this.frameworkVersion = frameworkVersion
261
280
  const testSessionSpanContext = this.tracer.extract('text_map', {
@@ -263,8 +282,9 @@ class VitestPlugin extends CiPlugin {
263
282
  'x-datadog-parent-id': process.env.DD_CIVISIBILITY_TEST_MODULE_ID
264
283
  })
265
284
 
285
+ const trimmedCommand = DD_MAJOR < 6 ? this.command : 'vitest run'
266
286
  // test suites run in a different process, so they also need to init the metadata dictionary
267
- const testSessionName = getTestSessionName(this.config, this.command, this.testEnvironmentMetadata)
287
+ const testSessionName = getTestSessionName(this.config, trimmedCommand, this.testEnvironmentMetadata)
268
288
  const metadataTags = {}
269
289
  for (const testLevel of TEST_LEVEL_EVENT_TYPES) {
270
290
  metadataTags[testLevel] = {
@@ -305,17 +325,18 @@ class VitestPlugin extends CiPlugin {
305
325
  })
306
326
  this.telemetry.ciVisEvent(TELEMETRY_EVENT_CREATED, 'suite')
307
327
  const store = storage('legacy').getStore()
308
- this.enter(testSuiteSpan, store)
328
+ ctx.parentStore = store
329
+ ctx.currentStore = { ...store, testSuiteSpan }
309
330
  this.testSuiteSpan = testSuiteSpan
331
+
332
+ return ctx.currentStore
310
333
  })
311
334
 
312
- this.addSub('ci:vitest:test-suite:finish', ({ status, onFinish }) => {
313
- const store = storage('legacy').getStore()
314
- const span = store?.span
315
- if (span) {
316
- span.setTag(TEST_STATUS, status)
317
- span.finish()
318
- finishAllTraceSpans(span)
335
+ this.addSub('ci:vitest:test-suite:finish', ({ testSuiteSpan, status, onFinish }) => {
336
+ if (testSuiteSpan) {
337
+ testSuiteSpan.setTag(TEST_STATUS, status)
338
+ testSuiteSpan.finish()
339
+ finishAllTraceSpans(testSuiteSpan)
319
340
  }
320
341
  this.telemetry.ciVisEvent(TELEMETRY_EVENT_FINISHED, 'suite')
321
342
  // TODO: too frequent flush - find for method in worker to decrease frequency
@@ -325,13 +346,19 @@ class VitestPlugin extends CiPlugin {
325
346
  }
326
347
  })
327
348
 
328
- this.addSub('ci:vitest:test-suite:error', ({ error }) => {
329
- const store = storage('legacy').getStore()
330
- const span = store?.span
331
- if (span && error) {
332
- span.setTag('error', error)
333
- span.setTag(TEST_STATUS, 'fail')
349
+ this.addBind('ci:vitest:test-suite:error', (ctx) => {
350
+ const { error } = ctx
351
+ const testSuiteSpan = ctx.currentStore?.testSuiteSpan
352
+
353
+ if (testSuiteSpan && error) {
354
+ testSuiteSpan.setTag('error', error)
355
+ testSuiteSpan.setTag(TEST_STATUS, 'fail')
356
+
357
+ ctx.parentStore = ctx.currentStore
358
+ ctx.currentStore = { ...ctx.currentStore, testSuiteSpan }
334
359
  }
360
+
361
+ return ctx.currentStore
335
362
  })
336
363
 
337
364
  this.addSub('ci:vitest:session:finish', ({