dd-trace 5.53.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 (319) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/index.d.ts +33 -16
  3. package/initialize.mjs +3 -4
  4. package/package.json +36 -34
  5. package/packages/datadog-core/src/utils/src/get.js +1 -1
  6. package/packages/datadog-core/src/utils/src/has.js +1 -1
  7. package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
  8. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  9. package/packages/datadog-core/src/utils/src/pick.js +2 -2
  10. package/packages/datadog-core/src/utils/src/set.js +1 -1
  11. package/packages/datadog-core/src/utils/src/uniq.js +1 -1
  12. package/packages/datadog-instrumentations/src/amqp10.js +19 -17
  13. package/packages/datadog-instrumentations/src/amqplib.js +52 -35
  14. package/packages/datadog-instrumentations/src/apollo.js +2 -2
  15. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  16. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -4
  17. package/packages/datadog-instrumentations/src/child_process.js +1 -2
  18. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +88 -73
  19. package/packages/datadog-instrumentations/src/couchbase.js +3 -3
  20. package/packages/datadog-instrumentations/src/cucumber.js +87 -40
  21. package/packages/datadog-instrumentations/src/cypress.js +2 -1
  22. package/packages/datadog-instrumentations/src/dns.js +1 -1
  23. package/packages/datadog-instrumentations/src/fs.js +1 -1
  24. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +28 -34
  25. package/packages/datadog-instrumentations/src/graphql.js +7 -10
  26. package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
  27. package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
  28. package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
  29. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
  30. package/packages/datadog-instrumentations/src/helpers/hooks.js +0 -1
  31. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
  32. package/packages/datadog-instrumentations/src/helpers/register.js +5 -7
  33. package/packages/datadog-instrumentations/src/http/client.js +14 -20
  34. package/packages/datadog-instrumentations/src/jest.js +137 -48
  35. package/packages/datadog-instrumentations/src/kafkajs.js +52 -44
  36. package/packages/datadog-instrumentations/src/knex.js +4 -4
  37. package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
  38. package/packages/datadog-instrumentations/src/mariadb.js +38 -61
  39. package/packages/datadog-instrumentations/src/mocha/main.js +63 -24
  40. package/packages/datadog-instrumentations/src/mocha/utils.js +36 -12
  41. package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
  42. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  43. package/packages/datadog-instrumentations/src/mysql.js +20 -36
  44. package/packages/datadog-instrumentations/src/mysql2.js +53 -47
  45. package/packages/datadog-instrumentations/src/net.js +1 -1
  46. package/packages/datadog-instrumentations/src/next.js +1 -0
  47. package/packages/datadog-instrumentations/src/nyc.js +1 -1
  48. package/packages/datadog-instrumentations/src/openai.js +21 -23
  49. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  50. package/packages/datadog-instrumentations/src/pg.js +1 -2
  51. package/packages/datadog-instrumentations/src/playwright.js +112 -69
  52. package/packages/datadog-instrumentations/src/redis.js +3 -3
  53. package/packages/datadog-instrumentations/src/restify.js +2 -2
  54. package/packages/datadog-instrumentations/src/rhea.js +42 -54
  55. package/packages/datadog-instrumentations/src/router.js +22 -25
  56. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  57. package/packages/datadog-instrumentations/src/vitest.js +77 -28
  58. package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
  59. package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
  60. package/packages/datadog-plugin-amqplib/src/client.js +6 -2
  61. package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
  62. package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
  63. package/packages/datadog-plugin-amqplib/src/util.js +1 -1
  64. package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
  65. package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
  66. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -2
  67. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  68. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
  69. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +24 -31
  70. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  71. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +6 -6
  72. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
  73. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -1
  74. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +4 -5
  75. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  76. package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
  77. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  78. package/packages/datadog-plugin-child_process/src/index.js +4 -4
  79. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
  80. package/packages/datadog-plugin-cucumber/src/index.js +57 -2
  81. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +97 -27
  82. package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
  83. package/packages/datadog-plugin-cypress/src/support.js +24 -5
  84. package/packages/datadog-plugin-express/src/code_origin.js +30 -0
  85. package/packages/datadog-plugin-express/src/index.js +10 -12
  86. package/packages/datadog-plugin-express/src/tracing.js +19 -0
  87. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
  88. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
  89. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
  90. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +26 -9
  91. package/packages/datadog-plugin-graphql/src/execute.js +2 -2
  92. package/packages/datadog-plugin-graphql/src/index.js +7 -6
  93. package/packages/datadog-plugin-graphql/src/resolve.js +2 -2
  94. package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
  95. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
  96. package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
  97. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  98. package/packages/datadog-plugin-grpc/src/util.js +2 -2
  99. package/packages/datadog-plugin-http/src/client.js +18 -7
  100. package/packages/datadog-plugin-http2/src/client.js +20 -20
  101. package/packages/datadog-plugin-jest/src/index.js +23 -21
  102. package/packages/datadog-plugin-jest/src/util.js +8 -8
  103. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
  104. package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
  105. package/packages/datadog-plugin-kafkajs/src/producer.js +8 -3
  106. package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
  107. package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
  108. package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
  109. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
  110. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
  111. package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
  112. package/packages/datadog-plugin-mariadb/src/index.js +3 -9
  113. package/packages/datadog-plugin-mocha/src/index.js +33 -13
  114. package/packages/datadog-plugin-mongodb-core/src/index.js +1 -1
  115. package/packages/datadog-plugin-mysql/src/index.js +11 -9
  116. package/packages/datadog-plugin-mysql2/src/index.js +16 -0
  117. package/packages/datadog-plugin-net/src/tcp.js +1 -1
  118. package/packages/datadog-plugin-next/src/index.js +6 -5
  119. package/packages/datadog-plugin-openai/src/services.js +6 -10
  120. package/packages/datadog-plugin-openai/src/tracing.js +10 -14
  121. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  122. package/packages/datadog-plugin-playwright/src/index.js +22 -2
  123. package/packages/datadog-plugin-redis/src/index.js +1 -1
  124. package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
  125. package/packages/datadog-plugin-rhea/src/producer.js +5 -2
  126. package/packages/datadog-plugin-router/src/index.js +1 -1
  127. package/packages/datadog-plugin-selenium/src/index.js +1 -6
  128. package/packages/datadog-plugin-vitest/src/index.js +47 -31
  129. package/packages/datadog-shimmer/src/shimmer.js +4 -8
  130. package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
  131. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  132. package/packages/dd-trace/src/appsec/blocking.js +6 -20
  133. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +1 -1
  134. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +1 -1
  135. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +1 -1
  136. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +4 -6
  137. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
  138. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +4 -6
  139. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
  140. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
  141. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
  142. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
  143. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  144. package/packages/dd-trace/src/appsec/iast/index.js +1 -0
  145. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
  146. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
  147. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +6 -13
  148. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
  149. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
  150. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
  151. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
  152. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -7
  153. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
  154. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  155. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +5 -7
  156. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  157. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +6 -6
  158. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -1
  159. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  160. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
  161. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
  162. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -24
  163. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
  164. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
  165. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
  166. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
  167. package/packages/dd-trace/src/appsec/index.js +1 -1
  168. package/packages/dd-trace/src/appsec/rasp/index.js +15 -15
  169. package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
  170. package/packages/dd-trace/src/appsec/reporter.js +233 -40
  171. package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
  172. package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
  173. package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -5
  174. package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
  175. package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
  176. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +2 -2
  177. package/packages/dd-trace/src/azure_metadata.js +2 -7
  178. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +1 -1
  179. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
  180. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
  181. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
  182. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
  183. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
  184. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +1 -1
  185. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
  186. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +2 -2
  187. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
  188. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +1 -1
  189. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +1 -1
  190. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +8 -5
  191. package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
  192. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +1 -1
  193. package/packages/dd-trace/src/config.js +82 -51
  194. package/packages/dd-trace/src/config_stable.js +3 -3
  195. package/packages/dd-trace/src/datastreams/encoding.js +9 -9
  196. package/packages/dd-trace/src/datastreams/fnv.js +1 -1
  197. package/packages/dd-trace/src/datastreams/pathway.js +4 -4
  198. package/packages/dd-trace/src/datastreams/processor.js +5 -7
  199. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
  200. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
  201. package/packages/dd-trace/src/datastreams/size.js +1 -1
  202. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +74 -67
  203. package/packages/dd-trace/src/debugger/devtools_client/condition.js +6 -8
  204. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
  205. package/packages/dd-trace/src/debugger/devtools_client/index.js +7 -1
  206. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
  207. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +1 -1
  208. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +8 -10
  209. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +3 -3
  210. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
  211. package/packages/dd-trace/src/debugger/devtools_client/state.js +10 -3
  212. package/packages/dd-trace/src/dogstatsd.js +5 -4
  213. package/packages/dd-trace/src/encode/0.4.js +9 -9
  214. package/packages/dd-trace/src/encode/0.5.js +1 -1
  215. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +3 -3
  216. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  217. package/packages/dd-trace/src/encode/tags-processors.js +1 -1
  218. package/packages/dd-trace/src/exporter.js +6 -6
  219. package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
  220. package/packages/dd-trace/src/exporters/common/docker.js +1 -1
  221. package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
  222. package/packages/dd-trace/src/exporters/common/request.js +1 -1
  223. package/packages/dd-trace/src/exporters/common/util.js +1 -1
  224. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  225. package/packages/dd-trace/src/flare/file.js +1 -5
  226. package/packages/dd-trace/src/format.js +1 -1
  227. package/packages/dd-trace/src/git_properties.js +1 -1
  228. package/packages/dd-trace/src/id.js +12 -6
  229. package/packages/dd-trace/src/iitm.js +10 -22
  230. package/packages/dd-trace/src/lambda/handler.js +6 -6
  231. package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
  232. package/packages/dd-trace/src/lambda/runtime/ritm.js +1 -1
  233. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
  234. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
  235. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
  236. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
  237. package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -1
  238. package/packages/dd-trace/src/llmobs/sdk.js +2 -2
  239. package/packages/dd-trace/src/llmobs/tagger.js +110 -96
  240. package/packages/dd-trace/src/llmobs/util.js +9 -9
  241. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  242. package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
  243. package/packages/dd-trace/src/log/index.js +4 -4
  244. package/packages/dd-trace/src/log/log.js +1 -1
  245. package/packages/dd-trace/src/log/writer.js +2 -2
  246. package/packages/dd-trace/src/msgpack/chunk.js +3 -3
  247. package/packages/dd-trace/src/msgpack/encoder.js +28 -28
  248. package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
  249. package/packages/dd-trace/src/noop/span.js +3 -5
  250. package/packages/dd-trace/src/noop/tracer.js +1 -2
  251. package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
  252. package/packages/dd-trace/src/opentelemetry/tracer.js +6 -5
  253. package/packages/dd-trace/src/opentracing/propagation/log.js +6 -8
  254. package/packages/dd-trace/src/opentracing/propagation/text_map.js +27 -23
  255. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
  256. package/packages/dd-trace/src/opentracing/span.js +9 -14
  257. package/packages/dd-trace/src/opentracing/tracer.js +9 -6
  258. package/packages/dd-trace/src/payload-tagging/index.js +1 -1
  259. package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
  260. package/packages/dd-trace/src/pkg.js +1 -1
  261. package/packages/dd-trace/src/plugins/ci_plugin.js +62 -10
  262. package/packages/dd-trace/src/plugins/consumer.js +2 -2
  263. package/packages/dd-trace/src/plugins/inbound.js +5 -1
  264. package/packages/dd-trace/src/plugins/index.js +0 -1
  265. package/packages/dd-trace/src/plugins/outbound.js +4 -5
  266. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  267. package/packages/dd-trace/src/plugins/producer.js +2 -2
  268. package/packages/dd-trace/src/plugins/storage.js +2 -2
  269. package/packages/dd-trace/src/plugins/util/ci.js +23 -15
  270. package/packages/dd-trace/src/plugins/util/git.js +165 -11
  271. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
  272. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  273. package/packages/dd-trace/src/plugins/util/llm.js +27 -10
  274. package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
  275. package/packages/dd-trace/src/plugins/util/test.js +311 -48
  276. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  277. package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
  278. package/packages/dd-trace/src/plugins/util/user-provided-git.js +12 -3
  279. package/packages/dd-trace/src/plugins/util/web.js +5 -4
  280. package/packages/dd-trace/src/priority_sampler.js +22 -22
  281. package/packages/dd-trace/src/profiling/config.js +44 -8
  282. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +5 -5
  283. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  284. package/packages/dd-trace/src/profiling/profiler.js +37 -2
  285. package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
  286. package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
  287. package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
  288. package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
  289. package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
  290. package/packages/dd-trace/src/profiling/tagger.js +3 -5
  291. package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
  292. package/packages/dd-trace/src/proxy.js +7 -9
  293. package/packages/dd-trace/src/random_sampler.js +40 -0
  294. package/packages/dd-trace/src/rate_limiter.js +4 -4
  295. package/packages/dd-trace/src/remote_config/index.js +3 -7
  296. package/packages/dd-trace/src/remote_config/manager.js +25 -13
  297. package/packages/dd-trace/src/require-package-json.js +1 -1
  298. package/packages/dd-trace/src/ritm.js +4 -4
  299. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +2 -2
  300. package/packages/dd-trace/src/sampler.js +33 -4
  301. package/packages/dd-trace/src/sampling_rule.js +12 -3
  302. package/packages/dd-trace/src/scope.js +1 -1
  303. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  304. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
  305. package/packages/dd-trace/src/span_processor.js +3 -3
  306. package/packages/dd-trace/src/span_sampler.js +4 -1
  307. package/packages/dd-trace/src/standalone/tracesource.js +1 -1
  308. package/packages/dd-trace/src/startup-log.js +2 -2
  309. package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
  310. package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
  311. package/packages/dd-trace/src/telemetry/metrics.js +10 -5
  312. package/packages/dd-trace/src/telemetry/send-data.js +1 -1
  313. package/packages/dd-trace/src/telemetry/telemetry.js +23 -24
  314. package/packages/dd-trace/src/util.js +1 -1
  315. package/version.js +1 -0
  316. package/packages/datadog-instrumentations/src/paperplane.js +0 -77
  317. package/packages/datadog-plugin-paperplane/src/index.js +0 -25
  318. package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
  319. package/packages/datadog-plugin-paperplane/src/server.js +0 -24
