dd-trace 5.53.0 → 5.55.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 (368) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/ci/cypress/plugin.js +8 -0
  3. package/ci/cypress/polyfills.js +23 -0
  4. package/ci/init.js +8 -7
  5. package/index.d.ts +33 -16
  6. package/initialize.mjs +5 -6
  7. package/package.json +40 -38
  8. package/packages/datadog-code-origin/index.js +22 -4
  9. package/packages/datadog-core/src/utils/src/get.js +1 -1
  10. package/packages/datadog-core/src/utils/src/has.js +1 -1
  11. package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
  12. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  13. package/packages/datadog-core/src/utils/src/pick.js +2 -2
  14. package/packages/datadog-core/src/utils/src/set.js +1 -1
  15. package/packages/datadog-core/src/utils/src/uniq.js +1 -1
  16. package/packages/datadog-instrumentations/src/amqp10.js +19 -17
  17. package/packages/datadog-instrumentations/src/amqplib.js +52 -35
  18. package/packages/datadog-instrumentations/src/apollo.js +2 -2
  19. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  20. package/packages/datadog-instrumentations/src/cassandra-driver.js +10 -10
  21. package/packages/datadog-instrumentations/src/child_process.js +1 -2
  22. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +89 -75
  23. package/packages/datadog-instrumentations/src/cookie-parser.js +1 -1
  24. package/packages/datadog-instrumentations/src/couchbase.js +6 -9
  25. package/packages/datadog-instrumentations/src/cucumber.js +108 -68
  26. package/packages/datadog-instrumentations/src/cypress.js +2 -1
  27. package/packages/datadog-instrumentations/src/dns.js +5 -5
  28. package/packages/datadog-instrumentations/src/elasticsearch.js +9 -10
  29. package/packages/datadog-instrumentations/src/fastify.js +7 -9
  30. package/packages/datadog-instrumentations/src/fs.js +1 -1
  31. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +35 -43
  32. package/packages/datadog-instrumentations/src/graphql.js +7 -10
  33. package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
  34. package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
  35. package/packages/datadog-instrumentations/src/hapi.js +10 -11
  36. package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
  37. package/packages/datadog-instrumentations/src/helpers/fetch.js +4 -5
  38. package/packages/datadog-instrumentations/src/helpers/hook.js +2 -3
  39. package/packages/datadog-instrumentations/src/helpers/hooks.js +0 -1
  40. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
  41. package/packages/datadog-instrumentations/src/helpers/register.js +11 -12
  42. package/packages/datadog-instrumentations/src/http/client.js +14 -20
  43. package/packages/datadog-instrumentations/src/jest.js +201 -143
  44. package/packages/datadog-instrumentations/src/kafkajs.js +52 -44
  45. package/packages/datadog-instrumentations/src/knex.js +4 -4
  46. package/packages/datadog-instrumentations/src/koa.js +2 -3
  47. package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
  48. package/packages/datadog-instrumentations/src/mariadb.js +49 -65
  49. package/packages/datadog-instrumentations/src/mocha/main.js +116 -73
  50. package/packages/datadog-instrumentations/src/mocha/utils.js +36 -12
  51. package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
  52. package/packages/datadog-instrumentations/src/mocha.js +3 -1
  53. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  54. package/packages/datadog-instrumentations/src/mysql.js +30 -37
  55. package/packages/datadog-instrumentations/src/mysql2.js +53 -47
  56. package/packages/datadog-instrumentations/src/net.js +1 -1
  57. package/packages/datadog-instrumentations/src/next.js +1 -0
  58. package/packages/datadog-instrumentations/src/nyc.js +3 -2
  59. package/packages/datadog-instrumentations/src/openai.js +22 -24
  60. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  61. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +4 -3
  62. package/packages/datadog-instrumentations/src/pg.js +3 -5
  63. package/packages/datadog-instrumentations/src/playwright.js +123 -83
  64. package/packages/datadog-instrumentations/src/protobufjs.js +3 -4
  65. package/packages/datadog-instrumentations/src/redis.js +4 -4
  66. package/packages/datadog-instrumentations/src/restify.js +9 -13
  67. package/packages/datadog-instrumentations/src/rhea.js +42 -54
  68. package/packages/datadog-instrumentations/src/router.js +30 -32
  69. package/packages/datadog-instrumentations/src/tedious.js +2 -3
  70. package/packages/datadog-instrumentations/src/vitest.js +87 -52
  71. package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
  72. package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
  73. package/packages/datadog-plugin-amqplib/src/client.js +6 -2
  74. package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
  75. package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
  76. package/packages/datadog-plugin-amqplib/src/util.js +1 -1
  77. package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
  78. package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
  79. package/packages/datadog-plugin-avsc/src/schema_iterator.js +12 -12
  80. package/packages/datadog-plugin-aws-sdk/src/base.js +15 -10
  81. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  82. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
  83. package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +3 -5
  84. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +28 -43
  85. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  86. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +10 -11
  87. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +4 -6
  88. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +3 -5
  89. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +3 -5
  90. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +2 -3
  91. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +11 -15
  92. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  93. package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
  94. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  95. package/packages/datadog-plugin-child_process/src/index.js +4 -4
  96. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
  97. package/packages/datadog-plugin-cucumber/src/index.js +60 -4
  98. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +99 -28
  99. package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
  100. package/packages/datadog-plugin-cypress/src/support.js +24 -5
  101. package/packages/datadog-plugin-dd-trace-api/src/index.js +2 -1
  102. package/packages/datadog-plugin-elasticsearch/src/index.js +1 -1
  103. package/packages/datadog-plugin-express/src/code_origin.js +30 -0
  104. package/packages/datadog-plugin-express/src/index.js +10 -12
  105. package/packages/datadog-plugin-express/src/tracing.js +19 -0
  106. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
  107. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
  108. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
  109. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +27 -10
  110. package/packages/datadog-plugin-graphql/src/execute.js +2 -2
  111. package/packages/datadog-plugin-graphql/src/index.js +10 -8
  112. package/packages/datadog-plugin-graphql/src/resolve.js +19 -12
  113. package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
  114. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
  115. package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
  116. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  117. package/packages/datadog-plugin-grpc/src/util.js +2 -2
  118. package/packages/datadog-plugin-http/src/client.js +23 -13
  119. package/packages/datadog-plugin-http2/src/client.js +24 -25
  120. package/packages/datadog-plugin-jest/src/index.js +26 -23
  121. package/packages/datadog-plugin-jest/src/util.js +8 -8
  122. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
  123. package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
  124. package/packages/datadog-plugin-kafkajs/src/producer.js +8 -3
  125. package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
  126. package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
  127. package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
  128. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
  129. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
  130. package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
  131. package/packages/datadog-plugin-mariadb/src/index.js +3 -9
  132. package/packages/datadog-plugin-mocha/src/index.js +39 -14
  133. package/packages/datadog-plugin-mongodb-core/src/index.js +3 -2
  134. package/packages/datadog-plugin-mysql/src/index.js +22 -9
  135. package/packages/datadog-plugin-mysql2/src/index.js +16 -0
  136. package/packages/datadog-plugin-net/src/tcp.js +1 -1
  137. package/packages/datadog-plugin-next/src/index.js +7 -6
  138. package/packages/datadog-plugin-openai/src/services.js +6 -10
  139. package/packages/datadog-plugin-openai/src/tracing.js +12 -18
  140. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  141. package/packages/datadog-plugin-playwright/src/index.js +25 -4
  142. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +8 -9
  143. package/packages/datadog-plugin-redis/src/index.js +2 -4
  144. package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
  145. package/packages/datadog-plugin-rhea/src/producer.js +5 -2
  146. package/packages/datadog-plugin-router/src/index.js +1 -1
  147. package/packages/datadog-plugin-selenium/src/index.js +1 -6
  148. package/packages/datadog-plugin-vitest/src/index.js +52 -35
  149. package/packages/datadog-shimmer/src/shimmer.js +4 -8
  150. package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
  151. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  152. package/packages/dd-trace/src/appsec/blocking.js +6 -20
  153. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +0 -1
  154. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +0 -1
  155. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +0 -1
  156. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +0 -1
  157. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
  158. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +5 -8
  159. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
  160. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
  161. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
  162. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
  163. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  164. package/packages/dd-trace/src/appsec/iast/index.js +1 -0
  165. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
  166. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
  167. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +16 -24
  168. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
  169. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
  170. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
  171. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
  172. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +2 -8
  173. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
  174. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  175. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +7 -8
  176. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  177. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +7 -7
  178. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +2 -3
  179. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/range-utils.js +10 -11
  180. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  181. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
  182. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
  183. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -28
  184. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
  185. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
  186. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
  187. package/packages/dd-trace/src/appsec/iast/vulnerabilities.js +0 -1
  188. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
  189. package/packages/dd-trace/src/appsec/index.js +5 -5
  190. package/packages/dd-trace/src/appsec/rasp/index.js +15 -15
  191. package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
  192. package/packages/dd-trace/src/appsec/reporter.js +232 -41
  193. package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
  194. package/packages/dd-trace/src/appsec/sdk/set_user.js +2 -2
  195. package/packages/dd-trace/src/appsec/sdk/track_event.js +3 -3
  196. package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
  197. package/packages/dd-trace/src/appsec/telemetry/index.js +31 -1
  198. package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -5
  199. package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
  200. package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
  201. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +8 -4
  202. package/packages/dd-trace/src/azure_metadata.js +9 -9
  203. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +9 -8
  204. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
  205. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +3 -2
  206. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
  207. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +3 -2
  208. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +3 -2
  209. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +3 -2
  210. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
  211. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +6 -5
  212. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +7 -6
  213. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
  214. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +3 -2
  215. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +5 -4
  216. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +12 -8
  217. package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
  218. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +3 -2
  219. package/packages/dd-trace/src/config-helper.js +89 -0
  220. package/packages/dd-trace/src/config.js +159 -129
  221. package/packages/dd-trace/src/config_stable.js +10 -7
  222. package/packages/dd-trace/src/datastreams/encoding.js +9 -9
  223. package/packages/dd-trace/src/datastreams/fnv.js +2 -2
  224. package/packages/dd-trace/src/datastreams/pathway.js +4 -4
  225. package/packages/dd-trace/src/datastreams/processor.js +5 -7
  226. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +7 -7
  227. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
  228. package/packages/dd-trace/src/datastreams/size.js +1 -1
  229. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +75 -69
  230. package/packages/dd-trace/src/debugger/devtools_client/condition.js +7 -10
  231. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
  232. package/packages/dd-trace/src/debugger/devtools_client/index.js +9 -2
  233. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
  234. package/packages/dd-trace/src/debugger/devtools_client/send.js +3 -2
  235. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +1 -2
  236. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +1 -1
  237. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +11 -14
  238. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +4 -4
  239. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
  240. package/packages/dd-trace/src/debugger/devtools_client/state.js +10 -3
  241. package/packages/dd-trace/src/debugger/index.js +1 -0
  242. package/packages/dd-trace/src/dogstatsd.js +7 -6
  243. package/packages/dd-trace/src/encode/0.4.js +14 -11
  244. package/packages/dd-trace/src/encode/0.5.js +4 -6
  245. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +8 -8
  246. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  247. package/packages/dd-trace/src/encode/tags-processors.js +1 -1
  248. package/packages/dd-trace/src/exporter.js +7 -6
  249. package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
  250. package/packages/dd-trace/src/exporters/common/docker.js +4 -3
  251. package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
  252. package/packages/dd-trace/src/exporters/common/request.js +5 -2
  253. package/packages/dd-trace/src/exporters/common/util.js +4 -2
  254. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  255. package/packages/dd-trace/src/flare/file.js +1 -5
  256. package/packages/dd-trace/src/format.js +1 -1
  257. package/packages/dd-trace/src/git_properties.js +1 -1
  258. package/packages/dd-trace/src/id.js +15 -9
  259. package/packages/dd-trace/src/iitm.js +10 -22
  260. package/packages/dd-trace/src/index.js +4 -3
  261. package/packages/dd-trace/src/lambda/handler.js +7 -6
  262. package/packages/dd-trace/src/lambda/index.js +2 -1
  263. package/packages/dd-trace/src/lambda/runtime/patch.js +7 -6
  264. package/packages/dd-trace/src/lambda/runtime/ritm.js +4 -3
  265. package/packages/dd-trace/src/llmobs/constants/tags.js +1 -0
  266. package/packages/dd-trace/src/llmobs/index.js +21 -5
  267. package/packages/dd-trace/src/llmobs/noop.js +18 -20
  268. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
  269. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
  270. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
  271. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/index.js +11 -13
  272. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
  273. package/packages/dd-trace/src/llmobs/plugins/openai.js +2 -3
  274. package/packages/dd-trace/src/llmobs/sdk.js +4 -3
  275. package/packages/dd-trace/src/llmobs/span_processor.js +1 -1
  276. package/packages/dd-trace/src/llmobs/tagger.js +129 -102
  277. package/packages/dd-trace/src/llmobs/util.js +9 -9
  278. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  279. package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
  280. package/packages/dd-trace/src/log/index.js +9 -8
  281. package/packages/dd-trace/src/log/log.js +1 -1
  282. package/packages/dd-trace/src/log/writer.js +3 -4
  283. package/packages/dd-trace/src/msgpack/chunk.js +3 -3
  284. package/packages/dd-trace/src/msgpack/encoder.js +31 -31
  285. package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
  286. package/packages/dd-trace/src/noop/span.js +4 -6
  287. package/packages/dd-trace/src/noop/tracer.js +1 -2
  288. package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
  289. package/packages/dd-trace/src/opentelemetry/tracer.js +7 -6
  290. package/packages/dd-trace/src/opentracing/propagation/log.js +10 -13
  291. package/packages/dd-trace/src/opentracing/propagation/text_map.js +40 -37
  292. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
  293. package/packages/dd-trace/src/opentracing/span.js +16 -20
  294. package/packages/dd-trace/src/opentracing/tracer.js +9 -6
  295. package/packages/dd-trace/src/payload-tagging/config/index.js +17 -21
  296. package/packages/dd-trace/src/payload-tagging/index.js +1 -1
  297. package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
  298. package/packages/dd-trace/src/pkg.js +1 -1
  299. package/packages/dd-trace/src/plugin_manager.js +4 -3
  300. package/packages/dd-trace/src/plugins/ci_plugin.js +87 -11
  301. package/packages/dd-trace/src/plugins/consumer.js +2 -2
  302. package/packages/dd-trace/src/plugins/inbound.js +5 -1
  303. package/packages/dd-trace/src/plugins/index.js +0 -1
  304. package/packages/dd-trace/src/plugins/outbound.js +4 -5
  305. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  306. package/packages/dd-trace/src/plugins/producer.js +2 -2
  307. package/packages/dd-trace/src/plugins/storage.js +2 -2
  308. package/packages/dd-trace/src/plugins/util/ci.js +28 -20
  309. package/packages/dd-trace/src/plugins/util/git.js +166 -12
  310. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
  311. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  312. package/packages/dd-trace/src/plugins/util/llm.js +27 -10
  313. package/packages/dd-trace/src/plugins/util/stacktrace.js +9 -2
  314. package/packages/dd-trace/src/plugins/util/test.js +315 -51
  315. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  316. package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
  317. package/packages/dd-trace/src/plugins/util/user-provided-git.js +14 -4
  318. package/packages/dd-trace/src/plugins/util/web.js +8 -8
  319. package/packages/dd-trace/src/priority_sampler.js +64 -53
  320. package/packages/dd-trace/src/profiling/config.js +51 -35
  321. package/packages/dd-trace/src/profiling/exporter_cli.js +20 -20
  322. package/packages/dd-trace/src/profiling/exporters/agent.js +1 -1
  323. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +7 -6
  324. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  325. package/packages/dd-trace/src/profiling/index.js +2 -1
  326. package/packages/dd-trace/src/profiling/profiler.js +44 -6
  327. package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
  328. package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
  329. package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
  330. package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
  331. package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
  332. package/packages/dd-trace/src/profiling/ssi-telemetry-mock-profiler.js +3 -1
  333. package/packages/dd-trace/src/profiling/tagger.js +21 -13
  334. package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
  335. package/packages/dd-trace/src/proxy.js +9 -10
  336. package/packages/dd-trace/src/random_sampler.js +40 -0
  337. package/packages/dd-trace/src/rate_limiter.js +4 -4
  338. package/packages/dd-trace/src/remote_config/index.js +3 -7
  339. package/packages/dd-trace/src/remote_config/manager.js +25 -13
  340. package/packages/dd-trace/src/require-package-json.js +1 -1
  341. package/packages/dd-trace/src/ritm.js +8 -8
  342. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +5 -4
  343. package/packages/dd-trace/src/sampler.js +41 -4
  344. package/packages/dd-trace/src/sampling_rule.js +12 -3
  345. package/packages/dd-trace/src/scope.js +1 -1
  346. package/packages/dd-trace/src/serverless.js +11 -4
  347. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  348. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
  349. package/packages/dd-trace/src/span_processor.js +5 -4
  350. package/packages/dd-trace/src/span_sampler.js +4 -1
  351. package/packages/dd-trace/src/standalone/tracesource.js +2 -3
  352. package/packages/dd-trace/src/standalone/tracesource_priority_sampler.js +1 -2
  353. package/packages/dd-trace/src/startup-log.js +6 -18
  354. package/packages/dd-trace/src/supported-configurations.json +439 -0
  355. package/packages/dd-trace/src/telemetry/dependencies.js +64 -59
  356. package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
  357. package/packages/dd-trace/src/telemetry/metrics.js +10 -5
  358. package/packages/dd-trace/src/telemetry/send-data.js +8 -7
  359. package/packages/dd-trace/src/telemetry/telemetry.js +31 -45
  360. package/packages/dd-trace/src/tracer.js +3 -7
  361. package/packages/dd-trace/src/util.js +1 -6
  362. package/version.js +1 -0
  363. package/packages/datadog-instrumentations/src/paperplane.js +0 -77
  364. package/packages/datadog-plugin-paperplane/src/index.js +0 -25
  365. package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
  366. package/packages/datadog-plugin-paperplane/src/server.js +0 -24
  367. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +0 -122
  368. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/header-sensitive-analyzer.js +0 -20
