dd-trace 6.16.0 → 6.18.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 (356) hide show
  1. package/ci/diagnose.js +0 -23
  2. package/ci/test-optimization-validation/approval-artifacts.js +0 -3
  3. package/ci/test-optimization-validation/approval.js +0 -6
  4. package/ci/test-optimization-validation/artifact-id.js +0 -1
  5. package/ci/test-optimization-validation/bounded-json.js +0 -1
  6. package/ci/test-optimization-validation/cli.js +0 -12
  7. package/ci/test-optimization-validation/command-output-policy.js +0 -1
  8. package/ci/test-optimization-validation/command-runner.js +0 -3
  9. package/ci/test-optimization-validation/environment.js +0 -4
  10. package/ci/test-optimization-validation/executable-approval.js +0 -1
  11. package/ci/test-optimization-validation/executable.js +0 -5
  12. package/ci/test-optimization-validation/framework-adapters/cucumber.js +0 -6
  13. package/ci/test-optimization-validation/framework-adapters/cypress.js +0 -3
  14. package/ci/test-optimization-validation/framework-adapters/playwright.js +0 -6
  15. package/ci/test-optimization-validation/framework-adapters/vitest.js +0 -4
  16. package/ci/test-optimization-validation/generated-test-contract.js +0 -5
  17. package/ci/test-optimization-validation/generated-verifier.js +0 -1
  18. package/ci/test-optimization-validation/literal-environment.js +0 -1
  19. package/ci/test-optimization-validation/manifest-scaffold.js +0 -17
  20. package/ci/test-optimization-validation/manifest-schema.js +0 -21
  21. package/ci/test-optimization-validation/offline-fixtures.js +0 -4
  22. package/ci/test-optimization-validation/plan-writer.js +0 -11
  23. package/ci/test-optimization-validation/preflight-runner.js +0 -1
  24. package/ci/test-optimization-validation/redaction.js +0 -4
  25. package/ci/test-optimization-validation/report-writer.js +0 -16
  26. package/ci/test-optimization-validation/runner-command.js +0 -3
  27. package/ci/test-optimization-validation/runner-contract.js +0 -4
  28. package/ci/test-optimization-validation/safe-files.js +0 -1
  29. package/ci/test-optimization-validation/scenarios/basic-reporting.js +0 -1
  30. package/ci/test-optimization-validation/scenarios/ci-wiring.js +0 -1
  31. package/ci/test-optimization-validation/source-text.js +0 -3
  32. package/ci/vitest-no-worker-init-setup.mjs +41 -16
  33. package/index.d.ts +208 -0
  34. package/package.json +17 -16
  35. package/packages/datadog-esbuild/src/utils.js +0 -2
  36. package/packages/datadog-instrumentations/src/aerospike.js +28 -6
  37. package/packages/datadog-instrumentations/src/aws-durable-execution-sdk-js.js +0 -2
  38. package/packages/datadog-instrumentations/src/aws-sdk.js +0 -2
  39. package/packages/datadog-instrumentations/src/claude-agent-sdk.js +0 -2
  40. package/packages/datadog-instrumentations/src/console.js +97 -0
  41. package/packages/datadog-instrumentations/src/cucumber.js +77 -12
  42. package/packages/datadog-instrumentations/src/cypress-config.js +27 -38
  43. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +6 -0
  44. package/packages/datadog-instrumentations/src/helpers/channel.js +0 -2
  45. package/packages/datadog-instrumentations/src/helpers/check-require-cache.js +2 -1
  46. package/packages/datadog-instrumentations/src/helpers/graphql-jit-runtime.js +0 -5
  47. package/packages/datadog-instrumentations/src/helpers/hooks.js +8 -6
  48. package/packages/datadog-instrumentations/src/helpers/instrumentation-utils.js +0 -3
  49. package/packages/datadog-instrumentations/src/helpers/pool-acquire.js +0 -6
  50. package/packages/datadog-instrumentations/src/helpers/register.js +24 -0
  51. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +111 -26
  52. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentation-registry.js +41 -0
  53. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +3 -17
  54. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/playwright.js +55 -0
  55. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/postgres.js +36 -0
  56. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/supabase.js +128 -0
  57. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/webdriverio.js +13 -0
  58. package/packages/datadog-instrumentations/src/helpers/rewriter/targets.js +28 -3
  59. package/packages/datadog-instrumentations/src/helpers/rewriter/targets.json +20 -0
  60. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms/postgres.js +388 -0
  61. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +0 -5
  62. package/packages/datadog-instrumentations/src/helpers/router-helper.js +0 -1
  63. package/packages/datadog-instrumentations/src/jest.js +165 -51
  64. package/packages/datadog-instrumentations/src/knex.js +0 -1
  65. package/packages/datadog-instrumentations/src/mariadb-bundle.js +0 -24
  66. package/packages/datadog-instrumentations/src/mariadb.js +0 -2
  67. package/packages/datadog-instrumentations/src/mocha/common.js +0 -1
  68. package/packages/datadog-instrumentations/src/mocha/main.js +25 -26
  69. package/packages/datadog-instrumentations/src/mocha/utils.js +119 -49
  70. package/packages/datadog-instrumentations/src/mocha/webdriverio-protocol.js +0 -6
  71. package/packages/datadog-instrumentations/src/mocha/worker.js +14 -17
  72. package/packages/datadog-instrumentations/src/mysql2.js +0 -2
  73. package/packages/datadog-instrumentations/src/openai-realtime/audio-accumulator.js +241 -0
  74. package/packages/datadog-instrumentations/src/openai-realtime/events.js +76 -0
  75. package/packages/datadog-instrumentations/src/openai-realtime/index.js +301 -0
  76. package/packages/datadog-instrumentations/src/openai-realtime/session.js +998 -0
  77. package/packages/datadog-instrumentations/src/openai-realtime/turns.js +211 -0
  78. package/packages/datadog-instrumentations/src/openai.js +51 -12
  79. package/packages/datadog-instrumentations/src/oracledb.js +9 -3
  80. package/packages/datadog-instrumentations/src/playwright-reporter.js +6 -20
  81. package/packages/datadog-instrumentations/src/playwright.js +280 -56
  82. package/packages/datadog-instrumentations/src/{azure-cosmos.js → postgres.js} +1 -1
  83. package/packages/datadog-instrumentations/src/router.js +0 -2
  84. package/packages/datadog-instrumentations/src/rum-browser-scripts.js +0 -2
  85. package/packages/datadog-instrumentations/src/sequelize.js +0 -1
  86. package/packages/datadog-instrumentations/src/supabase.js +15 -0
  87. package/packages/datadog-instrumentations/src/undici.js +7 -3
  88. package/packages/datadog-instrumentations/src/vitest-main-no-worker-init.js +18 -18
  89. package/packages/datadog-instrumentations/src/vitest-main.js +121 -30
  90. package/packages/datadog-instrumentations/src/vitest-util.js +7 -1
  91. package/packages/datadog-instrumentations/src/vitest-worker.js +49 -13
  92. package/packages/datadog-instrumentations/src/webdriverio.js +44 -47
  93. package/packages/datadog-instrumentations/src/ws.js +41 -2
  94. package/packages/datadog-plugin-ai/src/utils.js +0 -2
  95. package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/trace-checkpoint.js +0 -1
  96. package/packages/datadog-plugin-aws-durable-execution-sdk-js/src/util.js +0 -2
  97. package/packages/datadog-plugin-aws-sdk/src/base.js +0 -1
  98. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +0 -1
  99. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +0 -1
  100. package/packages/datadog-plugin-aws-sdk/src/util.js +0 -1
  101. package/packages/datadog-plugin-azure-durable-functions/src/index.js +0 -1
  102. package/packages/datadog-plugin-cucumber/src/index.js +9 -0
  103. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +211 -85
  104. package/packages/datadog-plugin-cypress/src/finalization.js +0 -3
  105. package/packages/datadog-plugin-cypress/src/index.js +3 -1
  106. package/packages/datadog-plugin-cypress/src/source-map-utils.js +0 -4
  107. package/packages/datadog-plugin-cypress/src/support.js +52 -7
  108. package/packages/datadog-plugin-graphql/src/resolve-error.js +1 -2
  109. package/packages/datadog-plugin-graphql/src/utils.js +0 -5
  110. package/packages/datadog-plugin-jest/src/index.js +12 -0
  111. package/packages/datadog-plugin-kafkajs/src/producer.js +0 -1
  112. package/packages/datadog-plugin-mocha/src/index.js +38 -11
  113. package/packages/datadog-plugin-mongodb-core/src/query.js +0 -1
  114. package/packages/datadog-plugin-openai/src/index.js +16 -1
  115. package/packages/datadog-plugin-openai/src/realtime.js +144 -0
  116. package/packages/datadog-plugin-openai-agents/src/integration.js +0 -4
  117. package/packages/datadog-plugin-openai-agents/src/util.js +0 -1
  118. package/packages/datadog-plugin-playwright/src/index.js +81 -9
  119. package/packages/datadog-plugin-postgres/src/index.js +167 -0
  120. package/packages/datadog-plugin-prisma/src/datadog-tracing-helper.js +0 -1
  121. package/packages/datadog-plugin-redis/src/index.js +15 -1
  122. package/packages/datadog-plugin-supabase/src/error.js +18 -0
  123. package/packages/datadog-plugin-supabase/src/index.js +21 -0
  124. package/packages/datadog-plugin-supabase/src/supabase-auth-js-gotrueclient-getuser.js +69 -0
  125. package/packages/datadog-plugin-supabase/src/supabase-functions-js-functionsclient-invoke.js +70 -0
  126. package/packages/datadog-plugin-supabase/src/supabase-postgrest-js-postgrestbuilder-then.js +122 -0
  127. package/packages/datadog-plugin-supabase/src/supabase-realtime-js-realtimechannel-send.js +66 -0
  128. package/packages/datadog-plugin-supabase/src/supabase-storage-js-handle-request.js +93 -0
  129. package/packages/datadog-plugin-supabase/src/url.js +17 -0
  130. package/packages/datadog-plugin-vitest/src/index.js +9 -0
  131. package/packages/datadog-plugin-ws/src/producer.js +1 -1
  132. package/packages/datadog-plugin-ws/src/util.js +0 -4
  133. package/packages/datadog-shimmer/src/shimmer.js +14 -10
  134. package/packages/datadog-turbopack/index.js +4 -7
  135. package/packages/datadog-turbopack/src/loader.js +6 -18
  136. package/packages/datadog-webpack/src/loader.js +0 -1
  137. package/packages/dd-trace/src/agent/info.js +5 -4
  138. package/packages/dd-trace/src/aiguard/client.js +2 -3
  139. package/packages/dd-trace/src/aiguard/evaluation.js +6 -12
  140. package/packages/dd-trace/src/aiguard/index.js +2 -2
  141. package/packages/dd-trace/src/aiguard/integrations/index.js +1 -1
  142. package/packages/dd-trace/src/aiguard/integrations/openai.js +81 -7
  143. package/packages/dd-trace/src/aiguard/messages/anthropic.js +0 -2
  144. package/packages/dd-trace/src/aiguard/messages/openai.js +64 -1
  145. package/packages/dd-trace/src/aiguard/messages/utils.js +0 -1
  146. package/packages/dd-trace/src/aiguard/redaction.js +0 -1
  147. package/packages/dd-trace/src/aiguard/sdk.js +1 -1
  148. package/packages/dd-trace/src/appsec/activation.js +1 -1
  149. package/packages/dd-trace/src/appsec/api_security/normalized-route.js +0 -5
  150. package/packages/dd-trace/src/appsec/api_security/sampler.js +0 -4
  151. package/packages/dd-trace/src/appsec/blocking/index.js +3 -3
  152. package/packages/dd-trace/src/appsec/downstream_requests.js +1 -4
  153. package/packages/dd-trace/src/appsec/iast/index.js +1 -1
  154. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +5 -5
  155. package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +1 -1
  156. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -1
  157. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +3 -3
  158. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +8 -10
  159. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +2 -2
  160. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +4 -1
  161. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +7 -7
  162. package/packages/dd-trace/src/appsec/index.js +2 -2
  163. package/packages/dd-trace/src/appsec/lambda.js +71 -2
  164. package/packages/dd-trace/src/appsec/rasp/utils.js +5 -1
  165. package/packages/dd-trace/src/appsec/remote_config.js +8 -6
  166. package/packages/dd-trace/src/appsec/reporter.js +10 -6
  167. package/packages/dd-trace/src/appsec/rule_manager.js +3 -3
  168. package/packages/dd-trace/src/appsec/sdk/track_event.js +0 -2
  169. package/packages/dd-trace/src/appsec/waf/index.js +2 -2
  170. package/packages/dd-trace/src/appsec/waf/waf_manager.js +8 -5
  171. package/packages/dd-trace/src/carrier.js +0 -5
  172. package/packages/dd-trace/src/ci-visibility/dynamic-atr-retries.js +104 -0
  173. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +0 -2
  174. package/packages/dd-trace/src/ci-visibility/efd-retry-policy.js +34 -3
  175. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +0 -1
  176. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +0 -1
  177. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +0 -1
  178. package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/index.js +0 -4
  179. package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/msgpack-to-json.js +0 -1
  180. package/packages/dd-trace/src/ci-visibility/exporters/ci-validation/sink.js +0 -2
  181. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +37 -15
  182. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +0 -3
  183. package/packages/dd-trace/src/ci-visibility/exporters/request.js +0 -11
  184. package/packages/dd-trace/src/ci-visibility/exporters/settings-cache-key.js +0 -1
  185. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +0 -1
  186. package/packages/dd-trace/src/ci-visibility/requests/fs-cache.js +0 -6
  187. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +2 -2
  188. package/packages/dd-trace/src/ci-visibility/requests/rate-limit.js +0 -1
  189. package/packages/dd-trace/src/ci-visibility/requests/upload-test-screenshot.js +0 -5
  190. package/packages/dd-trace/src/ci-visibility/requests/video-request.js +0 -1
  191. package/packages/dd-trace/src/ci-visibility/telemetry.js +13 -0
  192. package/packages/dd-trace/src/ci-visibility/test-optimization-cache.js +0 -1
  193. package/packages/dd-trace/src/ci-visibility/test-screenshot.js +0 -2
  194. package/packages/dd-trace/src/ci-visibility/test-video.js +0 -1
  195. package/packages/dd-trace/src/config/defaults.js +3 -2
  196. package/packages/dd-trace/src/config/generated-config-types.d.ts +88 -82
  197. package/packages/dd-trace/src/config/helper.js +0 -1
  198. package/packages/dd-trace/src/config/index.js +31 -30
  199. package/packages/dd-trace/src/config/parsers.js +34 -6
  200. package/packages/dd-trace/src/config/remote_config.js +25 -109
  201. package/packages/dd-trace/src/config/supported-configurations.json +150 -10
  202. package/packages/dd-trace/src/datastreams/encoding.js +0 -1
  203. package/packages/dd-trace/src/datastreams/pathway.js +0 -1
  204. package/packages/dd-trace/src/debugger/constants.js +10 -0
  205. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +62 -10
  206. package/packages/dd-trace/src/debugger/devtools_client/config.js +4 -1
  207. package/packages/dd-trace/src/debugger/devtools_client/guardrail-metrics.js +15 -0
  208. package/packages/dd-trace/src/debugger/devtools_client/index.js +103 -27
  209. package/packages/dd-trace/src/debugger/devtools_client/json-buffer.js +50 -7
  210. package/packages/dd-trace/src/debugger/devtools_client/log.js +3 -1
  211. package/packages/dd-trace/src/debugger/devtools_client/probe_sampler.js +21 -8
  212. package/packages/dd-trace/src/debugger/devtools_client/send.js +41 -15
  213. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +53 -13
  214. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +118 -71
  215. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +5 -3
  216. package/packages/dd-trace/src/debugger/devtools_client/snapshot-pruner.js +0 -3
  217. package/packages/dd-trace/src/debugger/devtools_client/status.js +21 -7
  218. package/packages/dd-trace/src/debugger/guardrail-metrics.js +167 -0
  219. package/packages/dd-trace/src/debugger/index.js +51 -3
  220. package/packages/dd-trace/src/debugger/inspect-segment.js +0 -3
  221. package/packages/dd-trace/src/debugger/probe_sampler.js +133 -9
  222. package/packages/dd-trace/src/debugger/probe_sampler_constants.js +31 -1
  223. package/packages/dd-trace/src/dogstatsd.js +0 -23
  224. package/packages/dd-trace/src/encode/0.4-cross-payload.js +0 -3
  225. package/packages/dd-trace/src/encode/0.4.js +0 -7
  226. package/packages/dd-trace/src/encode/0.5.js +0 -2
  227. package/packages/dd-trace/src/encode/tags-processors.js +0 -1
  228. package/packages/dd-trace/src/evp_proxy/constants.js +2 -0
  229. package/packages/dd-trace/src/evp_proxy/direct.js +17 -13
  230. package/packages/dd-trace/src/evp_proxy/discovery.js +14 -11
  231. package/packages/dd-trace/src/evp_proxy/path.js +21 -9
  232. package/packages/dd-trace/src/exporters/agent/writer.js +0 -1
  233. package/packages/dd-trace/src/exporters/agentless/index.js +0 -1
  234. package/packages/dd-trace/src/exporters/agentless/intake.js +0 -1
  235. package/packages/dd-trace/src/exporters/agentless/writer.js +0 -3
  236. package/packages/dd-trace/src/exporters/common/final-flush-request-tracker.js +0 -6
  237. package/packages/dd-trace/src/exporters/common/request.js +1 -0
  238. package/packages/dd-trace/src/exporters/common/url.js +33 -4
  239. package/packages/dd-trace/src/exporters/common/writer.js +0 -2
  240. package/packages/dd-trace/src/id.js +0 -11
  241. package/packages/dd-trace/src/llmobs/audio-codec.js +192 -0
  242. package/packages/dd-trace/src/llmobs/audio-utils.js +121 -0
  243. package/packages/dd-trace/src/llmobs/constants/audio.js +35 -0
  244. package/packages/dd-trace/src/llmobs/constants/prompts.js +14 -0
  245. package/packages/dd-trace/src/llmobs/constants/tags.js +17 -0
  246. package/packages/dd-trace/src/llmobs/eval-metric.js +0 -6
  247. package/packages/dd-trace/src/llmobs/experiments/dataset.js +0 -4
  248. package/packages/dd-trace/src/llmobs/experiments/experiment.js +0 -3
  249. package/packages/dd-trace/src/llmobs/experiments/index.js +7 -6
  250. package/packages/dd-trace/src/llmobs/experiments/util.js +1 -11
  251. package/packages/dd-trace/src/llmobs/index.js +1 -3
  252. package/packages/dd-trace/src/llmobs/noop.js +10 -0
  253. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +0 -4
  254. package/packages/dd-trace/src/llmobs/plugins/anthropic/util.js +0 -1
  255. package/packages/dd-trace/src/llmobs/plugins/genai/util.js +0 -4
  256. package/packages/dd-trace/src/llmobs/plugins/modelcontextprotocol-sdk/utils.js +0 -2
  257. package/packages/dd-trace/src/llmobs/plugins/openai/constants.js +0 -2
  258. package/packages/dd-trace/src/llmobs/plugins/openai/index.js +4 -6
  259. package/packages/dd-trace/src/llmobs/plugins/openai/realtime.js +285 -0
  260. package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +16 -3
  261. package/packages/dd-trace/src/llmobs/prompts/cache.js +272 -0
  262. package/packages/dd-trace/src/llmobs/prompts/manager.js +647 -0
  263. package/packages/dd-trace/src/llmobs/prompts/noop.js +29 -0
  264. package/packages/dd-trace/src/llmobs/prompts/prompt.js +158 -0
  265. package/packages/dd-trace/src/llmobs/sdk.js +21 -6
  266. package/packages/dd-trace/src/llmobs/span_processor.js +81 -2
  267. package/packages/dd-trace/src/llmobs/tagger.js +39 -11
  268. package/packages/dd-trace/src/llmobs/telemetry.js +36 -4
  269. package/packages/dd-trace/src/llmobs/util.js +0 -34
  270. package/packages/dd-trace/src/llmobs/writers/base.js +0 -1
  271. package/packages/dd-trace/src/llmobs/writers/util.js +1 -2
  272. package/packages/dd-trace/src/log/channels.js +3 -0
  273. package/packages/dd-trace/src/log/index.js +23 -5
  274. package/packages/dd-trace/src/log-submission/log-submission-plugin.js +74 -6
  275. package/packages/dd-trace/src/msgpack/chunk.js +0 -1
  276. package/packages/dd-trace/src/openfeature/agentless_configuration_source.js +0 -12
  277. package/packages/dd-trace/src/openfeature/configuration_source.js +4 -1
  278. package/packages/dd-trace/src/openfeature/encoding.js +0 -2
  279. package/packages/dd-trace/src/openfeature/eval-metrics-hook.js +0 -1
  280. package/packages/dd-trace/src/openfeature/flagging_provider.js +3 -3
  281. package/packages/dd-trace/src/openfeature/index.js +6 -6
  282. package/packages/dd-trace/src/openfeature/span-enrichment-hook.js +0 -1
  283. package/packages/dd-trace/src/openfeature/span-enrichment.js +0 -4
  284. package/packages/dd-trace/src/openfeature/writers/base.js +90 -23
  285. package/packages/dd-trace/src/openfeature/writers/exposures.js +4 -5
  286. package/packages/dd-trace/src/openfeature/writers/util.js +104 -37
  287. package/packages/dd-trace/src/opentelemetry/logs/logger.js +0 -1
  288. package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +0 -1
  289. package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +0 -1
  290. package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +0 -2
  291. package/packages/dd-trace/src/opentelemetry/metrics/meter_provider.js +0 -1
  292. package/packages/dd-trace/src/opentelemetry/metrics/otlp_span_stats_transformer.js +0 -1
  293. package/packages/dd-trace/src/opentelemetry/metrics/otlp_transformer.js +0 -1
  294. package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +1 -14
  295. package/packages/dd-trace/src/opentelemetry/metrics/time.js +0 -1
  296. package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +30 -13
  297. package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +0 -1
  298. package/packages/dd-trace/src/opentelemetry/span-helpers.js +0 -1
  299. package/packages/dd-trace/src/opentelemetry/trace/otlp_http_trace_exporter.js +0 -1
  300. package/packages/dd-trace/src/opentelemetry/trace/otlp_transformer.js +0 -3
  301. package/packages/dd-trace/src/opentracing/propagation/text_map.js +0 -6
  302. package/packages/dd-trace/src/opentracing/span_context.js +0 -1
  303. package/packages/dd-trace/src/opentracing/tracer.js +3 -3
  304. package/packages/dd-trace/src/otel-thread-ctx.js +38 -11
  305. package/packages/dd-trace/src/payload-tagging/tagging.js +15 -3
  306. package/packages/dd-trace/src/plugin_manager.js +27 -8
  307. package/packages/dd-trace/src/plugins/ci_plugin.js +1 -2
  308. package/packages/dd-trace/src/plugins/database.js +2 -6
  309. package/packages/dd-trace/src/plugins/index.js +7 -0
  310. package/packages/dd-trace/src/plugins/plugin.js +0 -4
  311. package/packages/dd-trace/src/plugins/tracing.js +1 -1
  312. package/packages/dd-trace/src/plugins/util/git.js +1 -3
  313. package/packages/dd-trace/src/plugins/util/http-otel-semantics.js +0 -1
  314. package/packages/dd-trace/src/plugins/util/llm.js +0 -2
  315. package/packages/dd-trace/src/plugins/util/status-validator.js +0 -1
  316. package/packages/dd-trace/src/plugins/util/test.js +26 -20
  317. package/packages/dd-trace/src/plugins/util/url.js +0 -5
  318. package/packages/dd-trace/src/priority_sampler.js +0 -6
  319. package/packages/dd-trace/src/process-tags/index.js +0 -1
  320. package/packages/dd-trace/src/profiler.js +132 -35
  321. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +0 -1
  322. package/packages/dd-trace/src/profiling/profiler.js +101 -41
  323. package/packages/dd-trace/src/profiling/ssi-heuristics.js +29 -15
  324. package/packages/dd-trace/src/propagation-hash/index.js +0 -1
  325. package/packages/dd-trace/src/proxy.js +23 -47
  326. package/packages/dd-trace/src/random_sampler.js +0 -4
  327. package/packages/dd-trace/src/rate_limiter.js +0 -4
  328. package/packages/dd-trace/src/remote_config/capabilities.js +1 -9
  329. package/packages/dd-trace/src/remote_config/index.js +0 -1
  330. package/packages/dd-trace/src/runtime_metrics/otlp_runtime_metrics.js +0 -3
  331. package/packages/dd-trace/src/sampler.js +0 -4
  332. package/packages/dd-trace/src/sampling_rule.js +0 -7
  333. package/packages/dd-trace/src/serverless/vercel.js +0 -1
  334. package/packages/dd-trace/src/serverless.js +0 -1
  335. package/packages/dd-trace/src/service-naming/index.js +0 -1
  336. package/packages/dd-trace/src/service-naming/schemas/util.js +0 -1
  337. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +7 -0
  338. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +5 -0
  339. package/packages/dd-trace/src/span_processor.js +2 -2
  340. package/packages/dd-trace/src/span_sampler.js +0 -1
  341. package/packages/dd-trace/src/standalone/product.js +2 -2
  342. package/packages/dd-trace/src/standalone/tracesource.js +0 -1
  343. package/packages/dd-trace/src/startup-log.js +1 -1
  344. package/packages/dd-trace/src/telemetry/endpoints.js +0 -8
  345. package/packages/dd-trace/src/telemetry/logs/index.js +16 -5
  346. package/packages/dd-trace/src/telemetry/logs/log-collector.js +16 -6
  347. package/packages/dd-trace/src/telemetry/metrics.js +0 -2
  348. package/packages/dd-trace/src/telemetry/send-data.js +2 -1
  349. package/packages/dd-trace/src/telemetry/telemetry.js +4 -1
  350. package/packages/dd-trace/src/tracer.js +5 -4
  351. package/packages/dd-trace/src/util.js +13 -1
  352. package/vendor/dist/@datadog/openfeature-node-server/index.js +1 -1
  353. package/packages/datadog-instrumentations/src/bullmq.js +0 -11
  354. package/packages/datadog-instrumentations/src/langchain.js +0 -7
  355. package/packages/datadog-instrumentations/src/langgraph.js +0 -7
  356. package/packages/datadog-instrumentations/src/mercurius.js +0 -11
