dd-trace 5.52.0 → 5.54.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/README.md +5 -0
  3. package/index.d.ts +87 -22
  4. package/initialize.mjs +3 -4
  5. package/package.json +36 -34
  6. package/packages/datadog-core/src/utils/src/get.js +1 -1
  7. package/packages/datadog-core/src/utils/src/has.js +1 -1
  8. package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
  9. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  10. package/packages/datadog-core/src/utils/src/pick.js +2 -2
  11. package/packages/datadog-core/src/utils/src/set.js +1 -1
  12. package/packages/datadog-core/src/utils/src/uniq.js +1 -1
  13. package/packages/datadog-instrumentations/src/amqp10.js +19 -17
  14. package/packages/datadog-instrumentations/src/amqplib.js +57 -37
  15. package/packages/datadog-instrumentations/src/apollo.js +2 -2
  16. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  17. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -4
  18. package/packages/datadog-instrumentations/src/child_process.js +3 -3
  19. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +92 -62
  20. package/packages/datadog-instrumentations/src/couchbase.js +5 -4
  21. package/packages/datadog-instrumentations/src/cucumber.js +126 -84
  22. package/packages/datadog-instrumentations/src/cypress.js +2 -1
  23. package/packages/datadog-instrumentations/src/dns.js +1 -1
  24. package/packages/datadog-instrumentations/src/express.js +2 -6
  25. package/packages/datadog-instrumentations/src/fs.js +7 -6
  26. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +28 -34
  27. package/packages/datadog-instrumentations/src/graphql.js +7 -10
  28. package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
  29. package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
  30. package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
  31. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
  32. package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -1
  33. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
  34. package/packages/datadog-instrumentations/src/helpers/register.js +21 -18
  35. package/packages/datadog-instrumentations/src/http/client.js +16 -21
  36. package/packages/datadog-instrumentations/src/iovalkey.js +51 -0
  37. package/packages/datadog-instrumentations/src/jest.js +184 -87
  38. package/packages/datadog-instrumentations/src/kafkajs.js +65 -44
  39. package/packages/datadog-instrumentations/src/knex.js +4 -4
  40. package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
  41. package/packages/datadog-instrumentations/src/mariadb.js +38 -61
  42. package/packages/datadog-instrumentations/src/mocha/main.js +85 -59
  43. package/packages/datadog-instrumentations/src/mocha/utils.js +103 -82
  44. package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
  45. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  46. package/packages/datadog-instrumentations/src/mysql.js +20 -36
  47. package/packages/datadog-instrumentations/src/mysql2.js +55 -47
  48. package/packages/datadog-instrumentations/src/net.js +4 -2
  49. package/packages/datadog-instrumentations/src/next.js +7 -14
  50. package/packages/datadog-instrumentations/src/nyc.js +1 -1
  51. package/packages/datadog-instrumentations/src/openai.js +21 -23
  52. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  53. package/packages/datadog-instrumentations/src/pg.js +6 -13
  54. package/packages/datadog-instrumentations/src/playwright.js +170 -136
  55. package/packages/datadog-instrumentations/src/redis.js +3 -3
  56. package/packages/datadog-instrumentations/src/restify.js +2 -2
  57. package/packages/datadog-instrumentations/src/rhea.js +42 -54
  58. package/packages/datadog-instrumentations/src/router.js +22 -25
  59. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  60. package/packages/datadog-instrumentations/src/url.js +9 -17
  61. package/packages/datadog-instrumentations/src/vitest.js +126 -97
  62. package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
  63. package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
  64. package/packages/datadog-plugin-amqplib/src/client.js +6 -2
  65. package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
  66. package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
  67. package/packages/datadog-plugin-amqplib/src/util.js +1 -1
  68. package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
  69. package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
  70. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -2
  71. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  72. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
  73. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +24 -31
  74. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  75. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +6 -6
  76. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
  77. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -1
  78. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +4 -5
  79. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  80. package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
  81. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  82. package/packages/datadog-plugin-child_process/src/index.js +4 -4
  83. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
  84. package/packages/datadog-plugin-cucumber/src/index.js +86 -20
  85. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +97 -27
  86. package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
  87. package/packages/datadog-plugin-cypress/src/support.js +24 -5
  88. package/packages/datadog-plugin-express/src/code_origin.js +30 -0
  89. package/packages/datadog-plugin-express/src/index.js +10 -12
  90. package/packages/datadog-plugin-express/src/tracing.js +19 -0
  91. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
  92. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
  93. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
  94. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +26 -9
  95. package/packages/datadog-plugin-graphql/src/execute.js +2 -2
  96. package/packages/datadog-plugin-graphql/src/index.js +7 -6
  97. package/packages/datadog-plugin-graphql/src/resolve.js +2 -2
  98. package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
  99. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
  100. package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
  101. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  102. package/packages/datadog-plugin-grpc/src/util.js +2 -2
  103. package/packages/datadog-plugin-http/src/client.js +18 -7
  104. package/packages/datadog-plugin-http2/src/client.js +20 -20
  105. package/packages/datadog-plugin-iovalkey/src/index.js +18 -0
  106. package/packages/datadog-plugin-jest/src/index.js +36 -28
  107. package/packages/datadog-plugin-jest/src/util.js +8 -8
  108. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
  109. package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
  110. package/packages/datadog-plugin-kafkajs/src/producer.js +15 -7
  111. package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
  112. package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
  113. package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
  114. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
  115. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
  116. package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
  117. package/packages/datadog-plugin-mariadb/src/index.js +3 -9
  118. package/packages/datadog-plugin-mocha/src/index.js +88 -48
  119. package/packages/datadog-plugin-mongodb-core/src/index.js +1 -1
  120. package/packages/datadog-plugin-mysql/src/index.js +11 -9
  121. package/packages/datadog-plugin-mysql2/src/index.js +16 -0
  122. package/packages/datadog-plugin-net/src/tcp.js +1 -1
  123. package/packages/datadog-plugin-next/src/index.js +6 -5
  124. package/packages/datadog-plugin-openai/src/services.js +6 -10
  125. package/packages/datadog-plugin-openai/src/tracing.js +10 -14
  126. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  127. package/packages/datadog-plugin-playwright/src/index.js +48 -22
  128. package/packages/datadog-plugin-redis/src/index.js +9 -4
  129. package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
  130. package/packages/datadog-plugin-rhea/src/producer.js +5 -2
  131. package/packages/datadog-plugin-router/src/index.js +1 -1
  132. package/packages/datadog-plugin-selenium/src/index.js +1 -6
  133. package/packages/datadog-plugin-vitest/src/index.js +99 -72
  134. package/packages/datadog-shimmer/src/shimmer.js +163 -36
  135. package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
  136. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  137. package/packages/dd-trace/src/appsec/blocking.js +6 -20
  138. package/packages/dd-trace/src/appsec/graphql.js +2 -2
  139. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +1 -1
  140. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +1 -1
  141. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +1 -1
  142. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +4 -6
  143. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
  144. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +4 -6
  145. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
  146. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
  147. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
  148. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
  149. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  150. package/packages/dd-trace/src/appsec/iast/index.js +1 -0
  151. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
  152. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
  153. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +6 -13
  154. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
  155. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
  156. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
  157. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
  158. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -7
  159. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
  160. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  161. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +5 -7
  162. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  163. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +6 -6
  164. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -1
  165. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  166. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
  167. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
  168. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -24
  169. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
  170. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
  171. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
  172. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
  173. package/packages/dd-trace/src/appsec/index.js +15 -12
  174. package/packages/dd-trace/src/appsec/rasp/index.js +19 -17
  175. package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
  176. package/packages/dd-trace/src/appsec/rasp/utils.js +11 -6
  177. package/packages/dd-trace/src/appsec/reporter.js +233 -40
  178. package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
  179. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -2
  180. package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
  181. package/packages/dd-trace/src/appsec/telemetry/index.js +1 -2
  182. package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -14
  183. package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
  184. package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
  185. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +8 -8
  186. package/packages/dd-trace/src/azure_metadata.js +2 -7
  187. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +1 -1
  188. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
  189. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
  190. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
  191. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
  192. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
  193. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +1 -1
  194. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
  195. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +2 -2
  196. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
  197. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +1 -1
  198. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +1 -1
  199. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +8 -5
  200. package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
  201. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +1 -1
  202. package/packages/dd-trace/src/config.js +82 -51
  203. package/packages/dd-trace/src/config_stable.js +3 -3
  204. package/packages/dd-trace/src/datastreams/encoding.js +9 -9
  205. package/packages/dd-trace/src/datastreams/fnv.js +1 -1
  206. package/packages/dd-trace/src/datastreams/pathway.js +4 -4
  207. package/packages/dd-trace/src/datastreams/processor.js +5 -7
  208. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
  209. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
  210. package/packages/dd-trace/src/datastreams/size.js +1 -1
  211. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +131 -72
  212. package/packages/dd-trace/src/debugger/devtools_client/condition.js +6 -8
  213. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
  214. package/packages/dd-trace/src/debugger/devtools_client/index.js +17 -27
  215. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
  216. package/packages/dd-trace/src/debugger/devtools_client/send.js +8 -7
  217. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +16 -8
  218. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +8 -10
  219. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +3 -3
  220. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
  221. package/packages/dd-trace/src/debugger/devtools_client/state.js +31 -4
  222. package/packages/dd-trace/src/dogstatsd.js +7 -4
  223. package/packages/dd-trace/src/encode/0.4.js +9 -9
  224. package/packages/dd-trace/src/encode/0.5.js +1 -1
  225. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +3 -3
  226. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  227. package/packages/dd-trace/src/encode/tags-processors.js +1 -1
  228. package/packages/dd-trace/src/exporter.js +6 -6
  229. package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
  230. package/packages/dd-trace/src/exporters/common/docker.js +1 -1
  231. package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
  232. package/packages/dd-trace/src/exporters/common/request.js +1 -1
  233. package/packages/dd-trace/src/exporters/common/util.js +1 -1
  234. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  235. package/packages/dd-trace/src/flare/file.js +1 -5
  236. package/packages/dd-trace/src/format.js +1 -1
  237. package/packages/dd-trace/src/git_properties.js +1 -1
  238. package/packages/dd-trace/src/id.js +12 -6
  239. package/packages/dd-trace/src/iitm.js +10 -22
  240. package/packages/dd-trace/src/lambda/handler.js +6 -6
  241. package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
  242. package/packages/dd-trace/src/lambda/runtime/ritm.js +1 -1
  243. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
  244. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
  245. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
  246. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
  247. package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -1
  248. package/packages/dd-trace/src/llmobs/sdk.js +2 -2
  249. package/packages/dd-trace/src/llmobs/tagger.js +113 -99
  250. package/packages/dd-trace/src/llmobs/util.js +9 -9
  251. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  252. package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
  253. package/packages/dd-trace/src/log/index.js +4 -4
  254. package/packages/dd-trace/src/log/log.js +1 -1
  255. package/packages/dd-trace/src/log/writer.js +2 -2
  256. package/packages/dd-trace/src/msgpack/chunk.js +3 -3
  257. package/packages/dd-trace/src/msgpack/encoder.js +28 -28
  258. package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
  259. package/packages/dd-trace/src/noop/span.js +3 -5
  260. package/packages/dd-trace/src/noop/tracer.js +1 -2
  261. package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
  262. package/packages/dd-trace/src/opentelemetry/tracer.js +6 -5
  263. package/packages/dd-trace/src/opentracing/propagation/log.js +6 -8
  264. package/packages/dd-trace/src/opentracing/propagation/text_map.js +27 -23
  265. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
  266. package/packages/dd-trace/src/opentracing/span.js +9 -14
  267. package/packages/dd-trace/src/opentracing/tracer.js +9 -6
  268. package/packages/dd-trace/src/payload-tagging/index.js +1 -1
  269. package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
  270. package/packages/dd-trace/src/pkg.js +1 -1
  271. package/packages/dd-trace/src/plugins/ci_plugin.js +62 -10
  272. package/packages/dd-trace/src/plugins/consumer.js +2 -2
  273. package/packages/dd-trace/src/plugins/inbound.js +5 -1
  274. package/packages/dd-trace/src/plugins/index.js +1 -1
  275. package/packages/dd-trace/src/plugins/outbound.js +4 -5
  276. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  277. package/packages/dd-trace/src/plugins/producer.js +2 -2
  278. package/packages/dd-trace/src/plugins/storage.js +2 -2
  279. package/packages/dd-trace/src/plugins/util/ci.js +23 -15
  280. package/packages/dd-trace/src/plugins/util/git.js +165 -11
  281. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
  282. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  283. package/packages/dd-trace/src/plugins/util/llm.js +27 -10
  284. package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
  285. package/packages/dd-trace/src/plugins/util/test.js +311 -48
  286. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  287. package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
  288. package/packages/dd-trace/src/plugins/util/user-provided-git.js +12 -3
  289. package/packages/dd-trace/src/plugins/util/web.js +5 -4
  290. package/packages/dd-trace/src/priority_sampler.js +22 -22
  291. package/packages/dd-trace/src/profiling/config.js +44 -8
  292. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +5 -5
  293. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  294. package/packages/dd-trace/src/profiling/profiler.js +37 -2
  295. package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
  296. package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
  297. package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
  298. package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
  299. package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
  300. package/packages/dd-trace/src/profiling/tagger.js +3 -5
  301. package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
  302. package/packages/dd-trace/src/proxy.js +7 -13
  303. package/packages/dd-trace/src/random_sampler.js +40 -0
  304. package/packages/dd-trace/src/rate_limiter.js +4 -4
  305. package/packages/dd-trace/src/remote_config/index.js +3 -7
  306. package/packages/dd-trace/src/remote_config/manager.js +25 -13
  307. package/packages/dd-trace/src/require-package-json.js +1 -1
  308. package/packages/dd-trace/src/ritm.js +4 -4
  309. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +2 -2
  310. package/packages/dd-trace/src/sampler.js +33 -4
  311. package/packages/dd-trace/src/sampling_rule.js +12 -3
  312. package/packages/dd-trace/src/scope.js +1 -1
  313. package/packages/dd-trace/src/serverless.js +0 -48
  314. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  315. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +8 -0
  316. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
  317. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +4 -0
  318. package/packages/dd-trace/src/span_processor.js +3 -3
  319. package/packages/dd-trace/src/span_sampler.js +4 -1
  320. package/packages/dd-trace/src/standalone/tracesource.js +1 -1
  321. package/packages/dd-trace/src/startup-log.js +2 -2
  322. package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
  323. package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
  324. package/packages/dd-trace/src/telemetry/metrics.js +10 -5
  325. package/packages/dd-trace/src/telemetry/send-data.js +1 -1
  326. package/packages/dd-trace/src/telemetry/telemetry.js +23 -24
  327. package/packages/dd-trace/src/util.js +1 -1
  328. package/version.js +1 -0
  329. package/packages/datadog-instrumentations/src/paperplane.js +0 -77
  330. package/packages/datadog-plugin-paperplane/src/index.js +0 -25
  331. package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
  332. package/packages/datadog-plugin-paperplane/src/server.js +0 -24
