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
@@ -7,7 +7,8 @@ class GoogleCloudPubsubConsumerPlugin extends ConsumerPlugin {
7
7
  static get id () { return 'google-cloud-pubsub' }
8
8
  static get operation () { return 'receive' }
9
9
 
10
- start ({ message }) {
10
+ bindStart (ctx) {
11
+ const { message } = ctx
11
12
  const subscription = message._subscriber._subscription
12
13
  const topic = subscription.metadata && subscription.metadata.topic
13
14
  const childOf = this.tracer.extract('text_map', message.attributes) || null
@@ -23,25 +24,29 @@ class GoogleCloudPubsubConsumerPlugin extends ConsumerPlugin {
23
24
  metrics: {
24
25
  'pubsub.ack': 0
25
26
  }
26
- })
27
+ }, ctx)
28
+
27
29
  if (this.config.dsmEnabled && message?.attributes) {
28
30
  const payloadSize = getMessageSize(message)
29
31
  this.tracer.decodeDataStreamsContext(message.attributes)
30
32
  this.tracer
31
33
  .setCheckpoint(['direction:in', `topic:${topic}`, 'type:google-pubsub'], span, payloadSize)
32
34
  }
33
- }
34
35
 
35
- finish (message) {
36
- const span = this.activeSpan
36
+ return ctx.currentStore
37
+ }
37
38
 
38
- if (!span) return
39
+ bindFinish (ctx) {
40
+ const { message } = ctx
41
+ const span = ctx.currentStore.span
39
42
 
40
- if (message.message._handled) {
43
+ if (message?._handled) {
41
44
  span.setTag('pubsub.ack', 1)
42
45
  }
43
46
 
44
47
  super.finish()
48
+
49
+ return ctx.parentStore
45
50
  }
46
51
  }
47
52
 