@@ -37,7 +37,9 @@ const {
37
37
  TEST_MANAGEMENT_IS_ATTEMPT_TO_FIX,
38
38
  TEST_HAS_FAILED_ALL_RETRIES,
39
39
  TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
40
- TEST_RETRY_REASON_TYPES
40
+ TEST_RETRY_REASON_TYPES,
41
+ TEST_IS_MODIFIED,
42
+ isModifiedTest
41
43
  } = require('../../dd-trace/src/plugins/util/test')
42
44
  const { COMPONENT } = require('../../dd-trace/src/constants')
43
45
  const {
@@ -131,11 +133,9 @@ class MochaPlugin extends CiPlugin {
131
133
  testSuiteMetadata[TEST_ITR_FORCED_RUN] = 'true'
132
134
  this.telemetry.count(TELEMETRY_ITR_FORCED_TO_RUN, { testLevel: 'suite' })
133
135
  }
134
- if (this.repositoryRoot !== this.sourceRoot && !!this.repositoryRoot) {
135
- testSuiteMetadata[TEST_SOURCE_FILE] = getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
136
- } else {
137
- testSuiteMetadata[TEST_SOURCE_FILE] = testSuite
138
- }
136
+ testSuiteMetadata[TEST_SOURCE_FILE] = this.repositoryRoot !== this.sourceRoot && !!this.repositoryRoot
137
+ ? getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
138
+ : testSuite
139
139
  if (testSuiteMetadata[TEST_SOURCE_FILE]) {
140
140
  testSuiteMetadata[TEST_SOURCE_START] = 1
141
141
  }
@@ -192,6 +192,19 @@ class MochaPlugin extends CiPlugin {
192
192
  return ctx.currentStore
193
193
  })