@@ -34,7 +34,10 @@ const {
34
34
  TEST_MANAGEMENT_IS_ATTEMPT_TO_FIX,
35
35
  TEST_HAS_FAILED_ALL_RETRIES,
36
36
  TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
37
- TEST_RETRY_REASON_TYPES
37
+ TEST_RETRY_REASON_TYPES,
38
+ TEST_IS_MODIFIED,
39
+ isModifiedTest,
40
+ getTestEndLine
38
41
  } = require('../../dd-trace/src/plugins/util/test')
39
42
  const { RESOURCE_NAME } = require('../../../ext/tags')
40
43
  const { COMPONENT, ERROR_MESSAGE } = require('../../dd-trace/src/constants')
@@ -221,13 +224,8 @@ class CucumberPlugin extends CiPlugin {
221
224
  this.telemetry.ciVisEvent(TELEMETRY_CODE_COVERAGE_FINISHED, 'suite', { library: 'istanbul' })
222
225
  })
223
226
 
224
- this.addSub('ci:cucumber:test:start', ({
225
- testName,
226
- testFileAbsolutePath,
227
- testSourceLine,
228
- isParallel,
229
- promises
230
- }) => {
227
+ this.addBind('ci:cucumber:test:start', (ctx) => {
228
+ const { testName, testFileAbsolutePath, testSourceLine, isParallel, promises } = ctx
231
229
  const store = storage('legacy').getStore()
232
230
  const testSuite = getTestSuitePath(testFileAbsolutePath, this.sourceRoot)
233
231
  const testSourceFile = getTestSuitePath(testFileAbsolutePath, this.repositoryRoot)
@@ -240,22 +238,23 @@ class CucumberPlugin extends CiPlugin {
240
238
  extraTags[CUCUMBER_IS_PARALLEL] = 'true'
241
239
  }
242
240
 
243
- const testSpan = this.startTestSpan(testName, testSuite, extraTags)
241
+ const span = this.startTestSpan(testName, testSuite, extraTags)
244
242
 
245
- this.enter(testSpan, store)
243
+ ctx.parentStore = store
244
+ ctx.currentStore = { ...store, span }
246
245
 
247
- this.activeTestSpan = testSpan
246
+ this.activeTestSpan = span
248
247
  // Time we give the breakpoint to be hit
249
248
  if (promises && this.runningTestProbe) {
250
249
  promises.hitBreakpointPromise = new Promise((resolve) => {
251
250
  setTimeout(resolve, BREAKPOINT_HIT_GRACE_PERIOD_MS)
252
251
  })
253
252
  }
253
+
254
+ return ctx.currentStore
254
255
  })
255
256
 
256
- this.addSub('ci:cucumber:test:retry', ({ isFirstAttempt, error, isAtrRetry }) => {
257
- const store = storage('legacy').getStore()
258
- const span = store.span
257
+ this.addSub('ci:cucumber:test:retry', ({ span, isFirstAttempt, error, isAtrRetry }) => {
259
258
  if (!isFirstAttempt) {
260
259
  span.setTag(TEST_IS_RETRY, 'true')
261
260
  if (isAtrRetry) {
@@ -284,7 +283,9 @@ class CucumberPlugin extends CiPlugin {
284
283
  finishAllTraceSpans(span)
285
284
  })
286
285
 
287
- this.addSub('ci:cucumber:test-step:start', ({ resource }) => {
286
+ this.addBind('ci:cucumber:test-step:start', (ctx) => {
287
+ const { resource } = ctx
288
+
288
289
  const store = storage('legacy').getStore()
289
290
  const childOf = store ? store.span : store
290
291
  const span = this.tracer.startSpan('cucumber.step', {
@@ -295,7 +296,10 @@ class CucumberPlugin extends CiPlugin {
295
296
  [RESOURCE_NAME]: resource
296
297
  }
297
298
  })
298
- this.enter(span, store)
299
+ ctx.parentStore = store
300
+ ctx.currentStore = { ...store, span }
301
+
302
+ return ctx.currentStore
299
303
  })
300
304
 
301
305
  this.addSub('ci:cucumber:worker-report:trace', (traces) => {
@@ -329,6 +333,7 @@ class CucumberPlugin extends CiPlugin {
329
333
  })
330
334
 
331
335
  this.addSub('ci:cucumber:test:finish', ({
336
+ span,
332
337
  isStep,
333
338
  status,
334
339
  skipReason,
@@ -343,9 +348,9 @@ class CucumberPlugin extends CiPlugin {
343
348
  hasPassedAllRetries,
344
349
  hasFailedAttemptToFix,
345
350
  isDisabled,
346
- isQuarantined
351
+ isQuarantined,
352
+ isModified
347
353
  }) => {
348
- const span = storage('legacy').getStore().span
349
354
  const statusTag = isStep ? 'step.status' : TEST_STATUS
350
355
 
351
356
  span.setTag(statusTag, status)
@@ -399,6 +404,14 @@ class CucumberPlugin extends CiPlugin {
399
404
  span.setTag(TEST_MANAGEMENT_IS_QUARANTINED, 'true')
400
405
  }
401
406
 
407
+ if (isModified) {
408
+ span.setTag(TEST_IS_MODIFIED, 'true')
409
+ if (isEfdRetry) {
410
+ span.setTag(TEST_IS_RETRY, 'true')
411
+ span.setTag(TEST_RETRY_REASON, TEST_RETRY_REASON_TYPES.efd)
412
+ }
413
+ }
414
+
402
415
  span.finish()
403
416
  if (!isStep) {
404
417
  const spanTags = span.context()._tags
@@ -425,11 +438,64 @@ class CucumberPlugin extends CiPlugin {
425
438
  }
426
439
  })
427
440
 
428
- this.addSub('ci:cucumber:error', (err) => {
441
+ this.addBind('ci:cucumber:error', (ctx) => {
442
+ const { err } = ctx
429
443
  if (err) {
430
- const span = storage('legacy').getStore().span
444
+ const span = ctx.currentStore.span
431
445
  span.setTag('error', err)
446
+
447
+ ctx.parentStore = ctx.currentStore
448
+ ctx.currentStore = { ...ctx.currentStore, span }
449
+ }
450
+
451
+ return ctx.currentStore
452
+ })
453
+
454
+ this.addBind('ci:cucumber:test:fn', (ctx) => {
455
+ return ctx.currentStore
456
+ })
457
+
458
+ this.addSub('ci:cucumber:is-modified-test', ({
459
+ scenarios,
460
+ testFileAbsolutePath,
461
+ modifiedTests,
462
+ stepIds,
463
+ stepDefinitions,
464
+ setIsModified
465
+ }) => {
466
+ const testScenarioPath = getTestSuitePath(testFileAbsolutePath, this.repositoryRoot || process.cwd())
467
+ for (const scenario of scenarios) {
468
+ const isModified = isModifiedTest(
469
+ testScenarioPath,
470
+ scenario.location.line,
471
+ scenario.steps[scenario.steps.length - 1].location.line,
472
+ modifiedTests,
473
+ 'cucumber'
474
+ )
475
+ if (isModified) {
476
+ setIsModified(true)
477
+ return
478
+ }
479
+ }
480
+ for (const stepDefinition of stepDefinitions) {
481
+ if (!stepIds?.includes(stepDefinition.id)) {
482
+ continue
483
+ }
484
+ const testStartLineStep = stepDefinition.line
485
+ const testEndLineStep = getTestEndLine(stepDefinition.code, testStartLineStep)
486
+ const isModified = isModifiedTest(
487
+ stepDefinition.uri,
488
+ testStartLineStep,
489
+ testEndLineStep,
490
+ modifiedTests,
491
+ 'cucumber'
492
+ )
493
+ if (isModified) {
494
+ setIsModified(true)
495
+ return
496
+ }
432
497
  }
498
+ setIsModified(false)
433
499
  })
434
500
  }
435
501
 
@@ -41,7 +41,11 @@ 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')
@@ -67,7 +71,11 @@ const {
67
71
  GIT_BRANCH,
68
72
  CI_PROVIDER_NAME,
69
73
  CI_WORKSPACE_PATH,
70
- GIT_COMMIT_MESSAGE
74
+ GIT_COMMIT_MESSAGE,
75
+ GIT_TAG,
76
+ GIT_PULL_REQUEST_BASE_BRANCH_SHA,
77
+ GIT_COMMIT_HEAD_SHA,
78
+ GIT_PULL_REQUEST_BASE_BRANCH
71
79
  } = require('../../dd-trace/src/plugins/util/tags')
72
80
  const {
73
81
  OS_VERSION,
@@ -76,6 +84,7 @@ const {
76
84
  RUNTIME_NAME,
77
85
  RUNTIME_VERSION
78
86
  } = require('../../dd-trace/src/plugins/util/env')
87
+ const { DD_MAJOR } = require('../../../version')
79
88
 
80
89
  const TEST_FRAMEWORK_NAME = 'cypress'
81
90
 
@@ -175,6 +184,26 @@ function getTestManagementTests (tracer, testConfiguration) {
175
184
  })
176
185
  }
177
186
 
187
+ function getModifiedTests (testEnvironmentMetadata) {
188
+ const {
189
+ [GIT_PULL_REQUEST_BASE_BRANCH]: pullRequestBaseBranch,
190
+ [GIT_PULL_REQUEST_BASE_BRANCH_SHA]: pullRequestBaseBranchSha,
191
+ [GIT_COMMIT_HEAD_SHA]: commitHeadSha
192
+ } = testEnvironmentMetadata
193
+
194
+ const baseBranchSha = pullRequestBaseBranchSha || getPullRequestBaseBranch(pullRequestBaseBranch)
195
+
196
+ if (baseBranchSha) {
197
+ const diff = getPullRequestDiff(baseBranchSha, commitHeadSha)
198
+ const modifiedTests = getModifiedTestsFromDiff(diff)
199
+ if (modifiedTests) {
200
+ return modifiedTests
201
+ }
202
+ }
203
+
204
+ throw new Error('Modified tests could not be retrieved')
205
+ }
206
+
178
207
  function getSuiteStatus (suiteStats) {
179
208
  if (!suiteStats) {
180
209
  return 'skip'
@@ -205,10 +234,13 @@ class CypressPlugin {
205
234
  [GIT_BRANCH]: branch,
206
235
  [CI_PROVIDER_NAME]: ciProviderName,
207
236
  [CI_WORKSPACE_PATH]: repositoryRoot,
208
- [GIT_COMMIT_MESSAGE]: commitMessage
237
+ [GIT_COMMIT_MESSAGE]: commitMessage,
238
+ [GIT_TAG]: tag,
239
+ [GIT_PULL_REQUEST_BASE_BRANCH_SHA]: pullRequestBaseSha,
240
+ [GIT_COMMIT_HEAD_SHA]: commitHeadSha
209
241
  } = this.testEnvironmentMetadata
210
242
 
211
- this.repositoryRoot = repositoryRoot
243
+ this.repositoryRoot = repositoryRoot || process.cwd()
212
244
  this.ciProviderName = ciProviderName
213
245
  this.codeOwnersEntries = getCodeOwnersFileEntries(repositoryRoot)
214
246
 
@@ -222,7 +254,10 @@ class CypressPlugin {
222
254
  runtimeVersion,
223
255
  branch,
224
256
  testLevel: 'test',
225
- commitMessage
257
+ commitMessage,
258
+ tag,
259
+ pullRequestBaseSha,
260
+ commitHeadSha
226
261
  }
227
262
  this.finishedTestsByFile = {}
228
263
  this.testStatuses = {}
@@ -242,6 +277,8 @@ class CypressPlugin {
242
277
  this.knownTests = []
243
278
  this.isTestManagementTestsEnabled = false
244
279
  this.testManagementAttemptToFixRetries = 0
280
+ this.isImpactedTestsEnabled = false
281
+ this.modifiedTests = []
245
282
  }
246
283
 
247
284
  // Init function returns a promise that resolves with the Cypress configuration
@@ -271,7 +308,8 @@ class CypressPlugin {
271
308
  flakyTestRetriesCount,
272
309
  isKnownTestsEnabled,
273
310
  isTestManagementEnabled,
274
- testManagementAttemptToFixRetries
311
+ testManagementAttemptToFixRetries,
312
+ isImpactedTestsEnabled
275
313
  }
276
314
  } = libraryConfigurationResponse
277
315
  this.isSuitesSkippingEnabled = isSuitesSkippingEnabled
@@ -285,12 +323,25 @@ class CypressPlugin {
285
323
  }
286
324
  this.isTestManagementTestsEnabled = isTestManagementEnabled
287
325
  this.testManagementAttemptToFixRetries = testManagementAttemptToFixRetries
326
+ this.isImpactedTestsEnabled = isImpactedTestsEnabled
288
327
  }
289
328
  return this.cypressConfig
290
329
  })
291
330
  return this.libraryConfigurationPromise
292
331
  }
293
332
 
333
+ getIsTestModified (testSuiteAbsolutePath) {
334
+ const relativeTestSuitePath = getTestSuitePath(testSuiteAbsolutePath, this.repositoryRoot)
335
+ if (!this.modifiedTests) {
336
+ return false
337
+ }
338
+ const lines = this.modifiedTests[relativeTestSuitePath]
339
+ if (!lines) {
340
+ return false
341
+ }
342
+ return lines.length > 0
343
+ }
344
+
294
345
  getTestSuiteProperties (testSuite) {
295
346
  return this.testManagementTests?.cypress?.suites?.[testSuite]?.tests || {}
296
347
  }
@@ -455,6 +506,15 @@ class CypressPlugin {
455
506
  }
456
507
  }
457
508
 
509
+ if (this.isImpactedTestsEnabled) {
510
+ try {
511
+ this.modifiedTests = getModifiedTests(this.testEnvironmentMetadata)
512
+ } catch (error) {
513
+ log.error(error)
514
+ this.isImpactedTestsEnabled = false
515
+ }
516
+ }
517
+
458
518
  // `details.specs` are test files
459
519
  details.specs?.forEach(({ absolute, relative }) => {
460
520
  const isUnskippableSuite = isMarkedAsUnskippable({ path: absolute })
@@ -474,7 +534,13 @@ class CypressPlugin {
474
534
  testSessionSpanMetadata[TEST_EARLY_FLAKE_ENABLED] = 'true'
475
535
  }
476
536
 
477
- const testSessionName = getTestSessionName(this.tracer._tracer._config, this.command, this.testEnvironmentMetadata)
537
+ const trimmedCommand = DD_MAJOR < 6 ? this.command : 'cypress run'
538
+
539
+ const testSessionName = getTestSessionName(
540
+ this.tracer._tracer._config,
541
+ trimmedCommand,
542
+ this.testEnvironmentMetadata
543
+ )
478
544
 
479
545
  if (this.tracer._tracer._exporter?.addMetadataTags) {
480
546
  const metadataTags = {}
@@ -601,13 +667,9 @@ class CypressPlugin {
601
667
  const isSkippedByItr = this.testsToSkip.find(test =>
602
668
  cypressTestName === test.name && spec.relative === test.suite
603
669
  )
604
- let testSourceFile
605
-
606
- if (spec.absolute && this.repositoryRoot) {
607
- testSourceFile = getTestSuitePath(spec.absolute, this.repositoryRoot)
608
- } else {
609
- testSourceFile = spec.relative
610
- }
670
+ const testSourceFile = spec.absolute && this.repositoryRoot
671
+ ? getTestSuitePath(spec.absolute, this.repositoryRoot)
672
+ : spec.relative
611
673
 
612
674
  const skippedTestSpan = this.getTestSpan({ testName: cypressTestName, testSuite: spec.relative, testSourceFile })
613
675
 
@@ -683,12 +745,9 @@ class CypressPlugin {
683
745
  if (this.itrCorrelationId) {
684
746
  finishedTest.testSpan.setTag(ITR_CORRELATION_ID, this.itrCorrelationId)
685
747
  }
686
- let testSourceFile
687
- if (spec.absolute && this.repositoryRoot) {
688
- testSourceFile = getTestSuitePath(spec.absolute, this.repositoryRoot)
689
- } else {
690
- testSourceFile = spec.relative
691
- }
748
+ const testSourceFile = spec.absolute && this.repositoryRoot
749
+ ? getTestSuitePath(spec.absolute, this.repositoryRoot)
750
+ : spec.relative
692
751
  if (testSourceFile) {
693
752
  finishedTest.testSpan.setTag(TEST_SOURCE_FILE, testSourceFile)
694
753
  }
@@ -725,7 +784,10 @@ class CypressPlugin {
725
784
  isKnownTestsEnabled: this.isKnownTestsEnabled,
726
785
  isTestManagementEnabled: this.isTestManagementTestsEnabled,
727
786
  testManagementAttemptToFixRetries: this.testManagementAttemptToFixRetries,
728
- testManagementTests: this.getTestSuiteProperties(testSuite)
787
+ testManagementTests: this.getTestSuiteProperties(testSuite),
788
+ isImpactedTestsEnabled: this.isImpactedTestsEnabled,
789
+ isModifiedTest: this.getIsTestModified(testSuiteAbsolutePath),
790
+ repositoryRoot: this.repositoryRoot
729
791
  }
730
792
 
731
793
  if (this.testSuiteSpan) {
@@ -736,7 +798,7 @@ class CypressPlugin {
736
798
  },
737
799
  'dd:beforeEach': (test) => {
738
800
  const { testName, testSuite } = test
739
- const shouldSkip = !!this.testsToSkip.find(test => {
801
+ const shouldSkip = this.testsToSkip.some(test => {
740
802
  return testName === test.name && testSuite === test.suite
741
803
  })
742
804
  const isUnskippable = this.unskippableSuites.includes(testSuite)
@@ -783,7 +845,8 @@ class CypressPlugin {
783
845
  testName,
784
846
  isNew,
785
847
  isEfdRetry,
786
- isAttemptToFix
848
+ isAttemptToFix,
849
+ isModified
787
850
  } = test
788
851
  if (coverage && this.isCodeCoverageEnabled && this.tracer._tracer._exporter?.exportCoverage) {
789
852
  const coverageFiles = getCoveredFilenamesFromCoverage(coverage)
@@ -807,10 +870,10 @@ class CypressPlugin {
807
870
  this.activeTestSpan.setTag(TEST_STATUS, testStatus)
808
871
 
809
872
  // Save the test status to know if it has passed all retries
810
- if (!this.testStatuses[testName]) {
811
- this.testStatuses[testName] = [testStatus]
812
- } else {
873
+ if (this.testStatuses[testName]) {
813
874
  this.testStatuses[testName].push(testStatus)
875
+ } else {
876
+ this.testStatuses[testName] = [testStatus]
814
877
  }
815
878
  const testStatuses = this.testStatuses[testName]
816
879
 
@@ -830,6 +893,13 @@ class CypressPlugin {
830
893
  this.activeTestSpan.setTag(TEST_RETRY_REASON, TEST_RETRY_REASON_TYPES.efd)
831
894
  }
832
895
  }
896
+ if (isModified) {
897
+ this.activeTestSpan.setTag(TEST_IS_MODIFIED, 'true')
898
+ if (isEfdRetry) {
899
+ this.activeTestSpan.setTag(TEST_IS_RETRY, 'true')
900
+ this.activeTestSpan.setTag(TEST_RETRY_REASON, TEST_RETRY_REASON_TYPES.efd)
901
+ }
902
+ }
833
903
  if (isAttemptToFix) {
834
904
  this.activeTestSpan.setTag(TEST_MANAGEMENT_IS_ATTEMPT_TO_FIX, 'true')
835
905
  if (testStatuses.length > 1) {
@@ -838,7 +908,7 @@ class CypressPlugin {
838
908
  }
839
909
  const isLastAttempt = testStatuses.length === this.testManagementAttemptToFixRetries + 1
840
910
  if (isLastAttempt) {
841
- if (testStatuses.some(status => status === 'fail')) {
911
+ if (testStatuses.includes('fail')) {
842
912
  this.activeTestSpan.setTag(TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED, 'false')
843
913
  }
844
914
  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
@@ -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