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,6 +2,7 @@
2
2
 
3
3
  const CiPlugin = require('../../dd-trace/src/plugins/ci_plugin')
4
4
  const { storage } = require('../../datadog-core')
5
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
5
6
 
6
7
  const {
7
8
  TEST_SKIP_REASON,
@@ -34,7 +35,10 @@ const {
34
35
  TEST_MANAGEMENT_IS_ATTEMPT_TO_FIX,
35
36
  TEST_HAS_FAILED_ALL_RETRIES,
36
37
  TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
37
- TEST_RETRY_REASON_TYPES
38
+ TEST_RETRY_REASON_TYPES,
39
+ TEST_IS_MODIFIED,
40
+ isModifiedTest,
41
+ getTestEndLine
38
42
  } = require('../../dd-trace/src/plugins/util/test')
39
43
  const { RESOURCE_NAME } = require('../../../ext/tags')
40
44
  const { COMPONENT, ERROR_MESSAGE } = require('../../dd-trace/src/constants')
@@ -55,7 +59,7 @@ const id = require('../../dd-trace/src/id')
55
59
 
56
60
  const BREAKPOINT_HIT_GRACE_PERIOD_MS = 200
57
61
  const BREAKPOINT_SET_GRACE_PERIOD_MS = 200
58
- const isCucumberWorker = !!process.env.CUCUMBER_WORKER_ID
62
+ const isCucumberWorker = !!getEnvironmentVariable('CUCUMBER_WORKER_ID')
59
63
 
60
64
  function getTestSuiteTags (testSuiteSpan) {
61
65
  const suiteTags = {
@@ -131,7 +135,7 @@ class CucumberPlugin extends CiPlugin {
131
135
  finishAllTraceSpans(this.testSessionSpan)
132
136
  this.telemetry.count(TELEMETRY_TEST_SESSION, {
133
137
  provider: this.ciProviderName,
134
- autoInjected: !!process.env.DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER
138
+ autoInjected: !!getEnvironmentVariable('DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER')
135
139
  })
136
140
 
137
141
  this.libraryConfig = null
@@ -345,7 +349,8 @@ class CucumberPlugin extends CiPlugin {
345
349
  hasPassedAllRetries,
346
350
  hasFailedAttemptToFix,
347
351
  isDisabled,
348
- isQuarantined
352
+ isQuarantined,
353
+ isModified
349
354
  }) => {
350
355
  const statusTag = isStep ? 'step.status' : TEST_STATUS
351
356
 
@@ -400,6 +405,14 @@ class CucumberPlugin extends CiPlugin {
400
405
  span.setTag(TEST_MANAGEMENT_IS_QUARANTINED, 'true')
401
406
  }
402
407
 
408
+ if (isModified) {
409
+ span.setTag(TEST_IS_MODIFIED, 'true')
410
+ if (isEfdRetry) {
411
+ span.setTag(TEST_IS_RETRY, 'true')
412
+ span.setTag(TEST_RETRY_REASON, TEST_RETRY_REASON_TYPES.efd)
413
+ }
414
+ }
415
+
403
416
  span.finish()
404
417
  if (!isStep) {
405
418
  const spanTags = span.context()._tags
@@ -442,6 +455,49 @@ class CucumberPlugin extends CiPlugin {
442
455
  this.addBind('ci:cucumber:test:fn', (ctx) => {
443
456
  return ctx.currentStore
444
457
  })
458
+
459
+ this.addSub('ci:cucumber:is-modified-test', ({
460
+ scenarios,
461
+ testFileAbsolutePath,
462
+ modifiedTests,
463
+ stepIds,
464
+ stepDefinitions,
465
+ setIsModified
466
+ }) => {
467
+ const testScenarioPath = getTestSuitePath(testFileAbsolutePath, this.repositoryRoot || process.cwd())
468
+ for (const scenario of scenarios) {
469
+ const isModified = isModifiedTest(
470
+ testScenarioPath,
471
+ scenario.location.line,
472
+ scenario.steps[scenario.steps.length - 1].location.line,
473
+ modifiedTests,
474
+ 'cucumber'
475
+ )
476
+ if (isModified) {
477
+ setIsModified(true)
478
+ return
479
+ }
480
+ }
481
+ for (const stepDefinition of stepDefinitions) {
482
+ if (!stepIds?.includes(stepDefinition.id)) {
483
+ continue
484
+ }
485
+ const testStartLineStep = stepDefinition.line
486
+ const testEndLineStep = getTestEndLine(stepDefinition.code, testStartLineStep)
487
+ const isModified = isModifiedTest(
488
+ stepDefinition.uri,
489
+ testStartLineStep,
490
+ testEndLineStep,
491
+ modifiedTests,
492
+ 'cucumber'
493
+ )
494
+ if (isModified) {
495
+ setIsModified(true)
496
+ return
497
+ }
498
+ }
499
+ setIsModified(false)
500
+ })
445
501
  }
446
502
 
447
503
  startTestSpan (testName, testSuite, extraTags) {
@@ -41,10 +41,15 @@ const {
41
41
  TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
42
42
  TEST_HAS_FAILED_ALL_RETRIES,
43
43
  getLibraryCapabilitiesTags,
44
- TEST_RETRY_REASON_TYPES
44
+ TEST_RETRY_REASON_TYPES,
45
+ getPullRequestDiff,
46
+ getModifiedTestsFromDiff,
47
+ TEST_IS_MODIFIED,
48
+ getPullRequestBaseBranch
45
49
  } = require('../../dd-trace/src/plugins/util/test')
46
50
  const { isMarkedAsUnskippable } = require('../../datadog-plugin-jest/src/util')
47
51
  const { ORIGIN_KEY, COMPONENT } = require('../../dd-trace/src/constants')
52
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
48
53
  const { appClosing: appClosingTelemetry } = require('../../dd-trace/src/telemetry')
49
54
  const log = require('../../dd-trace/src/log')
50
55
 
@@ -67,7 +72,11 @@ const {
67
72
  GIT_BRANCH,
68
73
  CI_PROVIDER_NAME,
69
74
  CI_WORKSPACE_PATH,
70
- GIT_COMMIT_MESSAGE
75
+ GIT_COMMIT_MESSAGE,
76
+ GIT_TAG,
77
+ GIT_PULL_REQUEST_BASE_BRANCH_SHA,
78
+ GIT_COMMIT_HEAD_SHA,
79
+ GIT_PULL_REQUEST_BASE_BRANCH
71
80
  } = require('../../dd-trace/src/plugins/util/tags')
72
81
  const {
73
82
  OS_VERSION,
@@ -76,6 +85,7 @@ const {
76
85
  RUNTIME_NAME,
77
86
  RUNTIME_VERSION
78
87
  } = require('../../dd-trace/src/plugins/util/env')
88
+ const { DD_MAJOR } = require('../../../version')
79
89
 
80
90
  const TEST_FRAMEWORK_NAME = 'cypress'
81
91
 
@@ -175,6 +185,26 @@ function getTestManagementTests (tracer, testConfiguration) {
175
185
  })
176
186
  }
177
187
 
188
+ function getModifiedTests (testEnvironmentMetadata) {
189
+ const {
190
+ [GIT_PULL_REQUEST_BASE_BRANCH]: pullRequestBaseBranch,
191
+ [GIT_PULL_REQUEST_BASE_BRANCH_SHA]: pullRequestBaseBranchSha,
192
+ [GIT_COMMIT_HEAD_SHA]: commitHeadSha
193
+ } = testEnvironmentMetadata
194
+
195
+ const baseBranchSha = pullRequestBaseBranchSha || getPullRequestBaseBranch(pullRequestBaseBranch)
196
+
197
+ if (baseBranchSha) {
198
+ const diff = getPullRequestDiff(baseBranchSha, commitHeadSha)
199
+ const modifiedTests = getModifiedTestsFromDiff(diff)
200
+ if (modifiedTests) {
201
+ return modifiedTests
202
+ }
203
+ }
204
+
205
+ throw new Error('Modified tests could not be retrieved')
206
+ }
207
+
178
208
  function getSuiteStatus (suiteStats) {
179
209
  if (!suiteStats) {
180
210
  return 'skip'
@@ -205,10 +235,13 @@ class CypressPlugin {
205
235
  [GIT_BRANCH]: branch,
206
236
  [CI_PROVIDER_NAME]: ciProviderName,
207
237
  [CI_WORKSPACE_PATH]: repositoryRoot,
208
- [GIT_COMMIT_MESSAGE]: commitMessage
238
+ [GIT_COMMIT_MESSAGE]: commitMessage,
239
+ [GIT_TAG]: tag,
240
+ [GIT_PULL_REQUEST_BASE_BRANCH_SHA]: pullRequestBaseSha,
241
+ [GIT_COMMIT_HEAD_SHA]: commitHeadSha
209
242
  } = this.testEnvironmentMetadata
210
243
 
211
- this.repositoryRoot = repositoryRoot
244
+ this.repositoryRoot = repositoryRoot || process.cwd()
212
245
  this.ciProviderName = ciProviderName
213
246
  this.codeOwnersEntries = getCodeOwnersFileEntries(repositoryRoot)
214
247
 
@@ -222,7 +255,10 @@ class CypressPlugin {
222
255
  runtimeVersion,
223
256
  branch,
224
257
  testLevel: 'test',
225
- commitMessage
258
+ commitMessage,
259
+ tag,
260
+ pullRequestBaseSha,
261
+ commitHeadSha
226
262
  }
227
263
  this.finishedTestsByFile = {}
228
264
  this.testStatuses = {}
@@ -242,6 +278,8 @@ class CypressPlugin {
242
278
  this.knownTests = []
243
279
  this.isTestManagementTestsEnabled = false
244
280
  this.testManagementAttemptToFixRetries = 0
281
+ this.isImpactedTestsEnabled = false
282
+ this.modifiedTests = []
245
283
  }
246
284
 
247
285
  // Init function returns a promise that resolves with the Cypress configuration
@@ -271,7 +309,8 @@ class CypressPlugin {
271
309
  flakyTestRetriesCount,
272
310
  isKnownTestsEnabled,
273
311
  isTestManagementEnabled,
274
- testManagementAttemptToFixRetries
312
+ testManagementAttemptToFixRetries,
313
+ isImpactedTestsEnabled
275
314
  }
276
315
  } = libraryConfigurationResponse
277
316
  this.isSuitesSkippingEnabled = isSuitesSkippingEnabled
@@ -285,12 +324,25 @@ class CypressPlugin {
285
324
  }
286
325
  this.isTestManagementTestsEnabled = isTestManagementEnabled
287
326
  this.testManagementAttemptToFixRetries = testManagementAttemptToFixRetries
327
+ this.isImpactedTestsEnabled = isImpactedTestsEnabled
288
328
  }
289
329
  return this.cypressConfig
290
330
  })
291
331
  return this.libraryConfigurationPromise
292
332
  }
293
333
 
334
+ getIsTestModified (testSuiteAbsolutePath) {
335
+ const relativeTestSuitePath = getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
336
+ if (!this.modifiedTests) {
337
+ return false
338
+ }
339
+ const lines = this.modifiedTests[relativeTestSuitePath]
340
+ if (!lines) {
341
+ return false
342
+ }
343
+ return lines.length > 0
344
+ }
345
+
294
346
  getTestSuiteProperties (testSuite) {
295
347
  return this.testManagementTests?.cypress?.suites?.[testSuite]?.tests || {}
296
348
  }
@@ -455,6 +507,15 @@ class CypressPlugin {
455
507
  }
456
508
  }
457
509
 
510
+ if (this.isImpactedTestsEnabled) {
511
+ try {
512
+ this.modifiedTests = getModifiedTests(this.testEnvironmentMetadata)
513
+ } catch (error) {
514
+ log.error(error)
515
+ this.isImpactedTestsEnabled = false
516
+ }
517
+ }
518
+
458
519
  // `details.specs` are test files
459
520
  details.specs?.forEach(({ absolute, relative }) => {
460
521
  const isUnskippableSuite = isMarkedAsUnskippable({ path: absolute })
@@ -474,7 +535,13 @@ class CypressPlugin {
474
535
  testSessionSpanMetadata[TEST_EARLY_FLAKE_ENABLED] = 'true'
475
536
  }
476
537
 
477
- const testSessionName = getTestSessionName(this.tracer._tracer._config, this.command, this.testEnvironmentMetadata)
538
+ const trimmedCommand = DD_MAJOR < 6 ? this.command : 'cypress run'
539
+
540
+ const testSessionName = getTestSessionName(
541
+ this.tracer._tracer._config,
542
+ trimmedCommand,
543
+ this.testEnvironmentMetadata
544
+ )
478
545
 
479
546
  if (this.tracer._tracer._exporter?.addMetadataTags) {
480
547
  const metadataTags = {}
@@ -549,7 +616,7 @@ class CypressPlugin {
549
616
  this.ciVisEvent(TELEMETRY_EVENT_FINISHED, 'session')
550
617
  incrementCountMetric(TELEMETRY_TEST_SESSION, {
551
618
  provider: this.ciProviderName,
552
- autoInjected: !!process.env.DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER
619
+ autoInjected: !!getEnvironmentVariable('DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER')
553
620
  })
554
621
 
555
622
  finishAllTraceSpans(this.testSessionSpan)
@@ -601,13 +668,9 @@ class CypressPlugin {
601
668
  const isSkippedByItr = this.testsToSkip.find(test =>
602
669
  cypressTestName === test.name && spec.relative === test.suite
603
670
  )
604
- let testSourceFile
605
-
606
- if (spec.absolute && this.repositoryRoot) {
607
- testSourceFile = getTestSuitePath(spec.absolute, this.repositoryRoot)
608
- } else {
609
- testSourceFile = spec.relative
610
- }
671
+ const testSourceFile = spec.absolute && this.repositoryRoot
672
+ ? getTestSuitePath(spec.absolute, this.repositoryRoot)
673
+ : spec.relative
611
674
 
612
675
  const skippedTestSpan = this.getTestSpan({ testName: cypressTestName, testSuite: spec.relative, testSourceFile })
613
676
 
@@ -683,12 +746,9 @@ class CypressPlugin {
683
746
  if (this.itrCorrelationId) {
684
747
  finishedTest.testSpan.setTag(ITR_CORRELATION_ID, this.itrCorrelationId)
685
748
  }
686
- let testSourceFile
687
- if (spec.absolute && this.repositoryRoot) {
688
- testSourceFile = getTestSuitePath(spec.absolute, this.repositoryRoot)
689
- } else {
690
- testSourceFile = spec.relative
691
- }
749
+ const testSourceFile = spec.absolute && this.repositoryRoot
750
+ ? getTestSuitePath(spec.absolute, this.repositoryRoot)
751
+ : spec.relative
692
752
  if (testSourceFile) {
693
753
  finishedTest.testSpan.setTag(TEST_SOURCE_FILE, testSourceFile)
694
754
  }
@@ -725,7 +785,10 @@ class CypressPlugin {
725
785
  isKnownTestsEnabled: this.isKnownTestsEnabled,
726
786
  isTestManagementEnabled: this.isTestManagementTestsEnabled,
727
787
  testManagementAttemptToFixRetries: this.testManagementAttemptToFixRetries,
728
- testManagementTests: this.getTestSuiteProperties(testSuite)
788
+ testManagementTests: this.getTestSuiteProperties(testSuite),
789
+ isImpactedTestsEnabled: this.isImpactedTestsEnabled,
790
+ isModifiedTest: this.getIsTestModified(testSuiteAbsolutePath),
791
+ repositoryRoot: this.repositoryRoot
729
792
  }
730
793
 
731
794
  if (this.testSuiteSpan) {
@@ -736,7 +799,7 @@ class CypressPlugin {
736
799
  },
737
800
  'dd:beforeEach': (test) => {
738
801
  const { testName, testSuite } = test
739
- const shouldSkip = !!this.testsToSkip.find(test => {
802
+ const shouldSkip = this.testsToSkip.some(test => {
740
803
  return testName === test.name && testSuite === test.suite
741
804
  })
742
805
  const isUnskippable = this.unskippableSuites.includes(testSuite)
@@ -783,7 +846,8 @@ class CypressPlugin {
783
846
  testName,
784
847
  isNew,
785
848
  isEfdRetry,
786
- isAttemptToFix
849
+ isAttemptToFix,
850
+ isModified
787
851
  } = test
788
852
  if (coverage && this.isCodeCoverageEnabled && this.tracer._tracer._exporter?.exportCoverage) {
789
853
  const coverageFiles = getCoveredFilenamesFromCoverage(coverage)
@@ -807,10 +871,10 @@ class CypressPlugin {
807
871
  this.activeTestSpan.setTag(TEST_STATUS, testStatus)
808
872
 
809
873
  // Save the test status to know if it has passed all retries
810
- if (!this.testStatuses[testName]) {
811
- this.testStatuses[testName] = [testStatus]
812
- } else {
874
+ if (this.testStatuses[testName]) {
813
875
  this.testStatuses[testName].push(testStatus)
876
+ } else {
877
+ this.testStatuses[testName] = [testStatus]
814
878
  }
815
879
  const testStatuses = this.testStatuses[testName]
816
880
 
@@ -830,6 +894,13 @@ class CypressPlugin {
830
894
  this.activeTestSpan.setTag(TEST_RETRY_REASON, TEST_RETRY_REASON_TYPES.efd)
831
895
  }
832
896
  }
897
+ if (isModified) {
898
+ this.activeTestSpan.setTag(TEST_IS_MODIFIED, 'true')
899
+ if (isEfdRetry) {
900
+ this.activeTestSpan.setTag(TEST_IS_RETRY, 'true')
901
+ this.activeTestSpan.setTag(TEST_RETRY_REASON, TEST_RETRY_REASON_TYPES.efd)
902
+ }
903
+ }
833
904
  if (isAttemptToFix) {
834
905
  this.activeTestSpan.setTag(TEST_MANAGEMENT_IS_ATTEMPT_TO_FIX, 'true')
835
906
  if (testStatuses.length > 1) {
@@ -838,7 +909,7 @@ class CypressPlugin {
838
909
  }
839
910
  const isLastAttempt = testStatuses.length === this.testManagementAttemptToFixRetries + 1
840
911
  if (isLastAttempt) {
841
- if (testStatuses.some(status => status === 'fail')) {
912
+ if (testStatuses.includes('fail')) {
842
913
  this.activeTestSpan.setTag(TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED, 'false')
843
914
  }
844
915
  if (testStatuses.every(status => status === 'fail')) {
@@ -1,6 +1,7 @@
1
1
  const NoopTracer = require('../../dd-trace/src/noop/tracer')
2
2
  const cypressPlugin = require('./cypress-plugin')
3
3
  const satisfies = require('semifies')
4
+ const { DD_MAJOR } = require('../../../version')
4
5
 
5
6
  const noopTask = {
6
7
  'dd:testSuiteStart': () => {
@@ -17,10 +18,19 @@ const noopTask = {
17
18
  }
18
19
  }
19
20
 
20
- module.exports = (on, config) => {
21
+ module.exports = function CypressPlugin (on, config) {
21
22
  const tracer = require('../../dd-trace')
22
23
 
23
24
  if (satisfies(config.version, '<10.2.0')) {
25
+ if (DD_MAJOR >= 6) {
26
+ // eslint-disable-next-line no-console
27
+ console.error(
28
+ 'ERROR: dd-trace v6 has deleted support for Cypress<10.2.0.'
29
+ )
30
+ on('task', noopTask)
31
+ return config
32
+ }
33
+
24
34
  // console.warn does not seem to work in cypress, so using console.log instead
25
35
  // eslint-disable-next-line no-console
26
36
  console.log(
@@ -1,12 +1,15 @@
1
+ /* eslint-disable unicorn/no-abusive-eslint-disable */
1
2
  /* eslint-disable */
2
3
  let isEarlyFlakeDetectionEnabled = false
3
4
  let isKnownTestsEnabled = false
4
5
  let knownTestsForSuite = []
5
- let suiteTests = []
6
6
  let earlyFlakeDetectionNumRetries = 0
7
7
  let isTestManagementEnabled = false
8
8
  let testManagementAttemptToFixRetries = 0
9
9
  let testManagementTests = {}
10
+ let isImpactedTestsEnabled = false
11
+ let isModifiedTest = false
12
+
10
13
  // We need to grab the original window as soon as possible,
11
14
  // in case the test changes the origin. If the test does change the origin,
12
15
  // any call to `cy.window()` will result in a cross origin error.
@@ -48,10 +51,9 @@ function retryTest (test, suiteTests, numRetries, tags) {
48
51
  }
49
52
  }
50
53
 
51
-
52
54
  const oldRunTests = Cypress.mocha.getRunner().runTests
53
55
  Cypress.mocha.getRunner().runTests = function (suite, fn) {
54
- if (!isKnownTestsEnabled && !isTestManagementEnabled) {
56
+ if (!isKnownTestsEnabled && !isTestManagementEnabled && !isImpactedTestsEnabled) {
55
57
  return oldRunTests.apply(this, arguments)
56
58
  }
57
59
  // We copy the new tests at the beginning of the suite run (runTests), so that they're run
@@ -67,10 +69,24 @@ Cypress.mocha.getRunner().runTests = function (suite, fn) {
67
69
  retryTest(test, suite.tests, testManagementAttemptToFixRetries, ['_ddIsAttemptToFix'])
68
70
  }
69
71
  }
72
+ if (isImpactedTestsEnabled && isModifiedTest) {
73
+ test._ddIsModified = true
74
+ if (isEarlyFlakeDetectionEnabled && !isAttemptToFix) {
75
+ retryTest(
76
+ test,
77
+ suite.tests,
78
+ earlyFlakeDetectionNumRetries,
79
+ ['_ddIsModified', '_ddIsEfdRetry', isKnownTestsEnabled && isNewTest(test) && '_ddIsNew']
80
+ )
81
+ }
82
+ }
70
83
  if (isKnownTestsEnabled) {
71
84
  if (!test._ddIsNew && !test.isPending() && isNewTest(test)) {
72
85
  test._ddIsNew = true
73
- if (isEarlyFlakeDetectionEnabled && !isAttemptToFix) {
86
+ if (isImpactedTestsEnabled && isModifiedTest) {
87
+ test._ddIsModified = true
88
+ }
89
+ if (isEarlyFlakeDetectionEnabled && !isAttemptToFix && !isModifiedTest) {
74
90
  retryTest(test, suite.tests, earlyFlakeDetectionNumRetries, ['_ddIsNew', '_ddIsEfdRetry'])
75
91
  }
76
92
  }
@@ -108,6 +124,8 @@ before(function () {
108
124
  isTestManagementEnabled = suiteConfig.isTestManagementEnabled
109
125
  testManagementAttemptToFixRetries = suiteConfig.testManagementAttemptToFixRetries
110
126
  testManagementTests = suiteConfig.testManagementTests
127
+ isImpactedTestsEnabled = suiteConfig.isImpactedTestsEnabled
128
+ isModifiedTest = suiteConfig.isModifiedTest
111
129
  }
112
130
  })
113
131
  })
@@ -133,7 +151,8 @@ afterEach(function () {
133
151
  error: currentTest.err,
134
152
  isNew: currentTest._ddIsNew,
135
153
  isEfdRetry: currentTest._ddIsEfdRetry,
136
- isAttemptToFix: currentTest._ddIsAttemptToFix
154
+ isAttemptToFix: currentTest._ddIsAttemptToFix,
155
+ isModified: currentTest._ddIsModified
137
156
  }
138
157
  try {
139
158
  testInfo.testSourceLine = Cypress.mocha.getRunner().currentRunnable.invocationDetails.line
@@ -3,12 +3,13 @@
3
3
  const Plugin = require('../../dd-trace/src/plugins/plugin')
4
4
  const telemetryMetrics = require('../../dd-trace/src/telemetry/metrics')
5
5
  const apiMetrics = telemetryMetrics.manager.namespace('tracers')
6
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
6
7
 
7
8
  // api ==> here
8
9
  const objectMap = new WeakMap()
9
10
 
10
11
  const injectionEnabledTag =
11
- `injection_enabled:${process.env.DD_INJECTION_ENABLED ? 'yes' : 'no'}`
12
+ `injection_enabled:${getEnvironmentVariable('DD_INJECTION_ENABLED') ? 'yes' : 'no'}`
12
13
 
13
14
  module.exports = class DdTraceApiPlugin extends Plugin {
14
15
  static get id () {
@@ -35,7 +35,7 @@ function getBody (body) {
35
35
  }
36
36
 
37
37
  function quantizePath (path) {
38
- return path && path.replace(/[0-9]+/g, '?')
38
+ return path && path.replaceAll(/[0-9]+/g, '?')
39
39
  }
40
40
 
41
41
  module.exports = ElasticsearchPlugin
@@ -0,0 +1,30 @@
1
+ 'use strict'
2
+
3
+ const { entryTags } = require('../../datadog-code-origin')
4
+ const Plugin = require('../../dd-trace/src/plugins/plugin')
5
+ const web = require('../../dd-trace/src/plugins/util/web')
6
+
7
+ class ExpressCodeOriginForSpansPlugin extends Plugin {
8
+ static get id () {
9
+ return 'express'
10
+ }
11
+
12
+ constructor (...args) {
13
+ super(...args)
14
+
15
+ const layerTags = new WeakMap()
16
+
17
+ this.addSub('apm:express:middleware:enter', ({ req, layer }) => {
18
+ const tags = layerTags.get(layer)
19
+ if (!tags) return
20
+ web.getContext(req).span?.addTags(tags)
21
+ })
22
+
23
+ this.addSub('apm:express:route:added', ({ topOfStackFunc, layer }) => {
24
+ if (layerTags.has(layer)) return
25
+ layerTags.set(layer, entryTags(topOfStackFunc))
26
+ })
27
+ }
28
+ }
29
+
30
+ module.exports = ExpressCodeOriginForSpansPlugin
@@ -1,18 +1,16 @@
1
1
  'use strict'
2
2
 
3
- const RouterPlugin = require('../../datadog-plugin-router/src')
3
+ const ExpressTracingPlugin = require('./tracing')
4
+ const ExpressCodeOriginForSpansPlugin = require('./code_origin')
5
+ const CompositePlugin = require('../../dd-trace/src/plugins/composite')
4
6
 
5
- class ExpressPlugin extends RouterPlugin {
6
- static get id () {
7
- return 'express'
8
- }
9
-
10
- constructor (...args) {
11
- super(...args)
12
-
13
- this.addSub('apm:express:request:handle', ({ req }) => {
14
- this.setFramework(req, 'express', this.config)
15
- })
7
+ class ExpressPlugin extends CompositePlugin {
8
+ static get id () { return 'express' }
9
+ static get plugins () {
10
+ return {
11
+ tracing: ExpressTracingPlugin,
12
+ codeOriginForSpans: ExpressCodeOriginForSpansPlugin
13
+ }
16
14
  }
17
15
  }
18
16
 
@@ -0,0 +1,19 @@
1
+ 'use strict'
2
+
3
+ const RouterPlugin = require('../../datadog-plugin-router/src')
4
+
5
+ class ExpressTracingPlugin extends RouterPlugin {
6
+ static get id () {
7
+ return 'express'
8
+ }
9
+
10
+ constructor (...args) {
11
+ super(...args)
12
+
13
+ this.addSub('apm:express:request:handle', ({ req }) => {
14
+ this.setFramework(req, 'express', this.config)
15
+ })
16
+ }
17
+ }
18
+
19
+ module.exports = ExpressTracingPlugin
@@ -7,18 +7,22 @@ class GoogleCloudPubsubClientPlugin extends ClientPlugin {
7
7
  static get type () { return 'messaging' }
8
8
  static get operation () { return 'request' }
9
9
 
10
- start ({ request, api, projectId }) {
10
+ start (ctx) {
11
+ const { request, api, projectId } = ctx
12
+
11
13
  if (api === 'publish') return
12
14
 
13
15
  this.startSpan(this.operationName(), {
14
16
  service: this.config.service || this.serviceName(),
15
- resource: [api, request.name].filter(x => x).join(' '),
17
+ resource: [api, request.name].filter(Boolean).join(' '),
16
18
  kind: this.constructor.kind,
17
19
  meta: {
18
20
  'pubsub.method': api,
19
21
  'gcloud.project_id': projectId
20
22
  }
21
- })
23
+ }, ctx)
24
+
25
+ return ctx.currentStore
22
26
  }
23
27
  }
24
28
 
@@ -7,7 +7,8 @@ class GoogleCloudPubsubConsumerPlugin extends ConsumerPlugin {
7
7
  static get id () { return 'google-cloud-pubsub' }
8
8
  static get operation () { return 'receive' }
9
9
 
10
- start ({ message }) {
10
+ bindStart (ctx) {
11
+ const { message } = ctx
11
12
  const subscription = message._subscriber._subscription
12
13
  const topic = subscription.metadata && subscription.metadata.topic
13
14
  const childOf = this.tracer.extract('text_map', message.attributes) || null
@@ -23,25 +24,29 @@ class GoogleCloudPubsubConsumerPlugin extends ConsumerPlugin {
23
24
  metrics: {
24
25
  'pubsub.ack': 0
25
26
  }
26
- })
27
+ }, ctx)
28
+
27
29
  if (this.config.dsmEnabled && message?.attributes) {
28
30
  const payloadSize = getMessageSize(message)
29
31
  this.tracer.decodeDataStreamsContext(message.attributes)
30
32
  this.tracer
31
33
  .setCheckpoint(['direction:in', `topic:${topic}`, 'type:google-pubsub'], span, payloadSize)
32
34
  }
33
- }
34
35
 
35
- finish (message) {
36
- const span = this.activeSpan
36
+ return ctx.currentStore
37
+ }
37
38
 
38
- if (!span) return
39
+ bindFinish (ctx) {
40
+ const { message } = ctx
41
+ const span = ctx.currentStore.span
39
42
 
40
- if (message.message._handled) {
43
+ if (message?._handled) {
41
44
  span.setTag('pubsub.ack', 1)
42
45
  }
43
46
 
44
47
  super.finish()
48
+
49
+ return ctx.parentStore
45
50
  }
46
51
  }
47
52