194
194
 
195
+ this.addSub('ci:mocha:test:is-modified', ({ modifiedTests, file, onDone }) => {
196
+ const testPath = getTestSuitePath(file, this.repositoryRoot)
197
+ const isModified = isModifiedTest(
198
+ testPath,
199
+ null,
200
+ null,
201
+ modifiedTests,
202
+ this.constructor.id
203
+ )
204
+
205
+ onDone(isModified)
206
+ })
207
+
195
208
  this.addBind('ci:mocha:test:fn', (ctx) => {
196
209
  return ctx.currentStore
197
210
  })
@@ -466,7 +479,8 @@ class MochaPlugin extends CiPlugin {
466
479
  isParallel,
467
480
  isAttemptToFix,
468
481
  isDisabled,
469
- isQuarantined
482
+ isQuarantined,
483
+ isModified
470
484
  } = testInfo
471
485
 
472
486
  const extraTags = {}
@@ -495,20 +509,26 @@ class MochaPlugin extends CiPlugin {
495
509
  extraTags[TEST_MANAGEMENT_IS_QUARANTINED] = 'true'
496
510
  }
497
511
 
512
+ if (isModified) {
513
+ extraTags[TEST_IS_MODIFIED] = 'true'
514
+ if (isEfdRetry) {
515
+ extraTags[TEST_IS_RETRY] = 'true'
516
+ extraTags[TEST_RETRY_REASON] = TEST_RETRY_REASON_TYPES.efd
517
+ }
518
+ }
519
+
498
520
  const testSuite = getTestSuitePath(testSuiteAbsolutePath, this.sourceRoot)
