dd-trace 6.15.0 → 6.17.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 (378) hide show
  1. package/README.md +15 -0
  2. package/ci/diagnose.js +0 -23
  3. package/ci/test-optimization-validation/approval-artifacts.js +0 -3
  4. package/ci/test-optimization-validation/approval.js +0 -6
  5. package/ci/test-optimization-validation/artifact-id.js +0 -1
  6. package/ci/test-optimization-validation/bounded-json.js +0 -1
  7. package/ci/test-optimization-validation/cli.js +0 -12
  8. package/ci/test-optimization-validation/command-output-policy.js +0 -1
  9. package/ci/test-optimization-validation/command-runner.js +0 -3
  10. package/ci/test-optimization-validation/environment.js +0 -4
  11. package/ci/test-optimization-validation/executable-approval.js +0 -1
  12. package/ci/test-optimization-validation/executable.js +0 -5
  13. package/ci/test-optimization-validation/framework-adapters/cucumber.js +4 -8
  14. package/ci/test-optimization-validation/framework-adapters/cypress.js +0 -3
  15. package/ci/test-optimization-validation/framework-adapters/playwright.js +0 -6
  16. package/ci/test-optimization-validation/framework-adapters/vitest.js +0 -4
  17. package/ci/test-optimization-validation/generated-test-contract.js +0 -5
  18. package/ci/test-optimization-validation/generated-verifier.js +0 -1
  19. package/ci/test-optimization-validation/literal-environment.js +0 -1
  20. package/ci/test-optimization-validation/manifest-scaffold.js +0 -17
  21. package/ci/test-optimization-validation/manifest-schema.js +0 -21
  22. package/ci/test-optimization-validation/offline-fixtures.js +0 -4
  23. package/ci/test-optimization-validation/package-check.js +4 -1
  24. package/ci/test-optimization-validation/plan-writer.js +0 -11
  25. package/ci/test-optimization-validation/preflight-runner.js +0 -1
  26. package/ci/test-optimization-validation/redaction.js +0 -4
  27. package/ci/test-optimization-validation/report-writer.js +0 -16
  28. package/ci/test-optimization-validation/runner-command.js +0 -3
  29. package/ci/test-optimization-validation/runner-contract.js +0 -4
  30. package/ci/test-optimization-validation/safe-files.js +0 -1
  31. package/ci/test-optimization-validation/scenarios/basic-reporting.js +0 -1
  32. package/ci/test-optimization-validation/scenarios/ci-wiring.js +1 -2
  33. package/ci/test-optimization-validation/source-text.js +0 -3
  34. package/ci/vitest-no-worker-init-setup.mjs +41 -16
  35. package/index.d.ts +169 -0
  36. package/next.d.ts +27 -0
  37. package/next.js +3 -0
  38. package/package.json +28 -23
  39. package/packages/datadog-esbuild/index.js +14 -1
  40. package/packages/datadog-esbuild/src/resolver.js +284 -0
  41. package/packages/datadog-esbuild/src/utils.js +162 -120
  42. package/packages/datadog-instrumentations/src/aerospike.js +28 -6
  43. package/packages/datadog-instrumentations/src/ai.js +39 -97
  44. package/packages/datadog-instrumentations/src/anthropic.js +76 -134
  45. package/packages/datadog-instrumentations/src/aws-durable-execution-sdk-js.js +1 -3
  46. package/packages/datadog-instrumentations/src/aws-sdk.js +0 -2
  47. package/packages/datadog-instrumentations/src/azure-cosmos.js +1 -1
  48. package/packages/datadog-instrumentations/src/azure-durable-functions.js +23 -9
  49. package/packages/datadog-instrumentations/src/azure-functions.js +48 -0
  50. package/packages/datadog-instrumentations/src/bullmq.js +1 -1
  51. package/packages/datadog-instrumentations/src/claude-agent-sdk.js +1 -3
  52. package/packages/datadog-instrumentations/src/console.js +97 -0
  53. package/packages/datadog-instrumentations/src/cucumber.js +72 -12
  54. package/packages/datadog-instrumentations/src/cypress-config.js +0 -23
  55. package/packages/datadog-instrumentations/src/dd-trace-api.js +2 -2
  56. package/packages/datadog-instrumentations/src/graphql.js +1 -1
  57. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +39 -14
  58. package/packages/datadog-instrumentations/src/helpers/channel.js +0 -2
  59. package/packages/datadog-instrumentations/src/helpers/graphql-jit-runtime.js +0 -5
  60. package/packages/datadog-instrumentations/src/helpers/hooks.js +8 -0
  61. package/packages/datadog-instrumentations/src/helpers/instrument.js +25 -8
  62. package/packages/datadog-instrumentations/src/helpers/instrumentation-utils.js +69 -0
  63. package/packages/datadog-instrumentations/src/helpers/pool-acquire.js +0 -6
  64. package/packages/datadog-instrumentations/src/helpers/register.js +13 -64
  65. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +109 -29
  66. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentation-registry.js +39 -0
  67. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/azure-durable-functions.js +17 -0
  68. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +3 -16
  69. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/playwright.js +12 -0
  70. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/postgres.js +36 -0
  71. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/supabase.js +128 -0
  72. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/webdriverio.js +6 -7
  73. package/packages/datadog-instrumentations/src/helpers/rewriter/targets.json +17 -0
  74. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms/postgres.js +388 -0
  75. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +99 -75
  76. package/packages/datadog-instrumentations/src/helpers/router-helper.js +0 -1
  77. package/packages/datadog-instrumentations/src/jest.js +141 -51
  78. package/packages/datadog-instrumentations/src/knex.js +0 -1
  79. package/packages/datadog-instrumentations/src/langchain.js +1 -1
  80. package/packages/datadog-instrumentations/src/langgraph.js +1 -1
  81. package/packages/datadog-instrumentations/src/mariadb-bundle.js +0 -24
  82. package/packages/datadog-instrumentations/src/mariadb.js +0 -2
  83. package/packages/datadog-instrumentations/src/mercurius.js +1 -1
  84. package/packages/datadog-instrumentations/src/mocha/common.js +0 -1
  85. package/packages/datadog-instrumentations/src/mocha/main.js +22 -25
  86. package/packages/datadog-instrumentations/src/mocha/utils.js +119 -49
  87. package/packages/datadog-instrumentations/src/mocha/webdriverio-protocol.js +0 -6
  88. package/packages/datadog-instrumentations/src/mocha/worker.js +14 -17
  89. package/packages/datadog-instrumentations/src/modelcontextprotocol-sdk.js +1 -1
  90. package/packages/datadog-instrumentations/src/mysql2.js +0 -2
  91. package/packages/datadog-instrumentations/src/openai-agents.js +1 -1
  92. package/packages/datadog-instrumentations/src/openai-realtime/audio-accumulator.js +241 -0
  93. package/packages/datadog-instrumentations/src/openai-realtime/events.js +76 -0
  94. package/packages/datadog-instrumentations/src/openai-realtime/index.js +301 -0
  95. package/packages/datadog-instrumentations/src/openai-realtime/session.js +998 -0
  96. package/packages/datadog-instrumentations/src/openai-realtime/turns.js +211 -0
  97. package/packages/datadog-instrumentations/src/openai.js +97 -80
  98. package/packages/datadog-instrumentations/src/oracledb.js +9 -3
  99. package/packages/datadog-instrumentations/src/playwright-reporter.js +3 -16
  100. package/packages/datadog-instrumentations/src/playwright.js +238 -55
  101. package/packages/datadog-instrumentations/src/postgres.js +7 -0
  102. package/packages/datadog-instrumentations/src/router.js +0 -2
  103. package/packages/datadog-instrumentations/src/rum-browser-scripts.js +0 -2
  104. package/packages/datadog-instrumentations/src/sequelize.js +0 -1
  105. package/packages/datadog-instrumentations/src/supabase.js +15 -0
  106. package/packages/datadog-instrumentations/src/vitest-main-no-worker-init.js +18 -18
  107. package/packages/datadog-instrumentations/src/vitest-main.js +37 -17
  108. package/packages/datadog-instrumentations/src/vitest-util.js +7 -1
  109. package/packages/datadog-instrumentations/src/vitest-worker.js +56 -23
  110. package/packages/datadog-instrumentations/src/webdriverio.js +23 -42
  111. package/packages/datadog-instrumentations/src/ws.js +0 -1
  112. package/packages/datadog-plugin-ai/src/utils.js +0 -2
  113. package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/trace-checkpoint.js +0 -1
  114. package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/util.js +0 -2
  115. package/packages/datadog-plugin-aws-sdk/src/base.js +0 -1
  116. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +7 -2
  117. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +0 -1
  118. package/packages/datadog-plugin-aws-sdk/src/util.js +0 -1
  119. package/packages/datadog-plugin-azure-cosmos/src/index.js +1 -1
  120. package/packages/datadog-plugin-azure-durable-functions/src/index.js +95 -1
  121. package/packages/datadog-plugin-cucumber/src/index.js +10 -0
  122. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +171 -75
  123. package/packages/datadog-plugin-cypress/src/finalization.js +0 -3
  124. package/packages/datadog-plugin-cypress/src/source-map-utils.js +0 -4
  125. package/packages/datadog-plugin-cypress/src/support.js +52 -7
  126. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +2 -24
  127. package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +2 -36
  128. package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-request-context.js +31 -0
  129. package/packages/datadog-plugin-graphql/src/resolve-error.js +32 -11
  130. package/packages/datadog-plugin-graphql/src/utils.js +0 -5
  131. package/packages/datadog-plugin-jest/src/index.js +13 -0
  132. package/packages/datadog-plugin-kafkajs/src/producer.js +0 -1
  133. package/packages/datadog-plugin-mocha/src/index.js +39 -11
  134. package/packages/datadog-plugin-mongodb-core/src/query.js +0 -1
  135. package/packages/datadog-plugin-openai/src/index.js +16 -1
  136. package/packages/datadog-plugin-openai/src/realtime.js +144 -0
  137. package/packages/datadog-plugin-openai-agents/src/integration.js +0 -4
  138. package/packages/datadog-plugin-openai-agents/src/util.js +0 -1
  139. package/packages/datadog-plugin-playwright/src/index.js +76 -9
  140. package/packages/datadog-plugin-postgres/src/index.js +167 -0
  141. package/packages/datadog-plugin-prisma/src/datadog-tracing-helper.js +0 -1
  142. package/packages/datadog-plugin-redis/src/index.js +15 -1
  143. package/packages/datadog-plugin-supabase/src/error.js +18 -0
  144. package/packages/datadog-plugin-supabase/src/index.js +21 -0
  145. package/packages/datadog-plugin-supabase/src/supabase-auth-js-gotrueclient-getuser.js +69 -0
  146. package/packages/datadog-plugin-supabase/src/supabase-functions-js-functionsclient-invoke.js +70 -0
  147. package/packages/datadog-plugin-supabase/src/supabase-postgrest-js-postgrestbuilder-then.js +122 -0
  148. package/packages/datadog-plugin-supabase/src/supabase-realtime-js-realtimechannel-send.js +66 -0
  149. package/packages/datadog-plugin-supabase/src/supabase-storage-js-handle-request.js +93 -0
  150. package/packages/datadog-plugin-supabase/src/url.js +17 -0
  151. package/packages/datadog-plugin-vitest/src/index.js +10 -0
  152. package/packages/datadog-plugin-ws/src/util.js +0 -4
  153. package/packages/datadog-turbopack/index.js +206 -0
  154. package/packages/datadog-turbopack/src/constants.js +5 -0
  155. package/packages/datadog-turbopack/src/loader.js +484 -0
  156. package/packages/datadog-webpack/src/loader.js +0 -1
  157. package/packages/dd-trace/src/aiguard/client.js +2 -3
  158. package/packages/dd-trace/src/aiguard/evaluation.js +6 -12
  159. package/packages/dd-trace/src/aiguard/index.js +3 -2
  160. package/packages/dd-trace/src/aiguard/integrations/anthropic.js +53 -25
  161. package/packages/dd-trace/src/aiguard/integrations/evaluate.js +49 -25
  162. package/packages/dd-trace/src/aiguard/integrations/index.js +4 -3
  163. package/packages/dd-trace/src/aiguard/integrations/openai.js +132 -29
  164. package/packages/dd-trace/src/aiguard/integrations/vercel-ai.js +116 -42
  165. package/packages/dd-trace/src/aiguard/messages/anthropic.js +0 -2
  166. package/packages/dd-trace/src/aiguard/messages/openai.js +64 -1
  167. package/packages/dd-trace/src/aiguard/messages/utils.js +29 -2
  168. package/packages/dd-trace/src/aiguard/messages/vercel-ai.js +25 -0
  169. package/packages/dd-trace/src/aiguard/redaction.js +0 -1
  170. package/packages/dd-trace/src/aiguard/sdk.js +1 -1
  171. package/packages/dd-trace/src/appsec/activation.js +1 -1
  172. package/packages/dd-trace/src/appsec/api_security/normalized-route.js +0 -5
  173. package/packages/dd-trace/src/appsec/api_security/sampler.js +0 -4
  174. package/packages/dd-trace/src/appsec/blocking/index.js +3 -3
  175. package/packages/dd-trace/src/appsec/downstream_requests.js +1 -4
  176. package/packages/dd-trace/src/appsec/iast/index.js +1 -1
  177. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +5 -5
  178. package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +1 -1
  179. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -1
  180. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +3 -3
  181. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +8 -10
  182. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/url-sensitive-analyzer.js +2 -2
  183. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +2 -2
  184. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +4 -1
  185. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +7 -7
  186. package/packages/dd-trace/src/appsec/index.js +2 -2
  187. package/packages/dd-trace/src/appsec/lambda.js +71 -2
  188. package/packages/dd-trace/src/appsec/rasp/utils.js +5 -1
  189. package/packages/dd-trace/src/appsec/remote_config.js +8 -6
  190. package/packages/dd-trace/src/appsec/reporter.js +10 -6
  191. package/packages/dd-trace/src/appsec/rule_manager.js +3 -3
  192. package/packages/dd-trace/src/appsec/sdk/track_event.js +0 -2
  193. package/packages/dd-trace/src/appsec/telemetry/api_security.js +1 -3
  194. package/packages/dd-trace/src/appsec/telemetry/common.js +4 -0
  195. package/packages/dd-trace/src/appsec/telemetry/index.js +23 -5
  196. package/packages/dd-trace/src/appsec/telemetry/rasp.js +1 -20
  197. package/packages/dd-trace/src/appsec/telemetry/user.js +1 -3
  198. package/packages/dd-trace/src/appsec/telemetry/waf.js +1 -20
  199. package/packages/dd-trace/src/appsec/waf/index.js +2 -2
  200. package/packages/dd-trace/src/appsec/waf/waf_manager.js +8 -5
  201. package/packages/dd-trace/src/carrier.js +0 -5
  202. package/packages/dd-trace/src/ci-visibility/dynamic-atr-retries.js +104 -0
  203. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +0 -2
  204. package/packages/dd-trace/src/ci-visibility/efd-retry-policy.js +34 -3
  205. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +0 -1
  206. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +0 -1
  207. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +0 -1
  208. package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/index.js +0 -4
  209. package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/msgpack-to-json.js +0 -1
  210. package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/sink.js +0 -2
  211. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +37 -15
  212. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +0 -3
  213. package/packages/dd-trace/src/ci-visibility/exporters/request.js +0 -11
  214. package/packages/dd-trace/src/ci-visibility/exporters/settings-cache-key.js +0 -1
  215. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +0 -1
  216. package/packages/dd-trace/src/ci-visibility/requests/fs-cache.js +0 -6
  217. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +2 -2
  218. package/packages/dd-trace/src/ci-visibility/requests/rate-limit.js +0 -1
  219. package/packages/dd-trace/src/ci-visibility/requests/upload-test-screenshot.js +0 -5
  220. package/packages/dd-trace/src/ci-visibility/requests/video-request.js +0 -1
  221. package/packages/dd-trace/src/ci-visibility/telemetry.js +13 -0
  222. package/packages/dd-trace/src/ci-visibility/test-optimization-cache.js +0 -1
  223. package/packages/dd-trace/src/ci-visibility/test-screenshot.js +0 -2
  224. package/packages/dd-trace/src/ci-visibility/test-video.js +0 -1
  225. package/packages/dd-trace/src/config/defaults.js +3 -2
  226. package/packages/dd-trace/src/config/generated-config-types.d.ts +74 -66
  227. package/packages/dd-trace/src/config/helper.js +9 -2
  228. package/packages/dd-trace/src/config/index.js +44 -29
  229. package/packages/dd-trace/src/config/parsers.js +34 -6
  230. package/packages/dd-trace/src/config/remote_config.js +25 -109
  231. package/packages/dd-trace/src/config/supported-configurations.json +146 -9
  232. package/packages/dd-trace/src/datastreams/encoding.js +0 -1
  233. package/packages/dd-trace/src/datastreams/pathway.js +0 -1
  234. package/packages/dd-trace/src/debugger/constants.js +10 -0
  235. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +76 -17
  236. package/packages/dd-trace/src/debugger/devtools_client/config.js +2 -0
  237. package/packages/dd-trace/src/debugger/devtools_client/guardrail-metrics.js +15 -0
  238. package/packages/dd-trace/src/debugger/devtools_client/index.js +103 -27
  239. package/packages/dd-trace/src/debugger/devtools_client/json-buffer.js +50 -7
  240. package/packages/dd-trace/src/debugger/devtools_client/log.js +3 -1
  241. package/packages/dd-trace/src/debugger/devtools_client/probe_sampler.js +34 -8
  242. package/packages/dd-trace/src/debugger/devtools_client/send.js +40 -14
  243. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +53 -13
  244. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +118 -71
  245. package/packages/dd-trace/src/debugger/devtools_client/snapshot-pruner.js +0 -3
  246. package/packages/dd-trace/src/debugger/devtools_client/status.js +20 -6
  247. package/packages/dd-trace/src/debugger/guardrail-metrics.js +167 -0
  248. package/packages/dd-trace/src/debugger/index.js +50 -2
  249. package/packages/dd-trace/src/debugger/inspect-segment.js +0 -3
  250. package/packages/dd-trace/src/debugger/probe_sampler.js +133 -9
  251. package/packages/dd-trace/src/debugger/probe_sampler_constants.js +31 -1
  252. package/packages/dd-trace/src/dogstatsd.js +0 -23
  253. package/packages/dd-trace/src/encode/0.4-cross-payload.js +0 -3
  254. package/packages/dd-trace/src/encode/0.4.js +0 -7
  255. package/packages/dd-trace/src/encode/0.5.js +0 -2
  256. package/packages/dd-trace/src/encode/tags-processors.js +0 -1
  257. package/packages/dd-trace/src/evp_proxy/discovery.js +3 -5
  258. package/packages/dd-trace/src/evp_proxy/path.js +11 -4
  259. package/packages/dd-trace/src/exporters/agent/writer.js +0 -1
  260. package/packages/dd-trace/src/exporters/agentless/index.js +0 -1
  261. package/packages/dd-trace/src/exporters/agentless/intake.js +0 -1
  262. package/packages/dd-trace/src/exporters/agentless/writer.js +0 -3
  263. package/packages/dd-trace/src/exporters/common/docker.js +4 -1
  264. package/packages/dd-trace/src/exporters/common/final-flush-request-tracker.js +0 -6
  265. package/packages/dd-trace/src/exporters/common/proxy.js +3 -0
  266. package/packages/dd-trace/src/exporters/common/request.js +1 -0
  267. package/packages/dd-trace/src/exporters/common/url.js +0 -2
  268. package/packages/dd-trace/src/exporters/common/writer.js +0 -2
  269. package/packages/dd-trace/src/id.js +0 -11
  270. package/packages/dd-trace/src/llmobs/audio-codec.js +192 -0
  271. package/packages/dd-trace/src/llmobs/audio-utils.js +121 -0
  272. package/packages/dd-trace/src/llmobs/constants/audio.js +35 -0
  273. package/packages/dd-trace/src/llmobs/constants/prompts.js +14 -0
  274. package/packages/dd-trace/src/llmobs/constants/tags.js +17 -0
  275. package/packages/dd-trace/src/llmobs/eval-metric.js +0 -6
  276. package/packages/dd-trace/src/llmobs/experiments/dataset.js +0 -4
  277. package/packages/dd-trace/src/llmobs/experiments/experiment.js +0 -3
  278. package/packages/dd-trace/src/llmobs/experiments/index.js +7 -6
  279. package/packages/dd-trace/src/llmobs/experiments/util.js +1 -11
  280. package/packages/dd-trace/src/llmobs/index.js +1 -3
  281. package/packages/dd-trace/src/llmobs/noop.js +10 -0
  282. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +0 -4
  283. package/packages/dd-trace/src/llmobs/plugins/anthropic/util.js +0 -1
  284. package/packages/dd-trace/src/llmobs/plugins/genai/util.js +0 -4
  285. package/packages/dd-trace/src/llmobs/plugins/modelcontextprotocol-sdk/utils.js +0 -2
  286. package/packages/dd-trace/src/llmobs/plugins/openai/constants.js +0 -2
  287. package/packages/dd-trace/src/llmobs/plugins/openai/index.js +4 -6
  288. package/packages/dd-trace/src/llmobs/plugins/openai/realtime.js +285 -0
  289. package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +16 -3
  290. package/packages/dd-trace/src/llmobs/prompts/cache.js +272 -0
  291. package/packages/dd-trace/src/llmobs/prompts/manager.js +639 -0
  292. package/packages/dd-trace/src/llmobs/prompts/noop.js +29 -0
  293. package/packages/dd-trace/src/llmobs/prompts/prompt.js +92 -0
  294. package/packages/dd-trace/src/llmobs/sdk.js +21 -6
  295. package/packages/dd-trace/src/llmobs/span_processor.js +81 -2
  296. package/packages/dd-trace/src/llmobs/tagger.js +30 -7
  297. package/packages/dd-trace/src/llmobs/telemetry.js +36 -4
  298. package/packages/dd-trace/src/llmobs/util.js +0 -34
  299. package/packages/dd-trace/src/llmobs/writers/base.js +0 -1
  300. package/packages/dd-trace/src/llmobs/writers/util.js +1 -2
  301. package/packages/dd-trace/src/log/channels.js +3 -0
  302. package/packages/dd-trace/src/log/index.js +23 -5
  303. package/packages/dd-trace/src/log-submission/log-submission-plugin.js +74 -6
  304. package/packages/dd-trace/src/msgpack/chunk.js +0 -1
  305. package/packages/dd-trace/src/openfeature/agentless_configuration_source.js +0 -12
  306. package/packages/dd-trace/src/openfeature/encoding.js +0 -2
  307. package/packages/dd-trace/src/openfeature/eval-metrics-hook.js +0 -1
  308. package/packages/dd-trace/src/openfeature/index.js +0 -4
  309. package/packages/dd-trace/src/openfeature/span-enrichment-hook.js +0 -1
  310. package/packages/dd-trace/src/openfeature/span-enrichment.js +0 -4
  311. package/packages/dd-trace/src/openfeature/writers/base.js +0 -6
  312. package/packages/dd-trace/src/openfeature/writers/exposures.js +0 -5
  313. package/packages/dd-trace/src/openfeature/writers/util.js +0 -4
  314. package/packages/dd-trace/src/opentelemetry/logs/logger.js +0 -1
  315. package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +0 -1
  316. package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +0 -1
  317. package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +0 -2
  318. package/packages/dd-trace/src/opentelemetry/metrics/index.js +1 -1
  319. package/packages/dd-trace/src/opentelemetry/metrics/meter_provider.js +4 -4
  320. package/packages/dd-trace/src/opentelemetry/metrics/otlp_span_stats_transformer.js +0 -1
  321. package/packages/dd-trace/src/opentelemetry/metrics/otlp_transformer.js +0 -1
  322. package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +103 -35
  323. package/packages/dd-trace/src/opentelemetry/metrics/time.js +0 -1
  324. package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +36 -13
  325. package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +0 -1
  326. package/packages/dd-trace/src/opentelemetry/span-helpers.js +0 -1
  327. package/packages/dd-trace/src/opentelemetry/trace/otlp_http_trace_exporter.js +0 -1
  328. package/packages/dd-trace/src/opentelemetry/trace/otlp_transformer.js +0 -3
  329. package/packages/dd-trace/src/opentracing/propagation/text_map.js +0 -6
  330. package/packages/dd-trace/src/opentracing/span_context.js +0 -1
  331. package/packages/dd-trace/src/otel-thread-ctx.js +38 -11
  332. package/packages/dd-trace/src/payload-tagging/tagging.js +15 -3
  333. package/packages/dd-trace/src/plugin_manager.js +9 -3
  334. package/packages/dd-trace/src/plugins/ci_plugin.js +0 -1
  335. package/packages/dd-trace/src/plugins/database.js +2 -6
  336. package/packages/dd-trace/src/plugins/index.js +8 -0
  337. package/packages/dd-trace/src/plugins/plugin.js +0 -4
  338. package/packages/dd-trace/src/plugins/tracing.js +1 -1
  339. package/packages/dd-trace/src/plugins/util/git.js +1 -3
  340. package/packages/dd-trace/src/plugins/util/http-otel-semantics.js +0 -1
  341. package/packages/dd-trace/src/plugins/util/llm.js +0 -2
  342. package/packages/dd-trace/src/plugins/util/status-validator.js +0 -1
  343. package/packages/dd-trace/src/plugins/util/test.js +25 -21
  344. package/packages/dd-trace/src/plugins/util/url.js +0 -5
  345. package/packages/dd-trace/src/priority_sampler.js +0 -6
  346. package/packages/dd-trace/src/process-tags/index.js +0 -1
  347. package/packages/dd-trace/src/profiler.js +132 -35
  348. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +0 -1
  349. package/packages/dd-trace/src/profiling/profiler.js +101 -41
  350. package/packages/dd-trace/src/profiling/ssi-heuristics.js +29 -15
  351. package/packages/dd-trace/src/propagation-hash/index.js +0 -1
  352. package/packages/dd-trace/src/proxy.js +21 -45
  353. package/packages/dd-trace/src/random_sampler.js +0 -4
  354. package/packages/dd-trace/src/rate_limiter.js +0 -4
  355. package/packages/dd-trace/src/remote_config/capabilities.js +1 -9
  356. package/packages/dd-trace/src/remote_config/index.js +0 -1
  357. package/packages/dd-trace/src/runtime_metrics/otlp_runtime_metrics.js +0 -3
  358. package/packages/dd-trace/src/sampler.js +0 -4
  359. package/packages/dd-trace/src/sampling_rule.js +0 -7
  360. package/packages/dd-trace/src/serverless/vercel.js +0 -1
  361. package/packages/dd-trace/src/serverless.js +0 -1
  362. package/packages/dd-trace/src/service-naming/index.js +0 -1
  363. package/packages/dd-trace/src/service-naming/schemas/util.js +0 -1
  364. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +7 -0
  365. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +5 -0
  366. package/packages/dd-trace/src/span_processor.js +2 -2
  367. package/packages/dd-trace/src/span_sampler.js +0 -1
  368. package/packages/dd-trace/src/standalone/product.js +2 -2
  369. package/packages/dd-trace/src/standalone/tracesource.js +0 -1
  370. package/packages/dd-trace/src/startup-log.js +1 -1
  371. package/packages/dd-trace/src/telemetry/endpoints.js +0 -8
  372. package/packages/dd-trace/src/telemetry/logs/index.js +16 -5
  373. package/packages/dd-trace/src/telemetry/logs/log-collector.js +16 -6
  374. package/packages/dd-trace/src/telemetry/metrics.js +0 -2
  375. package/packages/dd-trace/src/telemetry/telemetry.js +4 -1
  376. package/packages/dd-trace/src/util.js +13 -1
  377. package/vendor/dist/@datadog/openfeature-node-server/index.js +1 -1
  378. package/packages/dd-trace/src/llmobs/plugins/claude-agent-sdk/utils.js +0 -10
