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
@@ -47,27 +47,27 @@ class Generation {
47
47
  class RequestParams {
48
48
  constructor ({
49
49
  prompt = '',
50
- temperature = undefined,
51
- topP = undefined,
52
- topK = undefined,
53
- maxTokens = undefined,
50
+ temperature,
51
+ topP,
52
+ topK,
53
+ maxTokens,
54
54
  stopSequences = [],
55
55
  inputType = '',
56
56
  truncate = '',
57
57
  stream = '',
58
- n = undefined
58
+ n
59
59
  } = {}) {
60
60
  // stringify prompt as it could be a single prompt as well as a list of message objects
61
61
  this.prompt = typeof prompt === 'string' ? prompt : JSON.stringify(prompt) || ''
62
- this.temperature = temperature !== undefined ? temperature : undefined
63
- this.topP = topP !== undefined ? topP : undefined
64
- this.topK = topK !== undefined ? topK : undefined
65
- this.maxTokens = maxTokens !== undefined ? maxTokens : undefined
62
+ this.temperature = temperature === undefined ? undefined : temperature
63
+ this.topP = topP === undefined ? undefined : topP
64
+ this.topK = topK === undefined ? undefined : topK
65
+ this.maxTokens = maxTokens === undefined ? undefined : maxTokens
66
66
  this.stopSequences = stopSequences || []
67
67
  this.inputType = inputType || ''
68
68
  this.truncate = truncate || ''
69
69
  this.stream = stream || ''
70
- this.n = n !== undefined ? n : undefined
70
+ this.n = n === undefined ? undefined : n
71
71
  }
72
72
  }
73
73
 
@@ -92,7 +92,7 @@ function parseModelId (modelId) {
92
92
  if (modelMeta.length < 2) {
93
93
  return { modelProvider: 'custom', modelName: modelMeta[0] }
94
94
  }
95
- return { modelProvider: modelMeta[modelMeta.length - 2], modelName: modelMeta[modelMeta.length - 1] }
95
+ return { modelProvider: modelMeta.at(-2), modelName: modelMeta.at(-1) }
96
96
  }
97
97
 
98
98
  for (const identifier of MODEL_TYPE_IDENTIFIERS) {
@@ -105,7 +105,7 @@ function parseModelId (modelId) {
105
105
  if (modelMeta.length < 2) {
106
106
  return { modelProvider: 'custom', modelName: modelId }
107
107
  }
108
- return { modelProvider: modelMeta[modelMeta.length - 2], modelName: modelMeta[modelMeta.length - 1] }
108
+ return { modelProvider: modelMeta.at(-2), modelName: modelMeta.at(-1) }
109
109
  }
110
110
  return { modelProvider: 'custom', modelName: modelId }
111
111
  }
@@ -296,7 +296,7 @@ function extractTextAndResponseReason (response, provider, modelName) {
296
296
  return new Generation()
297
297
  }
298
298
  }
299
- } catch (error) {
299
+ } catch {
300
300
  log.warn('Unable to extract text/finishReason from response body. Defaulting to empty text/finishReason.')
301
301
  return new Generation()
302
302
  }
