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
@@ -7,7 +7,9 @@ class GoogleCloudPubsubProducerPlugin extends ProducerPlugin {
7
7
  static get id () { return 'google-cloud-pubsub' }
8
8
  static get operation () { return 'request' }
9
9
 
10
- start ({ request, api, projectId }) {
10
+ bindStart (ctx) {
11
+ const { request, api, projectId } = ctx
12
+
11
13
  if (api !== 'publish') return
12
14
 
13
15
  const messages = request.messages || []
@@ -19,7 +21,7 @@ class GoogleCloudPubsubProducerPlugin extends ProducerPlugin {
19
21
  'pubsub.method': api, // TODO: remove
20
22
  'pubsub.topic': topic
21
23
  }
22
- })
24
+ }, ctx)
23
25
 
24
26
  for (const msg of messages) {
25
27
  if (!msg.attributes) {
@@ -33,6 +35,8 @@ class GoogleCloudPubsubProducerPlugin extends ProducerPlugin {
33
35
  DsmPathwayCodec.encode(dataStreamsContext, msg.attributes)
34
36
  }
35
37
  }
38
+
39
+ return ctx.currentStore
36
40
  }
37
41
  }
38
42
 
@@ -25,18 +25,18 @@ class GoogleCloudVertexAITracingPlugin extends TracingPlugin {
25
25
  bindStart (ctx) {
26
26
  const { instance, request, resource, stream } = ctx
27
27
 
28
- const tags = this.tagRequest(request, instance, stream)
29
-
30
28
  const span = this.startSpan('vertexai.request', {
31
29
  service: this.config.service,
32
30
  resource,
33
31
  kind: 'client',
34
32
  meta: {
35
- [MEASURED]: 1,
36
- ...tags
33
+ [MEASURED]: 1
37
34
  }
38
35
  }, false)
39
36
 
37
+ const tags = this.tagRequest(request, instance, stream, span)
38
+ span.addTags(tags)
39
+
40
40
  const store = storage('legacy').getStore() || {}
41
41
  ctx.currentStore = { ...store, span }
42
42
 
@@ -51,14 +51,23 @@ class GoogleCloudVertexAITracingPlugin extends TracingPlugin {
51
51
 
52
52
  const response = result?.response
53
53
  if (response) {
54
- const tags = this.tagResponse(response)
54
+ const tags = this.tagResponse(response, span)
55
55
  span.addTags(tags)
56
56
  }
57
57
 
58
58
  span.finish()
59
59
  }
60
60
 
61
- tagRequest (request, instance, stream) {
61
+ /**
62
+ * Generate the request tags.
63
+ *
64
+ * @param {Object} request
65
+ * @param {Object} instance
66
+ * @param {boolean} stream
67
+ * @param {Span} span
68
+ * @returns {Object}
69
+ */
70
+ tagRequest (request, instance, stream, span) {
62
71
  const model = extractModel(instance)
63
72
  const tags = {
64
73
  'vertexai.request.model': model
@@ -73,7 +82,7 @@ class GoogleCloudVertexAITracingPlugin extends TracingPlugin {
73
82
 
74
83
  const generationConfig = instance.generationConfig || {}
75
84
  for (const key of Object.keys(generationConfig)) {
76
- const transformedKey = key.replace(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase()
85
+ const transformedKey = key.replaceAll(/([a-z0-9])([A-Z])/g, '$1_$2').toLowerCase()
77
86
  tags[`vertexai.request.generation_config.${transformedKey}`] = JSON.stringify(generationConfig[key])
78
87
  }
79
88
 
@@ -81,7 +90,7 @@ class GoogleCloudVertexAITracingPlugin extends TracingPlugin {
81
90
  tags['vertexai.request.stream'] = true
82
91
  }
83
92
 
84
- if (!this.isPromptCompletionSampled()) return tags
93
+ if (!this.isPromptCompletionSampled(span)) return tags
85
94
 
86
95
  const systemInstructions = extractSystemInstructions(instance)
87
96
 
@@ -141,8 +150,16 @@ class GoogleCloudVertexAITracingPlugin extends TracingPlugin {
141
150
  }
142
151
  }
143
152
 
144
- tagResponse (response) {
153
+ /**
154
+ * Generate the response tags.
155
+ *
156
+ * @param {Object} response
157
+ * @param {Span} span
158
+ * @returns {Object}
159
+ */
160
+ tagResponse (response, span) {
145
161
  const tags = {}
162
+ const isSampled = this.isPromptCompletionSampled(span)
146
163
 
147
164
  const candidates = response.candidates
148
165
  for (const [candidateIdx, candidate] of candidates.entries()) {
@@ -154,7 +171,7 @@ class GoogleCloudVertexAITracingPlugin extends TracingPlugin {
154
171
  const role = candidateContent.role
155
172
  tags[`vertexai.response.candidates.${candidateIdx}.content.role`] = role
156
173
 
157
- if (!this.isPromptCompletionSampled()) continue
174
+ if (!isSampled) continue
158
175
 
159
176
  const parts = candidateContent.parts
160
177
  for (const [partIdx, part] of parts.entries()) {
@@ -70,12 +70,12 @@ function getSignature (document, operationName, operationType, calculate) {
70
70
  }
71
71
 
72
72
  return tools.defaultEngineReportingSignature(document, operationName)
73
- } catch (e) {
73
+ } catch {
74
74
  // safety net
75
75
  }
76
76
  }
77
77
 
78
- return [operationType, operationName].filter(val => val).join(' ')
78
+ return [operationType, operationName].filter(Boolean).join(' ')
79
79
  }
80
80
 
81
81
  module.exports = GraphQLExecutePlugin
@@ -27,12 +27,13 @@ class GraphQLPlugin extends CompositePlugin {
27
27
  // config validator helpers
28
28
 
29
29
  function validateConfig (config) {
30
- return Object.assign({}, config, {
30
+ return {
31
+ ...config,
31
32
  depth: getDepth(config),
32
33
  variables: getVariablesFilter(config),
33
34
  collapse: config.collapse === undefined || !!config.collapse,
34
35
  hooks: getHooks(config)
35
- })
36
+ }
36
37
  }
37
38
 
38
39
  function getDepth (config) {
@@ -47,7 +48,7 @@ function getDepth (config) {
47
48
  function getVariablesFilter (config) {
48
49
  if (typeof config.variables === 'function') {
49
50
  return config.variables
50
- } else if (config.variables instanceof Array) {
51
+ } else if (Array.isArray(config.variables)) {
51
52
  return variables => pick(variables, config.variables)
52
53
  } else if (config.hasOwnProperty('variables')) {
53
54
  log.error('Expected `variables` to be an array or function.')
@@ -55,11 +56,12 @@ function getVariablesFilter (config) {
55
56
  return null
56
57
  }
57
58
 
58
- function getHooks (config) {
59
- const noop = () => { }
60
- const execute = config.hooks?.execute || noop
61
- const parse = config.hooks?.parse || noop
62
- const validate = config.hooks?.validate || noop
59
+ const noop = () => {}
60
+
61
+ function getHooks ({ hooks }) {
62
+ const execute = hooks?.execute ?? noop
63
+ const parse = hooks?.parse ?? noop
64
+ const validate = hooks?.validate ?? noop
63
65
 
64
66
  return { execute, parse, validate }
65
67
  }
@@ -16,20 +16,21 @@ class GraphQLResolvePlugin extends TracingPlugin {
16
16
  const computedPathString = path.join('.')
17
17
 
18
18
  if (this.config.collapse) {
19
+ if (context.fields[computedPathString]) return
20
+
19
21
  if (!context[collapsedPathSym]) {
20
22
  context[collapsedPathSym] = {}
23
+ } else if (context[collapsedPathSym][computedPathString]) {
24
+ return
21
25
  }
22
26
 
23
- if (context.fields[computedPathString]) return
24
- if (context[collapsedPathSym][computedPathString]) return
25
-
26
27
  context[collapsedPathSym][computedPathString] = true
27
28
  }
28
29
 
29
30
  const document = context.source
30
31
  const fieldNode = info.fieldNodes.find(fieldNode => fieldNode.kind === 'Field')
31
32
  const loc = this.config.source && document && fieldNode && fieldNode.loc
32
- const source = loc && document.substring(loc.start, loc.end)
33
+ const source = loc && document.slice(loc.start, loc.end)
33
34
 
34
35
  const span = this.startSpan('graphql.resolve', {
35
36
  service: this.config.service,
@@ -47,10 +48,9 @@ class GraphQLResolvePlugin extends TracingPlugin {
47
48
  const variables = this.config.variables(info.variableValues)
48
49
 
49
50
  fieldNode.arguments
50
- .filter(arg => arg.value && arg.value.kind === 'Variable')
51
- .filter(arg => arg.value.name && variables[arg.value.name.value])
52
- .map(arg => arg.value.name.value)
53
- .forEach(name => {
51
+ .filter(arg => arg.value?.name && arg.value.kind === 'Variable' && variables[arg.value.name.value])
52
+ .forEach(arg => {
53
+ const name = arg.value.name.value
54
54
  span.setTag(`graphql.variables.${name}`, variables[name])
55
55
  })
56
56
  }
@@ -89,7 +89,12 @@ class GraphQLResolvePlugin extends TracingPlugin {
89
89
  // helpers
90
90
 
91
91
  function shouldInstrument (config, path) {
92
- const depth = path.filter(item => typeof item === 'string').length
92
+ let depth = 0
93
+ for (const item of path) {
94
+ if (typeof item === 'string') {
95
+ depth += 1
96
+ }
97
+ }
93
98
 
94
99
  return config.depth < 0 || config.depth >= depth
95
100
  }
@@ -122,10 +127,11 @@ function getResolverInfo (info, args) {
122
127
  let resolverInfo = null
123
128
  const resolverVars = {}
124
129
 
125
- if (args && Object.keys(args).length) {
130
+ if (args) {
126
131
  Object.assign(resolverVars, args)
127
132
  }
128
133
 
134
+ let hasResolvers = false
129
135
  const directives = info.fieldNodes?.[0]?.directives
130
136
  if (Array.isArray(directives)) {
131
137
  for (const directive of directives) {
@@ -134,13 +140,14 @@ function getResolverInfo (info, args) {
134
140
  argList[argument.name.value] = argument.value.value
135
141
  }
136
142
 
137
- if (Object.keys(argList).length) {
143
+ if (directive.arguments.length > 0) {
144
+ hasResolvers = true
138
145
  resolverVars[directive.name.value] = argList
139
146
  }
140
147
  }
141
148
  }
142
149
 
143
- if (Object.keys(resolverVars).length) {
150
+ if (hasResolvers || args && Object.keys(resolverVars).length) {
144
151
  resolverInfo = { [info.fieldName]: resolverVars }
145
152
  }
146
153
 
@@ -1,3 +1,4 @@
1
+ /* eslint-disable unicorn/no-abusive-eslint-disable */
1
2
  /* eslint-disable */
2
3
  // file mostly untouched from apollo-graphql
3
4
 
@@ -1,3 +1,4 @@
1
+ /* eslint-disable unicorn/no-abusive-eslint-disable */
1
2
  /* eslint-disable */
2
3
  // file mostly untouched from apollo-graphql
3
4
 
@@ -1,3 +1,4 @@
1
+ /* eslint-disable unicorn/no-abusive-eslint-disable */
1
2
  /* eslint-disable */
2
3
  // file mostly untouched from apollo-graphql
3
4
 
@@ -87,8 +87,8 @@ class GrpcClientPlugin extends ClientPlugin {
87
87
  // more are supported by the library
88
88
  // https://github.com/grpc/grpc/blob/v1.60.0/doc/naming.md
89
89
  const parts = peer.split(':')
90
- if (parts[parts.length - 1].match(/^\d+/)) {
91
- const port = parts[parts.length - 1]
90
+ if (/^\d+/.test(parts.at(-1))) {
91
+ const port = parts.at(-1)
92
92
  const ip = parts.slice(0, -1).join(':')
93
93
  span.setTag('network.destination.ip', ip)
94
94
  span.setTag('network.destination.port', port)
@@ -27,7 +27,7 @@ module.exports = {
27
27
  tags.service = service
28
28
  tags.package = pkg
29
29
  } else {
30
- tags.name = methodParts[methodParts.length - 1]
30
+ tags.name = methodParts.at(-1)
31
31
  }
32
32
 
33
33
  return tags
@@ -49,7 +49,7 @@ module.exports = {
49
49
  return config[filter]
50
50
  }
51
51
 
52
- if (config[filter] instanceof Array) {
52
+ if (Array.isArray(config[filter])) {
53
53
  return element => pick(element, config[filter])
54
54
  }
55
55
 
@@ -49,7 +49,7 @@ class HttpClientPlugin extends ClientPlugin {
49
49
  'out.host': hostname
50
50
  },
51
51
  metrics: {
52
- [CLIENT_PORT_KEY]: parseInt(options.port)
52
+ [CLIENT_PORT_KEY]: Number.parseInt(options.port)
53
53
  }
54
54
  }, false)
55
55
 
@@ -63,7 +63,7 @@ class HttpClientPlugin extends ClientPlugin {
63
63
  // Implemented due to aws-sdk issue where request signing is broken if we mutate the headers
64
64
  // Explained further in:
65
65
  // https://github.com/open-telemetry/opentelemetry-js-contrib/issues/1609#issuecomment-1826167348
66
- options.headers = Object.assign({}, options.headers)
66
+ options.headers = { ...options.headers }
67
67
  this.tracer.inject(span, HTTP_HEADERS, options.headers)
68
68
  }
69
69
 
@@ -173,13 +173,14 @@ function normalizeClientConfig (config) {
173
173
  const headers = getHeaders(config)
174
174
  const hooks = getHooks(config)
175
175
 
176
- return Object.assign({}, config, {
176
+ return {
177
+ ...config,
177
178
  validateStatus,
178
179
  filter,
179
180
  propagationFilter,
180
181
  headers,
181
182
  hooks
182
- })
183
+ }
183
184
  }
184
185
 
185
186
  function getStatusValidator (config) {
@@ -192,9 +193,7 @@ function getStatusValidator (config) {
192
193
  }
193
194
 
194
195
  function getFilter (config) {
195
- config = Object.assign({}, config, {
196
- blocklist: config.blocklist || []
197
- })
196
+ config = { ...config, blocklist: config.blocklist || [] }
198
197
 
199
198
  return urlFilter.getFilter(config)
200
199
  }
@@ -202,15 +201,26 @@ function getFilter (config) {
202
201
  function getHeaders (config) {
203
202
  if (!Array.isArray(config.headers)) return []
204
203
 
205
- return config.headers
206
- .filter(key => typeof key === 'string')
207
- .map(h => h.split(':'))
208
- .map(([key, tag]) => [key.toLowerCase(), tag])
204
+ const result = []
205
+ for (const header of config.headers) {
206
+ if (typeof header === 'string') {
207
+ const separatorIndex = header.indexOf(':')
208
+ result.push(separatorIndex === -1
209
+ ? [header, undefined]
210
+ : [
211
+ header.slice(0, separatorIndex).toLowerCase(),
212
+ header.slice(separatorIndex + 1)
213
+ ]
214
+ )
215
+ }
216
+ }
217
+ return result
209
218
  }
210
219
 
220
+ const noop = () => {}
221
+
211
222
  function getHooks (config) {
212
- const noop = () => {}
213
- const request = (config.hooks && config.hooks.request) || noop
223
+ const request = config.hooks?.request ?? noop
214
224
 
215
225
  return { request }
216
226
  }
@@ -51,7 +51,7 @@ class Http2ClientPlugin extends ClientPlugin {
51
51
  'out.host': sessionDetails.host
52
52
  },
53
53
  metrics: {
54
- [CLIENT_PORT_KEY]: parseInt(sessionDetails.port)
54
+ [CLIENT_PORT_KEY]: Number.parseInt(sessionDetails.port)
55
55
  }
56
56
  }, false)
57
57
 
@@ -124,9 +124,9 @@ function extractSessionDetails (authority, options) {
124
124
  }
125
125
 
126
126
  const protocol = authority.protocol || options.protocol || 'https:'
127
- let port = '' + (authority.port !== ''
128
- ? authority.port
129
- : (authority.protocol === 'http:' ? 80 : 443))
127
+ let port = authority.port === ''
128
+ ? authority.protocol === 'http:' ? '80' : '443'
129
+ : String(authority.port)
130
130
  let host = authority.hostname || authority.host || 'localhost'
131
131
 
132
132
  if (protocol === 'https:' && options) {
@@ -138,26 +138,26 @@ function extractSessionDetails (authority, options) {
138
138
  }
139
139
 
140
140
  function hasAmazonSignature (headers, path) {
141
- if (headers) {
142
- headers = Object.keys(headers)
143
- .reduce((prev, next) => Object.assign(prev, {
144
- [next.toLowerCase()]: headers[next]
145
- }), {})
146
-
147
- if (headers['x-amz-signature']) {
148
- return true
149
- }
141
+ if (path?.toLowerCase().includes('x-amz-signature=')) {
142
+ return true
143
+ }
150
144
 
151
- if ([].concat(headers.authorization).some(startsWith('AWS4-HMAC-SHA256'))) {
152
- return true
145
+ if (headers) {
146
+ for (const [key, value] of Object.entries(headers)) {
147
+ const lowerCaseKey = key.toLowerCase()
148
+ if (lowerCaseKey === 'x-amz-signature' && value) {
149
+ return true
150
+ }
151
+ if (lowerCaseKey === 'authorization' && value) {
152
+ const authorization = Array.isArray(value) ? value : [value]
153
+ if (authorization.some((val) => val.startsWith('AWS4-HMAC-SHA256'))) {
154
+ return true
155
+ }
156
+ }
153
157
  }
154
158
  }
155
159
 
156
- return path && path.toLowerCase().indexOf('x-amz-signature=') !== -1
157
- }
158
-
159
- function startsWith (searchString) {
160
- return value => String(value).startsWith(searchString)
160
+ return false
161
161
  }
162
162
 
163
163
  function getStatusValidator (config) {
@@ -174,17 +174,16 @@ function normalizeConfig (config) {
174
174
  const filter = getFilter(config)
175
175
  const headers = getHeaders(config)
176
176
 
177
- return Object.assign({}, config, {
177
+ return {
178
+ ...config,
178
179
  validateStatus,
179
180
  filter,
180
181
  headers
181
- })
182
+ }
182
183
  }
183
184
 
184
185
  function getFilter (config) {
185
- config = Object.assign({}, config, {
186
- blocklist: config.blocklist || []
187
- })
186
+ config = { ...config, blocklist: config.blocklist || [] }
188
187
 
189
188
  return urlFilter.getFilter(config)
190
189
  }
@@ -1,5 +1,6 @@
1
1
  const CiPlugin = require('../../dd-trace/src/plugins/ci_plugin')
2
2
  const { storage } = require('../../datadog-core')
3
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
3
4
 
4
5
  const {
5
6
  TEST_STATUS,
@@ -31,7 +32,8 @@ const {
31
32
  TEST_MANAGEMENT_IS_ATTEMPT_TO_FIX,
32
33
  TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
33
34
  TEST_HAS_FAILED_ALL_RETRIES,
34
- TEST_RETRY_REASON_TYPES
35
+ TEST_RETRY_REASON_TYPES,
36
+ TEST_IS_MODIFIED
35
37
  } = require('../../dd-trace/src/plugins/util/test')
36
38
  const { COMPONENT } = require('../../dd-trace/src/constants')
37
39
  const id = require('../../dd-trace/src/id')
@@ -47,7 +49,7 @@ const {
47
49
  TELEMETRY_TEST_SESSION
48
50
  } = require('../../dd-trace/src/ci-visibility/telemetry')
49
51
 
50
- const isJestWorker = !!process.env.JEST_WORKER_ID
52
+ const isJestWorker = !!getEnvironmentVariable('JEST_WORKER_ID')
51
53
 
52
54
  // https://github.com/facebook/jest/blob/d6ad15b0f88a05816c2fe034dd6900d28315d570/packages/jest-worker/src/types.ts#L38
53
55
  const CHILD_MESSAGE_END = 2
@@ -157,7 +159,7 @@ class JestPlugin extends CiPlugin {
157
159
 
158
160
  this.telemetry.count(TELEMETRY_TEST_SESSION, {
159
161
  provider: this.ciProviderName,
160
- autoInjected: !!process.env.DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER
162
+ autoInjected: !!getEnvironmentVariable('DD_CIVISIBILITY_AUTO_INSTRUMENTATION_PROVIDER')
161
163
  })
162
164
 
163
165
  this.tracer._exporter.flush(() => {
@@ -185,6 +187,7 @@ class JestPlugin extends CiPlugin {
185
187
  config._ddFlakyTestRetriesCount = this.libraryConfig?.flakyTestRetriesCount
186
188
  config._ddIsDiEnabled = this.libraryConfig?.isDiEnabled ?? false
187
189
  config._ddIsKnownTestsEnabled = this.libraryConfig?.isKnownTestsEnabled ?? false
190
+ config._ddIsImpactedTestsEnabled = this.libraryConfig?.isImpactedTestsEnabled ?? false
188
191
  })
189
192
  })
190
193
 
@@ -393,16 +396,14 @@ class JestPlugin extends CiPlugin {
393
396
  })
394
397
 
395
398
  this.addSub('ci:jest:test:err', ({ span, error, shouldSetProbe, promises }) => {
396
- if (error) {
397
- if (span) {
398
- span.setTag(TEST_STATUS, 'fail')
399
- span.setTag('error', getFormattedError(error, this.repositoryRoot))
400
- if (shouldSetProbe) {
401
- const probeInformation = this.addDiProbe(error)
402
- if (probeInformation) {
403
- const { setProbePromise } = probeInformation
404
- promises.isProbeReady = withTimeout(setProbePromise, 2000)
405
- }
399
+ if (error && span) {
400
+ span.setTag(TEST_STATUS, 'fail')
401
+ span.setTag('error', getFormattedError(error, this.repositoryRoot))
402
+ if (shouldSetProbe) {
403
+ const probeInformation = this.addDiProbe(error)
404
+ if (probeInformation) {
405
+ const { setProbePromise } = probeInformation
406
+ promises.isProbeReady = withTimeout(setProbePromise, 2000)
406
407
  }
407
408
  }
408
409
  }
@@ -438,7 +439,8 @@ class JestPlugin extends CiPlugin {
438
439
  isAttemptToFixRetry,
439
440
  isJestRetry,
440
441
  isDisabled,
441
- isQuarantined
442
+ isQuarantined,
443
+ isModified
442
444
  } = test
443
445
 
444
446
  const extraTags = {
@@ -463,6 +465,12 @@ class JestPlugin extends CiPlugin {
463
465
  if (isAttemptToFixRetry) {
464
466
  extraTags[TEST_IS_RETRY] = 'true'
465
467
  extraTags[TEST_RETRY_REASON] = TEST_RETRY_REASON_TYPES.atf
468
+ } else if (isEfdRetry) {
469
+ extraTags[TEST_IS_RETRY] = 'true'
470
+ extraTags[TEST_RETRY_REASON] = TEST_RETRY_REASON_TYPES.efd
471
+ } else if (isJestRetry) {
472
+ extraTags[TEST_IS_RETRY] = 'true'
473
+ extraTags[TEST_RETRY_REASON] = TEST_RETRY_REASON_TYPES.ext
466
474
  }
467
475
 
468
476
  if (isDisabled) {
@@ -473,17 +481,12 @@ class JestPlugin extends CiPlugin {
473
481
  extraTags[TEST_MANAGEMENT_IS_QUARANTINED] = 'true'
474
482
  }
475
483
 
476
- if (isNew) {
477
- extraTags[TEST_IS_NEW] = 'true'
478
- if (isEfdRetry) {
479
- extraTags[TEST_IS_RETRY] = 'true'
480
- extraTags[TEST_RETRY_REASON] = TEST_RETRY_REASON_TYPES.efd
481
- }
484
+ if (isModified) {
485
+ extraTags[TEST_IS_MODIFIED] = 'true'
482
486
  }
483
487
 
484
- if (isJestRetry) {
485
- extraTags[TEST_IS_RETRY] = 'true'
486
- extraTags[TEST_RETRY_REASON] = TEST_RETRY_REASON_TYPES.ext
488
+ if (isNew) {
489
+ extraTags[TEST_IS_NEW] = 'true'
487
490
  }
488
491
 
489
492
  return super.startTestSpan(name, suite, this.testSuiteSpan, extraTags)
@@ -25,15 +25,15 @@ function getFormattedJestTestParameters (testParameters) {
25
25
  // Way 2.
26
26
  const parameterKeys = parameterArray[0].split('|').map(key => key.trim())
27
27
  const formattedParameters = []
28
+ let lastFormattedParameter = {}
28
29
  for (let index = 0; index < parameterValues.length; index++) {
29
- const parameterValue = parameterValues[index]
30
30
  const parameterIndex = index % parameterKeys.length
31
- if (!parameterIndex) {
32
- formattedParameters.push({})
31
+ if (parameterIndex === 0) {
32
+ lastFormattedParameter = {}
33
+ formattedParameters.push(lastFormattedParameter)
33
34
  }
34
- const parameterKey = parameterKeys[parameterIndex]
35
- const lastFormattedParameter = formattedParameters[formattedParameters.length - 1]
36
- lastFormattedParameter[parameterKey] = parameterValue
35
+ const key = parameterKeys[parameterIndex]
36
+ lastFormattedParameter[key] = parameterValues[index]
37
37
  }
38
38
 
39
39
  return formattedParameters
@@ -57,7 +57,7 @@ function isMarkedAsUnskippable (test) {
57
57
  try {
58
58
  const testSource = readFileSync(test.path, 'utf8')
59
59
  docblocks = parse(extract(testSource))
60
- } catch (e) {
60
+ } catch {
61
61
  // If we have issues parsing the file, we'll assume no unskippable was passed
62
62
  return false
63
63
  }
@@ -69,7 +69,7 @@ function isMarkedAsUnskippable (test) {
69
69
 
70
70
  try {
71
71
  return JSON.parse(docblocks.datadog).unskippable
72
- } catch (e) {
72
+ } catch {
73
73
  // If the @datadog block comment is present but malformed, we'll run the suite
74
74
  log.warn('@datadog block comment is malformed.')
75
75
  return true
@@ -6,7 +6,9 @@ class KafkajsBatchConsumerPlugin extends ConsumerPlugin {
6
6
  static get id () { return 'kafkajs' }
7
7
  static get operation () { return 'consume-batch' }
8
8
 
9
- start ({ topic, partition, messages, groupId, clusterId }) {
9
+ start (ctx) {
10
+ const { topic, messages, groupId, clusterId } = ctx.extractedArgs || ctx
11
+
10
12
  if (!this.config.dsmEnabled) return
11
13
  for (const message of messages) {
12
14
  if (!message || !message.headers) continue