@@ -2,11 +2,22 @@ const path = require('path')
2
2
  const fs = require('fs')
3
3
  const { URL } = require('url')
4
4
  const log = require('../../log')
5
+ const { getEnvironmentVariable } = require('../../config-helper')
5
6
 
6
7
  const istanbul = require('istanbul-lib-coverage')
7
8
  const ignore = require('ignore')
8
9
 
9
- const { getGitMetadata } = require('./git')
10
+ const {
11
+ getGitMetadata,
12
+ getGitInformationDiscrepancy,
13
+ getGitDiff,
14
+ getGitRemoteName,
15
+ getSourceBranch,
16
+ checkAndFetchBranch,
17
+ getLocalBranches,
18
+ getMergeBase,
19
+ getCounts
20
+ } = require('./git')
10
21
  const { getUserProviderGitMetadata, validateGitRepositoryUrl, validateGitCommitSha } = require('./user-provided-git')
11
22
  const { getCIMetadata } = require('./ci')
12
23
  const { getRuntimeAndOSMetadata } = require('./env')
@@ -23,6 +34,11 @@ const {
23
34
  CI_JOB_NAME
24
35
  } = require('./tags')
25
36
  const id = require('../../id')
37
+ const {
38
+ incrementCountMetric,
39
+ TELEMETRY_GIT_COMMIT_SHA_DISCREPANCY,
40
+ TELEMETRY_GIT_SHA_MATCH
41
+ } = require('../../ci-visibility/telemetry')
26
42
 