499
521
  const testSuiteSpan = this._testSuites.get(testSuite)
500
522
 
501
- if (this.repositoryRoot !== this.sourceRoot && !!this.repositoryRoot) {
502
- extraTags[TEST_SOURCE_FILE] = getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
503
- } else {
504
- extraTags[TEST_SOURCE_FILE] = testSuite
505
- }
523
+ extraTags[TEST_SOURCE_FILE] = this.repositoryRoot !== this.sourceRoot && !!this.repositoryRoot
524
+ ? getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
525
+ : testSuite
506
526
 
507
527
  if (isNew) {
508
528
  extraTags[TEST_IS_NEW] = 'true'
509
529
  if (isEfdRetry) {
510
530
  extraTags[TEST_IS_RETRY] = 'true'
511
- extraTags[TEST_RETRY_REASON] = 'early_flake_detection'
531
+ extraTags[TEST_RETRY_REASON] = TEST_RETRY_REASON_TYPES.efd
512
532
  }
513
533
  }
514
534
 
@@ -103,7 +103,7 @@ function getResource (plugin, ns, query, operationName) {
103
103
  }
104
104
 
105
105
  function truncate (input) {
106
- return input.slice(0, Math.min(input.length, 10000))
106
+ return input.slice(0, Math.min(input.length, 10_000))
107
107
  }
