dd-trace 5.53.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 (319) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/index.d.ts +33 -16
  3. package/initialize.mjs +3 -4
  4. package/package.json +36 -34
  5. package/packages/datadog-core/src/utils/src/get.js +1 -1
  6. package/packages/datadog-core/src/utils/src/has.js +1 -1
  7. package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
  8. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  9. package/packages/datadog-core/src/utils/src/pick.js +2 -2
  10. package/packages/datadog-core/src/utils/src/set.js +1 -1
  11. package/packages/datadog-core/src/utils/src/uniq.js +1 -1
  12. package/packages/datadog-instrumentations/src/amqp10.js +19 -17
  13. package/packages/datadog-instrumentations/src/amqplib.js +52 -35
  14. package/packages/datadog-instrumentations/src/apollo.js +2 -2
  15. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  16. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -4
  17. package/packages/datadog-instrumentations/src/child_process.js +1 -2
  18. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +88 -73
  19. package/packages/datadog-instrumentations/src/couchbase.js +3 -3
  20. package/packages/datadog-instrumentations/src/cucumber.js +87 -40
  21. package/packages/datadog-instrumentations/src/cypress.js +2 -1
  22. package/packages/datadog-instrumentations/src/dns.js +1 -1
  23. package/packages/datadog-instrumentations/src/fs.js +1 -1
  24. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +28 -34
  25. package/packages/datadog-instrumentations/src/graphql.js +7 -10
  26. package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
  27. package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
  28. package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
  29. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
  30. package/packages/datadog-instrumentations/src/helpers/hooks.js +0 -1
  31. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
  32. package/packages/datadog-instrumentations/src/helpers/register.js +5 -7
  33. package/packages/datadog-instrumentations/src/http/client.js +14 -20
  34. package/packages/datadog-instrumentations/src/jest.js +137 -48
  35. package/packages/datadog-instrumentations/src/kafkajs.js +52 -44
  36. package/packages/datadog-instrumentations/src/knex.js +4 -4
  37. package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
  38. package/packages/datadog-instrumentations/src/mariadb.js +38 -61
  39. package/packages/datadog-instrumentations/src/mocha/main.js +63 -24
  40. package/packages/datadog-instrumentations/src/mocha/utils.js +36 -12
  41. package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
  42. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  43. package/packages/datadog-instrumentations/src/mysql.js +20 -36
  44. package/packages/datadog-instrumentations/src/mysql2.js +53 -47
  45. package/packages/datadog-instrumentations/src/net.js +1 -1
  46. package/packages/datadog-instrumentations/src/next.js +1 -0
  47. package/packages/datadog-instrumentations/src/nyc.js +1 -1
  48. package/packages/datadog-instrumentations/src/openai.js +21 -23
  49. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  50. package/packages/datadog-instrumentations/src/pg.js +1 -2
  51. package/packages/datadog-instrumentations/src/playwright.js +112 -69
  52. package/packages/datadog-instrumentations/src/redis.js +3 -3
  53. package/packages/datadog-instrumentations/src/restify.js +2 -2
  54. package/packages/datadog-instrumentations/src/rhea.js +42 -54
  55. package/packages/datadog-instrumentations/src/router.js +22 -25
  56. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  57. package/packages/datadog-instrumentations/src/vitest.js +77 -28
  58. package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
  59. package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
  60. package/packages/datadog-plugin-amqplib/src/client.js +6 -2
  61. package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
  62. package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
  63. package/packages/datadog-plugin-amqplib/src/util.js +1 -1
  64. package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
  65. package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
  66. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -2
  67. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  68. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
  69. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +24 -31
  70. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  71. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +6 -6
  72. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
  73. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -1
  74. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +4 -5
  75. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  76. package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
  77. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  78. package/packages/datadog-plugin-child_process/src/index.js +4 -4
  79. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
  80. package/packages/datadog-plugin-cucumber/src/index.js +57 -2
  81. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +97 -27
  82. package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
  83. package/packages/datadog-plugin-cypress/src/support.js +24 -5
  84. package/packages/datadog-plugin-express/src/code_origin.js +30 -0
  85. package/packages/datadog-plugin-express/src/index.js +10 -12
  86. package/packages/datadog-plugin-express/src/tracing.js +19 -0
  87. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
  88. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
  89. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
  90. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +26 -9
  91. package/packages/datadog-plugin-graphql/src/execute.js +2 -2
  92. package/packages/datadog-plugin-graphql/src/index.js +7 -6
  93. package/packages/datadog-plugin-graphql/src/resolve.js +2 -2
  94. package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
  95. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
  96. package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
  97. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  98. package/packages/datadog-plugin-grpc/src/util.js +2 -2
  99. package/packages/datadog-plugin-http/src/client.js +18 -7
  100. package/packages/datadog-plugin-http2/src/client.js +20 -20
  101. package/packages/datadog-plugin-jest/src/index.js +23 -21
  102. package/packages/datadog-plugin-jest/src/util.js +8 -8
  103. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
  104. package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
  105. package/packages/datadog-plugin-kafkajs/src/producer.js +8 -3
  106. package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
  107. package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
  108. package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
  109. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
  110. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
  111. package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
  112. package/packages/datadog-plugin-mariadb/src/index.js +3 -9
  113. package/packages/datadog-plugin-mocha/src/index.js +33 -13
  114. package/packages/datadog-plugin-mongodb-core/src/index.js +1 -1
  115. package/packages/datadog-plugin-mysql/src/index.js +11 -9
  116. package/packages/datadog-plugin-mysql2/src/index.js +16 -0
  117. package/packages/datadog-plugin-net/src/tcp.js +1 -1
  118. package/packages/datadog-plugin-next/src/index.js +6 -5
  119. package/packages/datadog-plugin-openai/src/services.js +6 -10
  120. package/packages/datadog-plugin-openai/src/tracing.js +10 -14
  121. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  122. package/packages/datadog-plugin-playwright/src/index.js +22 -2
  123. package/packages/datadog-plugin-redis/src/index.js +1 -1
  124. package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
  125. package/packages/datadog-plugin-rhea/src/producer.js +5 -2
  126. package/packages/datadog-plugin-router/src/index.js +1 -1
  127. package/packages/datadog-plugin-selenium/src/index.js +1 -6
  128. package/packages/datadog-plugin-vitest/src/index.js +47 -31
  129. package/packages/datadog-shimmer/src/shimmer.js +4 -8
  130. package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
  131. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  132. package/packages/dd-trace/src/appsec/blocking.js +6 -20
  133. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +1 -1
  134. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +1 -1
  135. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +1 -1
  136. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +4 -6
  137. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
  138. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +4 -6
  139. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
  140. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
  141. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
  142. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
  143. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  144. package/packages/dd-trace/src/appsec/iast/index.js +1 -0
  145. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
  146. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
  147. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +6 -13
  148. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
  149. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
  150. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
  151. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
  152. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -7
  153. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
  154. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  155. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +5 -7
  156. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  157. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +6 -6
  158. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -1
  159. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  160. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
  161. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
  162. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -24
  163. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
  164. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
  165. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
  166. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
  167. package/packages/dd-trace/src/appsec/index.js +1 -1
  168. package/packages/dd-trace/src/appsec/rasp/index.js +15 -15
  169. package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
  170. package/packages/dd-trace/src/appsec/reporter.js +233 -40
  171. package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
  172. package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
  173. package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -5
  174. package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
  175. package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
  176. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +2 -2
  177. package/packages/dd-trace/src/azure_metadata.js +2 -7
  178. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +1 -1
  179. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
  180. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
  181. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
  182. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
  183. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
  184. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +1 -1
  185. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
  186. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +2 -2
  187. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
  188. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +1 -1
  189. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +1 -1
  190. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +8 -5
  191. package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
  192. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +1 -1
  193. package/packages/dd-trace/src/config.js +82 -51
  194. package/packages/dd-trace/src/config_stable.js +3 -3
  195. package/packages/dd-trace/src/datastreams/encoding.js +9 -9
  196. package/packages/dd-trace/src/datastreams/fnv.js +1 -1
  197. package/packages/dd-trace/src/datastreams/pathway.js +4 -4
  198. package/packages/dd-trace/src/datastreams/processor.js +5 -7
  199. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
  200. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
  201. package/packages/dd-trace/src/datastreams/size.js +1 -1
  202. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +74 -67
  203. package/packages/dd-trace/src/debugger/devtools_client/condition.js +6 -8
  204. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
  205. package/packages/dd-trace/src/debugger/devtools_client/index.js +7 -1
  206. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
  207. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +1 -1
  208. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +8 -10
  209. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +3 -3
  210. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
  211. package/packages/dd-trace/src/debugger/devtools_client/state.js +10 -3
  212. package/packages/dd-trace/src/dogstatsd.js +5 -4
  213. package/packages/dd-trace/src/encode/0.4.js +9 -9
  214. package/packages/dd-trace/src/encode/0.5.js +1 -1
  215. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +3 -3
  216. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  217. package/packages/dd-trace/src/encode/tags-processors.js +1 -1
  218. package/packages/dd-trace/src/exporter.js +6 -6
  219. package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
  220. package/packages/dd-trace/src/exporters/common/docker.js +1 -1
  221. package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
  222. package/packages/dd-trace/src/exporters/common/request.js +1 -1
  223. package/packages/dd-trace/src/exporters/common/util.js +1 -1
  224. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  225. package/packages/dd-trace/src/flare/file.js +1 -5
  226. package/packages/dd-trace/src/format.js +1 -1
  227. package/packages/dd-trace/src/git_properties.js +1 -1
  228. package/packages/dd-trace/src/id.js +12 -6
  229. package/packages/dd-trace/src/iitm.js +10 -22
  230. package/packages/dd-trace/src/lambda/handler.js +6 -6
  231. package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
  232. package/packages/dd-trace/src/lambda/runtime/ritm.js +1 -1
  233. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
  234. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
  235. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
  236. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
  237. package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -1
  238. package/packages/dd-trace/src/llmobs/sdk.js +2 -2
  239. package/packages/dd-trace/src/llmobs/tagger.js +110 -96
  240. package/packages/dd-trace/src/llmobs/util.js +9 -9
  241. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  242. package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
  243. package/packages/dd-trace/src/log/index.js +4 -4
  244. package/packages/dd-trace/src/log/log.js +1 -1
  245. package/packages/dd-trace/src/log/writer.js +2 -2
  246. package/packages/dd-trace/src/msgpack/chunk.js +3 -3
  247. package/packages/dd-trace/src/msgpack/encoder.js +28 -28
  248. package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
  249. package/packages/dd-trace/src/noop/span.js +3 -5
  250. package/packages/dd-trace/src/noop/tracer.js +1 -2
  251. package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
  252. package/packages/dd-trace/src/opentelemetry/tracer.js +6 -5
  253. package/packages/dd-trace/src/opentracing/propagation/log.js +6 -8
  254. package/packages/dd-trace/src/opentracing/propagation/text_map.js +27 -23
  255. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
  256. package/packages/dd-trace/src/opentracing/span.js +9 -14
  257. package/packages/dd-trace/src/opentracing/tracer.js +9 -6
  258. package/packages/dd-trace/src/payload-tagging/index.js +1 -1
  259. package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
  260. package/packages/dd-trace/src/pkg.js +1 -1
  261. package/packages/dd-trace/src/plugins/ci_plugin.js +62 -10
  262. package/packages/dd-trace/src/plugins/consumer.js +2 -2
  263. package/packages/dd-trace/src/plugins/inbound.js +5 -1
  264. package/packages/dd-trace/src/plugins/index.js +0 -1
  265. package/packages/dd-trace/src/plugins/outbound.js +4 -5
  266. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  267. package/packages/dd-trace/src/plugins/producer.js +2 -2
  268. package/packages/dd-trace/src/plugins/storage.js +2 -2
  269. package/packages/dd-trace/src/plugins/util/ci.js +23 -15
  270. package/packages/dd-trace/src/plugins/util/git.js +165 -11
  271. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
  272. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  273. package/packages/dd-trace/src/plugins/util/llm.js +27 -10
  274. package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
  275. package/packages/dd-trace/src/plugins/util/test.js +311 -48
  276. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  277. package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
  278. package/packages/dd-trace/src/plugins/util/user-provided-git.js +12 -3
  279. package/packages/dd-trace/src/plugins/util/web.js +5 -4
  280. package/packages/dd-trace/src/priority_sampler.js +22 -22
  281. package/packages/dd-trace/src/profiling/config.js +44 -8
  282. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +5 -5
  283. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  284. package/packages/dd-trace/src/profiling/profiler.js +37 -2
  285. package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
  286. package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
  287. package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
  288. package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
  289. package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
  290. package/packages/dd-trace/src/profiling/tagger.js +3 -5
  291. package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
  292. package/packages/dd-trace/src/proxy.js +7 -9
  293. package/packages/dd-trace/src/random_sampler.js +40 -0
  294. package/packages/dd-trace/src/rate_limiter.js +4 -4
  295. package/packages/dd-trace/src/remote_config/index.js +3 -7
  296. package/packages/dd-trace/src/remote_config/manager.js +25 -13
  297. package/packages/dd-trace/src/require-package-json.js +1 -1
  298. package/packages/dd-trace/src/ritm.js +4 -4
  299. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +2 -2
  300. package/packages/dd-trace/src/sampler.js +33 -4
  301. package/packages/dd-trace/src/sampling_rule.js +12 -3
  302. package/packages/dd-trace/src/scope.js +1 -1
  303. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  304. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
  305. package/packages/dd-trace/src/span_processor.js +3 -3
  306. package/packages/dd-trace/src/span_sampler.js +4 -1
  307. package/packages/dd-trace/src/standalone/tracesource.js +1 -1
  308. package/packages/dd-trace/src/startup-log.js +2 -2
  309. package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
  310. package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
  311. package/packages/dd-trace/src/telemetry/metrics.js +10 -5
  312. package/packages/dd-trace/src/telemetry/send-data.js +1 -1
  313. package/packages/dd-trace/src/telemetry/telemetry.js +23 -24
  314. package/packages/dd-trace/src/util.js +1 -1
  315. package/version.js +1 -0
  316. package/packages/datadog-instrumentations/src/paperplane.js +0 -77
  317. package/packages/datadog-plugin-paperplane/src/index.js +0 -25
  318. package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
  319. package/packages/datadog-plugin-paperplane/src/server.js +0 -24