@@ -2,35 +2,37 @@
2
2
 
3
3
  const { channel } = require('dc-polyfill')
4
4
 
5
- const { buildOutputMessages, convertVercelPromptToMessages } = require('../messages/vercel-ai')
5
+ const {
6
+ buildOutputMessages,
7
+ convertVercelPromptToMessages,
8
+ getStreamedContent,
9
+ } = require('../messages/vercel-ai')
10
+ const { decode } = require('../messages/utils')
6
11
  const { SOURCE_AUTO } = require('../tags')
7
- const { pushEvaluation } = require('./evaluate')
12
+ const { evaluate } = require('./evaluate')
8
13
 
9
- const doGenerateBeforeChannel = channel('dd-trace:vercel-ai:doGenerate:before')
10
- const doGenerateAfterChannel = channel('dd-trace:vercel-ai:doGenerate:after')
11
- const doStreamBeforeChannel = channel('dd-trace:vercel-ai:doStream:before')
12
- const doStreamAfterChannel = channel('dd-trace:vercel-ai:doStream:after')
14
+ const modelInterceptChannel = channel('dd-trace:vercel-ai:model:intercept')
13
15
 
14
16
  let isEnabled = false
15
17
  let aiguard
16
18
  let opts
19
+ let analyzeStreamResponses
17
20
 