108
108
 
109
109
  function shouldSimplify (input) {
@@ -7,22 +7,24 @@ class MySQLPlugin extends DatabasePlugin {
7
7
  static get id () { return 'mysql' }
8
8
  static get system () { return 'mysql' }
9
9
 
10
- start (payload) {
11
- const service = this.serviceName({ pluginConfig: this.config, dbConfig: payload.conf, system: this.system })
10
+ bindStart (ctx) {
11
+ const service = this.serviceName({ pluginConfig: this.config, dbConfig: ctx.conf, system: this.system })
12
12
  const span = this.startSpan(this.operationName(), {
13
13
  service,
14
- resource: payload.sql,
14
+ resource: ctx.sql,
15
15
  type: 'sql',
16
16
  kind: 'client',
17
17
  meta: {
18
18
  'db.type': this.system,
19
- 'db.user': payload.conf.user,
20
- 'db.name': payload.conf.database,
21
- 'out.host': payload.conf.host,
22
- [CLIENT_PORT_KEY]: payload.conf.port
19
+ 'db.user': ctx.conf.user,
20
+ 'db.name': ctx.conf.database,
21
+ 'out.host': ctx.conf.host,
22
+ [CLIENT_PORT_KEY]: ctx.conf.port
23
23
  }
24
- })
25
- payload.sql = this.injectDbmQuery(span, payload.sql, service)
24
+ }, ctx)
25
+ ctx.sql = this.injectDbmQuery(span, ctx.sql, service)
26
+
27
+ return ctx.currentStore
26
28
  }
27
29
  }
28
30
 
@@ -1,9 +1,25 @@
1
1
  'use strict'
2
2
 
3
+ const { storage } = require('../../datadog-core')
3
4
  const MySQLPlugin = require('../../datadog-plugin-mysql/src')
4
5
 
5
6
  class MySQL2Plugin extends MySQLPlugin {
6
7
  static get id () { return 'mysql2' }
8
+
9
+ constructor () {
10
+ super(...arguments)
11
+
12
+ this.addSub(`apm:${this.component}:command:add`, ctx => {
13
+ ctx.parentStore = storage('legacy').getStore()
14
+ })
15
+
16
+ this.addBind(`apm:${this.component}:command:start`, ctx => ctx.parentStore)
17
+ this.addBind(`apm:${this.component}:command:finish`, ctx => ctx.parentStore)
18
+ }
19
+
20
+ bindStart (ctx) {
21
+ return storage('legacy').run(ctx.parentStore, () => super.bindStart(ctx))
22
+ }
7
23
  }
8
24
 
9
25
  module.exports = MySQL2Plugin