@@ -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) {
@@ -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
 
@@ -393,16 +395,14 @@ class JestPlugin extends CiPlugin {
393
395
  })
394
396
 
395
397
  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
- }
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)
406
406
  }
407
407
  }
408
408
  }
@@ -438,7 +438,8 @@ class JestPlugin extends CiPlugin {
438
438
  isAttemptToFixRetry,
439
439
  isJestRetry,
440
440
  isDisabled,
441
- isQuarantined
441
+ isQuarantined,
442
+ isModified
442
443
  } = test
443
444
 
444
445
  const extraTags = {
@@ -463,6 +464,12 @@ class JestPlugin extends CiPlugin {
463
464
  if (isAttemptToFixRetry) {
464
465
  extraTags[TEST_IS_RETRY] = 'true'
465
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
466
473
  }
467
474
 
468
475
  if (isDisabled) {
@@ -473,17 +480,12 @@ class JestPlugin extends CiPlugin {
473
480
  extraTags[TEST_MANAGEMENT_IS_QUARANTINED] = 'true'
474
481
  }
475
482
 
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
- }
483
+ if (isModified) {
484
+ extraTags[TEST_IS_MODIFIED] = 'true'
482
485
  }
483
486
 
484
- if (isJestRetry) {
485
- extraTags[TEST_IS_RETRY] = 'true'
486
- extraTags[TEST_RETRY_REASON] = TEST_RETRY_REASON_TYPES.ext
487
+ if (isNew) {
488
+ extraTags[TEST_IS_NEW] = 'true'
487
489
  }
488
490
 
489
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, disableHeaderInjection }) {
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,7 +82,7 @@ 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
  }
@@ -105,6 +108,8 @@ class KafkajsProducerPlugin extends ProducerPlugin {
105
108
  }
106
109
  }