@@ -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
@@ -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
@@ -47,7 +47,7 @@ function getDepth (config) {
47
47
  function getVariablesFilter (config) {
48
48
  if (typeof config.variables === 'function') {
49
49
  return config.variables
50
- } else if (config.variables instanceof Array) {
50
+ } else if (Array.isArray(config.variables)) {
51
51
  return variables => pick(variables, config.variables)
52
52
  } else if (config.hasOwnProperty('variables')) {
53
53
  log.error('Expected `variables` to be an array or function.')
@@ -55,11 +55,12 @@ function getVariablesFilter (config) {
55
55
  return null
56
56
  }
57
57
 
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
58
+ const noop = () => {}
59
+
60
+ function getHooks ({ hooks }) {
61
+ const execute = hooks?.execute ?? noop
62
+ const parse = hooks?.parse ?? noop
63
+ const validate = hooks?.validate ?? noop
63
64
 
64
65
  return { execute, parse, validate }
65
66
  }
@@ -29,7 +29,7 @@ class GraphQLResolvePlugin extends TracingPlugin {
29
29
  const document = context.source
30
30
  const fieldNode = info.fieldNodes.find(fieldNode => fieldNode.kind === 'Field')
31
31
  const loc = this.config.source && document && fieldNode && fieldNode.loc
32
- const source = loc && document.substring(loc.start, loc.end)
32
+ const source = loc && document.slice(loc.start, loc.end)
33
33
 
34
34
  const span = this.startSpan('graphql.resolve', {
35
35
  service: this.config.service,
@@ -122,7 +122,7 @@ function getResolverInfo (info, args) {
122
122
  let resolverInfo = null
123
123
  const resolverVars = {}
124
124
 
125
- if (args && Object.keys(args).length) {
125
+ if (args) {
126
126
  Object.assign(resolverVars, args)
127
127
  }
128
128
 
@@ -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
 
@@ -202,15 +202,26 @@ function getFilter (config) {
202
202
  function getHeaders (config) {
203
203
  if (!Array.isArray(config.headers)) return []
204
204
 
205
- return config.headers
206
- .filter(key => typeof key === 'string')
207
- .map(h => h.split(':'))
208
- .map(([key, tag]) => [key.toLowerCase(), tag])
205
+ const result = []
206
+ for (const header of config.headers) {
207
+ if (typeof header === 'string') {
208
+ const separatorIndex = header.indexOf(':')
209
+ result.push(separatorIndex === -1
210
+ ? [header, undefined]
211
+ : [
212
+ header.slice(0, separatorIndex).toLowerCase(),
213
+ header.slice(separatorIndex + 1)
214
+ ]
215
+ )
216
+ }
217
+ }
218
+ return result
209
219
  }
210
220
 
221
+ const noop = () => {}
222
+
211
223
  function getHooks (config) {
212
- const noop = () => {}
213
- const request = (config.hooks && config.hooks.request) || noop
224
+ const request = config.hooks?.request ?? noop
214
225
 
215
226
  return { request }
216
227
  }
@@ -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
+ : 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) {
@@ -0,0 +1,18 @@
1
+ 'use strict'
2
+
3
+ const RedisPlugin = require('../../datadog-plugin-redis/src')
4
+
5
+ class IOValkeyPlugin extends RedisPlugin {
6
+ static get id () {
7
+ return 'iovalkey'
8
+ }
9
+
10
+ static get system () { return 'valkey' }
11
+
12
+ constructor (...args) {
13
+ super(...args)
14
+ this._spanType = 'valkey'
15
+ }
16
+ }
17
+
18
+ module.exports = IOValkeyPlugin
@@ -31,7 +31,8 @@ const {
31
31
  TEST_MANAGEMENT_IS_ATTEMPT_TO_FIX,
32
32
  TEST_MANAGEMENT_ATTEMPT_TO_FIX_PASSED,
33
33
  TEST_HAS_FAILED_ALL_RETRIES,
34
- TEST_RETRY_REASON_TYPES
34
+ TEST_RETRY_REASON_TYPES,
35
+ TEST_IS_MODIFIED
35
36
  } = require('../../dd-trace/src/plugins/util/test')
36
37
  const { COMPONENT } = require('../../dd-trace/src/constants')
37
38
  const id = require('../../dd-trace/src/id')
@@ -185,6 +186,7 @@ class JestPlugin extends CiPlugin {
185
186
  config._ddFlakyTestRetriesCount = this.libraryConfig?.flakyTestRetriesCount
186
187
  config._ddIsDiEnabled = this.libraryConfig?.isDiEnabled ?? false
187
188
  config._ddIsKnownTestsEnabled = this.libraryConfig?.isKnownTestsEnabled ?? false
189
+ config._ddIsImpactedTestsEnabled = this.libraryConfig?.isImpactedTestsEnabled ?? false
188
190
  })
189
191
  })
190
192
 
@@ -333,15 +335,24 @@ class JestPlugin extends CiPlugin {
333
335
  this.telemetry.distribution(TELEMETRY_CODE_COVERAGE_NUM_FILES, {}, files.length)
334
336
  })
335
337
 
336
- this.addSub('ci:jest:test:start', (test) => {
338
+ this.addBind('ci:jest:test:start', (ctx) => {
337
339
  const store = storage('legacy').getStore()
338
- const span = this.startTestSpan(test)
340
+ const span = this.startTestSpan(ctx)
341
+
342
+ ctx.parentStore = store
343
+ ctx.currentStore = { ...store, span }
339
344
 
340
- this.enter(span, store)
341
345
  this.activeTestSpan = span
346
+
347
+ return ctx.currentStore
348
+ })
349
+
350
+ this.addBind('ci:jest:test:fn', (ctx) => {
351
+ return ctx.currentStore
342
352
  })
343
353
 
344
354
  this.addSub('ci:jest:test:finish', ({
355
+ span,
345
356
  status,
346
357
  testStartLine,
347
358
  attemptToFixPassed,
@@ -349,7 +360,6 @@ class JestPlugin extends CiPlugin {
349
360
  attemptToFixFailed,
350
361
  isAtrRetry
351
362
  }) => {
352
- const span = storage('legacy').getStore().span
353
363
  span.setTag(TEST_STATUS, status)
354
364
  if (testStartLine) {
355
365
  span.setTag(TEST_SOURCE_START, testStartLine)
@@ -384,19 +394,15 @@ class JestPlugin extends CiPlugin {
384
394
  this.activeTestSpan = null
385
395
  })
386
396
 
387
- this.addSub('ci:jest:test:err', ({ error, shouldSetProbe, promises }) => {
388
- if (error) {
389
- const store = storage('legacy').getStore()
390
- if (store && store.span) {
391
- const span = store.span
392
- span.setTag(TEST_STATUS, 'fail')
393
- span.setTag('error', getFormattedError(error, this.repositoryRoot))
394
- if (shouldSetProbe) {
395
- const probeInformation = this.addDiProbe(error)
396
- if (probeInformation) {
397
- const { setProbePromise } = probeInformation
398
- promises.isProbeReady = withTimeout(setProbePromise, 2000)
399
- }
397
+ this.addSub('ci:jest:test:err', ({ span, error, shouldSetProbe, promises }) => {
398
+ if (error && span) {
399
+ span.setTag(TEST_STATUS, 'fail')
400
+ span.setTag('error', getFormattedError(error, this.repositoryRoot))
401
+ if (shouldSetProbe) {
402
+ const probeInformation = this.addDiProbe(error)
403
+ if (probeInformation) {
404
+ const { setProbePromise } = probeInformation
405
+ promises.isProbeReady = withTimeout(setProbePromise, 2000)
400
406
  }
401
407
  }
402
408
  }
@@ -432,7 +438,8 @@ class JestPlugin extends CiPlugin {
432
438
  isAttemptToFixRetry,
433
439
  isJestRetry,
434
440
  isDisabled,
435
- isQuarantined
441
+ isQuarantined,
442
+ isModified
436
443
  } = test
437
444
 
438
445
  const extraTags = {
@@ -457,6 +464,12 @@ class JestPlugin extends CiPlugin {
457
464
  if (isAttemptToFixRetry) {
458
465
  extraTags[TEST_IS_RETRY] = 'true'
459
466
  extraTags[TEST_RETRY_REASON] = TEST_RETRY_REASON_TYPES.atf
467
+ } else if (isEfdRetry) {
468
+ extraTags[TEST_IS_RETRY] = 'true'
469
+ extraTags[TEST_RETRY_REASON] = TEST_RETRY_REASON_TYPES.efd
470
+ } else if (isJestRetry) {
471
+ extraTags[TEST_IS_RETRY] = 'true'
472
+ extraTags[TEST_RETRY_REASON] = TEST_RETRY_REASON_TYPES.ext
460
473
  }
461
474
 
462
475
  if (isDisabled) {
@@ -467,17 +480,12 @@ class JestPlugin extends CiPlugin {
467
480
  extraTags[TEST_MANAGEMENT_IS_QUARANTINED] = 'true'
468
481
  }
469
482
 
470
- if (isNew) {
471
- extraTags[TEST_IS_NEW] = 'true'
472
- if (isEfdRetry) {
473
- extraTags[TEST_IS_RETRY] = 'true'
474
- extraTags[TEST_RETRY_REASON] = TEST_RETRY_REASON_TYPES.efd
475
- }
483
+ if (isModified) {
484
+ extraTags[TEST_IS_MODIFIED] = 'true'
476
485
  }
477
486
 
478
- if (isJestRetry) {
479
- extraTags[TEST_IS_RETRY] = 'true'
480
- extraTags[TEST_RETRY_REASON] = TEST_RETRY_REASON_TYPES.ext
487
+ if (isNew) {
488
+ extraTags[TEST_IS_NEW] = 'true'
481
489
  }
482
490
 
483
491
  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
@@ -64,7 +64,9 @@ class KafkajsConsumerPlugin extends ConsumerPlugin {
64
64
  }
65
65
  }
66
66
 
67
- start ({ topic, partition, message, groupId, clusterId }) {
67
+ bindStart (ctx) {
68
+ const { topic, partition, message, groupId, clusterId } = ctx.extractedArgs || ctx
69
+
68
70
  let childOf
69
71
  const headers = convertToTextMap(message?.headers)
70
72
  if (headers) {
@@ -83,7 +85,7 @@ class KafkajsConsumerPlugin extends ConsumerPlugin {
83
85
  metrics: {
84
86
  'kafka.partition': partition
85
87
  }
86
- })
88
+ }, ctx)
87
89
  if (message?.offset) span.setTag('kafka.message.offset', message?.offset)
88
90
 
89
91
  if (this.config.dsmEnabled && headers) {
@@ -97,16 +99,18 @@ class KafkajsConsumerPlugin extends ConsumerPlugin {
97
99
  }
98
100
 
99
101
  if (afterStartCh.hasSubscribers) {
100
- afterStartCh.publish({ topic, partition, message, groupId })
102
+ afterStartCh.publish({ topic, partition, message, groupId, currentStore: ctx.currentStore })
101
103
  }
104
+
105
+ return ctx.currentStore
102
106
  }
103
107
 
104
- finish () {
108
+ finish (ctx) {
105
109
  if (beforeFinishCh.hasSubscribers) {
106
110
  beforeFinishCh.publish()
107
111
  }
108
112
 
109
- super.finish()
113
+ super.finish(ctx)
110
114
  }
111
115
  }
112
116
 
@@ -52,7 +52,9 @@ class KafkajsProducerPlugin extends ProducerPlugin {
52
52
  * @param {ProducerResponseItem[]} commitList
53
53
  * @returns {void}
54
54
  */
55
- commit (commitList) {
55
+ commit (ctx) {
56
+ const commitList = ctx.result
57
+
56
58
  if (!this.config.dsmEnabled) return
57
59
  if (!commitList || !Array.isArray(commitList)) return
58
60
  const keys = [
@@ -67,7 +69,8 @@ class KafkajsProducerPlugin extends ProducerPlugin {
67
69
  }
68
70
  }
69
71
 
70
- start ({ topic, messages, bootstrapServers, clusterId }) {
72
+ bindStart (ctx) {
73
+ const { topic, messages, bootstrapServers, clusterId, disableHeaderInjection } = ctx
71
74
  const span = this.startSpan({
72
75
  resource: topic,
73
76
  meta: {
@@ -79,16 +82,17 @@ class KafkajsProducerPlugin extends ProducerPlugin {
79
82
  metrics: {
80
83
  'kafka.batch_size': messages.length
81
84
  }
82
- })
85
+ }, ctx)
83
86
  if (bootstrapServers) {
84
87
  span.setTag(BOOTSTRAP_SERVERS_KEY, bootstrapServers)
85
88
  }
86
89
  for (const message of messages) {
87
90
  if (message !== null && typeof message === 'object') {
88
- if (!message.headers) {
89
- message.headers = {}
91
+ // message headers are not supported for kafka broker versions <0.11
92
+ if (!disableHeaderInjection) {
93
+ message.headers ??= {}
94
+ this.tracer.inject(span, 'text_map', message.headers)
90
95
  }
91
- this.tracer.inject(span, 'text_map', message.headers)
92
96
  if (this.config.dsmEnabled) {
93
97
  const payloadSize = getMessageSize(message)
94
98
  const edgeTags = ['direction:out', `topic:${topic}`, 'type:kafka']
@@ -98,10 +102,14 @@ class KafkajsProducerPlugin extends ProducerPlugin {
98
102
  }
99
103
 
100
104
  const dataStreamsContext = this.tracer.setCheckpoint(edgeTags, span, payloadSize)
101
- DsmPathwayCodec.encode(dataStreamsContext, message.headers)
105
+ if (!disableHeaderInjection) {
106
+ DsmPathwayCodec.encode(dataStreamsContext, message.headers)
107
+ }
102
108
  }
103
109
  }
104
110
  }
111
+
112
+ return ctx.currentStore
105
113
  }
106
114
  }
107
115