18
21
  /**
19
- * Subscribes AI Guard to Vercel AI lifecycle channels.
22
+ * Subscribes AI Guard to the Vercel AI model call channel.
20
23
  *
21
24
  * @param {object} aiguardInstance
22
25
  * @param {boolean} block
26
+ * @param {boolean} analyzeStreams
23
27
  */
24
- function enable (aiguardInstance, block) {
28
+ function enable (aiguardInstance, block, analyzeStreams) {
25
29
  if (isEnabled) return
26
30
 
27
31
  aiguard = aiguardInstance
28
32
  opts = { block, source: SOURCE_AUTO, integration: 'ai' }
33
+ analyzeStreamResponses = analyzeStreams
29
34
 
30
- doGenerateBeforeChannel.subscribe(onBefore)
31
- doGenerateAfterChannel.subscribe(onGenerateAfter)
32
- doStreamBeforeChannel.subscribe(onBefore)
33
- doStreamAfterChannel.subscribe(onStreamAfter)
35
+ modelInterceptChannel.subscribe(onModelIntercept)
34
36
 
35
37
  isEnabled = true
36
38
  }
@@ -38,54 +40,126 @@ function enable (aiguardInstance, block) {
38
40
  function disable () {
39
41
  if (!isEnabled) return
40
42
 
41
- doGenerateBeforeChannel.unsubscribe(onBefore)
42
- doGenerateAfterChannel.unsubscribe(onGenerateAfter)
43
- doStreamBeforeChannel.unsubscribe(onBefore)
44
- doStreamAfterChannel.unsubscribe(onStreamAfter)
43
+ modelInterceptChannel.unsubscribe(onModelIntercept)
45
44
 
46
45
  aiguard = undefined
47
46
  opts = undefined
47
+ analyzeStreamResponses = undefined
48
48
  isEnabled = false
49
49
  }
50
50
 
51
- function onBefore (ctx) {
52
- pushEvaluation(ctx, aiguard, convertVercelPromptToMessages(ctx.prompt), opts)
53
- }
51
+ function onModelIntercept (ctx) {
52
+ const inputMessages = convertVercelPromptToMessages(ctx.arguments?.[0]?.prompt)
53
+ if (!inputMessages.length) return
54
+
55
+ // Called exactly once per model call by the instrumentation, so no memoization needed.
56
+ ctx.beforeResult = () => {
57
+ if (!isEnabled) return
58
+ return evaluate(ctx, aiguard, [inputMessages], opts)
59
+ }
54
60
 
55
- function onGenerateAfter (ctx) {
56
- const inputMessages = convertVercelPromptToMessages(ctx.prompt)
57
- if (!inputMessages.length || !ctx.result?.content?.length) return
61
+ if (ctx.method === 'doStream' && !analyzeStreamResponses) return
58
62
 
59
- pushEvaluation(ctx, aiguard, buildOutputMessages(inputMessages, ctx.result.content), opts)
63
+ ctx.onResult = ctx.method === 'doStream'
64
+ ? result => {
65
+ if (!isEnabled) return result
66
+ return interceptStreamedResult(ctx, result, inputMessages)
67
+ }
68
+ : result => {
69
+ if (!isEnabled) return result
70
+
71
+ const outputMessages = decode(
72
+ () => buildOutputMessages(inputMessages, result?.content ?? []),
73
+ null,
74
+ 'AIGuard: unable to decode the model result: %s'
75
+ )
76
+ if (outputMessages === null) return result
77
+ if (!outputMessages.length) return result
78
+
79
+ return evaluate(ctx, aiguard, [outputMessages], opts).then(() => result)
80
+ }
60
81
  }
61
82
 
62
- function onStreamAfter (ctx) {
63
- const inputMessages = convertVercelPromptToMessages(ctx.prompt)
64
- if (!inputMessages.length || !ctx.chunks?.length) return
83
+ /**
84
+ * Judging a streamed response requires the whole output, so the stream is drained and replaced
85
+ * with a replay of the collected chunks. That trades streaming latency for output coverage.
86
+ *
87
+ * @param {object} ctx
88
+ * @param {object} result
89
+ * @param {Array<object>} inputMessages
90
+ * @returns {object|Promise<object>}
91
+ */
92
+ function interceptStreamedResult (ctx, result, inputMessages) {
93
+ if (!result?.stream) return result
94
+
95
+ let drained
96
+ try {
97
+ drained = drainStream(result.stream)
98
+ } catch {
99
+ // Nothing was consumed, so the caller still has the stream they handed us.
100
+ return result
101
+ }
102
+
103
+ return drained.then(({ chunks, error }) => {
104
+ // The original stream is spent from here on, so the caller must get the replay either way.
105
+ const replayed = { ...result, stream: replayChunks(chunks, error) }
65
106
 
66
- pushEvaluation(ctx, aiguard, buildOutputMessages(inputMessages, getStreamContent(ctx.chunks)), opts)
107
+ // A stream that failed part-way has no complete output to judge; the replay carries the error.
108
+ if (error) return replayed
109
+
110
+ const outputMessages = decode(
111
+ () => buildOutputMessages(inputMessages, getStreamedContent(chunks)),
112
+ null,
113
+ 'AIGuard: unable to decode the streamed model result: %s'
114
+ )
115
+ if (outputMessages === null) return replayed
116
+ if (!outputMessages.length) return replayed
117
+
118
+ return evaluate(ctx, aiguard, [outputMessages], opts).then(() => replayed)
119
+ })
67
120
  }
68
121
 
69
122
  /**
70
- * Converts Vercel stream chunks into the content shape used by doGenerate results.
123
+ * Never rejects: a stream that fails part-way is already consumed, so its chunks and its error
124
+ * are both returned for the replay to hand back to the caller.
71
125
  *
72
- * @param {Array<object>} chunks
73
- * @returns {Array<object>}
126
+ * @param {ReadableStream} stream
127
+ * @returns {Promise<{ chunks: Array<object>, error?: unknown }>}
74
128
  */
75
- function getStreamContent (chunks) {
76
- const toolCalls = []
77
- let text = ''
78
-
79
- for (const chunk of chunks) {
80
- if (chunk?.type === 'tool-call') {
81
- toolCalls.push(chunk)
82
- } else if (chunk?.type === 'text-delta') {
83
- text += chunk.delta ?? chunk.textDelta ?? ''
84
- }
129
+ function drainStream (stream) {
130
+ const chunks = []
131
+ const reader = stream.getReader()
132
+
133
+ function readAll () {
134
+ return reader.read().then(({ done, value }) => {
135
+ if (done) return { chunks }
136
+ chunks.push(value)
137
+ return readAll()
138
+ }, error => ({ chunks, error }))
85
139
  }
86
140
 
87
- if (toolCalls.length) return toolCalls
88
- return text ? [{ type: 'text', text }] : []
141
+ return readAll()
142
+ }
143
+
144
+ /**
145
+ * @param {Array<object>} chunks
146
+ * @param {unknown} [error]
147
+ * @returns {ReadableStream}
148
+ */
149
+ function replayChunks (chunks, error) {
150
+ // eslint-disable-next-line n/no-unsupported-features/node-builtins
151
+ return new ReadableStream({
152
+ start (controller) {
153
+ for (const chunk of chunks) {
154
+ controller.enqueue(chunk)
155
+ }
156
+ if (error) {
157
+ controller.error(error)
158
+ } else {
159
+ controller.close()
160
+ }
161
+ },
162
+ })
89
163
  }
90
164
 
91
165
  module.exports = { enable, disable }
@@ -220,7 +220,6 @@ function partsToContent (parts, hasImages) {
220
220
 
221
221
  /**
222
222
  * @param {Array<object>} parts
223
- * @returns {boolean}
224
223
  */
225
224
  function hasImageParts (parts) {
226
225
  return parts.some(part => part.type === 'image_url')
@@ -267,7 +266,6 @@ function convertAnthropicToolResultContent (content) {
267
266
 
268
267
  /**
269
268
  * @param {unknown} content
270
- * @returns {string}
271
269
  */
272
270
  function convertServerToolResultContent (content) {
273
271
  if (typeof content === 'string') return content || '[tool result]'
@@ -195,6 +195,68 @@ function getResponsesOutputMessages (body) {
195
195
  return convertOpenAIResponseItemsToMessages(body?.output, 'assistant')
196
196
  }
197
197
 
198
+ /**
199
+ * Combines streamed chat completion deltas into regular output messages.
200
+ *
201
+ * @param {Array<object>} chunks
202
+ * @returns {Array<object>}
203
+ */
204
+ function getStreamedChatCompletionsOutputMessages (chunks) {
205
+ const messages = new Map()
206
+
207
+ for (const chunk of chunks) {
208
+ if (!Array.isArray(chunk?.choices)) continue
209
+ for (const choice of chunk.choices) {
210
+ const delta = choice.delta
211
+ if (!delta) continue
212
+
213
+ const index = choice.index ?? 0
214
+ const message = messages.get(index) ?? { role: 'assistant' }
215
+ messages.set(index, message)
216
+
217
+ if (typeof delta.role === 'string') message.role = delta.role
218
+ if (typeof delta.content === 'string') message.content = (message.content ?? '') + delta.content
219
+ if (typeof delta.refusal === 'string') message.refusal = (message.refusal ?? '') + delta.refusal
220
+
221
+ if (delta.function_call) {
222
+ const functionCall = message.function_call ??= {}
223
+ functionCall.name ??= delta.function_call.name
224
+ if (typeof delta.function_call.arguments === 'string') {
225
+ functionCall.arguments = (functionCall.arguments ?? '') + delta.function_call.arguments
226
+ }
227
+ }
228
+
229
+ if (!Array.isArray(delta.tool_calls)) continue
230
+ for (const toolCallDelta of delta.tool_calls) {
231
+ const toolCalls = message.tool_calls ??= []
232
+ const toolCall = toolCalls[toolCallDelta.index ?? 0] ??= { function: {} }
233
+ toolCall.id ??= toolCallDelta.id
234
+ toolCall.type ??= toolCallDelta.type
235
+ toolCall.function.name ??= toolCallDelta.function?.name
236
+ if (typeof toolCallDelta.function?.arguments === 'string') {
237
+ toolCall.function.arguments = (toolCall.function.arguments ?? '') + toolCallDelta.function.arguments
238
+ }
239
+ }
240
+ }
241
+ }
242
+
243
+ const choices = [...messages.values()].map(message => {
244
+ if (message.tool_calls) message.tool_calls = message.tool_calls.filter(Boolean)
245
+ return { message }
246
+ })
247
+ return getChatCompletionsOutputMessages({ choices })
248
+ }
249
+
250
+ /**
251
+ * Gets output messages from the final response snapshot in a Responses API stream.
252
+ *
253
+ * @param {Array<object>} chunks
254
+ * @returns {Array<object>}
255
+ */
256
+ function getStreamedResponsesOutputMessages (chunks) {
257
+ return getResponsesOutputMessages(chunks.at(-1)?.response)
258
+ }
259
+
198
260
  /**
199
261
  * Converts one OpenAI reusable prompt variable value to message content.
200
262
  *
@@ -348,7 +410,6 @@ function openAIResponseImageContentPart (part) {
348
410
  * Extracts a stable text marker from an OpenAI file content part.
349
411
  *
350
412
  * @param {{file_id?: string|null, file_url?: string, filename?: string, file_data?: string}} part
351
- * @returns {string}
352
413
  */
353
414
  function openAIResponseFileContentPart (part) {
354
415
  return part.file_id ?? part.file_url ?? part.filename ?? FILE_FALLBACK
@@ -362,5 +423,7 @@ module.exports = {
362
423
  convertOpenAIResponsePromptToMessages,
363
424
  getResponsesInputMessages,
364
425
  getResponsesOutputMessages,
426
+ getStreamedChatCompletionsOutputMessages,
427
+ getStreamedResponsesOutputMessages,
365
428
  openAIResponseContentToMessageContent,
366
429
  }
@@ -1,5 +1,7 @@
1
1
  'use strict'
2
2
 
3
+ const log = require('../../log')
4
+
3
5
  const FILE_FALLBACK = '[file]'
4
6
  const IMAGE_FALLBACK = '[image]'
5
7
 
@@ -9,20 +11,45 @@ const IMAGE_FALLBACK = '[image]'
9
11
  */
10
12
  function stringifyIfNeeded (value) {
11
13
  if (value == null) return value
12
- return typeof value === 'string' ? value : JSON.stringify(value)
14
+ if (typeof value === 'string') return value
15
+
16
+ try {
17
+ return JSON.stringify(value)
18
+ } catch (error) {
19
+ log.debug('AIGuard: dropping an unserializable message field: %s', error.message)
20
+ }
13
21
  }
14
22
 
15
23
  /**
16
24
  * @param {unknown} value
17
- * @returns {string}
18
25
  */
19
26
  function stringifyOrEmpty (value) {
20
27
  return stringifyIfNeeded(value) ?? ''
21
28
  }
22
29
 
30
+ /**
31
+ * Runs `attempt`, returning its value. On failure, logs and returns `fallback` instead of
32
+ * throwing — this runs inside the caller's promise chain, so a bad payload must not break them.
33
+ *
34
+ * @template T
35
+ * @param {() => T} attempt
36
+ * @param {T} fallback
37
+ * @param {string} logMessage printf-style, with a single %s for the error message
38
+ * @returns {T}
39
+ */
40
+ function decode (attempt, fallback, logMessage) {
41
+ try {
42
+ return attempt()
43
+ } catch (error) {
44
+ log.error(logMessage, error.message)
45
+ return fallback
46
+ }
47
+ }
48
+
23
49
  module.exports = {
24
50
  FILE_FALLBACK,
25
51
  IMAGE_FALLBACK,
26
52
  stringifyIfNeeded,
27
53
  stringifyOrEmpty,
54
+ decode,
28
55
  }
@@ -180,7 +180,32 @@ function buildOutputMessages (inputMessages, content) {
180
180
  return []
181
181
  }
182
182
 
183
+ /**
184
+ * Converts Vercel stream chunks into the content shape a doGenerate result carries.
185
+ *
186
+ * @param {Array<object>} chunks
187
+ * @returns {Array<object>}
188
+ */
189
+ function getStreamedContent (chunks) {
190
+ const toolCalls = []
191
+ let text = ''
192
+
193
+ for (const chunk of chunks) {
194
+ if (chunk?.type === 'tool-call') {
195
+ toolCalls.push(chunk)
196
+ } else if (chunk?.type === 'text-delta') {
197
+ // AI SDK 6 renamed `textDelta` to `delta`; both shapes are supported. Coalesced with `??`
198
+ // because a missing delta must contribute nothing, not "undefined".
199
+ text += chunk.delta ?? chunk.textDelta ?? ''
200
+ }
201
+ }
202
+
203
+ if (toolCalls.length) return toolCalls
204
+ return text ? [{ type: 'text', text }] : []
205
+ }
206
+
183
207
  module.exports = {
208
+ getStreamedContent,
184
209
  convertVercelPromptToMessages,
185
210
  convertFilePartToImageUrl,
186
211
  buildToolCallOutputMessages,
@@ -49,7 +49,6 @@ function parsePath (path) {
49
49
  * Reports whether a parsed path targets an allowed message string.
50
50
  *
51
51
  * @param {Array<{ name: string, index: number|undefined }>} segments
52
- * @returns {boolean}
53
52
  */
54
53
  function isRedactablePath (segments) {
55
54
  const first = segments[0]
@@ -30,7 +30,7 @@ class AIGuard extends NoopAIGuard {
30
30
  this.#tracer = tracer
31
31
  this.#client = new AIGuardClient(config)
32
32
  this.#reporter = new EvaluationReporter(config)
33
- this.#redactionEnabled = config.experimental.aiguard.redactionEnabled
33
+ this.#redactionEnabled = config.aiguard.DD_AI_GUARD_REDACTION_ENABLED
34
34
  this.#meta = { service: config.service, env: config.env }
35
35
  this.#initialized = true
36
36
  }
@@ -6,7 +6,7 @@ const Activation = {
6
6
  DISABLED: 'Disabled',
7
7
 
8
8
  fromConfig (config) {
9
- switch (config.appsec.enabled) {
9
+ switch (config.appsec.DD_APPSEC_ENABLED) {
10
10
  // ASM is activated by an env var DD_APPSEC_ENABLED=true
11
11
  case true:
12
12
  return Activation.ENABLED
@@ -215,7 +215,6 @@ function compileRoute (route, parse, makeMatcher) {
215
215
  * @param {number} g
216
216
  * @param {Map<number, number>} groupParent
217
217
  * @param {Set<number>} present
218
- * @returns {boolean}
219
218
  */
220
219
  function groupActive (g, groupParent, present) {
221
220
  while (g !== 0) {
@@ -229,7 +228,6 @@ function groupActive (g, groupParent, present) {
229
228
  * URL-encode chars outside the RFC-1103 static alphabet [A-Za-z0-9.-~_]. The 'u' flag iterates whole
230
229
  * codepoints so surrogate pairs encode as correct multi-byte UTF-8.
231
230
  * @param {string} str
232
- * @returns {string}
233
231
  */
234
232
  function encodeStaticSegment (str) {
235
233
  return str.replaceAll(/[^A-Za-z0-9.\-~_]/gu, c => {
@@ -246,7 +244,6 @@ function encodeStaticSegment (str) {
246
244
  /**
247
245
  * URL-encode the 6 characters not allowed in a normalized param name (/?#+{}).
248
246
  * @param {string} name
249
- * @returns {string}
250
247
  */
251
248
  function encodeParamName (name) {
252
249
  return name.replaceAll(/[/?#+{}]/g, c => '%' + c.charCodeAt(0).toString(16).toUpperCase().padStart(2, '0'))
@@ -256,7 +253,6 @@ function encodeParamName (name) {
256
253
  * Render the normalized route for a given set of present optional groups.
257
254
  * @param {CompiledRoute} compiled
258
255
  * @param {Set<number>} present
259
- * @returns {string}
260
256
  */
261
257
  function renderRoute (compiled, present) {
262
258
  const { segments, groupParent } = compiled
@@ -367,7 +363,6 @@ function resolvePresence (compiled, params) {
367
363
  * Stable bitmask key for a present-group set (group ids are small, route-local).
368
364
  * @param {number[]} optionalGroups
369
365
  * @param {Set<number>} present
370
- * @returns {number}
371
366
  */
372
367
  function presenceBitmask (optionalGroups, present) {
373
368
  let mask = 0
@@ -122,7 +122,6 @@ function sampleRequest (req, res, record = false) {
122
122
  *
123
123
  * @param {string|undefined} route
124
124
  * @param {boolean} record
125
- * @returns {boolean}
126
125
  */
127
126
  function isRoutelessRecord (route, record) {
128
127
  return record && route === undefined
@@ -130,7 +129,6 @@ function isRoutelessRecord (route, record) {
130
129
 
131
130
  /**
132
131
  * @param {number|string} statusCode
133
- * @returns {boolean}
134
132
  */
135
133
  function isNotFound (statusCode) {
136
134
  return Number(statusCode) === 404
@@ -141,7 +139,6 @@ function isNotFound (statusCode) {
141
139
  * @param {string|undefined} route A route string, an empty string (still a valid route), or
142
140
  * `undefined`
143
141
  * @param {number|string} statusCode
144
- * @returns {string}
145
142
  */
146
143
  function buildSamplingKey (method, route, statusCode) {
147
144
  return method + (route ?? '') + statusCode
@@ -176,7 +173,6 @@ function getRouteOrEndpoint (context, statusCode) {
176
173
  * regardless of the APM sampling decision.
177
174
  *
178
175
  * @param {DatadogSpan} rootSpan
179
- * @returns {boolean}
180
176
  */
181
177
  function isRejected (rootSpan) {
182
178
  if (asmStandaloneEnabled) return false
@@ -204,9 +204,9 @@ function handleResults (actions, req, res, rootSpan, abortController) {
204
204
  * @param {import('../../config/config-base')} [config] - Tracer configuration
205
205
  */
206
206
  function setTemplates (config) {
207
- templates.html.body = config?.appsec?.blockedTemplateHtml
208
- templates.json.body = config?.appsec?.blockedTemplateJson
209
- templates.graphqlJson.body = config?.appsec?.blockedTemplateGraphql
207
+ templates.html.body = config?.appsec?.DD_APPSEC_HTTP_BLOCKED_TEMPLATE_HTML
208
+ templates.json.body = config?.appsec?.DD_APPSEC_HTTP_BLOCKED_TEMPLATE_JSON
209
+ templates.graphqlJson.body = config?.appsec?.DD_APPSEC_GRAPHQL_BLOCKED_TEMPLATE_JSON
210
210
 
211
211
  for (const type of Object.keys(templates)) {
212
212
  const template = templates[type]
@@ -102,7 +102,6 @@ function recordResponseBodyIgnored (req, tag) {
102
102
  /**
103
103
  * @param {import('http').IncomingMessage} originatingReq inbound request (for metrics).
104
104
  * @param {import('http').IncomingMessage} res downstream response.
105
- * @returns {boolean} whether downstream response body should be collected for AppSec.
106
105
  */
107
106
  function evaluateResponseBodyCollection (originatingReq, res) {
108
107
  const maxBytes = config.appsec.DD_API_SECURITY_MAX_DOWNSTREAM_BODY_BYTES
@@ -131,7 +130,6 @@ function evaluateResponseBodyCollection (originatingReq, res) {
131
130
  * Probabilistic gate for downstream response body capture (rate + per-request cap).
132
131
  * Only used from {@link planResponseBodyCollection}; does not increment {@link bodyAnalysisCount}.
133
132
  * @param {import('http').IncomingMessage} req originating server request.
134
- * @returns {boolean}
135
133
  */
136
134
  function shouldSampleBody (req) {
137
135
  globalRequestCounter = (globalRequestCounter + 1n) & UINT64_MAX
@@ -150,7 +148,6 @@ function shouldSampleBody (req) {
150
148
 
151
149
  /**
152
150
  * @param {import('http').IncomingMessage} res downstream HTTP response.
153
- * @returns {boolean}
154
151
  */
155
152
  function isRedirectResponse (res) {
156
153
  const location = res.headers?.location || ''
@@ -271,7 +268,6 @@ function incrementDownstreamAnalysisCount (req) {
271
268
  /**
272
269
  * Returns the HTTP method to use for a downstream request, defaulting to GET.
273
270
  * @param {string} method method supplied in the outgoing request options.
274
- * @returns {string} validated HTTP method.
275
271
  */
276
272
  function getMethod (method) {
277
273
  return typeof method === 'string' && method ? method : 'GET'
@@ -351,6 +347,7 @@ module.exports = {
351
347
  disable,
352
348
  planResponseBodyCollection,
353
349
  incrementDownstreamAnalysisCount,
350
+ extractMimeType,
354
351
  extractRequestData,
355
352
  extractResponseData,
356
353
  }
@@ -31,7 +31,7 @@ let isEnabled = false
31
31
  function enable (config, _tracer) {
32
32
  if (isEnabled) return
33
33
 
34
- iastTelemetry.configure(config, config.iast?.telemetryVerbosity)
34
+ iastTelemetry.configure(config, config.iast?.DD_IAST_TELEMETRY_VERBOSITY)
35
35
  enableFsPlugin(IAST_MODULE)
36
36
  enableAllAnalyzers(config)
37
37
  enableTaintTracking(config.iast, iastTelemetry.verbosity)
@@ -73,7 +73,7 @@ const OPERATIONS = {
73
73
  },
74
74
  name: REPORT_VULNERABILITY,
75
75
  initialTokenBucketSize () {
76
- return typeof config.maxContextOperations === 'number' ? config.maxContextOperations : 2
76
+ return typeof config.DD_IAST_MAX_CONTEXT_OPERATIONS === 'number' ? config.DD_IAST_MAX_CONTEXT_OPERATIONS : 2
77
77
  },
78
78
  initContext: function (context) {
79
79
  context.tokens[REPORT_VULNERABILITY] = this.initialTokenBucketSize()
@@ -146,8 +146,8 @@ function _resetGlobalContext () {
146
146
 
147
147
  function acquireRequest (rootSpan) {
148
148
  if (availableRequest > 0 && rootSpan) {
149
- const sampling = config && typeof config.requestSampling === 'number'
150
- ? config.requestSampling
149
+ const sampling = config && typeof config.DD_IAST_REQUEST_SAMPLING === 'number'
150
+ ? config.DD_IAST_REQUEST_SAMPLING
151
151
  : 30
152
152
  if (rootSpan.context().toSpanId().slice(-2) <= sampling) {
153
153
  availableRequest--
@@ -158,7 +158,7 @@ function acquireRequest (rootSpan) {
158
158
  }
159
159
 
160
160
  function releaseRequest () {
161
- if (availableRequest < config.maxConcurrentRequests) {
161
+ if (availableRequest < config.DD_IAST_MAX_CONCURRENT_REQUESTS) {
162
162
  availableRequest++
163
163
  }
164
164
  }
@@ -174,7 +174,7 @@ function initializeRequestContext (iastContext) {
174
174
 
175
175
  function configure (cfg) {
176
176
  config = cfg
177
- availableRequest = config.maxConcurrentRequests
177
+ availableRequest = config.DD_IAST_MAX_CONCURRENT_REQUESTS
178
178
  }
179
179
 
180
180
  function startGlobalContext () {
@@ -20,7 +20,7 @@ module.exports = {
20
20
  kafkaContextPlugin.enable(config)
21
21
  kafkaConsumerPlugin.enable(config)
22
22
 
23
- setMaxTransactions(config.maxConcurrentRequests)
23
+ setMaxTransactions(config.DD_IAST_MAX_CONCURRENT_REQUESTS)
24
24
  },
25
25
  disableTaintTracking () {
26
26
  disableTaintOperations()
@@ -30,7 +30,7 @@ class TaintTrackingPlugin extends SourceIastPlugin {
30
30
  configure (config) {
31
31
  super.configure(config)
32
32
 
33
- let rowsToTaint = this.iastConfig?.dbRowsToTaint
33
+ let rowsToTaint = this.iastConfig?.DD_IAST_DB_ROWS_TO_TAINT
34
34
  if (typeof rowsToTaint !== 'number') {
35
35
  rowsToTaint = 1
36
36
  }
@@ -97,7 +97,7 @@ function getPrepareStackTraceAccessor () {
97
97
 
98
98
  function getCompileMethodFn (compileMethod) {
99
99
  let delegate = function (content, filename) {
100
- if (isDdTrace(filename) || !isPrivateModule(filename) || !config.iast?.enabled) {
100
+ if (isDdTrace(filename) || !isPrivateModule(filename) || !config.iast?.DD_IAST_ENABLED) {
101
101
  return compileMethod.apply(this, [content, filename])
102
102
  }
103
103
 
@@ -163,7 +163,7 @@ function shimPrepareStackTrace () {
163
163
 
164
164
  function enableRewriter (telemetryVerbosity) {
165
165
  try {
166
- if (config.iast?.enabled) {
166
+ if (config.iast?.DD_IAST_ENABLED) {
167
167
  const rewriter = getRewriter(telemetryVerbosity)
168
168
  if (rewriter) {
169
169
  shimPrepareStackTrace()
@@ -218,7 +218,7 @@ let enableEsmRewriter = function (telemetryVerbosity) {
218
218
  telemetryVerbosity,
219
219
  chainSourceMap: isFlagPresent('--enable-source-maps'),
220
220
  orchestrionConfig,
221
- iastEnabled: config?.iast?.enabled,
221
+ iastEnabled: config?.iast?.DD_IAST_ENABLED,
222
222
  },
223
223
  })
224
224
  } catch (e) {