@@ -1,9 +1,14 @@
1
1
  'use strict'
2
2
 
3
3
  const request = require('../../exporters/common/request')
4
- const { safeJSONStringify } = require('../../exporters/common/util')
5
4
 
6
5
  const log = require('../../log')
6
+ const tracerVersion = require('../../../../../package.json').version
7
+
8
+ const EVP_ORIGIN_HEADERS = {
9
+ 'DD-EVP-ORIGIN': 'dd-trace-js',
10
+ 'DD-EVP-ORIGIN-VERSION': tracerVersion,
11
+ }
7
12
 
8
13
  /**
9
14
  * @typedef {object} BaseFFEWriterOptions
@@ -23,6 +28,8 @@ const log = require('../../log')
23
28
  * @property {string} endpoint - Route endpoint
24
29
  * @property {object} headers - Route-specific headers
25
30
  * @property {import('node:https').Agent} [agent] - Optional HTTPS proxy agent
31
+ * @property {Function} [onFallback] - Called after direct fallback becomes active
32
+ * @property {Function} [onUnavailable] - Called after the local route becomes unavailable
26
33
  */
27
34
 
28
35
  /**
@@ -30,6 +37,8 @@ const log = require('../../log')
30
37
  * @property {URL} url - Route base URL
31
38
  * @property {string} endpoint - Route endpoint
32
39
  * @property {object} requestOptions - HTTP request options
40
+ * @property {Function} [onFallback] - Called after direct fallback becomes active
41
+ * @property {Function} [onUnavailable] - Called after the local route becomes unavailable
33
42
  */
