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
@@ -5,8 +5,8 @@ class NoopSpanProcessor {
5
5
  return Promise.resolve()
6
6
  }
7
7
 
8
- onStart (span, context) { }
9
- onEnd (span) { }
8
+ onStart (span, context) {}
9
+ onEnd (span) {}
10
10
 
11
11
  shutdown () {
12
12
  return Promise.resolve()
@@ -71,7 +71,11 @@ class Tracer {
71
71
 
72
72
  // Update meta and samplingPriority based on extracted values
73
73
  Object.assign(meta, otherPropagatedTags)
74
- samplingPriority = TextMapPropagator._getSamplingPriority(traceFlag, parseInt(samplingPriorityTs, 10), origin)
74
+ samplingPriority = TextMapPropagator._getSamplingPriority(
75
+ traceFlag,
76
+ Number.parseInt(samplingPriorityTs, 10),
77
+ origin
78
+ )
75
79
  } else {
76
80
  log.debug(`no dd list member in tracestate from incoming request: ${ts}`)
77
81
  }
@@ -144,10 +148,7 @@ class Tracer {
144
148
 
145
149
  // Set initial span attributes. The attributes object may have been mutated
146
150
  // by the sampler, so we sanitize the merged attributes before setting them.
147
- sanitizeAttributes(
148
- // Object.assign(attributes, samplingResult.attributes)
149
- attributes
150
- )
151
+ sanitizeAttributes(attributes)
151
152
  )
152
153
  }
153
154
 