27
43
  const { SPAN_TYPE, RESOURCE_NAME, SAMPLING_PRIORITY } = require('../../../../../ext/tags')
28
44
  const { SAMPLING_RULE_DECISION } = require('../../constants')
@@ -59,7 +75,7 @@ const TEST_EARLY_FLAKE_ENABLED = 'test.early_flake.enabled'
59
75
  const TEST_EARLY_FLAKE_ABORT_REASON = 'test.early_flake.abort_reason'
60
76
  const TEST_RETRY_REASON = 'test.retry_reason'
61
77
  const TEST_HAS_FAILED_ALL_RETRIES = 'test.has_failed_all_retries'
62
-
78
+ const TEST_IS_MODIFIED = 'test.is_modified'
63
79
  const CI_APP_ORIGIN = 'ciapp-test'
64
80
 
65
81
  const JEST_TEST_RUNNER = 'test.jest.test_runner'
@@ -101,18 +117,20 @@ const PLAYWRIGHT_WORKER_TRACE_PAYLOAD_CODE = 90
101
117
 
102
118
  // Early flake detection util strings
103
119
  const EFD_STRING = "Retried by Datadog's Early Flake Detection"
104
- const EFD_TEST_NAME_REGEX = new RegExp(EFD_STRING + ' \\(#\\d+\\): ', 'g')
120
+ const EFD_TEST_NAME_REGEX = new RegExp(EFD_STRING + String.raw` \(#\d+\): `, 'g')
105
121
 