107
110
  }
111
+
112
+ return ctx.currentStore
108
113
  }
109
114
  }
110
115
 
@@ -4,7 +4,7 @@ function convertToTextMap (bufferMap) {
4
4
  if (!bufferMap) return null
5
5
 
6
6
  // rdKafka returns an array of header maps
7
- if (bufferMap instanceof Array) {
7
+ if (Array.isArray(bufferMap)) {
8
8
  const headers = {}
9
9
  for (const headerMap of bufferMap) {
10
10
  for (const key of Object.keys(headerMap)) {
@@ -3,35 +3,35 @@
3
3
  const LangChainHandler = require('./default')
4
4
 
5
5
  class LangChainChainHandler extends LangChainHandler {
6
- getSpanStartTags (ctx) {
6
+ getSpanStartTags (ctx, provider, span) {
7
7
  const tags = {}
8
8
 
9
- if (!this.isPromptCompletionSampled()) return tags
9
+ if (!this.isPromptCompletionSampled(span)) return tags
10
10
 
11
11
  let inputs = ctx.args?.[0]
12
12
  inputs = Array.isArray(inputs) ? inputs : [inputs]
13
13
 
14
14
  for (const idx in inputs) {
15
15
  const input = inputs[idx]
16
- if (typeof input !== 'object') {
17
- tags[`langchain.request.inputs.${idx}`] = this.normalize(input)
18
- } else {
16
+ if (typeof input === 'object') {
19
17
  for (const [key, value] of Object.entries(input)) {
20
18
  // these are mappings to the python client names, ie lc_kwargs
21
19
  // only present on BaseMessage types
22
20
  if (key.includes('lc_')) continue
23
21
  tags[`langchain.request.inputs.${idx}.${key}`] = this.normalize(value)
24
22
  }
23
+ } else {
24
+ tags[`langchain.request.inputs.${idx}`] = this.normalize(input)
25
25
  }
26
26
  }
27
27
 
28
28
  return tags
29
29
  }
30
30
 
31
- getSpanEndTags (ctx) {
31
+ getSpanEndTags (ctx, span) {
32
32
  const tags = {}
33
33
 
34
- if (!this.isPromptCompletionSampled()) return tags
34
+ if (!this.isPromptCompletionSampled(span)) return tags
35
35
 
36
36
  let outputs = ctx.result
37
37
  outputs = Array.isArray(outputs) ? outputs : [outputs]
@@ -3,12 +3,12 @@
3
3
  const LangChainHandler = require('./default')
4
4
 
5
5
  class LangChainEmbeddingHandler extends LangChainHandler {
6
- getSpanStartTags (ctx) {
6
+ getSpanStartTags (ctx, provider, span) {
7
7
  const tags = {}
8
8
 
9
9
  const inputTexts = ctx.args?.[0]
10
10
 
11
- const sampled = this.isPromptCompletionSampled()
11
+ const sampled = this.isPromptCompletionSampled(span)
12
12
  if (typeof inputTexts === 'string') {
13
13
  // embed query
14
14
  if (sampled) {
@@ -5,7 +5,7 @@ const LangChainLanguageModelHandler = require('.')
5
5
  const COMPLETIONS = 'langchain.response.completions'
6
6
 
7
7
  class LangChainChatModelHandler extends LangChainLanguageModelHandler {
8
- getSpanStartTags (ctx, provider) {
8
+ getSpanStartTags (ctx, provider, span) {
9
9
  const tags = {}
10
10
 
11
11
  const inputs = ctx.args?.[0]
@@ -15,7 +15,7 @@ class LangChainChatModelHandler extends LangChainLanguageModelHandler {
15
15
 
16
16
  for (const messageIndex in messageSet) {
17
17
  const message = messageSet[messageIndex]
18
- if (this.isPromptCompletionSampled()) {
18
+ if (this.isPromptCompletionSampled(span)) {
19
19
  tags[`langchain.request.messages.${messageSetIndex}.${messageIndex}.content`] =
20
20
  this.normalize(message.content) || ''
21
21
  }
@@ -39,11 +39,13 @@ class LangChainChatModelHandler extends LangChainLanguageModelHandler {
39
39
  return tags
40
40
  }
41
41
 
42
- getSpanEndTags (ctx) {
42
+ getSpanEndTags (ctx, span) {
43
43
  const { result } = ctx
44
44
 
45
45
  const tags = {}
46
46
 
47
+ const sampled = this.isPromptCompletionSampled(span)
48
+
47
49
  this.extractTokenMetrics(ctx.currentStore?.span, result)
48
50
 
49
51
  for (const messageSetIdx in result?.generations) {
@@ -56,7 +58,7 @@ class LangChainChatModelHandler extends LangChainLanguageModelHandler {
56
58
  const message = chatCompletion.message
57
59
  let toolCalls = message.tool_calls
58
60
 
59
- if (text && this.isPromptCompletionSampled()) {
61
+ if (text && sampled) {
60
62
  tags[
61
63
  `${COMPLETIONS}.${messageSetIdx}.${chatCompletionIdx}.content`
62
64
  ] = this.normalize(text)
@@ -3,12 +3,12 @@
3
3
  const LangChainLanguageModelHandler = require('.')
4
4
 
5
5
  class LangChainLLMHandler extends LangChainLanguageModelHandler {
6
- getSpanStartTags (ctx, provider) {
6
+ getSpanStartTags (ctx, provider, span) {
7
7
  const tags = {}
8
8
 
9
9
  const prompts = ctx.args?.[0]
10
10
  for (const promptIdx in prompts) {
11
- if (!this.isPromptCompletionSampled()) continue
11
+ if (!this.isPromptCompletionSampled(span)) continue
12
12
 
13
13
  const prompt = prompts[promptIdx]
14
14
  tags[`langchain.request.prompts.${promptIdx}.content`] = this.normalize(prompt) || ''
@@ -30,16 +30,17 @@ class LangChainLLMHandler extends LangChainLanguageModelHandler {
30
30
  return tags
31
31
  }
32
32
 
33
- getSpanEndTags (ctx) {
33
+ getSpanEndTags (ctx, span) {
34
34
  const { result } = ctx
35
35
 
36
36
  const tags = {}
37
+ const sampled = this.isPromptCompletionSampled(span)
37
38
 
38
39
  this.extractTokenMetrics(ctx.currentStore?.span, result)
39
40
 
40
41
  for (const completionIdx in result?.generations) {
41
42
  const completion = result.generations[completionIdx]
42
- if (this.isPromptCompletionSampled()) {
43
+ if (sampled) {
43
44
  tags[`langchain.response.completions.${completionIdx}.text`] = this.normalize(completion[0].text) || ''
44
45
  }
45
46
 
@@ -49,23 +49,24 @@ class BaseLangChainTracingPlugin extends TracingPlugin {
49
49
  const provider = handler.extractProvider(instance)
50
50
  const model = handler.extractModel(instance)
51
51
 
52
- const tags = handler.getSpanStartTags(ctx, provider) || []
53
-
54
- if (apiKey) tags[API_KEY] = apiKey
55
- if (provider) tags[PROVIDER] = provider
56
- if (model) tags[MODEL] = model
57
- if (type) tags[TYPE] = type
58
-
59
52
  const span = this.startSpan('langchain.request', {
60
53
  service: this.config.service,
61
54
  resource,
62
55
  kind: 'client',
63
56
  meta: {
64
- [MEASURED]: 1,
65
- ...tags
57
+ [MEASURED]: 1
66
58
  }
67
59
  }, false)
68
60
 
61
+ const tags = handler.getSpanStartTags(ctx, provider, span) || []
62
+
63
+ if (apiKey) tags[API_KEY] = apiKey
64
+ if (provider) tags[PROVIDER] = provider
65
+ if (model) tags[MODEL] = model
66
+ if (type) tags[TYPE] = type
67
+
68
+ span.addTags(tags)
69
+
69
70
  const store = storage('legacy').getStore() || {}
70
71
  ctx.currentStore = { ...store, span }
71
72
 
@@ -78,7 +79,7 @@ class BaseLangChainTracingPlugin extends TracingPlugin {
78
79
  const { type } = ctx
79
80
 
80
81
  const handler = this.handlers[type]
81
- const tags = handler.getSpanEndTags(ctx) || {}
82
+ const tags = handler.getSpanEndTags(ctx, span) || {}
82
83
 
83
84
  span.addTags(tags)
84
85
 
@@ -3,8 +3,6 @@
3
3
  const { storage } = require('../../datadog-core')
4
4
  const MySQLPlugin = require('../../datadog-plugin-mysql/src')
5
5
 
6
- let skippedStore
7
-
8
6
  class MariadbPlugin extends MySQLPlugin {
9
7
  static get id () { return 'mariadb' }
10
8
  static get system () { return 'mariadb' }
@@ -12,14 +10,10 @@ class MariadbPlugin extends MySQLPlugin {
12
10
  constructor (...args) {
13
11
  super(...args)
14
12
 
15
- this.addSub(`apm:${this.component}:pool:skip`, () => {
16
- skippedStore = storage('legacy').getStore()
17
- storage('legacy').enterWith({ noop: true })
18
- })
13
+ this.addBind(`apm:${this.component}:pool:skip`, () => ({ noop: true }))
19
14
 
20
- this.addSub(`apm:${this.component}:pool:unskip`, () => {
21
- storage('legacy').enterWith(skippedStore)
22
- skippedStore = undefined
15
+ this.addSub(`apm:${this.component}:command:add`, ctx => {
16
+ ctx.parentStore = storage('legacy').getStore()
23
17
  })
24
18
  }
25
19
  }