@@ -14,12 +14,10 @@ class LogPropagator {
14
14
  carrier.dd = {}
15
15
 
16
16
  if (spanContext) {
17
- if (this._config.traceId128BitGenerationEnabled &&
18
- this._config.traceId128BitLoggingEnabled && spanContext._trace.tags['_dd.p.tid']) {
19
- carrier.dd.trace_id = spanContext.toTraceId(true)
20
- } else {
21
- carrier.dd.trace_id = spanContext.toTraceId()
22
- }
17
+ carrier.dd.trace_id = this._config.traceId128BitGenerationEnabled &&
18
+ this._config.traceId128BitLoggingEnabled && spanContext._trace.tags['_dd.p.tid']
19
+ ? spanContext.toTraceId(true)
20
+ : spanContext.toTraceId()
23
21
 
24
22
  carrier.dd.span_id = spanContext.toSpanId()
25
23
  }
@@ -35,8 +33,8 @@ class LogPropagator {
35
33
  }
36
34
 
37
35
  if (carrier.dd.trace_id.length === 32) {
38
- const hi = carrier.dd.trace_id.substring(0, 16)
39
- const lo = carrier.dd.trace_id.substring(16, 32)
36
+ const hi = carrier.dd.trace_id.slice(0, 16)
37
+ const lo = carrier.dd.trace_id.slice(16, 32)
40
38
  const spanContext = new DatadogSpanContext({
41
39
  traceId: id(lo, 16),
42
40
  spanId: id(carrier.dd.span_id, 10)
@@ -31,21 +31,21 @@ const b3HeaderKey = 'b3'
31
31
  const sqsdHeaderHey = 'x-aws-sqsd-attr-_datadog'
32
32
  const b3HeaderExpr = /^(([0-9a-f]{16}){1,2}-[0-9a-f]{16}(-[01d](-[0-9a-f]{16})?)?|[01d])$/i
33
33
  const baggageExpr = new RegExp(`^${baggagePrefix}(.+)$`)
34
- const tagKeyExpr = /^_dd\.p\.[\x21-\x2b\x2d-\x7e]+$/ // ASCII minus spaces and commas
35
- const tagValueExpr = /^[\x20-\x2b\x2d-\x7e]*$/ // ASCII minus commas
34
+ const tagKeyExpr = /^_dd\.p\.[\x21-\x2B\x2D-\x7E]+$/ // ASCII minus spaces and commas
35
+ const tagValueExpr = /^[\x20-\x2B\x2D-\x7E]*$/ // ASCII minus commas
36
36
  const traceparentExpr = /^([a-f0-9]{2})-([a-f0-9]{32})-([a-f0-9]{16})-([a-f0-9]{2})(-.*)?$/i
37
37
  const traceparentKey = 'traceparent'
38
38
  const tracestateKey = 'tracestate'
39
39
  const ddKeys = [traceKey, spanKey, samplingKey, originKey]
40
40
  const b3Keys = [b3TraceKey, b3SpanKey, b3ParentKey, b3SampledKey, b3FlagsKey, b3HeaderKey]
41
41
  const w3cKeys = [traceparentKey, tracestateKey]
42
- const logKeys = ddKeys.concat(b3Keys, w3cKeys)
42
+ const logKeys = [...ddKeys, ...b3Keys, ...w3cKeys]
43
43
  // Origin value in tracestate replaces '~', ',' and ';' with '_"
44
- const tracestateOriginFilter = /[^\x20-\x2b\x2d-\x3a\x3c-\x7d]/g
44
+ const tracestateOriginFilter = /[^\x20-\x2B\x2D-\x3A\x3C-\x7D]/g
45
45
  // Tag keys in tracestate replace ' ', ',' and '=' with '_'
46
- const tracestateTagKeyFilter = /[^\x21-\x2b\x2d-\x3c\x3e-\x7e]/g
46
+ const tracestateTagKeyFilter = /[^\x21-\x2B\x2D-\x3C\x3E-\x7E]/g
47
47
  // Tag values in tracestate replace ',', '~' and ';' with '_'
48
- const tracestateTagValueFilter = /[^\x20-\x2b\x2d-\x3a\x3c-\x7d]/g
48
+ const tracestateTagValueFilter = /[^\x20-\x2B\x2D-\x3A\x3C-\x7D]/g
49
49
  const invalidSegment = /^0+$/
50
50
  const zeroTraceId = '0000000000000000'
51
51
  const hex16 = /^[0-9A-Fa-f]{16}$/
@@ -146,7 +146,7 @@ class TextMapPropagator {
146
146
  baggage += item
147
147
  }
148
148
 
149
- baggage = baggage.slice(0, baggage.length - 1)
149
+ baggage = baggage.slice(0, -1)
150
150
  if (baggage) carrier.baggage = baggage
151
151
  }
152
152
  }
@@ -240,7 +240,7 @@ class TextMapPropagator {
240
240
  if (typeof origin === 'string') {
241
241
  const originValue = origin
242
242
  .replace(tracestateOriginFilter, '_')
243
- .replace(/[\x3d]/g, '~')
243
+ .replace(/[\x3D]/g, '~')
244
244
 
245
245
  state.set('o', originValue)
246
246
  }
@@ -254,7 +254,7 @@ class TextMapPropagator {
254
254
  const tagValue = tags[key]
255
255
  .toString()
256
256
  .replace(tracestateTagValueFilter, '_')
257
- .replace(/[\x3d]/g, '~')
257
+ .replace(/[\x3D]/g, '~')
258
258
 
259
259
  state.set(tagKey, tagValue)
260
260
  }
@@ -316,12 +316,10 @@ class TextMapPropagator {
316
316
  extractedContext = this._extractB3SingleContext(carrier)
317
317
  break
318
318
  case 'b3':
319
- if (this._config.tracePropagationStyle.otelPropagators) {
319
+ extractedContext = this._config.tracePropagationStyle.otelPropagators
320
320
  // TODO: should match "b3 single header" in next major
321
- extractedContext = this._extractB3SingleContext(carrier)
322
- } else {
323
- extractedContext = this._extractB3MultiContext(carrier)
324
- }
321
+ ? this._extractB3SingleContext(carrier)
322
+ : this._extractB3MultiContext(carrier)
325
323
  break
326
324
  case 'b3multi':
327
325
  extractedContext = this._extractB3MultiContext(carrier)
@@ -442,7 +440,7 @@ class TextMapPropagator {
442
440
  let parsed
443
441
  try {
444
442
  parsed = JSON.parse(headerValue)
445
- } catch (e) {
443
+ } catch {
446
444
  return null
447
445
  }
448
446
  return this._extractDatadogContext(parsed)
@@ -471,7 +469,7 @@ class TextMapPropagator {
471
469
  traceId: id(traceId, 16),
472
470
  spanId: id(spanId, 16),
473
471
  isRemote: true,
474
- sampling: { priority: parseInt(flags, 10) & 1 ? 1 : 0 },
472
+ sampling: { priority: Number.parseInt(flags, 10) & 1 ? 1 : 0 },
475
473
  traceparent,
476
474
  tracestate
477
475
  })
@@ -486,7 +484,7 @@ class TextMapPropagator {
486
484
  break
487
485
  }
488
486
  case 's': {
489
- const priority = parseInt(value, 10)
487
+ const priority = Number.parseInt(value, 10)
490
488
  if (!Number.isInteger(priority)) continue
491
489
  if (
492
490
  (spanContext._sampling.priority === 1 && priority > 0) ||
@@ -500,7 +498,7 @@ class TextMapPropagator {
500
498
  spanContext._trace.origin = value
501
499
  break
502
500
  case 't.dm': {
503
- const mechanism = Math.abs(parseInt(value, 10))
501
+ const mechanism = Math.abs(Number.parseInt(value, 10))
504
502
  if (Number.isInteger(mechanism)) {
505
503
  spanContext._sampling.mechanism = mechanism
506
504
  spanContext._trace.tags['_dd.p.dm'] = `-${mechanism}`
@@ -510,7 +508,7 @@ class TextMapPropagator {
510
508
  default: {
511
509
  if (!key.startsWith('t.')) continue
512
510
  const subKey = key.slice(2) // e.g. t.tid -> tid
513
- const transformedValue = value.replace(/[\x7e]/gm, '=')
511
+ const transformedValue = value.replace(/[\x7E]/gm, '=')
514
512
 
515
513
  // If subkey is tid then do nothing because trace header tid should always be preserved
516
514
  if (subKey === 'tid') {
@@ -590,7 +588,7 @@ class TextMapPropagator {
590
588
  }
591
589
 
592
590
  if (parts[2]) {
593
- b3[b3SampledKey] = parts[2] !== '0' ? '1' : '0'
591
+ b3[b3SampledKey] = parts[2] === '0' ? '0' : '1'
594
592
 
595
593
  if (parts[2] === 'd') {
596
594
  b3[b3FlagsKey] = '1'
@@ -633,6 +631,9 @@ class TextMapPropagator {
633
631
  if (!carrier || !carrier.baggage) return
634
632
  if (!spanContext) removeAllBaggageItems()
635
633
  const baggages = carrier.baggage.split(',')
634
+ const keysToSpanTag = this._config.baggageTagKeys === '*'
635
+ ? undefined
636
+ : new Set(this._config.baggageTagKeys.split(','))
636
637
  for (const keyValue of baggages) {
637
638
  if (!keyValue.includes('=')) {
638
639
  if (spanContext) spanContext._baggageItems = {}
@@ -647,8 +648,11 @@ class TextMapPropagator {
647
648
  }
648
649
  // the current code assumes precedence of ot-baggage- (legacy opentracing baggage) over baggage
649
650
  if (spanContext) {
650
- if (key in spanContext._baggageItems) return
651
+ if (Object.hasOwn(spanContext._baggageItems, key)) continue
651
652
  spanContext._baggageItems[key] = value
653
+ if (this._config.baggageTagKeys === '*' || keysToSpanTag.has(key)) {
654
+ spanContext._trace.tags['baggage.' + key] = value
655
+ }
652
656
  } else {
653
657
  setBaggageItem(key, value)
654
658
  }
@@ -656,7 +660,7 @@ class TextMapPropagator {
656
660
  }
657
661
 
658
662
  _extractSamplingPriority (carrier, spanContext) {
659
- const priority = parseInt(carrier[samplingKey], 10)
663
+ const priority = Number.parseInt(carrier[samplingKey], 10)
660
664
 
661
665
  if (Number.isInteger(priority)) {
662
666
  spanContext._sampling.priority = priority
@@ -703,7 +707,7 @@ class TextMapPropagator {
703
707
 
704
708
  if (buffer.length !== 16) return
705
709
 
706
- const tid = traceId.substring(0, 16)
710
+ const tid = traceId.slice(0, 16)
707
711
 
708
712
  if (tid === zeroTraceId) return
709
713
 
@@ -17,10 +17,14 @@ function fromString (Type, regex, value) {
17
17
  }
18
18
 
19
19
  function toString (map, pairSeparator, fieldSeparator) {
20
- return Array.from(map.entries())
21
- .reverse()
22
- .map((pair) => pair.join(pairSeparator))
23
- .join(fieldSeparator)
20
+ let result = ''
21
+ for (const [key, value] of map) {
22
+ if (result) {
23
+ result = `${fieldSeparator}${result}`
24
+ }
25
+ result = `${key}${pairSeparator}${value}${result}`
26
+ }
27
+ return result
24
28
  }
25
29
 
26
30
  class TraceStateData extends Map {
@@ -4,7 +4,6 @@
4
4
  const { performance } = require('perf_hooks')
5
5
  const now = performance.now.bind(performance)
6
6
  const dateNow = Date.now
7
- const satisfies = require('semifies')
8
7
  const SpanContext = require('./span_context')
9
8
  const id = require('../id')
10
9
  const tagger = require('../tagger')
@@ -26,7 +25,7 @@ const unfinishedRegistry = createRegistry('unfinished')
26
25
  const finishedRegistry = createRegistry('finished')
27
26
 
28
27
  const OTEL_ENABLED = !!process.env.DD_TRACE_OTEL_ENABLED
29
- const ALLOWED = ['string', 'number', 'boolean']
28
+ const ALLOWED = new Set(['string', 'number', 'boolean'])
30
29
 
31
30
  const integrationCounters = {
32
31
  spans_created: {},
@@ -129,7 +128,7 @@ class DatadogSpan {
129
128
  const spanContext = this.context()
130
129
  const resourceName = spanContext._tags['resource.name'] || ''
131
130
  const resource = resourceName.length > 100
132
- ? `${resourceName.substring(0, 97)}...`
131
+ ? `${resourceName.slice(0, 97)}...`
133
132
  : resourceName
134
133
  const json = JSON.stringify({
135
134
  traceId: spanContext._traceId,
@@ -198,7 +197,7 @@ class DatadogSpan {
198
197
 
199
198
  addLink (context, attributes) {
200
199
  this._links.push({
201
- context: context._ddContext ? context._ddContext : context,
200
+ context: context._ddContext ?? context,
202
201
  attributes: this._sanitizeAttributes(attributes)
203
202
  })
204
203
  }
@@ -235,10 +234,8 @@ class DatadogSpan {
235
234
  return
236
235
  }
237
236
 
238
- if (DD_TRACE_EXPERIMENTAL_STATE_TRACKING === 'true') {
239
- if (!this._spanContext._tags['service.name']) {
240
- log.error('Finishing invalid span: %s', this)
241
- }
237
+ if (DD_TRACE_EXPERIMENTAL_STATE_TRACKING === 'true' && !this._spanContext._tags['service.name']) {
238
+ log.error('Finishing invalid span: %s', this)
242
239
  }
243
240
 
244
241
  getIntegrationCounter('spans_finished', this._integrationName).inc()
@@ -256,7 +253,7 @@ class DatadogSpan {
256
253
  finishedRegistry.register(this, this._name)
257
254
  }
258
255
 
259
- finishTime = parseFloat(finishTime) || this._getTime()
256
+ finishTime = Number.parseFloat(finishTime) || this._getTime()
260
257
 
261
258
  this._duration = finishTime - this._startTime
262
259
  this._spanContext._trace.finished.push(this)
@@ -275,7 +272,7 @@ class DatadogSpan {
275
272
  }
276
273
  } else {
277
274
  const maybeScalar = maybeArray
278
- if (ALLOWED.includes(typeof maybeScalar)) {
275
+ if (ALLOWED.has(typeof maybeScalar)) {
279
276
  // Wrap the value as a string if it's not already a string
280
277
  sanitizedAttributes[key] = typeof maybeScalar === 'string' ? maybeScalar : String(maybeScalar)
281
278
  } else {
@@ -299,14 +296,14 @@ class DatadogSpan {
299
296
  if (Array.isArray(value)) {
300
297
  const newArray = []
301
298
  for (const subkey in value) {
302
- if (ALLOWED.includes(typeof value[subkey])) {
299
+ if (ALLOWED.has(typeof value[subkey])) {
303
300
  newArray.push(value[subkey])
304
301
  } else {
305
302
  log.warn('Dropping span event attribute. It is not of an allowed type')
306
303
  }
307
304
  }
308
305
  sanitizedAttributes[key] = newArray
309
- } else if (ALLOWED.includes(typeof value)) {
306
+ } else if (ALLOWED.has(typeof value)) {
310
307
  sanitizedAttributes[key] = value
311
308
  } else {
312
309
  log.warn('Dropping span event attribute. It is not of an allowed type')
@@ -388,8 +385,6 @@ class DatadogSpan {
388
385
  }
389
386
 
390
387
  function createRegistry (type) {
391
- if (!satisfies(process.version, '>=14.6')) return
392
-
393
388
  return new global.FinalizationRegistry(name => {
394
389
  runtimeMetrics.decrement(`runtime.node.spans.${type}`)
395
390
  runtimeMetrics.decrement(`runtime.node.spans.${type}.by.name`, [`span_name:${name}`])
@@ -107,6 +107,12 @@ class DatadogTracer {
107
107
  }
108
108
  }
109
109
 
110
+ /**
111
+ * Get the span context from a span or a span context.
112
+ *
113
+ * @param {Span|SpanContext} spanContext
114
+ * @returns {SpanContext}
115
+ */
110
116
  function getContext (spanContext) {
111
117
  if (spanContext instanceof Span) {
112
118
  spanContext = spanContext.context()
@@ -122,17 +128,14 @@ function getContext (spanContext) {
122
128
  function getParent (references = []) {
123
129
  let parent = null
124
130
 
125
- for (let i = 0; i < references.length; i++) {
126
- const ref = references[i]
131
+ for (const ref of references) {
127
132
  const type = ref.type()
128
133
 
129
134
  if (type === REFERENCE_CHILD_OF) {
130
135
  parent = ref.referencedContext()
131
136
  break
132
- } else if (type === REFERENCE_FOLLOWS_FROM) {
133
- if (!parent) {
134
- parent = ref.referencedContext()
135
- }
137
+ } else if (type === REFERENCE_FOLLOWS_FROM && !parent) {
138
+ parent = ref.referencedContext()
136
139
  }
137
140
  }
138
141
 
@@ -22,7 +22,7 @@ function maybeJSONParseValue (value) {
22
22
 
23
23
  try {
24
24
  return JSON.parse(value)
25
- } catch (e) {
25
+ } catch {
26
26
  return value
27
27
  }
28
28
  }
@@ -1,13 +1,13 @@
1
1
  const { PAYLOAD_TAGGING_MAX_TAGS } = require('../constants')
2
2
 
3
- const redactedKeys = [
3
+ const redactedKeys = new Set([
4
4
  'authorization', 'x-authorization', 'password', 'token'
5
- ]
5
+ ])
6
6
  const truncated = 'truncated'
7
7
  const redacted = 'redacted'
8
8
 
9
9
  function escapeKey (key) {
10
- return key.replaceAll('.', '\\.')
10
+ return key.replaceAll('.', String.raw`\.`)
11
11
  }
12
12
 
13
13
  /**
@@ -56,18 +56,18 @@ function tagsFromObject (object, opts) {
56
56
 
57
57
  if (['number', 'boolean'].includes(typeof object) || Buffer.isBuffer(object)) {
58
58
  tagCount += 1
59
- result[prefix] = object.toString().substring(0, 5000)
59
+ result[prefix] = object.toString().slice(0, 5000)
60
60
  return
61
61
  }
62
62
 
63
63
  if (typeof object === 'string') {
64
64
  tagCount += 1
65
- result[prefix] = object.substring(0, 5000)
65
+ result[prefix] = object.slice(0, 5000)
66
66
  }
67
67
 
68
68
  if (typeof object === 'object') {
69
69
  for (const [key, value] of Object.entries(object)) {
70
- if (redactedKeys.includes(key.toLowerCase())) {
70
+ if (redactedKeys.has(key.toLowerCase())) {
71
71
  tagCount += 1
72
72
  result[`${prefix}.${escapeKey(key)}`] = redacted
73
73
  } else {
@@ -22,7 +22,7 @@ function findPkg () {
22
22
 
23
23
  try {
24
24
  return JSON.parse(fs.readFileSync(filePath, 'utf8'))
25
- } catch (e) {
25
+ } catch {
26
26
  return {}
27
27
  }
28
28
  }
@@ -28,7 +28,10 @@ const {
28
28
  DI_DEBUG_ERROR_SNAPSHOT_ID_SUFFIX,
29
29
  DI_DEBUG_ERROR_FILE_SUFFIX,
30
30
  DI_DEBUG_ERROR_LINE_SUFFIX,
31
- getLibraryCapabilitiesTags
31
+ getLibraryCapabilitiesTags,
32
+ getPullRequestDiff,
33
+ getModifiedTestsFromDiff,
34
+ getPullRequestBaseBranch
32
35
  } = require('./util/test')
33
36
  const Plugin = require('./plugin')
34
37
  const { COMPONENT } = require('../constants')
@@ -45,10 +48,23 @@ const {
45
48
  GIT_COMMIT_SHA,
46
49
  GIT_BRANCH,
47
50
  CI_WORKSPACE_PATH,
48
- GIT_COMMIT_MESSAGE
51
+ GIT_COMMIT_MESSAGE,
52
+ GIT_TAG,
53
+ GIT_PULL_REQUEST_BASE_BRANCH_SHA,
54
+ GIT_COMMIT_HEAD_SHA,
55
+ GIT_PULL_REQUEST_BASE_BRANCH
49
56
  } = require('./util/tags')
50
57
  const { OS_VERSION, OS_PLATFORM, OS_ARCHITECTURE, RUNTIME_NAME, RUNTIME_VERSION } = require('./util/env')
51
58
  const getDiClient = require('../ci-visibility/dynamic-instrumentation')
59
+ const { DD_MAJOR } = require('../../../../version')
60
+
61
+ const FRAMEWORK_TO_TRIMMED_COMMAND = {
62
+ vitest: 'vitest run',
63
+ mocha: 'mocha',
64
+ cucumber: 'cucumber-js',
65
+ playwright: 'playwright test',
66
+ jest: 'jest'
67
+ }
52
68
 
53
69
  module.exports = class CiPlugin extends Plugin {
54
70
  constructor (...args) {
@@ -103,7 +119,11 @@ module.exports = class CiPlugin extends Plugin {
103
119
  // only for playwright
104
120
  this.rootDir = rootDir
105
121
 
106
- const testSessionName = getTestSessionName(this.config, this.command, this.testEnvironmentMetadata)
122
+ const testSessionName = getTestSessionName(
123
+ this.config,
124
+ DD_MAJOR < 6 ? this.command : FRAMEWORK_TO_TRIMMED_COMMAND[this.constructor.id],
125
+ this.testEnvironmentMetadata
126
+ )
107
127
 
108
128
  const metadataTags = {}
109
129
  for (const testLevel of TEST_LEVEL_EVENT_TYPES) {
@@ -194,6 +214,27 @@ module.exports = class CiPlugin extends Plugin {
194
214
  onDone({ err, testManagementTests })
195
215
  })
196
216
  })
217
+
218
+ this.addSub(`ci:${this.constructor.id}:modified-tests`, ({ onDone }) => {
219
+ const {
220
+ [GIT_PULL_REQUEST_BASE_BRANCH]: pullRequestBaseBranch,
221
+ [GIT_PULL_REQUEST_BASE_BRANCH_SHA]: pullRequestBaseBranchSha,
222
+ [GIT_COMMIT_HEAD_SHA]: commitHeadSha
223
+ } = this.testEnvironmentMetadata
224
+
225
+ const baseBranchSha = pullRequestBaseBranchSha || getPullRequestBaseBranch(pullRequestBaseBranch)
226
+
227
+ if (baseBranchSha) {
228
+ const diff = getPullRequestDiff(baseBranchSha, commitHeadSha)
229
+ const modifiedTests = getModifiedTestsFromDiff(diff)
230
+ if (modifiedTests) {
231
+ return onDone({ err: null, modifiedTests })
232
+ }
233
+ }
234
+
235
+ // TODO: Add telemetry for this type of error
236
+ return onDone({ err: new Error('No modified tests could have been retrieved') })
237
+ })
197
238
  }
198
239
 
199
240
  get telemetry () {
@@ -240,7 +281,10 @@ module.exports = class CiPlugin extends Plugin {
240
281
  [GIT_BRANCH]: branch,
241
282
  [CI_PROVIDER_NAME]: ciProviderName,
242
283
  [CI_WORKSPACE_PATH]: repositoryRoot,
243
- [GIT_COMMIT_MESSAGE]: commitMessage
284
+ [GIT_COMMIT_MESSAGE]: commitMessage,
285
+ [GIT_TAG]: tag,
286
+ [GIT_PULL_REQUEST_BASE_BRANCH_SHA]: pullRequestBaseSha,
287
+ [GIT_COMMIT_HEAD_SHA]: commitHeadSha
244
288
  } = this.testEnvironmentMetadata
245
289
 
246
290
  this.repositoryRoot = repositoryRoot || process.cwd()
@@ -259,7 +303,10 @@ module.exports = class CiPlugin extends Plugin {
259
303
  runtimeVersion,
260
304
  branch,
261
305
  testLevel: 'suite',
262
- commitMessage
306
+ commitMessage,
307
+ tag,
308
+ pullRequestBaseSha,
309
+ commitHeadSha
263
310
  }
264
311
  }
265
312
 
@@ -372,11 +419,12 @@ module.exports = class CiPlugin extends Plugin {
372
419
  return Promise.resolve()
373
420
  }
374
421
  log.debug('Removing all Dynamic Instrumentation probes')
375
- return Promise.all(Array.from(this.fileLineToProbeId.keys())
376
- .map((fileLine) => {
377
- const [file, line] = fileLine.split(':')
378
- return this.removeDiProbe({ file, line })
379
- }))
422
+ const promises = []
423
+ for (const fileLine of this.fileLineToProbeId.keys()) {
424
+ const [file, line] = fileLine.split(':')
425
+ promises.push(this.removeDiProbe({ file, line }))
426
+ }
427
+ return Promise.all(promises)
380
428
  }
381
429
 
382
430
  removeDiProbe ({ file, line }) {
@@ -387,6 +435,10 @@ module.exports = class CiPlugin extends Plugin {
387
435
  }
388
436
 
389
437
  addDiProbe (err) {
438
+ if (!err?.stack) {
439
+ log.warn('Can not add breakpoint if the test error does not have a stack')
440
+ return
441
+ }
390
442
  const [file, line, stackIndex] = getFileAndLineNumberFromError(err, this.repositoryRoot)
391
443
 
392
444
  if (!file || !Number.isInteger(line)) {
@@ -7,14 +7,14 @@ class ConsumerPlugin extends InboundPlugin {
7
7
  static get kind () { return 'consumer' }
8
8
  static get type () { return 'messaging' }
9
9
 
10
- startSpan (options) {
10
+ startSpan (options, enterOrCtx) {
11
11
  if (!options.service) {
12
12
  options.service = this.config.service || this.serviceName()
13
13
  }
14
14
  if (!options.kind) {
15
15
  options.kind = this.constructor.kind
16
16
  }
17
- return super.startSpan(this.operationName(), options)
17
+ return super.startSpan(this.operationName(), options, enterOrCtx)
18
18
  }
19
19
  }
20
20
 
@@ -2,6 +2,10 @@
2
2
 
3
3
  const TracingPlugin = require('./tracing')
4
4
 
5
- class InboundPlugin extends TracingPlugin {}
5
+ class InboundPlugin extends TracingPlugin {
6
+ bindFinish (ctx) {
7
+ return ctx.parentStore
8
+ }
9
+ }
6
10
 
7
11
  module.exports = InboundPlugin
@@ -84,7 +84,6 @@ module.exports = {
84
84
  get nyc () { return require('../../../datadog-plugin-nyc/src') },
85
85
  get oracledb () { return require('../../../datadog-plugin-oracledb/src') },
86
86
  get openai () { return require('../../../datadog-plugin-openai/src') },
87
- get paperplane () { return require('../../../datadog-plugin-paperplane/src') },
88
87
  get pg () { return require('../../../datadog-plugin-pg/src') },
89
88
  get pino () { return require('../../../datadog-plugin-pino/src') },
90
89
  get 'pino-pretty' () { return require('../../../datadog-plugin-pino/src') },
@@ -26,6 +26,10 @@ class OutboundPlugin extends TracingPlugin {
26
26
  })
27
27
  }
28
28
 
29
+ bindFinish (ctx) {
30
+ return ctx.parentStore
31
+ }
32
+
29
33
  startSpan (...args) {
30
34
  const span = super.startSpan(...args)
31
35
  if (
@@ -67,7 +71,6 @@ class OutboundPlugin extends TracingPlugin {
67
71
  }
68
72
  }
69
73
  }
70
- return undefined
71
74
  }
72
75
 
73
76
  getPeerServiceRemap (peerData) {
@@ -87,10 +90,6 @@ class OutboundPlugin extends TracingPlugin {
87
90
  return peerData
88
91
  }
89
92
 
90
- bindFinish (ctx) {
91
- return ctx.parentStore
92
- }
93
-
94
93
  finish (ctx) {
95
94
  const span = ctx?.currentStore?.span || this.activeSpan
96
95
  this.tagPeerService(span)
@@ -34,7 +34,7 @@ class StoreBinding {
34
34
  this._transform = data => {
35
35
  const store = storage('legacy').getStore()
36
36
 
37
- return !store || !store.noop
37
+ return !store || !store.noop || data?.currentStore
38
38
  ? transform(data)
39
39
  : store
40
40
  }
@@ -7,7 +7,7 @@ class ProducerPlugin extends OutboundPlugin {
7
7
  static get kind () { return 'producer' }
8
8
  static get type () { return 'messaging' }
9
9
 
10
- startSpan (options) {
10
+ startSpan (options, enterOrCtx) {
11
11
  const spanDefaults = {
12
12
  kind: this.constructor.kind
13
13
  }
@@ -19,7 +19,7 @@ class ProducerPlugin extends OutboundPlugin {
19
19
  if (!options[key]) options[key] = spanDefaults[key]
20
20
  }
21
21
  )
22
- return super.startSpan(this.operationName(), options)
22
+ return super.startSpan(this.operationName(), options, enterOrCtx)
23
23
  }
24
24
  }
25
25
 
@@ -11,12 +11,12 @@ class StoragePlugin extends ClientPlugin {
11
11
  this.system = this.constructor.system || this.component
12
12
  }
13
13
 
14
- startSpan (name, options) {
14
+ startSpan (name, options, ctx) {
15
15
  if (!options.service && this.system) {
16
16
  options.service = `${this.tracer._service}-${this.system}`
17
17
  }
18
18
 
19
- return super.startSpan(name, options)
19
+ return super.startSpan(name, options, ctx)
20
20
  }
21
21
  }
22
22