106
122
  // Library Capabilities Tagging
107
123
  const DD_CAPABILITIES_TEST_IMPACT_ANALYSIS = '_dd.library_capabilities.test_impact_analysis'
108
124
  const DD_CAPABILITIES_EARLY_FLAKE_DETECTION = '_dd.library_capabilities.early_flake_detection'
109
125
  const DD_CAPABILITIES_AUTO_TEST_RETRIES = '_dd.library_capabilities.auto_test_retries'
126
+ const DD_CAPABILITIES_IMPACTED_TESTS = '_dd.library_capabilities.impacted_tests'
110
127
  const DD_CAPABILITIES_TEST_MANAGEMENT_QUARANTINE = '_dd.library_capabilities.test_management.quarantine'
111
128
  const DD_CAPABILITIES_TEST_MANAGEMENT_DISABLE = '_dd.library_capabilities.test_management.disable'
112
129
  const DD_CAPABILITIES_TEST_MANAGEMENT_ATTEMPT_TO_FIX = '_dd.library_capabilities.test_management.attempt_to_fix'
113
- const UNSUPPORTED_TIA_FRAMEWORKS = ['playwright', 'vitest']
114
- const UNSUPPORTED_TIA_FRAMEWORKS_PARALLEL_MODE = ['cucumber', 'mocha']
115
- const UNSUPPORTED_ATTEMPT_TO_FIX_FRAMEWORKS_PARALLEL_MODE = ['mocha']
130
+ const UNSUPPORTED_TIA_FRAMEWORKS = new Set(['playwright', 'vitest'])
131
+ const UNSUPPORTED_TIA_FRAMEWORKS_PARALLEL_MODE = new Set(['cucumber', 'mocha'])
132
+ const UNSUPPORTED_ATTEMPT_TO_FIX_FRAMEWORKS_PARALLEL_MODE = new Set(['mocha'])
133
+ const NOT_SUPPORTED_GRANULARITY_IMPACTED_TESTS_FRAMEWORKS = new Set(['mocha', 'playwright', 'vitest'])
116
134
 