@@ -31,7 +31,7 @@ class NetTCPPlugin extends ClientPlugin {
31
31
 
32
32
  this.startSpan('tcp.connect', {
33
33
  service: this.config.service,
34
- resource: [host, port].filter(val => val).join(':'),
34
+ resource: [host, port].filter(Boolean).join(':'),
35
35
  kind: 'client',
36
36
  meta: {
37
37
  'tcp.remote.host': host,
@@ -6,7 +6,7 @@ const analyticsSampler = require('../../dd-trace/src/analytics_sampler')
6
6
  const { COMPONENT } = require('../../dd-trace/src/constants')
7
7
  const web = require('../../dd-trace/src/plugins/util/web')
8
8
 
9
- const errorPages = ['/404', '/500', '/_error', '/_not-found', '/_not-found/page']
9
+ const errorPages = new Set(['/404', '/500', '/_error', '/_not-found', '/_not-found/page'])
10
10
 
11
11
  class NextPlugin extends ServerPlugin {
12
12
  static get id () {
@@ -97,7 +97,7 @@ class NextPlugin extends ServerPlugin {
97
97
 
98
98
  // Only use error page names if there's not already a name
99
99
  const current = span.context()._tags['next.page']
100
- const isErrorPage = errorPages.includes(page)
100
+ const isErrorPage = errorPages.has(page)
101
101
 
102
102
  if (current && isErrorPage) {
103
103
  return
@@ -106,7 +106,7 @@ class NextPlugin extends ServerPlugin {
106
106
  // remove ending /route or /page for appDir projects
107
107
  // need to check if not an error page too, as those are marked as app directory
108
108
  // in newer versions
109
- if (isAppPath && !isErrorPage) page = page.substring(0, page.lastIndexOf('/'))
109
+ if (isAppPath && !isErrorPage) page = page.slice(0, Math.max(0, page.lastIndexOf('/')))
110
110
 
111
111
  // handle static resource
112
112
  if (isStatic) {
@@ -137,9 +137,10 @@ function normalizeConfig (config) {
137
137
  return Object.assign({}, config, { hooks, validateStatus })
138
138
  }
139
139
 
140
+ const noop = () => {}
141
+
140
142
  function getHooks (config) {
141
- const noop = () => {}
142
- const request = (config.hooks && config.hooks.request) || noop
143
+ const request = config.hooks?.request ?? noop
143
144
 
144
145
  return { request }
145
146
  }
@@ -11,8 +11,8 @@ let logger = null
11
11
  let interval = null
12
12
 
13
13
  module.exports.init = function (tracerConfig) {
14
- if (tracerConfig && tracerConfig.dogstatsd) {
15
- metrics = new DogStatsDClient({
14
+ metrics = tracerConfig && tracerConfig.dogstatsd
15
+ ? new DogStatsDClient({
16
16
  host: tracerConfig.dogstatsd.hostname,
17
17
  port: tracerConfig.dogstatsd.port,
18
18
  tags: [
@@ -21,21 +21,17 @@ module.exports.init = function (tracerConfig) {
21
21
  `version:${tracerConfig.tags.version}`
22
22
  ]
23
23
  })
24
- } else {
25
- metrics = new NoopDogStatsDClient()
26
- }
24
+ : new NoopDogStatsDClient()
27
25
 
28
- if (tracerConfig && tracerConfig.apiKey) {
29
- logger = new ExternalLogger({
26
+ logger = tracerConfig && tracerConfig.apiKey
27
+ ? new ExternalLogger({
30
28
  ddsource: 'openai',
31
29
  hostname: tracerConfig.hostname,
32
30
  service: tracerConfig.service,
33
31
  apiKey: tracerConfig.apiKey,
34
32
  interval: FLUSH_INTERVAL
35
33
  })
36
- } else {
37
- logger = new NoopExternalLogger()
38
- }
34
+ : new NoopExternalLogger()
39
35
 
40
36
  interval = setInterval(() => {
41
37
  metrics.flush()
@@ -261,9 +261,11 @@ class OpenAiTracingPlugin extends TracingPlugin {
261
261
  if (error) {
262
262
  this.metrics.increment('openai.request.error', 1, tags)
263
263
  } else {
264
- tags.push(`org:${headers['openai-organization']}`)
265
- tags.push(`endpoint:${endpoint}`) // just "/v1/models", no method
266
- tags.push(`model:${headers['openai-model'] || body.model}`)
264
+ tags.push(
265
+ `org:${headers['openai-organization']}`,
266
+ `endpoint:${endpoint}`,
267
+ `model:${headers['openai-model'] || body.model}`
268
+ )
267
269
  }
268
270
 
269
271
  this.metrics.distribution('openai.request.duration', duration * 1000, tags)
@@ -329,7 +331,7 @@ class OpenAiTracingPlugin extends TracingPlugin {
329
331
  sendLog (methodName, span, tags, openaiStore, error) {
330
332
  if (!openaiStore) return
331
333
  if (!Object.keys(openaiStore).length) return
332
- if (!this.sampler.isSampled()) return
334
+ if (!this.sampler.isSampled(span)) return
333
335
 
334
336
  const log = {
335
337
  status: error ? 'error' : 'info',
@@ -725,7 +727,7 @@ function commonCreateResponseExtraction (tags, body, openaiStore, methodName) {
725
727
  const choice = body.choices[choiceIdx]
726
728
 
727
729
  // logprobs can be null and we still want to tag it as 'returned' even when set to 'null'
728
- const specifiesLogProb = Object.keys(choice).indexOf('logprobs') !== -1
730
+ const specifiesLogProb = Object.keys(choice).includes('logprobs')
729
731
 
730
732
  tags[`openai.response.choices.${choiceIdx}.finish_reason`] = choice.finish_reason
731
733
  tags[`openai.response.choices.${choiceIdx}.logprobs`] = specifiesLogProb ? 'returned' : undefined
@@ -790,7 +792,7 @@ function usageExtraction (tags, body, methodName, openaiStore) {
790
792
  }
791
793
 
792
794
  function truncateApiKey (apiKey) {
793
- return apiKey && `sk-...${apiKey.substr(apiKey.length - 4)}`
795
+ return apiKey && `sk-...${apiKey.slice(-4)}`
794
796
  }
795
797
 
796
798
  function tagChatCompletionRequestContent (contents, messageIdx, tags) {
@@ -989,15 +991,9 @@ function normalizeStringOrTokenArray (input, truncate) {
989
991
 
990
992
  function defensiveArrayLength (maybeArray) {
991
993
  if (maybeArray) {
992
- if (Array.isArray(maybeArray)) {
993
- return maybeArray.length
994
- } else {
995
- // case of a singular item (ie body.training_file vs body.training_files)
996
- return 1
997
- }
994
+ // Detect singular item (ie body.training_file vs body.training_files)
995
+ return Array.isArray(maybeArray) ? maybeArray.length : 1
998
996
  }
999
-
1000
- return undefined
1001
997
  }
1002
998
 
1003
999
  module.exports = OpenAiTracingPlugin
@@ -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,
@@ -277,6 +289,7 @@ class PlaywrightPlugin extends CiPlugin {
277
289
  hasPassedAttemptToFixRetries,
278
290
  hasFailedAttemptToFixRetries,
279
291
  isAtrRetry,
292
+ isModified,
280
293
  onDone
281
294
  }) => {
282
295
  if (!span) return
@@ -327,6 +340,13 @@ class PlaywrightPlugin extends CiPlugin {
327
340
  if (isQuarantined) {
328
341
  span.setTag(TEST_MANAGEMENT_IS_QUARANTINED, 'true')
329
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
+ }
330
350
  steps.forEach(step => {
331
351
  const stepStartTime = step.startTime.getTime()
332
352
  const stepSpan = this.tracer.startSpan('playwright.step', {
@@ -342,7 +362,7 @@ class PlaywrightPlugin extends CiPlugin {
342
362
  stepSpan.setTag('error', step.error)
343
363
  }
344
364
  let stepDuration = step.duration
345
- if (stepDuration <= 0 || isNaN(stepDuration)) {
365
+ if (stepDuration <= 0 || Number.isNaN(stepDuration)) {
346
366
  stepDuration = 0
347
367
  }
348
368
  stepSpan.finish(stepStartTime + stepDuration)
@@ -63,7 +63,7 @@ function formatArg (arg) {
63
63
 
64
64
  function trim (str, maxlen) {
65
65
  if (str.length > maxlen) {
66
- str = str.substr(0, maxlen - 3) + '...'
66
+ str = str.slice(0, maxlen - 3) + '...'
67
67
  }
68
68
 
69
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,
@@ -107,7 +117,8 @@ class VitestPlugin extends CiPlugin {
107
117
  mightHitProbe,
108
118
  isRetryReasonEfd,
109
119
  isRetryReasonAttemptToFix,
110
- isRetryReasonAtr
120
+ isRetryReasonAtr,
121
+ isModified
111
122
  } = ctx
112
123
 
113
124
  const testSuite = getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
@@ -140,6 +151,9 @@ class VitestPlugin extends CiPlugin {
140
151
  if (isDisabled) {
141
152
  extraTags[TEST_MANAGEMENT_IS_DISABLED] = 'true'
142
153
  }
154
+ if (isModified) {
155
+ extraTags[TEST_IS_MODIFIED] = 'true'
156
+ }
143
157
 
144
158
  const span = this.startTestSpan(
145
159
  testName,
@@ -204,37 +218,38 @@ class VitestPlugin extends CiPlugin {
204
218
  hasFailedAllRetries,
205
219
  attemptToFixFailed
206
220
  }) => {
207
- if (span) {
208
- if (shouldSetProbe && this.di) {
209
- const probeInformation = this.addDiProbe(error)
210
- if (probeInformation) {
211
- const { file, line, stackIndex, setProbePromise } = probeInformation
212
- this.runningTestProbe = { file, line }
213
- this.testErrorStackIndex = stackIndex
214
- promises.setProbePromise = setProbePromise
215
- }
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
216
231
  }
217
- this.telemetry.ciVisEvent(TELEMETRY_EVENT_FINISHED, 'test', {
218
- hasCodeowners: !!span.context()._tags[TEST_CODE_OWNERS]
219
- })
220
- 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')
221
237
 
222
- if (error) {
223
- span.setTag('error', error)
224
- }
225
- if (hasFailedAllRetries) {
226
- span.setTag(TEST_HAS_FAILED_ALL_RETRIES, 'true')
227
- }
228
- if (attemptToFixFailed) {
229
- span.setTag(TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED, 'false')
230
- }
231
- if (duration) {
232
- span.finish(span._startTime + duration - MILLISECONDS_TO_SUBTRACT_FROM_FAILED_TEST_DURATION) // milliseconds
233
- } else {
234
- span.finish() // `duration` is empty for retries, so we'll use clock time
235
- }
236
- finishAllTraceSpans(span)
238
+ if (error) {
239
+ span.setTag('error', error)
240
+ }
241
+ if (hasFailedAllRetries) {
242
+ span.setTag(TEST_HAS_FAILED_ALL_RETRIES, 'true')
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
237
251
  }
252
+ finishAllTraceSpans(span)
238
253
  })
239
254
 
240
255
  this.addSub('ci:vitest:test:skip', ({ testName, testSuiteAbsolutePath, isNew, isDisabled }) => {
@@ -267,8 +282,9 @@ class VitestPlugin extends CiPlugin {
267
282
  'x-datadog-parent-id': process.env.DD_CIVISIBILITY_TEST_MODULE_ID
268
283
  })
269
284
 
285
+ const trimmedCommand = DD_MAJOR < 6 ? this.command : 'vitest run'
270
286
  // test suites run in a different process, so they also need to init the metadata dictionary
271
- const testSessionName = getTestSessionName(this.config, this.command, this.testEnvironmentMetadata)
287
+ const testSessionName = getTestSessionName(this.config, trimmedCommand, this.testEnvironmentMetadata)
272
288
  const metadataTags = {}
273
289
  for (const testLevel of TEST_LEVEL_EVENT_TYPES) {
274
290
  metadataTags[testLevel] = {
@@ -100,7 +100,7 @@ function wrapFunction (original, wrapper) {
100
100
  */
101
101
  function wrap (target, name, wrapper, options) {
102
102
  if (typeof wrapper !== 'function') {
103
- throw new Error(wrapper ? 'Target is not a function' : 'No function provided')
103
+ throw new TypeError(wrapper ? 'Target is not a function' : 'No function provided')
104
104
  }
105
105
 
106
106
  // No descriptor means original was on the prototype. This is not totally
@@ -141,11 +141,7 @@ function wrap (target, name, wrapper, options) {
141
141
  } else {
142
142
  if (descriptor.get) {
143
143
  // `replaceGetter` may only be used when the getter has no side effect.
144
- if (options?.replaceGetter) {
145
- descriptor.get = () => wrapped
146
- } else {
147
- descriptor.get = wrapped
148
- }
144
+ descriptor.get = options?.replaceGetter ? () => wrapped : wrapped
149
145
  } else {
150
146
  descriptor.value = wrapped
151
147
  }
@@ -252,7 +248,7 @@ function assertMethod (target, name, method) {
252
248
  }
253
249
  }
254
250
 
255
- throw new Error(message)
251
+ throw new TypeError(message)
256
252
  }
257
253
  }
258
254
 
@@ -264,7 +260,7 @@ function assertMethod (target, name, method) {
264
260
  */
265
261
  function assertNotClass (target) {
266
262
  if (Function.prototype.toString.call(target).startsWith('class')) {
267
- throw new Error('Target is a native class constructor and cannot be wrapped.')
263
+ throw new TypeError('Target is a native class constructor and cannot be wrapped.')
268
264
  }
269
265
  }
270
266
 
@@ -18,8 +18,8 @@ let asmStandaloneEnabled
18
18
  let sampledRequests
19
19
 
20
20
  class NoopTTLCache {
21
- clear () { }
22
- set (_key, _value) { return undefined }
21
+ clear () {}
22
+ set (_key, _value) {}
23
23
  has (_key) { return false }
24
24
  }
25
25
 
@@ -1,4 +1,4 @@
1
- /* eslint-disable @stylistic/js/max-len */
1
+ /* eslint-disable @stylistic/max-len */
2
2
  'use strict'
3
3
 
4
4
  const html = '<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>You\'ve been blocked</title><style>a,body,div,html,span{margin:0;padding:0;border:0;font-size:100%;font:inherit;vertical-align:baseline}body{background:-webkit-radial-gradient(26% 19%,circle,#fff,#f4f7f9);background:radial-gradient(circle at 26% 19%,#fff,#f4f7f9);display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center;width:100%;min-height:100vh;line-height:1;flex-direction:column}p{display:block}main{text-align:center;flex:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-ms-flex-line-pack:center;align-content:center;flex-direction:column}p{font-size:18px;line-height:normal;color:#646464;font-family:sans-serif;font-weight:400}a{color:#4842b7}footer{width:100%;text-align:center}footer p{font-size:16px}</style></head><body><main><p>Sorry, you cannot access this page. Please contact the customer service team.</p></main><footer><p>Security provided by <a href="https://www.datadoghq.com/product/security-platform/application-security-monitoring/" target="_blank">Datadog</a></p></footer></body></html>'