@@ -25,18 +25,17 @@ class DynamoDb extends BaseAwsSdkPlugin {
25
25
  // batch operations have different format, collect table name for batch
26
26
  // https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#batchGetItem-property`
27
27
  // dynamoDB batch TableName
28
- if (params.RequestItems !== null) {
29
- if (typeof params.RequestItems === 'object') {
30
- if (Object.keys(params.RequestItems).length === 1) {
31
- const tableName = Object.keys(params.RequestItems)[0]
32
-
33
- // also add span type to match serverless convention
34
- Object.assign(tags, {
35
- 'resource.name': `${operation} ${tableName}`,
36
- 'aws.dynamodb.table_name': tableName,
37
- tablename: tableName
38
- })
39
- }
28
+ if (params.RequestItems !== null && typeof params.RequestItems === 'object') {
29
+ const requestItemsKeys = Object.keys(params.RequestItems)
30
+ if (requestItemsKeys.length === 1) {
31
+ const tableName = requestItemsKeys[0]
32
+
33
+ // also add span type to match serverless convention
34
+ Object.assign(tags, {
35
+ 'resource.name': `${operation} ${tableName}`,
36
+ 'aws.dynamodb.table_name': tableName,
37
+ tablename: tableName
38
+ })
40
39
  }
41
40
  }
42
41
 
@@ -81,10 +80,12 @@ class DynamoDb extends BaseAwsSdkPlugin {
81
80
  const hash =
82
81
  DynamoDb.calculatePutItemHash(item.Put.TableName, item.Put.Item, this.getPrimaryKeyConfig())
83
82
  if (hash) hashes.push(hash)
84
- } else if (item.Update || item.Delete) {
85
- const operation = item.Update ? item.Update : item.Delete
86
- const hash = DynamoDb.calculateHashWithKnownKeys(operation.TableName, operation.Key)
87
- if (hash) hashes.push(hash)
83
+ } else {
84
+ const operation = item.Update || item.Delete
85
+ if (operation) {
86
+ const hash = DynamoDb.calculateHashWithKnownKeys(operation.TableName, operation.Key)
87
+ if (hash) hashes.push(hash)
88
+ }
88
89
  }
89
90
  }
90
91
  break
@@ -136,7 +137,7 @@ class DynamoDb extends BaseAwsSdkPlugin {
136
137
  const config = {}
137
138
  for (const [tableName, primaryKeys] of Object.entries(parsedConfig)) {
138
139
  if (Array.isArray(primaryKeys) && primaryKeys.length > 0 && primaryKeys.length <= 2) {
139
- config[tableName] = new Set(primaryKeys)
140
+ config[tableName] = primaryKeys
140
141
  } else {
141
142
  log.warn(`Invalid primary key configuration for table: ${tableName}.` +
142
143
  'Please fix the DD_TRACE_DYNAMODB_TABLE_PRIMARY_KEYS env var.')
@@ -154,7 +155,7 @@ class DynamoDb extends BaseAwsSdkPlugin {
154
155
  * Calculates a hash for DynamoDB PutItem operations using table's configured primary keys.
155
156
  * @param {string} tableName - Name of the DynamoDB table.
156
157
  * @param {Object} item - Complete PutItem item parameter to be put.
157
- * @param {Object.<string, Set<string>>} primaryKeyConfig - Mapping of table names to Sets of primary key names
158
+ * @param {Object.<string, Array<string>>} primaryKeyConfig - Mapping of table names to an Array of primary key names
158
159
  * loaded from DD_TRACE_DYNAMODB_TABLE_PRIMARY_KEYS.
159
160
  * @returns {string|undefined} Hash combining table name and primary key/value pairs, or undefined if unable.
160
161
  */
@@ -163,19 +164,11 @@ class DynamoDb extends BaseAwsSdkPlugin {
163
164
  log.debug('Unable to calculate hash because missing required parameters')
164
165
  return
165
166
  }
166
- if (!primaryKeyConfig) {
167
- return
168
- }
169
- const primaryKeySet = primaryKeyConfig[tableName]
170
- if (!primaryKeySet || !(primaryKeySet instanceof Set) || primaryKeySet.size === 0 || primaryKeySet.size > 2) {
171
- log.warn(
172
- `span pointers: failed to extract PutItem span pointer: table ${tableName} ` +
173
- 'not found in primary key names or the DD_TRACE_DYNAMODB_TABLE_PRIMARY_KEYS env var was invalid.' +
174
- 'Please update the env var.'
175
- )
167
+ const keyNames = primaryKeyConfig?.[tableName]
168
+ if (!keyNames) {
176
169
  return
177
170
  }
178
- const keyValues = extractPrimaryKeys(primaryKeySet, item)
171
+ const keyValues = extractPrimaryKeys(keyNames, item)
179
172
  if (keyValues) {
180
173
  return generatePointerHash([tableName, ...keyValues])
181
174
  }
@@ -196,8 +189,8 @@ class DynamoDb extends BaseAwsSdkPlugin {
196
189
  log.debug('Unable to calculate hash because missing parameters')
197
190
  return
198
191
  }
199
- const keyNamesSet = new Set(Object.keys(keysObject))
200
- const keyValues = extractPrimaryKeys(keyNamesSet, keysObject)
192
+ const keyNames = Object.keys(keysObject)
193
+ const keyValues = extractPrimaryKeys(keyNames, keysObject)
201
194
  if (keyValues) {
202
195
  return generatePointerHash([tableName, ...keyValues])
203
196
  }
@@ -7,8 +7,8 @@ class EventBridge extends BaseAwsSdkPlugin {
7
7
  static get isPayloadReporter () { return true }
8
8
 
9
9
  generateTags (params, operation, response) {
10
- if (!params || !params.source) return {}
11
- const rulename = params.Name ? params.Name : ''
10
+ if (!params?.source) return {}
11
+ const rulename = params.Name ?? ''
12
12
  return {
13
13
  'resource.name': operation ? `${operation} ${params.source}` : params.source,
14
14
  'aws.eventbridge.source': `${params.source}`,
@@ -128,12 +128,12 @@ class Kinesis extends BaseAwsSdkPlugin {
128
128
  _tryParse (body) {
129
129
  try {
130
130
  return JSON.parse(body)
131
- } catch (e) {
131
+ } catch {
132
132
  log.info('Not JSON string. Trying Base64 encoded JSON string')
133
133
  }
134
134
  try {
135
135
  return JSON.parse(Buffer.from(body, 'base64').toString('ascii'), true)
136
- } catch (e) {
136
+ } catch {
137
137
  return null
138
138
  }
139
139
  }
@@ -145,17 +145,17 @@ class Kinesis extends BaseAwsSdkPlugin {
145
145
  let stream
146
146
  switch (operation) {
147
147
  case 'putRecord':
148
- stream = params.StreamArn ? params.StreamArn : (params.StreamName ? params.StreamName : '')
148
+ stream = params.StreamArn ?? params.StreamName ?? ''
149
149
  this.injectToMessage(span, params, stream, true)
150
150
  break
151
151
  case 'putRecords':
152
- stream = params.StreamArn ? params.StreamArn : (params.StreamName ? params.StreamName : '')
152
+ stream = params.StreamArn ?? params.StreamName ?? ''
153
153
  for (let i = 0; i < params.Records.length; i++) {
154
154
  this.injectToMessage(
155
155
  span,
156
156
  params.Records[i],
157
157
  stream,
158
- i === 0 || (this.config.batchPropagationEnabled)
158
+ i === 0 || this.config.batchPropagationEnabled
159
159
  )
160
160
  }
161
161
  }
@@ -192,7 +192,7 @@ class Kinesis extends BaseAwsSdkPlugin {
192
192
  const byteSize = finalData.length
193
193
  // Kinesis max payload size is 1MB
194
194
  // So we must ensure adding DD context won't go over that (512b is an estimate)
195
- if (byteSize >= 1048576) {
195
+ if (byteSize >= 1_048_576) {
196
196
  log.info('Payload size too large to pass context')
197
197
  return
198
198
  }
@@ -33,7 +33,7 @@ class Lambda extends BaseAwsSdkPlugin {
33
33
  // Check to see if there's already a config on the request
34
34
  let clientContext = {}
35
35
  if (request.params.ClientContext) {
36
- const clientContextJson = Buffer.from(request.params.ClientContext, 'base64').toString('utf-8')
36
+ const clientContextJson = Buffer.from(request.params.ClientContext, 'base64').toString('utf8')
37
37
  clientContext = JSON.parse(clientContextJson)
38
38
  }
39
39
  if (!clientContext.custom) {
@@ -19,7 +19,7 @@ class Sns extends BaseAwsSdkPlugin {
19
19
  const arnParts = TopicArn.split(':')
20
20
 
21
21
  // Get the topic name from the last part of the ARN
22
- const topicName = arnParts[arnParts.length - 1]
22
+ const topicName = arnParts.at(-1)
23
23
 
24
24
  return {
25
25
  'resource.name': `${operation} ${params.TopicArn || response.data.TopicArn}`,
@@ -20,7 +20,6 @@ class Sqs extends BaseAwsSdkPlugin {
20
20
  this.addSub('apm:aws:response:start:sqs', obj => {
21
21
  const { request, response } = obj
22
22
  const store = storage('legacy').getStore()
23
- const plugin = this
24
23
  const contextExtraction = this.responseExtract(request.params, request.operation, response)
25
24
  let span
26
25
  let parsedMessageAttributes = null
@@ -35,7 +34,7 @@ class Sqs extends BaseAwsSdkPlugin {
35
34
  )
36
35
  }
37
36
  parsedMessageAttributes = contextExtraction.parsedAttributes
38
- span = plugin.tracer.startSpan('aws.response', options)
37
+ span = this.tracer.startSpan('aws.response', options)
39
38
  this.enter(span, store)
40
39
  }
41
40
  // extract DSM context after as we might not have a parent-child but may have a DSM context
@@ -96,7 +95,7 @@ class Sqs extends BaseAwsSdkPlugin {
96
95
  // 'https://sqs.us-east-1.amazonaws.com/123456789012/my-queue';
97
96
  let queueName = params.QueueName
98
97
  if (params.QueueUrl) {
99
- queueName = params.QueueUrl.split('/')[params.QueueUrl.split('/').length - 1]
98
+ queueName = params.QueueUrl.split('/').at(-1)
100
99
  }
101
100
 
102
101
  Object.assign(tags, {
@@ -134,7 +133,7 @@ class Sqs extends BaseAwsSdkPlugin {
134
133
  if (body.Type === 'Notification') {
135
134
  message = body
136
135
  }
137
- } catch (e) {
136
+ } catch {
138
137
  // SQS to SQS
139
138
  }
140
139
  }
@@ -186,7 +185,7 @@ class Sqs extends BaseAwsSdkPlugin {
186
185
  if (body.Type === 'Notification') {
187
186
  message = body
188
187
  }
189
- } catch (e) {
188
+ } catch {
190
189
  // SQS to SQS
191
190
  }
192
191
  }
@@ -54,7 +54,7 @@ class Stepfunctions extends BaseAwsSdkPlugin {
54
54
  const newInput = JSON.stringify(inputObj)
55
55
  request.params.input = newInput
56
56
  }
57
- } catch (e) {
57
+ } catch {
58
58
  log.info('Unable to treat input as JSON')
59
59
  }
60
60
  }
@@ -13,7 +13,7 @@ function generatePointerHash (components) {
13
13
  // If passing S3's ETag as a component, make sure any quotes have already been removed!
14
14
  const dataToHash = components.join('|')
15
15
  const hash = crypto.createHash('sha256').update(dataToHash).digest('hex')
16
- return hash.substring(0, 32)
16
+ return hash.slice(0, 32)
17
17
  }
18
18
 
19
19
  /**
@@ -54,18 +54,17 @@ function encodeValue (valueObject) {
54
54
  * Extracts and encodes primary key values from a DynamoDB item.
55
55
  * Handles tables with single-key and two-key scenarios.
56
56
  *
57
- * @param {Set<string>} keySet - Set of primary key names.
57
+ * @param {Array<string>} keyNames - Set of primary key names.
58
58
  * @param {Object} keyValuePairs - Object containing key/value pairs.
59
59
  * @returns {Array|undefined} [key1Name, key1Value, key2Name, key2Value], or undefined if invalid input.
60
60
  * key2 entries are empty strings in the single-key case.
61
61
  * @example
62
- * extractPrimaryKeys(new Set(['userId']), {userId: {S: "user123"}})
62
+ * extractPrimaryKeys(['userId'], {userId: {S: "user123"}})
63
63
  * // Returns ["userId", Buffer("user123"), "", ""]
64
- * extractPrimaryKeys(new Set(['userId', 'timestamp']), {userId: {S: "user123"}, timestamp: {N: "1234}})
64
+ * extractPrimaryKeys(['userId', 'timestamp'], {userId: {S: "user123"}, timestamp: {N: "1234}})
65
65
  * // Returns ["timestamp", Buffer.from("1234"), "userId", Buffer.from("user123")]
66
66
  */
67
- const extractPrimaryKeys = (keySet, keyValuePairs) => {
68
- const keyNames = Array.from(keySet)
67
+ const extractPrimaryKeys = (keyNames, keyValuePairs) => {
69
68
  if (keyNames.length === 0) {
70
69
  return
71
70
  }
@@ -37,7 +37,7 @@ function combine (queries) {
37
37
  function trim (str, size) {
38
38
  if (!str || str.length <= size) return str
39
39
 
40
- return `${str.substr(0, size - 3)}...`
40
+ return `${str.slice(0, size - 3)}...`
41
41
  }
42
42
 
43
43
  module.exports = CassandraDriverPlugin
@@ -17,7 +17,7 @@ function truncateCommand (cmdFields) {
17
17
 
18
18
  const argLen = cmdFields[i].length
19
19
  if (size < MAX_ARG_SIZE && size + argLen > MAX_ARG_SIZE) {
20
- cmdFields[i] = cmdFields[i].substring(0, 2)
20
+ cmdFields[i] = cmdFields[i].slice(0, 2)
21
21
  truncated = true
22
22
  }
23
23
 
@@ -66,12 +66,12 @@ class ChildProcessPlugin extends TracingPlugin {
66
66
 
67
67
  if (result !== undefined) {
68
68
  exitCode = result?.status || 0
69
- } else if (error !== undefined) {
70
- exitCode = error?.status || error?.code || 0
71
- } else {
69
+ } else if (error === undefined) {
72
70
  // TracingChannels call start, end synchronously. Later when the promise is resolved then asyncStart asyncEnd.
73
71
  // Therefore in the case of calling end with neither result nor error means that they will come in the asyncEnd.
74
72
  return
73
+ } else {
74
+ exitCode = error?.status || error?.code || 0
75
75
  }
76
76
 
77
77
  this.activeSpan?.setTag('cmd.exit_code', `${exitCode}`)
@@ -2,14 +2,14 @@
2
2
 
3
3
  const shellParser = require('shell-quote/parse')
4
4
 
5
- const ALLOWED_ENV_VARIABLES = ['LD_PRELOAD', 'LD_LIBRARY_PATH', 'PATH']
6
- const PROCESS_DENYLIST = ['md5']
5
+ const ALLOWED_ENV_VARIABLES = new Set(['LD_PRELOAD', 'LD_LIBRARY_PATH', 'PATH'])
6
+ const PROCESS_DENYLIST = new Set(['md5'])
7
7
 
8
8
  const VARNAMES_REGEX = /\$([\w\d_]*)(?:[^\w\d_]|$)/gmi
9
- // eslint-disable-next-line @stylistic/js/max-len
9
+ // eslint-disable-next-line @stylistic/max-len
10
10
  const PARAM_PATTERN = '^-{0,2}(?:p(?:ass(?:w(?:or)?d)?)?|address|api[-_]?key|e?mail|secret(?:[-_]?key)?|a(?:ccess|uth)[-_]?token|mysql_pwd|credentials|(?:stripe)?token)$'
11
11
  const regexParam = new RegExp(PARAM_PATTERN, 'i')
12
- const ENV_PATTERN = '^(\\w+=\\w+;)*\\w+=\\w+;?$'
12
+ const ENV_PATTERN = String.raw`^(\w+=\w+;)*\w+=\w+;?$`
13
13
  const envVarRegex = new RegExp(ENV_PATTERN)
14
14
  const REDACTED = '?'
15
15
 
@@ -71,25 +71,39 @@ function scrubChildProcessCmd (expression) {
71
71
  } else if (token.comment) {
72
72
  result.push(`#${token.comment}`)
73
73
  }
74
- } else if (!foundBinary) {
74
+ } else if (foundBinary) {
75
+ const paramKeyValue = token.split('=')
76
+ const paramKey = paramKeyValue[0]
77
+
78
+ if (regexParam.test(paramKey)) {
79
+ if (paramKeyValue.length === 1) {
80
+ expressionTokens[index + 1] = REDACTED
81
+ result.push(token)
82
+ } else {
83
+ result.push(`${paramKey}=${REDACTED}`)
84
+ }
85
+ } else {
86
+ result.push(token)
87
+ }
88
+ } else {
75
89
  if (envVarRegex.test(token)) {
76
90
  const envSplit = token.split('=')
77
91
 
78
- if (!ALLOWED_ENV_VARIABLES.includes(envSplit[0])) {
92
+ if (ALLOWED_ENV_VARIABLES.has(envSplit[0])) {
93
+ result.push(token)
94
+ } else {
79
95
  envSplit[1] = REDACTED
80
96
 
81
97
  const newToken = envSplit.join('=')
82
98
  expressionTokens[index] = newToken
83
99
 
84
100
  result.push(newToken)
85
- } else {
86
- result.push(token)
87
101
  }
88
102
  } else {
89
103
  foundBinary = true
90
104
  result.push(token)
91
105
 
92
- if (PROCESS_DENYLIST.includes(token)) {
106
+ if (PROCESS_DENYLIST.has(token)) {
93
107
  for (index++; index < expressionTokens.length; index++) {
94
108
  const token = expressionTokens[index]
95
109
 
@@ -103,20 +117,6 @@ function scrubChildProcessCmd (expression) {
103
117
  break
104
118
  }
105
119
  }
106
- } else {
107
- const paramKeyValue = token.split('=')
108
- const paramKey = paramKeyValue[0]
109
-
110
- if (regexParam.test(paramKey)) {
111
- if (paramKeyValue.length === 1) {
112
- expressionTokens[index + 1] = REDACTED
113
- result.push(token)
114
- } else {
115
- result.push(`${paramKey}=${REDACTED}`)
116
- }
117
- } else {
118
- result.push(token)
119
- }
120
120
  }
121
121
  }
122
122
  })
@@ -34,7 +34,10 @@ const {
34
34
  TEST_MANAGEMENT_IS_ATTEMPT_TO_FIX,
35
35
  TEST_HAS_FAILED_ALL_RETRIES,
36
36
  TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
37
- TEST_RETRY_REASON_TYPES
37
+ TEST_RETRY_REASON_TYPES,
38
+ TEST_IS_MODIFIED,
39
+ isModifiedTest,
40
+ getTestEndLine
38
41
  } = require('../../dd-trace/src/plugins/util/test')
39
42
  const { RESOURCE_NAME } = require('../../../ext/tags')
40
43
  const { COMPONENT, ERROR_MESSAGE } = require('../../dd-trace/src/constants')
@@ -345,7 +348,8 @@ class CucumberPlugin extends CiPlugin {
345
348
  hasPassedAllRetries,
346
349
  hasFailedAttemptToFix,
347
350
  isDisabled,
348
- isQuarantined
351
+ isQuarantined,
352
+ isModified
349
353
  }) => {
350
354
  const statusTag = isStep ? 'step.status' : TEST_STATUS
351
355
 
@@ -400,6 +404,14 @@ class CucumberPlugin extends CiPlugin {
400
404
  span.setTag(TEST_MANAGEMENT_IS_QUARANTINED, 'true')
401
405
  }
402
406
 
407
+ if (isModified) {
408
+ span.setTag(TEST_IS_MODIFIED, 'true')
409
+ if (isEfdRetry) {
410
+ span.setTag(TEST_IS_RETRY, 'true')
411
+ span.setTag(TEST_RETRY_REASON, TEST_RETRY_REASON_TYPES.efd)
412
+ }
413
+ }
414
+
403
415
  span.finish()
404
416
  if (!isStep) {
405
417
  const spanTags = span.context()._tags
@@ -442,6 +454,49 @@ class CucumberPlugin extends CiPlugin {
442
454
  this.addBind('ci:cucumber:test:fn', (ctx) => {
443
455
  return ctx.currentStore
444
456
  })
457
+
458
+ this.addSub('ci:cucumber:is-modified-test', ({
459
+ scenarios,
460
+ testFileAbsolutePath,
461
+ modifiedTests,
462
+ stepIds,
463
+ stepDefinitions,
464
+ setIsModified
465
+ }) => {
466
+ const testScenarioPath = getTestSuitePath(testFileAbsolutePath, this.repositoryRoot || process.cwd())
467
+ for (const scenario of scenarios) {
468
+ const isModified = isModifiedTest(
469
+ testScenarioPath,
470
+ scenario.location.line,
471
+ scenario.steps[scenario.steps.length - 1].location.line,
472
+ modifiedTests,
473
+ 'cucumber'
474
+ )
475
+ if (isModified) {
476
+ setIsModified(true)
477
+ return
478
+ }
479
+ }
480
+ for (const stepDefinition of stepDefinitions) {
481
+ if (!stepIds?.includes(stepDefinition.id)) {
482
+ continue
483
+ }
484
+ const testStartLineStep = stepDefinition.line
485
+ const testEndLineStep = getTestEndLine(stepDefinition.code, testStartLineStep)
486
+ const isModified = isModifiedTest(
487
+ stepDefinition.uri,
488
+ testStartLineStep,
489
+ testEndLineStep,
490
+ modifiedTests,
491
+ 'cucumber'
492
+ )
493
+ if (isModified) {
494
+ setIsModified(true)
495
+ return
496
+ }
497
+ }
498
+ setIsModified(false)
499
+ })
445
500
  }
446
501
 
447
502
  startTestSpan (testName, testSuite, extraTags) {