117
135
  const TEST_LEVEL_EVENT_TYPES = [
118
136
  'test',
@@ -145,7 +163,11 @@ const TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED = 'test.test_management.attempt_to_f
145
163
 
146
164
  // Test Management utils strings
147
165
  const ATTEMPT_TO_FIX_STRING = "Retried by Datadog's Test Management"
148
- const ATTEMPT_TEST_NAME_REGEX = new RegExp(ATTEMPT_TO_FIX_STRING + ' \\(#\\d+\\): ', 'g')
166
+ const ATTEMPT_TEST_NAME_REGEX = new RegExp(ATTEMPT_TO_FIX_STRING + String.raw` \(#\d+\): `, 'g')
167
+
168
+ // Impacted tests
169
+ const POSSIBLE_BASE_BRANCHES = ['main', 'master', 'preprod', 'prod', 'dev', 'development', 'trunk']
170
+ const BASE_LIKE_BRANCH_FILTER = /^(main|master|preprod|prod|dev|development|trunk|release\/.*|hotfix\/.*)$/
149
171
 
150
172
  module.exports = {
151
173
  TEST_CODE_OWNERS,
@@ -180,6 +202,7 @@ module.exports = {
180
202
  TEST_EARLY_FLAKE_ABORT_REASON,
181
203
  TEST_RETRY_REASON,
182
204
  TEST_HAS_FAILED_ALL_RETRIES,
205
+ TEST_IS_MODIFIED,
183
206
  getTestEnvironmentMetadata,
184
207
  getTestParametersString,
185
208
  finishAllTraceSpans,
@@ -212,6 +235,7 @@ module.exports = {
212
235
  mergeCoverage,
213
236
  fromCoverageMapToCoverage,
214
237
  getTestLineStart,
238
+ getTestEndLine,
215
239
  removeInvalidMetadata,
216
240
  parseAnnotations,
217
241
  EFD_STRING,
@@ -229,6 +253,7 @@ module.exports = {
229
253
  DD_CAPABILITIES_TEST_IMPACT_ANALYSIS,
230
254
  DD_CAPABILITIES_EARLY_FLAKE_DETECTION,
231
255
  DD_CAPABILITIES_AUTO_TEST_RETRIES,
256
+ DD_CAPABILITIES_IMPACTED_TESTS,
232
257
  DD_CAPABILITIES_TEST_MANAGEMENT_QUARANTINE,
233
258
  DD_CAPABILITIES_TEST_MANAGEMENT_DISABLE,
234
259
  DD_CAPABILITIES_TEST_MANAGEMENT_ATTEMPT_TO_FIX,
@@ -248,14 +273,20 @@ module.exports = {
248
273
  TEST_MANAGEMENT_IS_QUARANTINED,
249
274
  TEST_MANAGEMENT_ENABLED,
250
275
  TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
251
- getLibraryCapabilitiesTags
276
+ getLibraryCapabilitiesTags,
277
+ checkShaDiscrepancies,
278
+ getPullRequestDiff,
279
+ getPullRequestBaseBranch,
280
+ getModifiedTestsFromDiff,
281
+ isModifiedTest,
282
+ POSSIBLE_BASE_BRANCHES
252
283
  }
253
284
 
254
285
  // Returns pkg manager and its version, separated by '-', e.g. npm-8.15.0 or yarn-1.22.19
255
286
  function getPkgManager () {
256
287
  try {
257
- return process.env.npm_config_user_agent.split(' ')[0].replace('/', '-')
258
- } catch (e) {
288
+ return getEnvironmentVariable('npm_config_user_agent').split(' ')[0].replace('/', '-')
289
+ } catch {
259
290
  return ''
260
291
  }
261
292
  }
@@ -264,35 +295,124 @@ function validateUrl (url) {
264
295
  try {
265
296
  const urlObject = new URL(url)
266
297
  return (urlObject.protocol === 'https:' || urlObject.protocol === 'http:')
267
- } catch (e) {
298
+ } catch {
268
299
  return false
269
300
  }
270
301
  }
271
302
 
272
303
  function removeInvalidMetadata (metadata) {
273
304
  return Object.keys(metadata).reduce((filteredTags, tag) => {
274
- if (tag === GIT_REPOSITORY_URL) {
275
- if (!validateGitRepositoryUrl(metadata[GIT_REPOSITORY_URL])) {
276
- log.error('Repository URL is not a valid repository URL: %s.', metadata[GIT_REPOSITORY_URL])
277
- return filteredTags
278
- }
305
+ if (tag === GIT_REPOSITORY_URL && !validateGitRepositoryUrl(metadata[GIT_REPOSITORY_URL])) {
306
+ log.error('Repository URL is not a valid repository URL: %s.', metadata[GIT_REPOSITORY_URL])
307
+ return filteredTags
279
308
  }
280
- if (tag === GIT_COMMIT_SHA) {
281
- if (!validateGitCommitSha(metadata[GIT_COMMIT_SHA])) {
282
- log.error('Git commit SHA must be a full-length git SHA: %s.', metadata[GIT_COMMIT_SHA])
283
- return filteredTags
284
- }
309
+ if (tag === GIT_COMMIT_SHA && !validateGitCommitSha(metadata[GIT_COMMIT_SHA])) {
310
+ log.error('Git commit SHA must be a full-length git SHA: %s.', metadata[GIT_COMMIT_SHA])
311
+ return filteredTags
285
312
  }
286
- if (tag === CI_PIPELINE_URL) {
287
- if (!validateUrl(metadata[CI_PIPELINE_URL])) {
288
- return filteredTags
289
- }
313
+ if (tag === CI_PIPELINE_URL && !validateUrl(metadata[CI_PIPELINE_URL])) {
314
+ return filteredTags
290
315
  }
291
316
  filteredTags[tag] = metadata[tag]
292
317
  return filteredTags
293
318
  }, {})
294
319
  }
295
320
 
321
+ function checkShaDiscrepancies (ciMetadata, userProvidedGitMetadata) {
322
+ const {
323
+ [GIT_COMMIT_SHA]: ciCommitSHA,
324
+ [GIT_REPOSITORY_URL]: ciRepositoryUrl
325
+ } = ciMetadata
326
+ const {
327
+ [GIT_COMMIT_SHA]: userProvidedCommitSHA,
328
+ [GIT_REPOSITORY_URL]: userProvidedRepositoryUrl
329
+ } = userProvidedGitMetadata
330
+ const { gitRepositoryUrl, gitCommitSHA } = getGitInformationDiscrepancy()
331
+
332
+ const checkDiscrepancyAndSendMetrics = (
333
+ valueExpected,
334
+ valueDiscrepant,
335
+ discrepancyType,
336
+ expectedProvider,
337
+ discrepantProvider
338
+ ) => {
339
+ if (valueExpected && valueDiscrepant && valueExpected !== valueDiscrepant) {
340
+ incrementCountMetric(
341
+ TELEMETRY_GIT_COMMIT_SHA_DISCREPANCY,
342
+ {
343
+ type: discrepancyType,
344
+ expected_provider: expectedProvider,
345
+ discrepant_provider: discrepantProvider
346
+ }
347
+ )
348
+ return true
349
+ }
350
+ return false
351
+ }
352
+
353
+ const checkConfigs = [
354
+ // User provided vs Git metadata
355
+ {
356
+ v1: userProvidedRepositoryUrl,
357
+ v2: gitRepositoryUrl,
358
+ type: 'repository_discrepancy',
359
+ expected: 'user_supplied',
360
+ discrepant: 'git_client'
361
+ },
362
+ {
363
+ v1: userProvidedCommitSHA,
364
+ v2: gitCommitSHA,
365
+ type: 'commit_discrepancy',
366
+ expected: 'user_supplied',
367
+ discrepant: 'git_client'
368
+ },
369
+ // User provided vs CI metadata
370
+ {
371
+ v1: userProvidedRepositoryUrl,
372
+ v2: ciRepositoryUrl,
373
+ type: 'repository_discrepancy',
374
+ expected: 'user_supplied',
375
+ discrepant: 'ci_provider'
376
+ },
377
+ {
378
+ v1: userProvidedCommitSHA,
379
+ v2: ciCommitSHA,
380
+ type: 'commit_discrepancy',
381
+ expected: 'user_supplied',
382
+ discrepant: 'ci_provider'
383
+ },
384
+ // CI metadata vs Git metadata
385
+ {
386
+ v1: ciRepositoryUrl,
387
+ v2: gitRepositoryUrl,
388
+ type: 'repository_discrepancy',
389
+ expected: 'ci_provider',
390
+ discrepant: 'git_client'
391
+ },
392
+ {
393
+ v1: ciCommitSHA,
394
+ v2: gitCommitSHA,
395
+ type: 'commit_discrepancy',
396
+ expected: 'ci_provider',
397
+ discrepant: 'git_client'
398
+ }
399
+ ]
400
+
401
+ let gitCommitShaMatch = true
402
+ for (const checkConfig of checkConfigs) {
403
+ const { v1, v2, type, expected, discrepant } = checkConfig
404
+ const discrepancy = checkDiscrepancyAndSendMetrics(v1, v2, type, expected, discrepant)
405
+ if (discrepancy) {
406
+ gitCommitShaMatch = false
407
+ }
408
+ }
409
+
410
+ incrementCountMetric(
411
+ TELEMETRY_GIT_SHA_MATCH,
412
+ { match: gitCommitShaMatch }
413
+ )
414
+ }
415
+
296
416
  function getTestEnvironmentMetadata (testFramework, config) {
297
417
  // TODO: eventually these will come from the tracer (generally available)
298
418
  const ciMetadata = getCIMetadata()
@@ -320,6 +440,8 @@ function getTestEnvironmentMetadata (testFramework, config) {
320
440
 
321
441
  const userProvidedGitMetadata = getUserProviderGitMetadata()
322
442
 
443
+ checkShaDiscrepancies(ciMetadata, userProvidedGitMetadata)
444
+
323
445
  const runtimeAndOSMetadata = getRuntimeAndOSMetadata()
324
446
 
325
447
  const metadata = {
@@ -344,7 +466,7 @@ function getTestParametersString (parametersByTestName, testName) {
344
466
  // test is invoked with each parameter set sequencially
345
467
  const testParameters = parametersByTestName[testName].shift()
346
468
  return JSON.stringify({ arguments: testParameters, metadata: {} })
347
- } catch (e) {
469
+ } catch {
348
470
  // We can't afford to interrupt the test if `testParameters` is not serializable to JSON,
349
471
  // so we ignore the test parameters and move on
350
472
  return ''
@@ -413,7 +535,7 @@ function readCodeOwners (rootDir) {
413
535
  for (const location of POSSIBLE_CODEOWNERS_LOCATIONS) {
414
536
  try {
415
537
  return fs.readFileSync(path.join(rootDir, location)).toString()
416
- } catch (e) {
538
+ } catch {
417
539
  // retry with next path
418
540
  }
419
541
  }
@@ -467,7 +589,7 @@ function getCodeOwnersForFilename (filename, entries) {
467
589
  if (isResponsible) {
468
590
  return JSON.stringify(entry.owners)
469
591
  }
470
- } catch (e) {
592
+ } catch {
471
593
  return null
472
594
  }
473
595
  }
@@ -619,12 +741,19 @@ function getTestLineStart (err, testSuitePath) {
619
741
  const testFileLine = err.stack.split('\n').find(line => line.includes(testSuitePath))
620
742
  try {
621
743
  const testFileLineMatch = testFileLine.match(/at (?:(.+?)\s+\()?(?:(.+?):(\d+)(?::(\d+))?|([^)]+))\)?/)
622
- return parseInt(testFileLineMatch[3], 10) || null
623
- } catch (e) {
744
+ return Number.parseInt(testFileLineMatch[3], 10) || null
745
+ } catch {
624
746
  return null
625
747
  }
626
748
  }
627
749
 
750
+ // Get the end line of a test by inspecting a given function's source code
751
+ function getTestEndLine (testFn, startLine = 0) {
752
+ const source = testFn.toString()
753
+ const lineCount = source.split('\n').length
754
+ return startLine + lineCount - 1
755
+ }
756
+
628
757
  /**
629
758
  * Gets an object of test tags from an Playwright annotations array.
630
759
  * @param {Object[]} annotations - Annotations from a Playwright test.
@@ -661,11 +790,11 @@ function addAttemptToFixStringToTestName (testName, numAttempt) {
661
790
  }
662
791
 
663
792
  function removeEfdStringFromTestName (testName) {
664
- return testName.replace(EFD_TEST_NAME_REGEX, '')
793
+ return testName.replaceAll(EFD_TEST_NAME_REGEX, '')
665
794
  }
666
795
 
667
796
  function removeAttemptToFixStringFromTestName (testName) {
668
- return testName.replace(ATTEMPT_TEST_NAME_REGEX, '')
797
+ return testName.replaceAll(ATTEMPT_TEST_NAME_REGEX, '')
669
798
  }
670
799
 
671
800
  function getIsFaultyEarlyFlakeDetection (projectSuites, testsBySuiteName, faultyThresholdPercentage) {
@@ -686,14 +815,14 @@ function getIsFaultyEarlyFlakeDetection (projectSuites, testsBySuiteName, faulty
686
815
  )
687
816
  }
688
817
 
689
- function getTestSessionName (config, testCommand, envTags) {
818
+ function getTestSessionName (config, trimmedCommand, envTags) {
690
819
  if (config.ciVisibilityTestSessionName) {
691
820
  return config.ciVisibilityTestSessionName
692
821
  }
693
822
  if (envTags[CI_JOB_NAME]) {
694
- return `${envTags[CI_JOB_NAME]}-${testCommand}`
823
+ return `${envTags[CI_JOB_NAME]}-${trimmedCommand}`
695
824
  }
696
- return testCommand
825
+ return trimmedCommand
697
826
  }
698
827
 
699
828
  // Calculate the number of a tests from the known tests response, which has a shape like:
@@ -761,28 +890,21 @@ function getFormattedError (error, repositoryRoot) {
761
890
  return newError
762
891
  }
763
892
 
764
- function getLibraryCapabilitiesTags (testFramework, isParallel) {
765
- function isTiaSupported (testFramework, isParallel) {
766
- if (UNSUPPORTED_TIA_FRAMEWORKS.includes(testFramework)) {
767
- return false
768
- }
769
- if (isParallel && UNSUPPORTED_TIA_FRAMEWORKS_PARALLEL_MODE.includes(testFramework)) {
770
- return false
771
- }
772
- return true
773
- }
893
+ function isTiaSupported (testFramework, isParallel) {
894
+ return !(UNSUPPORTED_TIA_FRAMEWORKS.has(testFramework) ||
895
+ (isParallel && UNSUPPORTED_TIA_FRAMEWORKS_PARALLEL_MODE.has(testFramework)))
896
+ }
774
897
 
775
- function isAttemptToFixSupported (testFramework, isParallel) {
776
- if (isParallel && UNSUPPORTED_ATTEMPT_TO_FIX_FRAMEWORKS_PARALLEL_MODE.includes(testFramework)) {
777
- return false
778
- }
779
- return true
780
- }
898
+ function isAttemptToFixSupported (testFramework, isParallel) {
899
+ return !(isParallel && UNSUPPORTED_ATTEMPT_TO_FIX_FRAMEWORKS_PARALLEL_MODE.has(testFramework))
900
+ }
781
901
 
902
+ function getLibraryCapabilitiesTags (testFramework, isParallel) {
782
903
  return {
783
904
  [DD_CAPABILITIES_TEST_IMPACT_ANALYSIS]: isTiaSupported(testFramework, isParallel) ? '1' : undefined,
784
905
  [DD_CAPABILITIES_EARLY_FLAKE_DETECTION]: '1',
785
906
  [DD_CAPABILITIES_AUTO_TEST_RETRIES]: '1',
907
+ [DD_CAPABILITIES_IMPACTED_TESTS]: '1',
786
908
  [DD_CAPABILITIES_TEST_MANAGEMENT_QUARANTINE]: '1',
787
909
  [DD_CAPABILITIES_TEST_MANAGEMENT_DISABLE]: '1',
788
910
  [DD_CAPABILITIES_TEST_MANAGEMENT_ATTEMPT_TO_FIX]: isAttemptToFixSupported(testFramework, isParallel)
@@ -790,3 +912,145 @@ function getLibraryCapabilitiesTags (testFramework, isParallel) {
790
912
  : undefined
791
913
  }
792
914
  }
915
+
916
+ function getPullRequestBaseBranch (pullRequestBaseBranch) {
917
+ const remoteName = getGitRemoteName()
918
+
919
+ const sourceBranch = getSourceBranch()
920
+ // TODO: We will get the default branch name from the backend in the future.
921
+ const POSSIBLE_DEFAULT_BRANCHES = ['main', 'master']
922
+
923
+ const candidateBranches = []
924
+ if (pullRequestBaseBranch) {
925
+ checkAndFetchBranch(pullRequestBaseBranch, remoteName)
926
+ candidateBranches.push(pullRequestBaseBranch)
927
+ } else {
928
+ for (const branch of POSSIBLE_BASE_BRANCHES) {
929
+ checkAndFetchBranch(branch, remoteName)
930
+ }
931
+
932
+ const localBranches = getLocalBranches(remoteName)
933
+ for (const branch of localBranches) {
934
+ const shortBranchName = branch.replace(new RegExp(`^${remoteName}/`), '')
935
+ if (branch !== sourceBranch && BASE_LIKE_BRANCH_FILTER.test(shortBranchName)) {
936
+ candidateBranches.push(branch)
937
+ }
938
+ }
939
+ }
940
+
941
+ if (candidateBranches.length === 1) {
942
+ return getMergeBase(candidateBranches[0], sourceBranch)
943
+ }
944
+
945
+ const metrics = {}
946
+ for (const candidate of candidateBranches) {
947
+ // Find common ancestor
948
+ const baseSha = getMergeBase(candidate, sourceBranch)
949
+ if (!baseSha) {
950
+ continue
951
+ }
952
+ // Count commits ahead/behind
953
+ const counts = getCounts(candidate, sourceBranch)
954
+ if (!counts) {
955
+ continue
956
+ }
957
+ const behind = counts.behind
958
+ const ahead = counts.ahead
959
+ metrics[candidate] = {
960
+ behind,
961
+ ahead,
962
+ baseSha
963
+ }
964
+ }
965
+
966
+ function isDefaultBranch (branch) {
967
+ return POSSIBLE_DEFAULT_BRANCHES.some(defaultBranch =>
968
+ branch === defaultBranch || branch === `${remoteName}/${defaultBranch}`
969
+ )
970
+ }
971
+
972
+ if (Object.keys(metrics).length === 0) {
973
+ return null
974
+ }
975
+ // Find branch with smallest "ahead" value, preferring default branch on tie
976
+ let bestBranch = null
977
+ let bestScore = Infinity
978
+ for (const branch of Object.keys(metrics)) {
979
+ const score = metrics[branch].ahead
980
+ if (score < bestScore) {
981
+ bestScore = score
982
+ bestBranch = branch
983
+ } else if (score === bestScore && isDefaultBranch(branch)) {
984
+ bestScore = score
985
+ bestBranch = branch
986
+ }
987
+ }
988
+ return bestBranch ? metrics[bestBranch].baseSha : null
989
+ }
990
+
991
+ function getPullRequestDiff (baseCommit, targetCommit) {
992
+ if (!baseCommit) {
993
+ return
994
+ }
995
+ return getGitDiff(baseCommit, targetCommit)
996
+ }
997
+
998
+ function getModifiedTestsFromDiff (diff) {
999
+ if (!diff) return null
1000
+ const result = {}
1001
+
1002
+ const filesRegex = /^diff --git a\/(?<file>.+) b\/(?<file2>.+)$/g
1003
+ const linesRegex = /^@@ -\d+(,\d+)? \+(?<start>\d+)(,(?<count>\d+))? @@/g
1004
+
1005
+ let currentFile = null
1006
+
1007
+ // Go line by line
1008
+ const lines = diff.split('\n')
1009
+ for (const line of lines) {
1010
+ // Check for new file
1011
+ const fileMatch = filesRegex.exec(line)
1012
+ if (fileMatch && fileMatch.groups.file) {
1013
+ currentFile = fileMatch.groups.file
1014
+ result[currentFile] = []
1015
+ continue
1016
+ }
1017
+
1018
+ // Check for changed lines
1019
+ const lineMatch = linesRegex.exec(line)
1020
+ if (lineMatch && currentFile) {
1021
+ const start = Number(lineMatch.groups.start)
1022
+ const count = lineMatch.groups.count ? Number(lineMatch.groups.count) : 1
1023
+ for (let j = 0; j < count; j++) {
1024
+ result[currentFile].push(start + j)
1025
+ }
1026
+ }
1027
+
1028
+ // Reset regexes to allow re-use
1029
+ filesRegex.lastIndex = 0
1030
+ linesRegex.lastIndex = 0
1031
+ }
1032
+
1033
+ if (Object.keys(result).length === 0) {
1034
+ return null
1035
+ }
1036
+ return result
1037
+ }
1038
+
1039
+ function isModifiedTest (testPath, testStartLine, testEndLine, modifiedTests, testFramework) {
1040
+ if (modifiedTests === undefined) {
1041
+ return false
1042
+ }
1043
+
1044
+ const lines = modifiedTests[testPath]
1045
+ if (!lines) {
1046
+ return false
1047
+ }
1048
+
1049
+ // For unsupported frameworks, consider the test modified if any lines were changed
1050
+ if (NOT_SUPPORTED_GRANULARITY_IMPACTED_TESTS_FRAMEWORKS.has(testFramework)) {
1051
+ return lines.length > 0
1052
+ }
1053
+
1054
+ // For supported frameworks, check if the test's line range overlaps with modified lines
1055
+ return lines.some(line => line >= testStartLine && line <= testEndLine)
1056
+ }
@@ -18,7 +18,7 @@ function filterSensitiveInfoFromRepository (repositoryUrl) {
18
18
  const { protocol, host, pathname } = new URL(repositoryUrl)
19
19
 
20
20
  return `${protocol}//${host}${pathname === '/' ? '' : pathname}`
21
- } catch (e) {
21
+ } catch {
22
22
  return ''
23
23
  }
24
24
  }
@@ -2,6 +2,18 @@
2
2
 
3
3
  const log = require('../../log')
4
4
 
5
+ function applyFilter (filter, uri) {
6
+ if (typeof filter === 'function') {
7
+ return filter(uri)
8
+ } else if (filter instanceof RegExp) {
9
+ return filter.test(uri)
10
+ } else if (Array.isArray(filter)) {
11
+ return filter.some(filter => applyFilter(filter, uri))
12
+ }
13
+
14
+ return filter === uri
15
+ }
16
+
5
17
  const urlFilter = {
6
18
  getFilter (config) {
7
19
  if (typeof config.filter === 'function') {
@@ -13,23 +25,7 @@ const urlFilter = {
13
25
  const allowlist = config.allowlist || config.whitelist || /.*/
14
26
  const blocklist = config.blocklist || config.blacklist || []
15
27
 
16
- return uri => {
17
- const allowed = applyFilter(allowlist, uri)
18
- const blocked = applyFilter(blocklist, uri)
19
- return allowed && !blocked
20
- }
21
-
22
- function applyFilter (filter, uri) {
23
- if (typeof filter === 'function') {
24
- return filter(uri)
25
- } else if (filter instanceof RegExp) {
26
- return filter.test(uri)
27
- } else if (filter instanceof Array) {
28
- return filter.some(filter => applyFilter(filter, uri))
29
- }
30
-
31
- return filter === uri
32
- }
28
+ return uri => applyFilter(allowlist, uri) && !applyFilter(blocklist, uri)
33
29
  }
34
30
  }
35
31
 
@@ -9,11 +9,15 @@ const {
9
9
  GIT_COMMIT_COMMITTER_NAME,
10
10
  GIT_COMMIT_AUTHOR_DATE,
11
11
  GIT_COMMIT_AUTHOR_EMAIL,
12
- GIT_COMMIT_AUTHOR_NAME
12
+ GIT_COMMIT_AUTHOR_NAME,
13
+ GIT_PULL_REQUEST_BASE_BRANCH,
14
+ GIT_PULL_REQUEST_BASE_BRANCH_SHA,
15
+ GIT_COMMIT_HEAD_SHA
13
16
  } = require('./tags')
14
17
 
15
18
  const { normalizeRef } = require('./ci')
16
19
  const { filterSensitiveInfoFromRepository } = require('./url')
20
+ const { getEnvironmentVariables } = require('../../config-helper')
17
21
 
18
22
  function removeEmptyValues (tags) {
19
23
  return Object.keys(tags).reduce((filteredTags, tag) => {
@@ -52,8 +56,11 @@ function getUserProviderGitMetadata () {
52
56
  DD_GIT_COMMIT_COMMITTER_DATE,
53
57
  DD_GIT_COMMIT_AUTHOR_NAME,
54
58
  DD_GIT_COMMIT_AUTHOR_EMAIL,
55
- DD_GIT_COMMIT_AUTHOR_DATE
56
- } = process.env
59
+ DD_GIT_COMMIT_AUTHOR_DATE,
60
+ DD_GIT_PULL_REQUEST_BASE_BRANCH,
61
+ DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA,
62
+ DD_GIT_COMMIT_HEAD_SHA
63
+ } = getEnvironmentVariables()
57
64
 
58
65
  const branch = normalizeRef(DD_GIT_BRANCH)
59
66
  let tag = normalizeRef(DD_GIT_TAG)
@@ -74,7 +81,10 @@ function getUserProviderGitMetadata () {
74
81
  [GIT_COMMIT_COMMITTER_EMAIL]: DD_GIT_COMMIT_COMMITTER_EMAIL,
75
82
  [GIT_COMMIT_AUTHOR_NAME]: DD_GIT_COMMIT_AUTHOR_NAME,
76
83
  [GIT_COMMIT_AUTHOR_EMAIL]: DD_GIT_COMMIT_AUTHOR_EMAIL,
77
- [GIT_COMMIT_AUTHOR_DATE]: DD_GIT_COMMIT_AUTHOR_DATE
84
+ [GIT_COMMIT_AUTHOR_DATE]: DD_GIT_COMMIT_AUTHOR_DATE,
85
+ [GIT_PULL_REQUEST_BASE_BRANCH]: DD_GIT_PULL_REQUEST_BASE_BRANCH,
86
+ [GIT_PULL_REQUEST_BASE_BRANCH_SHA]: DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA,
87
+ [GIT_COMMIT_HEAD_SHA]: DD_GIT_COMMIT_HEAD_SHA
78
88
  })
79
89
  }
80
90
 
@@ -253,7 +253,7 @@ const web = {
253
253
  if (!context) return null
254
254
  if (context.middleware.length === 0) return context.span || null
255
255
 
256
- return context.middleware.slice(-1)[0]
256
+ return context.middleware.at(-1)
257
257
  },
258
258
 
259
259
  // Extract the parent span from the headers and start a new span as its child
@@ -421,7 +421,7 @@ function addAllowHeaders (req, res, headers) {
421
421
  ]
422
422
 
423
423
  for (const header of contextHeaders) {
424
- if (~requestHeaders.indexOf(header)) {
424
+ if (requestHeaders.includes(header)) {
425
425
  allowHeaders.push(header)
426
426
  }
427
427
  }
@@ -500,7 +500,7 @@ function addResourceTag (context) {
500
500
  if (tags['resource.name']) return
501
501
 
502
502
  const resource = [req.method, tags[HTTP_ROUTE]]
503
- .filter(val => val)
503
+ .filter(Boolean)
504
504
  .join(' ')
505
505
 
506
506
  span.setTag(RESOURCE_NAME, resource)
@@ -530,10 +530,9 @@ function extractURL (req) {
530
530
 
531
531
  if (req.stream) {
532
532
  return `${headers[HTTP2_HEADER_SCHEME]}://${headers[HTTP2_HEADER_AUTHORITY]}${headers[HTTP2_HEADER_PATH]}`
533
- } else {
534
- const protocol = getProtocol(req)
535
- return `${protocol}://${req.headers.host}${req.originalUrl || req.url}`
536
533
  }
534
+ const protocol = getProtocol(req)
535
+ return `${protocol}://${req.headers.host}${req.originalUrl || req.url}`
537
536
  }
538
537
 
539
538
  function getProtocol (req) {
@@ -567,9 +566,10 @@ function getStatusValidator (config) {
567
566
  return code => code < 500
568
567
  }
569
568
 
569
+ const noop = () => {}
570
+
570
571
  function getHooks (config) {
571
- const noop = () => {}
572
- const request = (config.hooks && config.hooks.request) || noop
572
+ const request = config.hooks?.request ?? noop
573
573
 
574
574
  return { request }
575
575
  }