34
43
 
35
44
  /**
@@ -37,22 +46,32 @@ const log = require('../../log')
37
46
  *
38
47
  * @param {Error | null} error - Request error
39
48
  * @param {number | undefined} statusCode - HTTP response status
40
- * @returns {boolean} Whether direct retry is safe
41
49
  */
42
- function isDefinitiveRejection (error, statusCode) {
50
+ function isSafeToReplay (error, statusCode) {
43
51
  return error?.code === 'EAI_AGAIN' || error?.code === 'ECONNREFUSED' ||
44
52
  error?.code === 'ENOENT' || error?.code === 'ENOTFOUND' ||
45
- statusCode === 403 || statusCode === 404 || statusCode === 405
53
+ statusCode === 404 || statusCode === 405
46
54
  }
47
55
 
48
56
  /**
49
- * Tests whether a local route can have accepted an event batch before failing.
57
+ * Tests whether a local route failed without an authoritative HTTP response.
50
58
  *
51
59
  * @param {Error | null} error - Request error
52
- * @returns {boolean} Whether the delivery result is ambiguous
60
+ * @param {number | undefined} statusCode - HTTP response status
61
+ */
62
+ function isTransportFailure (error, statusCode) {
63
+ // SDK backpressure says nothing about the local receiver's health.
64
+ return error !== null && error !== undefined && statusCode === undefined &&
65
+ error.code !== 'ERR_DD_REQUEST_BUFFER_FULL'
66
+ }
67
+
68
+ /**
69
+ * Tests whether an HTTP response should move only future Agentless batches.
70
+ *
71
+ * @param {number | undefined} statusCode - HTTP response status
53
72
  */
54
- function isAmbiguousNetworkFailure (error) {
55
- return error?.code === 'ECONNRESET' || error?.code === 'EPIPE' || error?.code === 'ETIMEDOUT'
73
+ function shouldSwitchFutureRoute (statusCode) {
74
+ return statusCode === 403 || statusCode === 429 || statusCode >= 500 && statusCode < 600
56
75
  }
57
76
 
58
77
  /**
@@ -83,10 +102,11 @@ class BaseFFEWriter {
83
102
  this._requestOptions = {
84
103
  headers: {
85
104
  ...this._headers,
105
+ ...EVP_ORIGIN_HEADERS,
86
106
  'Content-Type': 'application/json',
87
107
  },
88
108
  method: 'POST',
89
- retry: true,
109
+ retry: false,
90
110
  timeout: this._timeout,
91
111
  url: this._baseUrl,
92
112
  path: this._endpoint,
@@ -152,11 +172,10 @@ class BaseFFEWriter {
152
172
 
153
173
  const payload = this._encode(this.makePayload(events))
154
174
 
175
+ // Keep byte counting behind the debug callback because payloads can be several megabytes.
155
176
  // eslint-disable-next-line eslint-rules/eslint-log-printf-style
156
- log.debug(() => `${this.constructor.name} flushing payload: ${safeJSONStringify(payload)}`)
157
-
158
- const route = this.#createActiveRoute()
159
- this.#sendRequest(payload, events.length, route, this._fallbackRoute)
177
+ log.debug(() => `${this.constructor.name} flushing ${events.length} events (${Buffer.byteLength(payload)} bytes)`)
178
+ this._sendPayload(payload, events.length)
160
179
  }
161
180
 
162
181
  /**
@@ -189,18 +208,28 @@ class BaseFFEWriter {
189
208
  /**
190
209
  * @private
191
210
  * @param {Array<object>} payload - Payload to encode
192
- * @returns {string} JSON-stringified payload
193
211
  */
194
212
  _encode (payload) {
195
213
  return JSON.stringify(payload)
196
214
  }
197
215
 
216
+ /**
217
+ * Sends one encoded event batch through a snapshot of the selected routes.
218
+ *
219
+ * @protected
220
+ * @param {string} payload - Encoded event batch
221
+ * @param {number} eventCount - Event count
222
+ */
223
+ _sendPayload (payload, eventCount) {
224
+ const route = this.#createActiveRoute()
225
+ this.#sendRequest(payload, eventCount, route, this._fallbackRoute)
226
+ }
227
+
198
228
  /**
199
229
  * Applies the active route and an optional direct fallback route.
200
230
  *
201
231
  * @param {WriterRoute} route - Active route
202
232
  * @param {WriterRoute} [fallbackRoute] - Direct fallback route
203
- * @returns {void}
204
233
  */
205
234
  _setRoutes (route, fallbackRoute) {
206
235
  this.#activateRoute(this.#createRoute(route))
@@ -217,10 +246,11 @@ class BaseFFEWriter {
217
246
  const requestOptions = {
218
247
  headers: {
219
248
  ...route.headers,
249
+ ...EVP_ORIGIN_HEADERS,
220
250
  'Content-Type': 'application/json',
221
251
  },
222
252
  method: 'POST',
223
- retry: true,
253
+ retry: false,
224
254
  timeout: this._timeout,
225
255
  url: route.url,
226
256
  path: route.endpoint,
@@ -231,6 +261,8 @@ class BaseFFEWriter {
231
261
  url: route.url,
232
262
  endpoint: route.endpoint,
233
263
  requestOptions,
264
+ onFallback: route.onFallback,
265
+ onUnavailable: route.onUnavailable,
234
266
  }
235
267
  }
236
268
 
@@ -244,6 +276,8 @@ class BaseFFEWriter {
244
276
  url: this._baseUrl,
245
277
  endpoint: this._endpoint,
246
278
  requestOptions: this._requestOptions,
279
+ onFallback: this._onFallback,
280
+ onUnavailable: this._onUnavailable,
247
281
  }
248
282
  }
249
283
 
@@ -251,26 +285,26 @@ class BaseFFEWriter {
251
285
  * Makes a route active for future event batches.
252
286
  *
253
287
  * @param {ActiveWriterRoute} route - Route state
254
- * @returns {void}
255
288
  */
256
289
  #activateRoute (route) {
257
290
  this._baseUrl = route.url
258
291
  this._endpoint = route.endpoint
259
292
  this._requestOptions = route.requestOptions
293
+ this._onFallback = route.onFallback
294
+ this._onUnavailable = route.onUnavailable
260
295
  }
261
296
 
262
297
  /**
263
- * Sends an encoded batch and retries it through direct intake after a local route failure.
298
+ * Sends an encoded batch once per route and applies safe local fallback semantics.
264
299
  *
265
300
  * @param {string} payload - Encoded event batch
266
301
  * @param {number} eventCount - Event count
267
302
  * @param {ActiveWriterRoute} route - Selected route
268
303
  * @param {ActiveWriterRoute} [fallbackRoute] - Direct fallback route
269
- * @returns {void}
270
304
  */
271
305
  #sendRequest (payload, eventCount, route, fallbackRoute) {
272
306
  request(payload, route.requestOptions, (error, response, statusCode) => {
273
- if (fallbackRoute && isDefinitiveRejection(error, statusCode)) {
307
+ if (fallbackRoute && isSafeToReplay(error, statusCode)) {
274
308
  log.debug(
275
309
  '%s switching from %s%s to direct intake after definitive rejection',
276
310
  this.constructor.name,
@@ -279,20 +313,53 @@ class BaseFFEWriter {
279
313
  )
280
314
  this.#activateRoute(fallbackRoute)
281
315
  this._fallbackRoute = undefined
316
+ route.onFallback?.()
282
317
  this.#sendRequest(payload, eventCount, fallbackRoute)
283
318
  return
284
319
  }
285
320
 
286
- if (fallbackRoute && isAmbiguousNetworkFailure(error)) {
321
+ if (fallbackRoute && isTransportFailure(error, statusCode)) {
287
322
  log.debug(
288
- '%s retrying through direct intake and switching future batches from %s%s after ambiguous failure',
323
+ '%s switching future batches from %s%s to direct intake after an ambiguous failure without replay',
289
324
  this.constructor.name,
290
325
  route.url.href,
291
326
  route.endpoint
292
327
  )
293
328
  this.#activateRoute(fallbackRoute)
294
329
  this._fallbackRoute = undefined
295
- this.#sendRequest(payload, eventCount, fallbackRoute)
330
+ route.onFallback?.()
331
+ log.error('Failed to send events to %s%s: %s', route.url.href, route.endpoint, error.message)
332
+ return
333
+ }
334
+
335
+ if (fallbackRoute && shouldSwitchFutureRoute(statusCode)) {
336
+ log.debug(
337
+ '%s switching future batches from %s%s to direct intake after status %d without replay',
338
+ this.constructor.name,
339
+ route.url.href,
340
+ route.endpoint,
341
+ statusCode
342
+ )
343
+ this.#activateRoute(fallbackRoute)
344
+ this._fallbackRoute = undefined
345
+ route.onFallback?.()
346
+ log.warn('Events request returned status %d', statusCode)
347
+ return
348
+ }
349
+
350
+ if (
351
+ !fallbackRoute &&
352
+ route.onUnavailable &&
353
+ (isSafeToReplay(error, statusCode) ||
354
+ isTransportFailure(error, statusCode) ||
355
+ shouldSwitchFutureRoute(statusCode))
356
+ ) {
357
+ route.onUnavailable()
358
+ if (error) {
359
+ log.error('Failed to send events to %s%s: %s', route.url.href, route.endpoint, error.message)
360
+ } else {
361
+ log.warn('Events request returned status %d', statusCode)
362
+ }
296
363
  return
297
364
  }
298
365
 
@@ -26,6 +26,8 @@ const PENDING_MAX_EVENTS = 1000
26
26
  * @property {object} [headers] - Route-specific headers
27
27
  * @property {import('node:https').Agent} [agent] - Optional HTTPS proxy agent
28
28
  * @property {ExposureRoute} [fallback] - Optional direct fallback route
29
+ * @property {Function} [onFallback] - Called after direct fallback becomes active
30
+ * @property {Function} [onUnavailable] - Called after the local route becomes unavailable
29
31
  */
30
32
 
31
33
  /**
@@ -114,7 +116,6 @@ class ExposuresWriter extends BaseFFEWriter {
114
116
  /**
115
117
  * @param {boolean} enabled - Whether to enable the writer
116
118
  * @param {ExposureRoute} [route] - Selected EVP route
117
- * @returns {void}
118
119
  */
119
120
  setEnabled (enabled, route) {
120
121
  if (route) {
@@ -134,7 +135,6 @@ class ExposuresWriter extends BaseFFEWriter {
134
135
  * Applies caller-supplied route data without performing discovery.
135
136
  *
136
137
  * @param {ExposureRoute} route - Selected EVP route
137
- * @returns {void}
138
138
  */
139
139
  #setRoute (route) {
140
140
  const fallbackRoute = route.fallback && {
@@ -152,6 +152,8 @@ class ExposuresWriter extends BaseFFEWriter {
152
152
  endpoint: joinEVPProxyPath(route.basePath, EXPOSURES_ENDPOINT),
153
153
  headers,
154
154
  agent: route.agent,
155
+ onFallback: route.onFallback,
156
+ onUnavailable: route.onUnavailable,
155
157
  }, fallbackRoute)
156
158
  }
157
159
 
@@ -180,9 +182,6 @@ class ExposuresWriter extends BaseFFEWriter {
180
182
  }
181
183
  }
182
184
 
183
- /**
184
- * @returns {number} Cumulative number of exposure events dropped due to buffer overflow.
185
- */
186
185
  get droppedEventCount () {
187
186
  return this._droppedEvents
188
187
  }
@@ -2,6 +2,8 @@
2
2
 
3
3
  const {
4
4
  EVP_EVENT_PLATFORM_SUBDOMAIN,
5
+ EVP_ORIGIN_HEADER_NAME,
6
+ EVP_ORIGIN_VERSION_HEADER_NAME,
5
7
  EVP_PROXY_PATH_V2,
6
8
  EVP_PROXY_PATH_V4,
7
9
  EVP_SUBDOMAIN_HEADER_NAME,
@@ -10,12 +12,15 @@ const { createDirectEVPRoute } = require('../../evp_proxy/direct')
10
12
  const { discoverEVPProxy } = require('../../evp_proxy/discovery')
11
13
  const logger = require('../../log')
12
14
 
15
+ const ROUTE_DISCOVERY_COOLDOWN_MS = 60_000
16
+ const REQUIRED_LOCAL_HEADERS = [EVP_ORIGIN_HEADER_NAME, EVP_ORIGIN_VERSION_HEADER_NAME]
17
+ const STOP_NOOP = () => {}
18
+
13
19
  let missingRouteWarningLogged = false
14
20
 
15
21
  /**
16
22
  * Logs the unavailable exposure-delivery warning once.
17
23
  *
18
- * @returns {void}
19
24
  */
20
25
  function warnExposureDeliveryUnavailable () {
21
26
  if (missingRouteWarningLogged) return
@@ -27,11 +32,10 @@ function warnExposureDeliveryUnavailable () {
27
32
  }
28
33
 
29
34
  /**
30
- * Preserves Agent exposure delivery for the Remote Configuration source.
35
+ * Preserves the one-time EVP v2 capability check for the Remote Configuration source.
31
36
  *
32
37
  * @param {import('../../config')} config - Tracer configuration object
33
38
  * @param {Function} setWriterEnabledValue - Callback to set the writer enabled state
34
- * @returns {void}
35
39
  */
36
40
  function setAgentStrategy (config, setWriterEnabledValue) {
37
41
  discoverEVPProxy(config.url, {
@@ -51,6 +55,7 @@ function setAgentStrategy (config, setWriterEnabledValue) {
51
55
  setWriterEnabledValue(false)
52
56
  }
53
57
  })
58
+ return STOP_NOOP
54
59
  }
55
60
 
56
61
  /**
@@ -61,59 +66,121 @@ function setAgentStrategy (config, setWriterEnabledValue) {
61
66
  *
62
67
  * @param {import('../../config')} config - Tracer configuration object
63
68
  * @param {Function} setWriterEnabledValue - Callback to set the writer enabled state
64
- * @returns {void}
65
69
  */
66
70
  function setAgentlessStrategy (config, setWriterEnabledValue) {
67
71
  const directRoute = createDirectEVPRoute(config, EVP_EVENT_PLATFORM_SUBDOMAIN)
72
+ let discovering = false
73
+ let recoveryTimer
74
+ let state = 'unknown'
75
+ let stopped = false
68
76
 
69
- discoverEVPProxy(config.url, {
70
- supportedPaths: [EVP_PROXY_PATH_V4, EVP_PROXY_PATH_V2],
71
- }, (error, localRoute) => {
72
- if (localRoute) {
73
- const route = {
74
- ...localRoute,
75
- headers: {
76
- [EVP_SUBDOMAIN_HEADER_NAME]: EVP_EVENT_PLATFORM_SUBDOMAIN,
77
- },
78
- }
79
- if (directRoute) route.fallback = directRoute
80
- logger.debug('FFE Writer enabled with local EVP route %s', route.basePath)
81
- setWriterEnabledValue(true, route)
82
- return
77
+ const stop = () => {
78
+ stopped = true
79
+ clearTimeout(recoveryTimer)
80
+ recoveryTimer = undefined
81
+ }
82
+
83
+ const scheduleRecovery = () => {
84
+ if (stopped || state !== 'unavailable' || recoveryTimer !== undefined) return
85
+
86
+ recoveryTimer = setTimeout(discover, ROUTE_DISCOVERY_COOLDOWN_MS)
87
+ recoveryTimer.unref?.()
88
+ }
89
+
90
+ const markUnavailable = () => {
91
+ if (stopped || state === 'direct') return
92
+ if (state !== 'unavailable') {
93
+ state = 'unavailable'
94
+ setWriterEnabledValue(false)
83
95
  }
96
+ scheduleRecovery()
97
+ }
84
98
 
99
+ const activateDirect = () => {
100
+ if (stopped || state === 'direct' || directRoute === undefined) return
101
+ state = 'direct'
102
+ clearTimeout(recoveryTimer)
103
+ recoveryTimer = undefined
104
+ setWriterEnabledValue(true, directRoute)
105
+ }
106
+
107
+ /**
108
+ * @param {{url: URL, basePath: string}} localRoute - Discovered local route
109
+ */
110
+ const activateLocal = localRoute => {
111
+ state = 'local'
112
+ const route = {
113
+ ...localRoute,
114
+ headers: {
115
+ [EVP_SUBDOMAIN_HEADER_NAME]: EVP_EVENT_PLATFORM_SUBDOMAIN,
116
+ },
117
+ }
85
118
  if (directRoute) {
119
+ route.fallback = directRoute
120
+ route.onFallback = activateDirect
121
+ } else {
122
+ route.onUnavailable = markUnavailable
123
+ }
124
+ logger.debug('FFE Writer enabled with local EVP route %s', route.basePath)
125
+ setWriterEnabledValue(true, route)
126
+ }
127
+
128
+ function discover () {
129
+ recoveryTimer = undefined
130
+ if (stopped || state === 'direct' || discovering) return
131
+ discovering = true
132
+
133
+ discoverEVPProxy(config.url, {
134
+ requiredHeaders: REQUIRED_LOCAL_HEADERS,
135
+ supportedPaths: [EVP_PROXY_PATH_V4, EVP_PROXY_PATH_V2],
136
+ // Agentless owns fallback and unavailable-state recovery; do not delay them with HTTP retries.
137
+ retry: false,
138
+ }, (error, localRoute) => {
139
+ discovering = false
140
+ if (stopped || state === 'direct') return
141
+
142
+ if (localRoute) {
143
+ activateLocal(localRoute)
144
+ return
145
+ }
146
+
147
+ if (directRoute) {
148
+ if (error) {
149
+ logger.debug('FFE Writer using direct EVP intake after local discovery failed: %s', error.message)
150
+ } else {
151
+ logger.debug('FFE Writer using direct EVP intake because no compatible local route was advertised')
152
+ }
153
+ activateDirect()
154
+ return
155
+ }
156
+
86
157
  if (error) {
87
- logger.debug('FFE Writer using direct EVP intake after local discovery failed: %s', error.message)
88
- } else {
89
- logger.debug('FFE Writer using direct EVP intake because no compatible local route was advertised')
158
+ logger.debug('FFE Writer disabled - error getting local receiver info: %s', error.message)
90
159
  }
91
- setWriterEnabledValue(true, directRoute)
92
- return
93
- }
160
+ warnExposureDeliveryUnavailable()
161
+ markUnavailable()
162
+ })
163
+ }
94
164
 
95
- if (error) {
96
- logger.debug('FFE Writer disabled - error getting local receiver info: %s', error.message)
97
- }
98
- warnExposureDeliveryUnavailable()
99
- setWriterEnabledValue(false)
100
- })
165
+ discover()
166
+ return stop
101
167
  }
102
168
 
103
169
  /**
104
- * Applies the exposure-delivery strategy for the configured Feature Flags source.
170
+ * Applies one event-delivery strategy that can be shared by all Feature Flags writers.
105
171
  *
106
172
  * @param {import('../../config')} config - Tracer configuration object
107
173
  * @param {Function} setWriterEnabledValue - Callback to set the writer enabled state
108
- * @returns {void}
109
174
  */
110
- function setExposureDeliveryStrategy (config, setWriterEnabledValue) {
175
+ function setEventDeliveryStrategy (config, setWriterEnabledValue) {
111
176
  if (config.featureFlags?.DD_FEATURE_FLAGS_CONFIGURATION_SOURCE === 'agentless') {
112
- setAgentlessStrategy(config, setWriterEnabledValue)
113
- return
177
+ return setAgentlessStrategy(config, setWriterEnabledValue)
114
178
  }
115
179
 
116
- setAgentStrategy(config, setWriterEnabledValue)
180
+ return setAgentStrategy(config, setWriterEnabledValue)
117
181
  }
118
182
 
119
- module.exports = { setExposureDeliveryStrategy }
183
+ module.exports = {
184
+ setEventDeliveryStrategy,
185
+ setExposureDeliveryStrategy: setEventDeliveryStrategy,
186
+ }
@@ -112,7 +112,6 @@ class Logger {
112
112
  * Emits a log record.
113
113
  *
114
114
  * @param {LogRecord} logRecord - The log record to emit
115
- * @returns {void}
116
115
  */
117
116
  emit (logRecord) {
118
117
  if (this.loggerProvider.isShutdown || !this.loggerProvider.processor) {
@@ -97,7 +97,6 @@ class LoggerProvider {
97
97
 
98
98
  /**
99
99
  * Shuts down the logger provider and all associated processors.
100
- * @returns {undefined} Promise that resolves when shutdown is complete
101
100
  */
102
101
  shutdown () {
103
102
  if (!this.isShutdown) {
@@ -49,7 +49,6 @@ class OtlpHttpLogExporter extends OtlpHttpExporterBase {
49
49
  * @param {LogRecord[]} logRecords - Array of enriched log records to export
50
50
  * @param {Function} resultCallback - Callback function for export result
51
51
  *
52
- * @returns {void}
53
52
  */
54
53
  export (logRecords, resultCallback) {
55
54
  if (logRecords.length === 0) {
@@ -43,7 +43,6 @@ const NANOSECONDS_PER_SECOND = 1_000_000_000n
43
43
  /**
44
44
  * Converts an OpenTelemetry HrTime to an exact OTLP uint64 decimal string.
45
45
  * @param {import('@opentelemetry/api').HrTime} hrTime
46
- * @returns {string}
47
46
  */
48
47
  function encodeHrTime (hrTime) {
49
48
  return (BigInt(hrTime[0]) * NANOSECONDS_PER_SECOND + BigInt(hrTime[1])).toString()
@@ -205,7 +204,6 @@ class OtlpTransformer extends OtlpTransformerBase {
205
204
  /**
206
205
  * Maps OpenTelemetry severity number to protobuf severity number.
207
206
  * @param {number} severityNumber - OpenTelemetry severity number
208
- * @returns {number} Protobuf severity number
209
207
  */
210
208
  #mapSeverityNumber (severityNumber) {
211
209
  const { protoSeverityNumber } = getProtobufTypes()
@@ -52,7 +52,6 @@ class MeterProvider {
52
52
 
53
53
  /**
54
54
  * @param {(error: Error | null) => void} [done] Called after shutdown completes
55
- * @returns {void}
56
55
  */
57
56
  shutdown (done) {
58
57
  if (this.reader) this.reader.shutdown(done)
@@ -148,7 +148,6 @@ class OtlpStatsTransformer extends OtlpTransformerBase {
148
148
  * @param {string} baseKey
149
149
  * @param {boolean} topLevel
150
150
  * @param {string} statusCode
151
- * @returns {void}
152
151
  */
153
152
  #addDistribution (distributions, sketch, startNano, endNano, baseAttributes, baseKey, topLevel, statusCode) {
154
153
  if (!sketch || sketch.count === 0) return
@@ -237,7 +237,6 @@ class OtlpTransformer extends OtlpTransformerBase {
237
237
  *
238
238
  * @param {NumberDataPoint} dataPoint - The number data point to assign a value to
239
239
  * @param {number} value - The value to assign
240
- * @returns {void}
241
240
  */
242
241
  #assignNumberValue (dataPoint, value) {
243
242
  if (Number.isInteger(value)) {
@@ -178,9 +178,9 @@ class PeriodicMetricReader {
178
178
  }
179
179
 
180
180
  /**
181
+ * Returns the matching index, or `-1` when no batch callback matches.
181
182
  * @param {Function} callback
182
183
  * @param {Set} instruments
183
- * @returns {number} index in #batchCallbacks, or -1
184
184
  */
185
185
  #findBatchCallback (callback, instruments) {
186
186
  return this.#batchCallbacks.findIndex(record =>
@@ -215,7 +215,6 @@ class PeriodicMetricReader {
215
215
  /**
216
216
  * Forces an immediate collection and export of all metrics.
217
217
  * @param {(error: Error | null) => void} [done] Called after the metric export completes
218
- * @returns {void}
219
218
  */
220
219
  forceFlush (done) {
221
220
  if (this.#isShutdown) {
@@ -230,7 +229,6 @@ class PeriodicMetricReader {
230
229
  /**
231
230
  * Shuts down the reader and stops periodic collection.
232
231
  * @param {(error: Error | null) => void} [done] Called after the final export and exporter shutdown complete
233
- * @returns {void}
234
232
  */
235
233
  shutdown (done) {
236
234
  if (this.#isShutdown) {
@@ -273,14 +271,12 @@ class PeriodicMetricReader {
273
271
  /**
274
272
  * @param {boolean} flushExporter Whether to flush the exporter after export
275
273
  * @param {(error: Error | null) => void} [done] Called when the queued export completes
276
- * @returns {void}
277
274
  */
278
275
  #enqueueExport (flushExporter, done) {
279
276
  this.#exportQueue.push({ flushExporter, done })
280
277
  this.#drainExportQueue()
281
278
  }
282
279
 
283
- /** @returns {void} */
284
280
  #drainExportQueue () {
285
281
  if (this.#isExporting || this.#exportQueue.length === 0) return
286
282
 
@@ -318,7 +314,6 @@ class PeriodicMetricReader {
318
314
 
319
315
  /**
320
316
  * @param {Error} [exportError] Error from the final export
321
- * @returns {void}
322
317
  */
323
318
  #shutdownExporter (exportError) {
324
319
  let completed = false
@@ -425,7 +420,6 @@ class MetricAggregator {
425
420
  * Gets the temporality for a given metric type.
426
421
  *
427
422
  * @param {string} type - Metric type from METRIC_TYPES
428
- * @returns {string} Temporality from TEMPORALITY
429
423
  */
430
424
  #getTemporality (type) {
431
425
  // UpDownCounter and Observable UpDownCounter always use CUMULATIVE
@@ -520,7 +514,6 @@ class MetricAggregator {
520
514
  * Gets unique identifier for a given instrumentation scope.
521
515
  *
522
516
  * @param {InstrumentationScope} instrumentationScope - The instrumentation scope
523
- * @returns {string} - The scope identifier
524
517
  */
525
518
  #getScopeKey (instrumentationScope) {
526
519
  return `${instrumentationScope.name}@${instrumentationScope.version}@${instrumentationScope.schemaUrl}`
@@ -533,7 +526,6 @@ class MetricAggregator {
533
526
  * @param {string} name - The metric name
534
527
  * @param {string} type - The metric type from METRIC_TYPES
535
528
  * @param {string} attrKey - The attribute key
536
- * @returns {string} - The metric identifier
537
529
  */
538
530
  #getStateKey (scopeKey, name, type, attrKey) {
539
531
  return `${scopeKey}:${name}:${type}:${attrKey}`
@@ -543,7 +535,6 @@ class MetricAggregator {
543
535
  * Checks if a given metric type is a delta type.
544
536
  *
545
537
  * @param {string} type - The metric type from METRIC_TYPES
546
- * @returns {boolean} - True if the metric type is a delta type
547
538
  */
548
539
  #isDeltaType (type) {
549
540
  return type === METRIC_TYPES.COUNTER ||
@@ -556,7 +547,6 @@ class MetricAggregator {
556
547
  *
557
548
  * @param {Iterable<AggregatedMetric>} metrics - The metrics to apply delta temporality to
558
549
  * @param {Map<string, LastExportedStateValue>} lastExportedState - The last exported state of the metrics
559
- * @returns {void}
560
550
  */
561
551
  #applyDeltaTemporality (metrics, lastExportedState) {
562
552
  for (const metric of metrics) {
@@ -681,7 +671,6 @@ class MetricAggregator {
681
671
  * @param {number} timestamp - The timestamp of the measurement
682
672
  * @param {string} stateKey - The state key
683
673
  * @param {Map<string, CumulativeStateValue>} cumulativeState - The cumulative state of the metrics
684
- * @returns {void}
685
674
  */
686
675
  #aggregateHistogram (metric, value, attributes, attrKey, timestamp, stateKey, cumulativeState) {
687
676
  if (!cumulativeState.has(stateKey)) {
@@ -733,7 +722,6 @@ class MetricAggregator {
733
722
 
734
723
  /**
735
724
  * @param {object} x
736
- * @returns {boolean}
737
725
  */
738
726
  function isObservableInstrument (x) {
739
727
  return x instanceof ObservableInstrument
@@ -742,7 +730,6 @@ function isObservableInstrument (x) {
742
730
  /**
743
731
  * @param {Set} a
744
732
  * @param {Set} b
745
- * @returns {boolean}
746
733
  */
747
734
  function setEquals (a, b) {
748
735
  if (a.size !== b.size) return false
@@ -10,7 +10,6 @@ const { timeOrigin } = performance
10
10
  * the value on the epoch while `performance.now()` keeps it monotonic, so a
11
11
  * backward wall-clock jump can't make `timeUnixNano` precede `startTimeUnixNano`.
12
12
  *
13
- * @returns {number} Nanoseconds since the UNIX epoch
14
13
  */
15
14
  function nowUnixNano () {
16
15
  return Math.round((timeOrigin + performance.now()) * 1e6)