dd-trace 5.80.0 → 5.82.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 (460) hide show
  1. package/LICENSE-3rdparty.csv +79 -88
  2. package/ext/tags.d.ts +1 -0
  3. package/ext/tags.js +1 -0
  4. package/index.d.ts +42 -35
  5. package/loader-hook.mjs +16 -4
  6. package/package.json +33 -56
  7. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  8. package/packages/datadog-esbuild/index.js +44 -26
  9. package/packages/datadog-esbuild/src/utils.js +14 -2
  10. package/packages/datadog-instrumentations/index.js +1 -0
  11. package/packages/datadog-instrumentations/src/aerospike.js +3 -2
  12. package/packages/datadog-instrumentations/src/ai.js +2 -2
  13. package/packages/datadog-instrumentations/src/amqp10.js +1 -1
  14. package/packages/datadog-instrumentations/src/amqplib.js +4 -4
  15. package/packages/datadog-instrumentations/src/anthropic.js +14 -2
  16. package/packages/datadog-instrumentations/src/apollo-server-core.js +2 -2
  17. package/packages/datadog-instrumentations/src/apollo-server.js +1 -1
  18. package/packages/datadog-instrumentations/src/apollo.js +3 -2
  19. package/packages/datadog-instrumentations/src/avsc.js +1 -1
  20. package/packages/datadog-instrumentations/src/aws-sdk.js +6 -2
  21. package/packages/datadog-instrumentations/src/azure-event-hubs.js +4 -3
  22. package/packages/datadog-instrumentations/src/azure-functions.js +2 -2
  23. package/packages/datadog-instrumentations/src/azure-service-bus.js +3 -4
  24. package/packages/datadog-instrumentations/src/bluebird.js +1 -1
  25. package/packages/datadog-instrumentations/src/bullmq.js +11 -0
  26. package/packages/datadog-instrumentations/src/bunyan.js +1 -1
  27. package/packages/datadog-instrumentations/src/cassandra-driver.js +1 -1
  28. package/packages/datadog-instrumentations/src/child_process.js +2 -2
  29. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +3 -3
  30. package/packages/datadog-instrumentations/src/couchbase.js +1 -1
  31. package/packages/datadog-instrumentations/src/crypto.js +1 -1
  32. package/packages/datadog-instrumentations/src/cucumber.js +12 -13
  33. package/packages/datadog-instrumentations/src/cypress.js +1 -1
  34. package/packages/datadog-instrumentations/src/dns.js +1 -1
  35. package/packages/datadog-instrumentations/src/elasticsearch.js +1 -1
  36. package/packages/datadog-instrumentations/src/express-mongo-sanitize.js +1 -1
  37. package/packages/datadog-instrumentations/src/express.js +1 -1
  38. package/packages/datadog-instrumentations/src/find-my-way.js +6 -5
  39. package/packages/datadog-instrumentations/src/fs.js +1 -1
  40. package/packages/datadog-instrumentations/src/generic-pool.js +1 -1
  41. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +137 -15
  42. package/packages/datadog-instrumentations/src/google-cloud-vertexai.js +2 -3
  43. package/packages/datadog-instrumentations/src/google-genai.js +120 -0
  44. package/packages/datadog-instrumentations/src/graphql.js +21 -1
  45. package/packages/datadog-instrumentations/src/grpc/client.js +1 -1
  46. package/packages/datadog-instrumentations/src/grpc/server.js +1 -1
  47. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +1 -1
  48. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
  49. package/packages/datadog-instrumentations/src/helpers/hooks.js +5 -1
  50. package/packages/datadog-instrumentations/src/helpers/instrument.js +11 -1
  51. package/packages/datadog-instrumentations/src/helpers/register.js +12 -5
  52. package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +27 -0
  53. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +152 -0
  54. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/bullmq.json +106 -0
  55. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +6 -0
  56. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/langchain.js +237 -0
  57. package/packages/datadog-instrumentations/src/helpers/rewriter/loader.js +9 -0
  58. package/packages/datadog-instrumentations/src/helpers/rewriter/loader.mjs +11 -0
  59. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +139 -0
  60. package/packages/datadog-instrumentations/src/helpers/router-helper.js +1 -1
  61. package/packages/datadog-instrumentations/src/helpers/shared-utils.js +9 -0
  62. package/packages/datadog-instrumentations/src/hono.js +55 -10
  63. package/packages/datadog-instrumentations/src/ioredis.js +1 -1
  64. package/packages/datadog-instrumentations/src/iovalkey.js +1 -1
  65. package/packages/datadog-instrumentations/src/jest.js +2 -2
  66. package/packages/datadog-instrumentations/src/kafkajs.js +3 -3
  67. package/packages/datadog-instrumentations/src/knex.js +1 -1
  68. package/packages/datadog-instrumentations/src/langchain.js +3 -109
  69. package/packages/datadog-instrumentations/src/ldapjs.js +1 -1
  70. package/packages/datadog-instrumentations/src/light-my-request.js +93 -0
  71. package/packages/datadog-instrumentations/src/limitd-client.js +1 -1
  72. package/packages/datadog-instrumentations/src/lodash.js +1 -2
  73. package/packages/datadog-instrumentations/src/mariadb.js +1 -2
  74. package/packages/datadog-instrumentations/src/memcached.js +1 -1
  75. package/packages/datadog-instrumentations/src/mocha/main.js +1 -1
  76. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  77. package/packages/datadog-instrumentations/src/mongodb.js +1 -1
  78. package/packages/datadog-instrumentations/src/mongoose.js +1 -1
  79. package/packages/datadog-instrumentations/src/mquery.js +1 -1
  80. package/packages/datadog-instrumentations/src/mysql.js +1 -1
  81. package/packages/datadog-instrumentations/src/mysql2.js +2 -2
  82. package/packages/datadog-instrumentations/src/net.js +1 -1
  83. package/packages/datadog-instrumentations/src/next.js +1 -1
  84. package/packages/datadog-instrumentations/src/nyc.js +1 -1
  85. package/packages/datadog-instrumentations/src/openai.js +2 -2
  86. package/packages/datadog-instrumentations/src/opensearch.js +1 -1
  87. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  88. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +1 -1
  89. package/packages/datadog-instrumentations/src/pg.js +3 -3
  90. package/packages/datadog-instrumentations/src/pino.js +1 -1
  91. package/packages/datadog-instrumentations/src/playwright.js +46 -17
  92. package/packages/datadog-instrumentations/src/prisma.js +52 -37
  93. package/packages/datadog-instrumentations/src/process.js +1 -1
  94. package/packages/datadog-instrumentations/src/promise-js.js +1 -1
  95. package/packages/datadog-instrumentations/src/promise.js +1 -1
  96. package/packages/datadog-instrumentations/src/protobufjs.js +1 -1
  97. package/packages/datadog-instrumentations/src/q.js +1 -1
  98. package/packages/datadog-instrumentations/src/redis.js +1 -1
  99. package/packages/datadog-instrumentations/src/rhea.js +1 -1
  100. package/packages/datadog-instrumentations/src/router.js +1 -1
  101. package/packages/datadog-instrumentations/src/selenium.js +4 -2
  102. package/packages/datadog-instrumentations/src/sequelize.js +1 -2
  103. package/packages/datadog-instrumentations/src/sharedb.js +1 -1
  104. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  105. package/packages/datadog-instrumentations/src/undici.js +4 -4
  106. package/packages/datadog-instrumentations/src/url.js +1 -1
  107. package/packages/datadog-instrumentations/src/vitest.js +1 -1
  108. package/packages/datadog-instrumentations/src/vm.js +1 -1
  109. package/packages/datadog-instrumentations/src/when.js +1 -1
  110. package/packages/datadog-instrumentations/src/winston.js +1 -1
  111. package/packages/datadog-instrumentations/src/ws.js +38 -19
  112. package/packages/datadog-plugin-amqp10/src/index.js +1 -1
  113. package/packages/datadog-plugin-amqplib/src/index.js +1 -1
  114. package/packages/datadog-plugin-anthropic/src/index.js +1 -1
  115. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/index.js +1 -1
  116. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +4 -4
  117. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  118. package/packages/datadog-plugin-aws-sdk/src/util.js +3 -3
  119. package/packages/datadog-plugin-azure-event-hubs/src/index.js +1 -1
  120. package/packages/datadog-plugin-azure-event-hubs/src/producer.js +19 -5
  121. package/packages/datadog-plugin-azure-service-bus/src/index.js +1 -1
  122. package/packages/datadog-plugin-azure-service-bus/src/producer.js +4 -0
  123. package/packages/datadog-plugin-bullmq/src/consumer.js +60 -0
  124. package/packages/datadog-plugin-bullmq/src/index.js +18 -0
  125. package/packages/datadog-plugin-bullmq/src/producer.js +178 -0
  126. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +1 -1
  127. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/index.js +1 -1
  128. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +23 -2
  129. package/packages/datadog-plugin-cypress/src/plugin.js +2 -2
  130. package/packages/datadog-plugin-cypress/src/support.js +73 -31
  131. package/packages/datadog-plugin-express/src/index.js +1 -1
  132. package/packages/datadog-plugin-fastify/src/index.js +1 -1
  133. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +13 -3
  134. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +171 -12
  135. package/packages/datadog-plugin-google-cloud-pubsub/src/index.js +1 -2
  136. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +160 -13
  137. package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +217 -0
  138. package/packages/datadog-plugin-google-cloud-vertexai/src/index.js +1 -1
  139. package/packages/datadog-plugin-google-genai/src/index.js +17 -0
  140. package/packages/datadog-plugin-google-genai/src/tracing.js +41 -0
  141. package/packages/datadog-plugin-graphql/src/resolve.js +1 -1
  142. package/packages/datadog-plugin-graphql/src/tools/transforms.js +5 -4
  143. package/packages/datadog-plugin-grpc/src/index.js +1 -1
  144. package/packages/datadog-plugin-http/src/client.js +2 -1
  145. package/packages/datadog-plugin-http/src/index.js +25 -5
  146. package/packages/datadog-plugin-http2/src/client.js +2 -2
  147. package/packages/datadog-plugin-http2/src/index.js +1 -1
  148. package/packages/datadog-plugin-jest/src/util.js +1 -1
  149. package/packages/datadog-plugin-kafkajs/src/index.js +1 -1
  150. package/packages/datadog-plugin-langchain/src/index.js +1 -1
  151. package/packages/datadog-plugin-langchain/src/tracing.js +7 -3
  152. package/packages/datadog-plugin-moleculer/src/index.js +1 -1
  153. package/packages/datadog-plugin-mongodb-core/src/index.js +6 -2
  154. package/packages/datadog-plugin-next/src/index.js +11 -3
  155. package/packages/datadog-plugin-openai/src/index.js +1 -1
  156. package/packages/datadog-plugin-openai/src/stream-helpers.js +30 -10
  157. package/packages/datadog-plugin-openai/src/tracing.js +2 -2
  158. package/packages/datadog-plugin-rhea/src/index.js +1 -1
  159. package/packages/datadog-plugin-ws/src/close.js +56 -3
  160. package/packages/datadog-plugin-ws/src/index.js +4 -0
  161. package/packages/datadog-plugin-ws/src/producer.js +39 -4
  162. package/packages/datadog-plugin-ws/src/receiver.js +39 -3
  163. package/packages/datadog-plugin-ws/src/server.js +13 -1
  164. package/packages/datadog-plugin-ws/src/util.js +107 -0
  165. package/packages/datadog-shimmer/src/shimmer.js +2 -2
  166. package/packages/dd-trace/src/aiguard/sdk.js +21 -13
  167. package/packages/dd-trace/src/appsec/api_security_sampler.js +1 -1
  168. package/packages/dd-trace/src/appsec/graphql.js +2 -2
  169. package/packages/dd-trace/src/appsec/iast/analyzers/code-injection-analyzer.js +1 -1
  170. package/packages/dd-trace/src/appsec/iast/analyzers/command-injection-analyzer.js +1 -1
  171. package/packages/dd-trace/src/appsec/iast/analyzers/cookie-analyzer.js +1 -1
  172. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-base-analyzer.js +1 -1
  173. package/packages/dd-trace/src/appsec/iast/analyzers/injection-analyzer.js +1 -1
  174. package/packages/dd-trace/src/appsec/iast/analyzers/ldap-injection-analyzer.js +1 -1
  175. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +3 -3
  176. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +1 -1
  177. package/packages/dd-trace/src/appsec/iast/analyzers/ssrf-analyzer.js +1 -1
  178. package/packages/dd-trace/src/appsec/iast/analyzers/untrusted-deserialization-analyzer.js +1 -1
  179. package/packages/dd-trace/src/appsec/iast/analyzers/unvalidated-redirect-analyzer.js +1 -1
  180. package/packages/dd-trace/src/appsec/iast/analyzers/weak-cipher-analyzer.js +1 -1
  181. package/packages/dd-trace/src/appsec/iast/analyzers/weak-hash-analyzer.js +3 -2
  182. package/packages/dd-trace/src/appsec/iast/analyzers/weak-randomness-analyzer.js +1 -1
  183. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  184. package/packages/dd-trace/src/appsec/iast/index.js +5 -5
  185. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +1 -1
  186. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +1 -1
  187. package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +1 -2
  188. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +1 -1
  189. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -1
  190. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  191. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +11 -16
  192. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +1 -1
  193. package/packages/dd-trace/src/appsec/iast/telemetry/namespaces.js +1 -1
  194. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +4 -4
  195. package/packages/dd-trace/src/appsec/index.js +8 -8
  196. package/packages/dd-trace/src/appsec/rasp/command_injection.js +1 -1
  197. package/packages/dd-trace/src/appsec/rasp/index.js +1 -1
  198. package/packages/dd-trace/src/appsec/rasp/lfi.js +1 -1
  199. package/packages/dd-trace/src/appsec/rc-products.js +10 -0
  200. package/packages/dd-trace/src/appsec/recommended.json +230 -3
  201. package/packages/dd-trace/src/appsec/remote_config.js +177 -0
  202. package/packages/dd-trace/src/appsec/reporter.js +3 -7
  203. package/packages/dd-trace/src/appsec/rule_manager.js +37 -20
  204. package/packages/dd-trace/src/appsec/sdk/index.js +1 -1
  205. package/packages/dd-trace/src/appsec/sdk/set_user.js +1 -1
  206. package/packages/dd-trace/src/appsec/sdk/track_event.js +2 -2
  207. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -2
  208. package/packages/dd-trace/src/appsec/user_tracking.js +2 -2
  209. package/packages/dd-trace/src/appsec/waf/index.js +17 -3
  210. package/packages/dd-trace/src/appsec/waf/waf_manager.js +11 -0
  211. package/packages/dd-trace/src/azure_metadata.js +8 -2
  212. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +8 -6
  213. package/packages/dd-trace/src/ci-visibility/exporters/agentless/index.js +2 -2
  214. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +1 -1
  215. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +1 -1
  216. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +4 -2
  217. package/packages/dd-trace/src/config/remote_config.js +34 -0
  218. package/packages/dd-trace/src/config.js +109 -34
  219. package/packages/dd-trace/src/config_defaults.js +16 -3
  220. package/packages/dd-trace/src/constants.js +5 -0
  221. package/packages/dd-trace/src/crashtracking/crashtracker.js +10 -1
  222. package/packages/dd-trace/src/datastreams/checkpointer.js +2 -2
  223. package/packages/dd-trace/src/datastreams/encoding.js +23 -6
  224. package/packages/dd-trace/src/datastreams/index.js +1 -1
  225. package/packages/dd-trace/src/datastreams/pathway.js +41 -2
  226. package/packages/dd-trace/src/datastreams/processor.js +3 -3
  227. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
  228. package/packages/dd-trace/src/datastreams/writer.js +2 -2
  229. package/packages/dd-trace/src/debugger/config.js +1 -0
  230. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +15 -5
  231. package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -1
  232. package/packages/dd-trace/src/debugger/devtools_client/config.js +3 -1
  233. package/packages/dd-trace/src/debugger/devtools_client/index.js +37 -17
  234. package/packages/dd-trace/src/debugger/devtools_client/inspector_promises_polyfill.js +2 -0
  235. package/packages/dd-trace/src/debugger/devtools_client/json-buffer.js +24 -18
  236. package/packages/dd-trace/src/debugger/devtools_client/send.js +21 -11
  237. package/packages/dd-trace/src/debugger/devtools_client/session.js +1 -1
  238. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +103 -15
  239. package/packages/dd-trace/src/debugger/devtools_client/snapshot/constants.js +25 -0
  240. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +56 -25
  241. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +64 -23
  242. package/packages/dd-trace/src/debugger/devtools_client/snapshot/symbols.js +3 -1
  243. package/packages/dd-trace/src/debugger/devtools_client/snapshot-pruner.js +404 -0
  244. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +1 -1
  245. package/packages/dd-trace/src/debugger/devtools_client/state.js +8 -3
  246. package/packages/dd-trace/src/debugger/devtools_client/status.js +3 -3
  247. package/packages/dd-trace/src/debugger/index.js +2 -2
  248. package/packages/dd-trace/src/dogstatsd.js +3 -2
  249. package/packages/dd-trace/src/encode/0.4.js +1 -1
  250. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +2 -2
  251. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  252. package/packages/dd-trace/src/encode/span-stats.js +13 -2
  253. package/packages/dd-trace/src/exporter.js +2 -2
  254. package/packages/dd-trace/src/exporters/agent/index.js +1 -1
  255. package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +1 -1
  256. package/packages/dd-trace/src/exporters/common/request.js +2 -2
  257. package/packages/dd-trace/src/exporters/common/writer.js +1 -1
  258. package/packages/dd-trace/src/exporters/span-stats/index.js +1 -1
  259. package/packages/dd-trace/src/external-logger/src/index.js +1 -2
  260. package/packages/dd-trace/src/flare/index.js +1 -1
  261. package/packages/dd-trace/src/guardrails/index.js +6 -3
  262. package/packages/dd-trace/src/histogram.js +1 -1
  263. package/packages/dd-trace/src/id.js +60 -0
  264. package/packages/dd-trace/src/index.js +1 -1
  265. package/packages/dd-trace/src/lambda/handler.js +4 -4
  266. package/packages/dd-trace/src/lambda/index.js +1 -1
  267. package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
  268. package/packages/dd-trace/src/lambda/runtime/ritm.js +2 -2
  269. package/packages/dd-trace/src/llmobs/constants/tags.js +8 -1
  270. package/packages/dd-trace/src/llmobs/index.js +8 -9
  271. package/packages/dd-trace/src/llmobs/plugins/ai/index.js +38 -7
  272. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +30 -9
  273. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +3 -3
  274. package/packages/dd-trace/src/llmobs/plugins/genai/index.js +104 -0
  275. package/packages/dd-trace/src/llmobs/plugins/genai/util.js +486 -0
  276. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +1 -1
  277. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +1 -1
  278. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/embedding.js +1 -1
  279. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/llm.js +1 -1
  280. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/vectorstore.js +1 -1
  281. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +2 -2
  282. package/packages/dd-trace/src/llmobs/plugins/openai/constants.js +16 -0
  283. package/packages/dd-trace/src/llmobs/plugins/{openai.js → openai/index.js} +63 -6
  284. package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +126 -0
  285. package/packages/dd-trace/src/llmobs/plugins/vertexai.js +1 -1
  286. package/packages/dd-trace/src/llmobs/sdk.js +20 -22
  287. package/packages/dd-trace/src/llmobs/span_processor.js +15 -14
  288. package/packages/dd-trace/src/llmobs/tagger.js +4 -0
  289. package/packages/dd-trace/src/llmobs/telemetry.js +3 -4
  290. package/packages/dd-trace/src/llmobs/writers/base.js +2 -2
  291. package/packages/dd-trace/src/llmobs/writers/spans.js +1 -2
  292. package/packages/dd-trace/src/log/index.js +1 -1
  293. package/packages/dd-trace/src/noop/proxy.js +2 -2
  294. package/packages/dd-trace/src/noop/span.js +1 -1
  295. package/packages/dd-trace/src/openfeature/index.js +2 -2
  296. package/packages/dd-trace/src/openfeature/noop.js +14 -14
  297. package/packages/dd-trace/src/openfeature/remote_config.js +31 -0
  298. package/packages/dd-trace/src/openfeature/writers/base.js +5 -5
  299. package/packages/dd-trace/src/openfeature/writers/exposures.js +9 -9
  300. package/packages/dd-trace/src/opentelemetry/context_manager.js +2 -2
  301. package/packages/dd-trace/src/opentelemetry/logs/index.js +2 -2
  302. package/packages/dd-trace/src/opentelemetry/logs/logger.js +3 -2
  303. package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +4 -4
  304. package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +5 -3
  305. package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +17 -16
  306. package/packages/dd-trace/src/opentelemetry/metrics/constants.js +34 -0
  307. package/packages/dd-trace/src/opentelemetry/metrics/index.js +81 -0
  308. package/packages/dd-trace/src/opentelemetry/metrics/instruments.js +225 -0
  309. package/packages/dd-trace/src/opentelemetry/metrics/meter.js +171 -0
  310. package/packages/dd-trace/src/opentelemetry/metrics/meter_provider.js +54 -0
  311. package/packages/dd-trace/src/opentelemetry/metrics/otlp_http_metric_exporter.js +62 -0
  312. package/packages/dd-trace/src/opentelemetry/metrics/otlp_transformer.js +251 -0
  313. package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +557 -0
  314. package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +10 -18
  315. package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +47 -32
  316. package/packages/dd-trace/src/opentelemetry/otlp/protobuf_loader.js +1 -1
  317. package/packages/dd-trace/src/opentelemetry/span.js +3 -3
  318. package/packages/dd-trace/src/opentelemetry/tracer.js +4 -4
  319. package/packages/dd-trace/src/opentelemetry/tracer_provider.js +1 -1
  320. package/packages/dd-trace/src/opentracing/propagation/text_map.js +24 -8
  321. package/packages/dd-trace/src/opentracing/span.js +3 -3
  322. package/packages/dd-trace/src/opentracing/tracer.js +5 -5
  323. package/packages/dd-trace/src/payload-tagging/index.js +8 -4
  324. package/packages/dd-trace/src/plugin_manager.js +5 -3
  325. package/packages/dd-trace/src/plugins/apollo.js +1 -1
  326. package/packages/dd-trace/src/plugins/ci_plugin.js +27 -27
  327. package/packages/dd-trace/src/plugins/database.js +1 -1
  328. package/packages/dd-trace/src/plugins/index.js +6 -1
  329. package/packages/dd-trace/src/plugins/log_plugin.js +1 -1
  330. package/packages/dd-trace/src/plugins/outbound.js +1 -1
  331. package/packages/dd-trace/src/plugins/tracing.js +1 -1
  332. package/packages/dd-trace/src/plugins/util/ci.js +1 -1
  333. package/packages/dd-trace/src/plugins/util/git.js +8 -8
  334. package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
  335. package/packages/dd-trace/src/plugins/util/test.js +27 -27
  336. package/packages/dd-trace/src/plugins/util/url.js +119 -1
  337. package/packages/dd-trace/src/plugins/util/user-provided-git.js +1 -1
  338. package/packages/dd-trace/src/plugins/util/web.js +18 -46
  339. package/packages/dd-trace/src/priority_sampler.js +15 -16
  340. package/packages/dd-trace/src/process-tags/index.js +83 -0
  341. package/packages/dd-trace/src/profiling/config.js +33 -22
  342. package/packages/dd-trace/src/profiling/exporter_cli.js +4 -4
  343. package/packages/dd-trace/src/profiling/exporters/agent.js +5 -5
  344. package/packages/dd-trace/src/profiling/index.js +1 -1
  345. package/packages/dd-trace/src/profiling/libuv-size.js +1 -1
  346. package/packages/dd-trace/src/profiling/profiler.js +4 -5
  347. package/packages/dd-trace/src/profiling/profilers/event_plugins/event.js +1 -1
  348. package/packages/dd-trace/src/profiling/profilers/events.js +11 -2
  349. package/packages/dd-trace/src/profiling/profilers/wall.js +4 -4
  350. package/packages/dd-trace/src/proxy.js +17 -18
  351. package/packages/dd-trace/src/rate_limiter.js +1 -1
  352. package/packages/dd-trace/src/remote_config/index.js +541 -137
  353. package/packages/dd-trace/src/require-package-json.js +1 -1
  354. package/packages/dd-trace/src/ritm.js +50 -27
  355. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +1 -1
  356. package/packages/dd-trace/src/serverless.js +16 -0
  357. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +8 -0
  358. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +4 -0
  359. package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +8 -0
  360. package/packages/dd-trace/src/service-naming/schemas/v1/web.js +4 -0
  361. package/packages/dd-trace/src/span_format.js +10 -5
  362. package/packages/dd-trace/src/span_processor.js +8 -3
  363. package/packages/dd-trace/src/span_stats.js +21 -8
  364. package/packages/dd-trace/src/spanleak.js +1 -1
  365. package/packages/dd-trace/src/standalone/index.js +1 -1
  366. package/packages/dd-trace/src/startup-log.js +3 -3
  367. package/packages/dd-trace/src/supported-configurations.json +16 -0
  368. package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
  369. package/packages/dd-trace/src/telemetry/endpoints.js +8 -8
  370. package/packages/dd-trace/src/telemetry/logs/index.js +1 -1
  371. package/packages/dd-trace/src/telemetry/telemetry.js +22 -8
  372. package/packages/dd-trace/src/tracer.js +3 -3
  373. package/packages/dd-trace/src/tracer_metadata.js +19 -15
  374. package/vendor/dist/@datadog/sketches-js/LICENSE +39 -0
  375. package/vendor/dist/@datadog/sketches-js/index.js +1 -0
  376. package/vendor/dist/@datadog/source-map/LICENSE +28 -0
  377. package/vendor/dist/@datadog/source-map/index.js +1 -0
  378. package/vendor/dist/@isaacs/ttlcache/LICENSE +55 -0
  379. package/vendor/dist/@isaacs/ttlcache/index.js +1 -0
  380. package/vendor/dist/@opentelemetry/core/LICENSE +201 -0
  381. package/vendor/dist/@opentelemetry/core/index.js +1 -0
  382. package/vendor/dist/@opentelemetry/resources/LICENSE +201 -0
  383. package/vendor/dist/@opentelemetry/resources/index.js +1 -0
  384. package/vendor/dist/astring/LICENSE +19 -0
  385. package/vendor/dist/astring/index.js +1 -0
  386. package/vendor/dist/crypto-randomuuid/index.js +1 -0
  387. package/vendor/dist/escape-string-regexp/LICENSE +9 -0
  388. package/vendor/dist/escape-string-regexp/index.js +1 -0
  389. package/vendor/dist/esquery/LICENSE +24 -0
  390. package/vendor/dist/esquery/index.js +1 -0
  391. package/vendor/dist/ignore/LICENSE +21 -0
  392. package/vendor/dist/ignore/index.js +1 -0
  393. package/vendor/dist/istanbul-lib-coverage/LICENSE +24 -0
  394. package/vendor/dist/istanbul-lib-coverage/index.js +1 -0
  395. package/vendor/dist/jest-docblock/LICENSE +21 -0
  396. package/vendor/dist/jest-docblock/index.js +1 -0
  397. package/vendor/dist/jsonpath-plus/LICENSE +22 -0
  398. package/vendor/dist/jsonpath-plus/index.js +1 -0
  399. package/vendor/dist/limiter/LICENSE +19 -0
  400. package/vendor/dist/limiter/index.js +1 -0
  401. package/vendor/dist/lodash.sortby/LICENSE +47 -0
  402. package/vendor/dist/lodash.sortby/index.js +1 -0
  403. package/vendor/dist/lru-cache/LICENSE +15 -0
  404. package/vendor/dist/lru-cache/index.js +1 -0
  405. package/vendor/dist/meriyah/LICENSE +7 -0
  406. package/vendor/dist/meriyah/index.js +1 -0
  407. package/vendor/dist/module-details-from-path/LICENSE +21 -0
  408. package/vendor/dist/module-details-from-path/index.js +1 -0
  409. package/vendor/dist/mutexify/promise/LICENSE +21 -0
  410. package/vendor/dist/mutexify/promise/index.js +1 -0
  411. package/vendor/dist/opentracing/LICENSE +201 -0
  412. package/vendor/dist/opentracing/binary_carrier.d.ts +11 -0
  413. package/vendor/dist/opentracing/constants.d.ts +61 -0
  414. package/vendor/dist/opentracing/examples/demo/demo.d.ts +2 -0
  415. package/vendor/dist/opentracing/ext/tags.d.ts +90 -0
  416. package/vendor/dist/opentracing/functions.d.ts +20 -0
  417. package/vendor/dist/opentracing/global_tracer.d.ts +14 -0
  418. package/vendor/dist/opentracing/index.d.ts +12 -0
  419. package/vendor/dist/opentracing/index.js +1 -0
  420. package/vendor/dist/opentracing/mock_tracer/index.d.ts +5 -0
  421. package/vendor/dist/opentracing/mock_tracer/mock_context.d.ts +13 -0
  422. package/vendor/dist/opentracing/mock_tracer/mock_report.d.ts +16 -0
  423. package/vendor/dist/opentracing/mock_tracer/mock_span.d.ts +50 -0
  424. package/vendor/dist/opentracing/mock_tracer/mock_tracer.d.ts +26 -0
  425. package/vendor/dist/opentracing/noop.d.ts +8 -0
  426. package/vendor/dist/opentracing/reference.d.ts +33 -0
  427. package/vendor/dist/opentracing/span.d.ts +147 -0
  428. package/vendor/dist/opentracing/span_context.d.ts +26 -0
  429. package/vendor/dist/opentracing/test/api_compatibility.d.ts +16 -0
  430. package/vendor/dist/opentracing/test/mocktracer_implemenation.d.ts +3 -0
  431. package/vendor/dist/opentracing/test/noop_implementation.d.ts +4 -0
  432. package/vendor/dist/opentracing/test/opentracing_api.d.ts +3 -0
  433. package/vendor/dist/opentracing/test/unittest.d.ts +2 -0
  434. package/vendor/dist/opentracing/tracer.d.ts +127 -0
  435. package/vendor/dist/path-to-regexp/LICENSE +21 -0
  436. package/vendor/dist/path-to-regexp/index.js +1 -0
  437. package/vendor/dist/pprof-format/LICENSE +8 -0
  438. package/vendor/dist/pprof-format/index.js +1 -0
  439. package/vendor/dist/protobufjs/LICENSE +39 -0
  440. package/vendor/dist/protobufjs/index.js +1 -0
  441. package/vendor/dist/protobufjs/minimal/LICENSE +39 -0
  442. package/vendor/dist/protobufjs/minimal/index.js +1 -0
  443. package/vendor/dist/retry/LICENSE +21 -0
  444. package/vendor/dist/retry/index.js +1 -0
  445. package/vendor/dist/rfdc/LICENSE +15 -0
  446. package/vendor/dist/rfdc/index.js +1 -0
  447. package/vendor/dist/semifies/LICENSE +201 -0
  448. package/vendor/dist/semifies/index.js +1 -0
  449. package/vendor/dist/shell-quote/LICENSE +24 -0
  450. package/vendor/dist/shell-quote/index.js +1 -0
  451. package/vendor/dist/source-map/LICENSE +28 -0
  452. package/vendor/dist/source-map/index.js +1 -0
  453. package/vendor/dist/source-map/lib/util/LICENSE +28 -0
  454. package/vendor/dist/source-map/lib/util/index.js +1 -0
  455. package/vendor/dist/source-map/mappings.wasm +0 -0
  456. package/vendor/dist/tlhunter-sorted-set/LICENSE +21 -0
  457. package/vendor/dist/tlhunter-sorted-set/index.js +1 -0
  458. package/vendor/dist/ttl-set/LICENSE +21 -0
  459. package/vendor/dist/ttl-set/index.js +1 -0
  460. package/packages/dd-trace/src/remote_config/manager.js +0 -368
@@ -1,8 +1,8 @@
1
1
  'use strict'
2
2
 
3
- const LangChainLLMObsHandler = require('.')
4
3
  const LLMObsTagger = require('../../../tagger')
5
4
  const { spanHasError } = require('../../../util')
5
+ const LangChainLLMObsHandler = require('.')
6
6
 
7
7
  class LangChainLLMObsEmbeddingHandler extends LangChainLLMObsHandler {
8
8
  setMetaTags ({ span, inputs, results }) {
@@ -1,8 +1,8 @@
1
1
  'use strict'
2
2
 
3
- const LangChainLLMObsHandler = require('.')
4
3
  const LLMObsTagger = require('../../../tagger')
5
4
  const { spanHasError } = require('../../../util')
5
+ const LangChainLLMObsHandler = require('.')
6
6
 
7
7
  class LangChainLLMObsLlmHandler extends LangChainLLMObsHandler {
8
8
  setMetaTags ({ span, inputs, results }) {
@@ -1,7 +1,7 @@
1
1
  'use strict'
2
2
 
3
- const LangChainLLMObsHandler = require('.')
4
3
  const { spanHasError } = require('../../../util')
4
+ const LangChainLLMObsHandler = require('.')
5
5
 
6
6
  class LangChainLLMObsVectorStoreHandler extends LangChainLLMObsHandler {
7
7
  setMetaTags ({ span, inputs, results }) {
@@ -174,13 +174,13 @@ class BaseLLMGeneratePlugin extends BaseLangChainLLMObsPlugin {
174
174
  class EmbeddingsEmbedQueryPlugin extends BaseLangChainLLMObsPlugin {
175
175
  static id = 'llmobs_langchain_embeddings_embed_query'
176
176
  static lcType = 'embedding'
177
- static prefix = 'tracing:apm:@langchain/core:Embeddings_embedQuery'
177
+ static prefix = 'tracing:orchestrion:@langchain/core:Embeddings_embedQuery'
178
178
  }
179
179
 
180
180
  class EmbeddingsEmbedDocumentsPlugin extends BaseLangChainLLMObsPlugin {
181
181
  static id = 'llmobs_langchain_embeddings_embed_documents'
182
182
  static lcType = 'embedding'
183
- static prefix = 'tracing:apm:@langchain/core:Embeddings_embedDocuments'
183
+ static prefix = 'tracing:orchestrion:@langchain/core:Embeddings_embedDocuments'
184
184
  }
185
185
 
186
186
  class ToolInvokePlugin extends BaseLangChainLLMObsPlugin {
@@ -0,0 +1,16 @@
1
+ 'use strict'
2
+
3
+ const INPUT_TYPE_IMAGE = 'input_image'
4
+ const INPUT_TYPE_FILE = 'input_file'
5
+ const INPUT_TYPE_TEXT = 'input_text'
6
+
7
+ const IMAGE_FALLBACK = '[image]'
8
+ const FILE_FALLBACK = '[file]'
9
+
10
+ module.exports = {
11
+ INPUT_TYPE_IMAGE,
12
+ INPUT_TYPE_FILE,
13
+ INPUT_TYPE_TEXT,
14
+ IMAGE_FALLBACK,
15
+ FILE_FALLBACK
16
+ }
@@ -1,6 +1,17 @@
1
1
  'use strict'
2
2
 
3
- const LLMObsPlugin = require('./base')
3
+ const LLMObsPlugin = require('../base')
4
+ const {
5
+ PROMPT_TRACKING_INSTRUMENTATION_METHOD,
6
+ PROMPT_MULTIMODAL,
7
+ INSTRUMENTATION_METHOD_AUTO
8
+ } = require('../../constants/tags')
9
+ const {
10
+ extractChatTemplateFromInstructions,
11
+ normalizePromptVariables,
12
+ extractTextFromContentItem,
13
+ hasMultimodalInputs
14
+ } = require('./utils')
4
15
 
5
16
  const allowedParamKeys = new Set([
6
17
  'max_output_tokens',
@@ -115,6 +126,10 @@ class OpenAiLLMObsPlugin extends LLMObsPlugin {
115
126
  metrics.cacheReadTokens = cacheReadTokens
116
127
  }
117
128
  }
129
+ // Reasoning tokens - Responses API returns `output_tokens_details`, `completion_tokens_details`
130
+ const reasoningOutputObject = tokenUsage.output_tokens_details ?? tokenUsage.completion_tokens_details
131
+ const reasoningOutputTokens = reasoningOutputObject?.reasoning_tokens ?? 0
132
+ if (reasoningOutputTokens !== undefined) metrics.reasoningOutputTokens = reasoningOutputTokens
118
133
  }
119
134
 
120
135
  return metrics
@@ -221,7 +236,8 @@ class OpenAiLLMObsPlugin extends LLMObsPlugin {
221
236
  #tagResponse (span, inputs, response, error) {
222
237
  // Tag metadata - use allowlist approach for request parameters
223
238
 
224
- const { input, model, ...parameters } = inputs
239
+ const { model, ...parameters } = inputs
240
+ let input = inputs.input
225
241
 
226
242
  // Create input messages
227
243
  const inputMessages = []
@@ -231,10 +247,33 @@ class OpenAiLLMObsPlugin extends LLMObsPlugin {
231
247
  inputMessages.push({ role: 'system', content: inputs.instructions })
232
248
  }
233
249
 
250
+ // For reusable prompts, use response.instructions if no explicit input is provided
251
+ if (!input && inputs.prompt && response?.instructions) {
252
+ input = response.instructions
253
+ }
254
+
234
255
  // Handle input - can be string or array of mixed messages
235
256
  if (Array.isArray(input)) {
236
257
  for (const item of input) {
237
- if (item.type === 'function_call') {
258
+ if (item.type === 'message') {
259
+ // Handle instruction messages (from response.instructions for reusable prompts)
260
+ const role = item.role
261
+ if (!role) continue
262
+
263
+ let content = ''
264
+ if (Array.isArray(item.content)) {
265
+ const textParts = item.content
266
+ .map(extractTextFromContentItem)
267
+ .filter(Boolean)
268
+ content = textParts.join('')
269
+ } else if (typeof item.content === 'string') {
270
+ content = item.content
271
+ }
272
+
273
+ if (content) {
274
+ inputMessages.push({ role, content })
275
+ }
276
+ } else if (item.type === 'function_call') {
238
277
  // Function call: convert to message with tool_calls
239
278
  // Parse arguments if it's a JSON string
240
279
  let parsedArgs = item.arguments
@@ -380,6 +419,27 @@ class OpenAiLLMObsPlugin extends LLMObsPlugin {
380
419
 
381
420
  this._tagger.tagLLMIO(span, inputMessages, outputMessages)
382
421
 
422
+ // Handle prompt tracking for reusable prompts
423
+ if (inputs.prompt && response?.prompt) {
424
+ const { id, version } = response.prompt // ResponsePrompt
425
+ // TODO: Add proper tagger API for prompt metadata
426
+ if (id && version) {
427
+ const normalizedVariables = normalizePromptVariables(inputs.prompt.variables)
428
+ const chatTemplate = extractChatTemplateFromInstructions(response.instructions, normalizedVariables)
429
+ this._tagger._setTag(span, '_ml_obs.meta.input.prompt', {
430
+ id,
431
+ version,
432
+ variables: normalizedVariables,
433
+ chat_template: chatTemplate
434
+ })
435
+ const tags = { [PROMPT_TRACKING_INSTRUMENTATION_METHOD]: INSTRUMENTATION_METHOD_AUTO }
436
+ if (hasMultimodalInputs(inputs.prompt.variables)) {
437
+ tags[PROMPT_MULTIMODAL] = 'true'
438
+ }
439
+ this._tagger.tagSpanTags(span, tags)
440
+ }
441
+ }
442
+
383
443
  const outputMetadata = {}
384
444
 
385
445
  // Add fields from response object (convert numbers to floats)
@@ -388,9 +448,6 @@ class OpenAiLLMObsPlugin extends LLMObsPlugin {
388
448
  if (response.tool_choice !== undefined) outputMetadata.tool_choice = response.tool_choice
389
449
  if (response.truncation !== undefined) outputMetadata.truncation = response.truncation
390
450
  if (response.text !== undefined) outputMetadata.text = response.text
391
- if (response.usage?.output_tokens_details?.reasoning_tokens !== undefined) {
392
- outputMetadata.reasoning_tokens = response.usage.output_tokens_details.reasoning_tokens
393
- }
394
451
 
395
452
  this._tagger.tagMetadata(span, outputMetadata) // update the metadata with the output metadata
396
453
  }
@@ -0,0 +1,126 @@
1
+ 'use strict'
2
+
3
+ const {
4
+ INPUT_TYPE_IMAGE,
5
+ INPUT_TYPE_FILE,
6
+ IMAGE_FALLBACK,
7
+ FILE_FALLBACK
8
+ } = require('./constants')
9
+
10
+ const REGEX_SPECIAL_CHARS = /[.*+?^${}()|[\]\\]/g
11
+
12
+ /**
13
+ * Extracts chat templates from OpenAI response instructions by replacing variable values with placeholders.
14
+ *
15
+ * Performs reverse templating: reconstructs the template by replacing actual values with {{variable_name}}.
16
+ * For images/files: uses {{variable_name}} when values are available, falls back to [image]/[file] when stripped.
17
+ *
18
+ * @param {Array<object>} instructions - From Response.instructions (array of ResponseInputMessageItem)
19
+ * @param {Record<string, string>} variables - Normalized variables (output of normalizePromptVariables)
20
+ * @returns {Array<{role: string, content: string}>} Chat template with placeholders
21
+ */
22
+ function extractChatTemplateFromInstructions (instructions, variables) {
23
+ if (!Array.isArray(instructions) || !variables) return []
24
+
25
+ const chatTemplate = []
26
+
27
+ // Build map of values to placeholders - exclude fallback markers so they remain as-is
28
+ const valueToPlaceholder = {}
29
+ for (const [varName, varValue] of Object.entries(variables)) {
30
+ // Exclude fallback markers - they should remain as [image]/[file] in the template
31
+ if (varValue && varValue !== IMAGE_FALLBACK && varValue !== FILE_FALLBACK) {
32
+ valueToPlaceholder[varValue] = `{{${varName}}}`
33
+ }
34
+ }
35
+
36
+ // Sort values by length (longest first) to handle overlapping values correctly
37
+ const sortedValues = Object.keys(valueToPlaceholder).sort((a, b) => b.length - a.length)
38
+
39
+ for (const instruction of instructions) {
40
+ const role = instruction.role
41
+ if (!role) continue
42
+
43
+ const contentItems = instruction.content
44
+ if (!Array.isArray(contentItems)) continue
45
+
46
+ // Extract text from all content items (uses actual values for images/files when available)
47
+ const textParts = contentItems
48
+ .map(extractTextFromContentItem)
49
+ .filter(Boolean)
50
+
51
+ if (textParts.length === 0) continue
52
+
53
+ // Combine text and replace variable values with placeholders (longest first)
54
+ let fullText = textParts.join('')
55
+ for (const valueStr of sortedValues) {
56
+ const placeholder = valueToPlaceholder[valueStr]
57
+ const escapedValue = valueStr.replaceAll(REGEX_SPECIAL_CHARS, String.raw`\$&`)
58
+ fullText = fullText.replaceAll(new RegExp(escapedValue, 'g'), placeholder)
59
+ }
60
+
61
+ chatTemplate.push({ role, content: fullText })
62
+ }
63
+
64
+ return chatTemplate
65
+ }
66
+
67
+ /**
68
+ * Extracts text content from a content item, using actual image_url/file_id values when available.
69
+ *
70
+ * Used for both input messages and chat template extraction. Falls back to [image]/[file] markers
71
+ * when the actual values are stripped (e.g., by OpenAI's default URL stripping behavior).
72
+ *
73
+ * @param {object} contentItem - Content item from Response.instructions[].content (ResponseInputContentItem)
74
+ * @returns {string|null} Text content, URL/file reference, or [image]/[file] fallback marker
75
+ */
76
+ function extractTextFromContentItem (contentItem) {
77
+ if (!contentItem) return null
78
+
79
+ if (contentItem.text) {
80
+ return contentItem.text
81
+ }
82
+
83
+ // For image/file items, extract the actual reference value
84
+ if (contentItem.type === INPUT_TYPE_IMAGE) {
85
+ return contentItem.image_url || contentItem.file_id || IMAGE_FALLBACK
86
+ }
87
+
88
+ if (contentItem.type === INPUT_TYPE_FILE) {
89
+ return contentItem.file_id || contentItem.file_url || contentItem.filename || FILE_FALLBACK
90
+ }
91
+
92
+ return null
93
+ }
94
+
95
+ /**
96
+ * Normalizes prompt variables by extracting meaningful values from OpenAI SDK response objects.
97
+ *
98
+ * Converts ResponseInputText, ResponseInputImage, and ResponseInputFile objects to simple string values.
99
+ *
100
+ * @param {Record<string, string | object>} variables - From ResponsePrompt.variables
101
+ * @returns {Record<string, string>} Normalized variables with simple string values
102
+ */
103
+ function normalizePromptVariables (variables) {
104
+ if (!variables) return {}
105
+
106
+ return Object.fromEntries(
107
+ Object.entries(variables).map(([key, value]) => [
108
+ key,
109
+ extractTextFromContentItem(value) ?? String(value ?? '')
110
+ ])
111
+ )
112
+ }
113
+
114
+ function hasMultimodalInputs (variables) {
115
+ if (!variables) return false
116
+ return Object.values(variables).some(value =>
117
+ value?.type === INPUT_TYPE_IMAGE || value?.type === INPUT_TYPE_FILE
118
+ )
119
+ }
120
+
121
+ module.exports = {
122
+ extractChatTemplateFromInstructions,
123
+ normalizePromptVariables,
124
+ extractTextFromContentItem,
125
+ hasMultimodalInputs
126
+ }
@@ -1,10 +1,10 @@
1
1
  'use strict'
2
2
 
3
- const LLMObsPlugin = require('./base')
4
3
  const {
5
4
  extractModel,
6
5
  extractSystemInstructions
7
6
  } = require('../../../../datadog-plugin-google-cloud-vertexai/src/utils')
7
+ const LLMObsPlugin = require('./base')
8
8
 
9
9
  class VertexAILLMObsPlugin extends LLMObsPlugin {
10
10
  static integration = 'vertexai' // used for llmobs telemetry
@@ -1,26 +1,22 @@
1
1
  'use strict'
2
2
 
3
- const { SPAN_KIND, OUTPUT_VALUE, INPUT_VALUE } = require('./constants/tags')
3
+ const { channel } = require('dc-polyfill')
4
4
 
5
+ const { isTrue, isError } = require('../util')
6
+ const tracerVersion = require('../../../../package.json').version
7
+ const logger = require('../log')
8
+ const { getEnvironmentVariable } = require('../config-helper')
9
+ const Span = require('../opentracing/span')
10
+ const { SPAN_KIND, OUTPUT_VALUE, INPUT_VALUE } = require('./constants/tags')
5
11
  const {
6
12
  getFunctionArguments,
7
13
  validateKind
8
14
  } = require('./util')
9
- const { isTrue, isError } = require('../util')
10
-
11
15
  const { storage } = require('./storage')
12
-
13
- const Span = require('../opentracing/span')
14
-
15
- const tracerVersion = require('../../../../package.json').version
16
- const logger = require('../log')
17
- const { getEnvironmentVariable } = require('../config-helper')
18
16
  const telemetry = require('./telemetry')
19
-
20
17
  const LLMObsTagger = require('./tagger')
21
18
 
22
19
  // communicating with writer
23
- const { channel } = require('dc-polyfill')
24
20
  const evalMetricAppendCh = channel('llmobs:eval-metric:append')
25
21
  const flushCh = channel('llmobs:writers:flush')
26
22
  const registerUserSpanProcessorCh = channel('llmobs:register-processor')
@@ -53,23 +49,20 @@ class LLMObs extends NoopLLMObs {
53
49
 
54
50
  logger.debug('Enabling LLMObs')
55
51
 
56
- const { mlApp, agentlessEnabled } = options
57
-
58
52
  const DD_LLMOBS_ENABLED = getEnvironmentVariable('DD_LLMOBS_ENABLED')
59
53
 
60
- const llmobsConfig = {
61
- mlApp,
62
- agentlessEnabled
63
- }
64
-
65
- const enabled = DD_LLMOBS_ENABLED == null || isTrue(DD_LLMOBS_ENABLED)
66
- if (!enabled) {
54
+ if (DD_LLMOBS_ENABLED != null && !isTrue(DD_LLMOBS_ENABLED)) {
67
55
  logger.debug('LLMObs.enable() called when DD_LLMOBS_ENABLED is false. No action taken.')
68
56
  return
69
57
  }
70
58
 
71
- this._config.llmobs.enabled = true
72
- this._config.configure({ ...this._config, llmobs: llmobsConfig })
59
+ const llmobs = {
60
+ mlApp: options.mlApp,
61
+ agentlessEnabled: options.agentlessEnabled
62
+ }
63
+ // TODO: This will update config telemetry with the origin 'code', which is not ideal when `enable()` is called
64
+ // based on `APM_TRACING` RC product updates.
65
+ this._config.configure({ llmobs })
73
66
 
74
67
  // configure writers and channel subscribers
75
68
  this._llmobsModule.enable(this._config)
@@ -410,6 +403,11 @@ class LLMObs extends NoopLLMObs {
410
403
  }
411
404
  }
412
405
 
406
+ // When OTel tracing is enabled, add source:otel tag to allow backend to wait for OTel span conversion
407
+ if (isTrue(getEnvironmentVariable('DD_TRACE_OTEL_ENABLED'))) {
408
+ evaluationTags.source = 'otel'
409
+ }
410
+
413
411
  const payload = {
414
412
  span_id: spanId,
415
413
  trace_id: traceId,
@@ -1,5 +1,14 @@
1
1
  'use strict'
2
2
 
3
+ const util = require('node:util')
4
+
5
+ const tracerVersion = require('../../../../package.json').version
6
+ const logger = require('../log')
7
+ const {
8
+ ERROR_MESSAGE,
9
+ ERROR_TYPE,
10
+ ERROR_STACK
11
+ } = require('../constants')
3
12
  const {
4
13
  SPAN_KIND,
5
14
  MODEL_NAME,
@@ -20,22 +29,9 @@ const {
20
29
  NAME
21
30
  } = require('./constants/tags')
22
31
  const { UNSERIALIZABLE_VALUE_TEXT } = require('./constants/text')
23
-
24
- const {
25
- ERROR_MESSAGE,
26
- ERROR_TYPE,
27
- ERROR_STACK
28
- } = require('../constants')
29
-
30
32
  const telemetry = require('./telemetry')
31
-
32
33
  const LLMObsTagger = require('./tagger')
33
34
 
34
- const tracerVersion = require('../../../../package.json').version
35
- const logger = require('../log')
36
-
37
- const util = require('node:util')
38
-
39
35
  class LLMObservabilitySpan {
40
36
  constructor () {
41
37
  this.input = []
@@ -126,6 +122,11 @@ class LLMObsSpanProcessor {
126
122
  inputType = 'value'
127
123
  }
128
124
 
125
+ // Handle prompt metadata for reusable prompts
126
+ if (mlObsTags['_ml_obs.meta.input.prompt']) {
127
+ input.prompt = mlObsTags['_ml_obs.meta.input.prompt']
128
+ }
129
+
129
130
  if (spanKind === 'llm' && mlObsTags[OUTPUT_MESSAGES]) {
130
131
  llmObsSpan.output = mlObsTags[OUTPUT_MESSAGES]
131
132
  outputType = 'messages'
@@ -207,7 +208,7 @@ class LLMObsSpanProcessor {
207
208
  const seenObjects = new WeakSet([obj])
208
209
 
209
210
  const isCircular = value => {
210
- if (typeof value !== 'object') return false
211
+ if (value == null || typeof value !== 'object') return false
211
212
  if (seenObjects.has(value)) return true
212
213
  seenObjects.add(value)
213
214
  return false
@@ -25,6 +25,7 @@ const {
25
25
  INPUT_TOKENS_METRIC_KEY,
26
26
  OUTPUT_TOKENS_METRIC_KEY,
27
27
  TOTAL_TOKENS_METRIC_KEY,
28
+ REASONING_OUTPUT_TOKENS_METRIC_KEY,
28
29
  INTEGRATION,
29
30
  DECORATOR,
30
31
  PROPAGATED_ML_APP_KEY
@@ -164,6 +165,9 @@ class LLMObsTagger {
164
165
  case 'cacheWriteTokens':
165
166
  processedKey = CACHE_WRITE_INPUT_TOKENS_METRIC_KEY
166
167
  break
168
+ case 'reasoningOutputTokens':
169
+ processedKey = REASONING_OUTPUT_TOKENS_METRIC_KEY
170
+ break
167
171
  }
168
172
 
169
173
  if (typeof value === 'number') {
@@ -1,5 +1,8 @@
1
1
  'use strict'
2
2
 
3
+ const ERROR_TYPE = require('../constants')
4
+
5
+ const telemetryMetrics = require('../telemetry/metrics')
3
6
  const {
4
7
  SPAN_KIND,
5
8
  MODEL_PROVIDER,
@@ -10,10 +13,6 @@ const {
10
13
  DECORATOR
11
14
  } = require('./constants/tags')
12
15
 
13
- const ERROR_TYPE = require('../constants')
14
-
15
- const telemetryMetrics = require('../telemetry/metrics')
16
-
17
16
  const LLMObsTagger = require('./tagger')
18
17
 
19
18
  const llmobsMetrics = telemetryMetrics.manager.namespace('mlobs')
@@ -1,9 +1,9 @@
1
1
  'use strict'
2
2
 
3
- const request = require('../../exporters/common/request')
4
- const { getEnvironmentVariable } = require('../../config-helper')
5
3
  const { URL, format } = require('node:url')
6
4
  const path = require('node:path')
5
+ const request = require('../../exporters/common/request')
6
+ const { getEnvironmentVariable } = require('../../config-helper')
7
7
 
8
8
  const logger = require('../../log')
9
9
 
@@ -9,11 +9,10 @@ const {
9
9
  } = require('../constants/writers')
10
10
  const { DROPPED_VALUE_TEXT } = require('../constants/text')
11
11
  const { DROPPED_IO_COLLECTION_ERROR } = require('../constants/tags')
12
- const BaseWriter = require('./base')
13
12
  const telemetry = require('../telemetry')
14
13
  const logger = require('../../log')
15
-
16
14
  const tracerVersion = require('../../../../../package.json').version
15
+ const BaseWriter = require('./base')
17
16
 
18
17
  class LLMObsSpanWriter extends BaseWriter {
19
18
  constructor (config) {
@@ -1,11 +1,11 @@
1
1
  'use strict'
2
2
  const { inspect } = require('util')
3
3
  const { isTrue } = require('../util')
4
+ const { getEnvironmentVariable } = require('../config-helper')
4
5
  const { traceChannel, debugChannel, infoChannel, warnChannel, errorChannel } = require('./channels')
5
6
  const logWriter = require('./writer')
6
7
  const { Log, LogConfig, NoTransmitError } = require('./log')
7
8
  const { memoize } = require('./utils')
8
- const { getEnvironmentVariable } = require('../config-helper')
9
9
 
10
10
  const config = {
11
11
  enabled: false,
@@ -1,11 +1,11 @@
1
1
  'use strict'
2
2
 
3
- const NoopTracer = require('./tracer')
4
3
  const NoopAppsecSdk = require('../appsec/sdk/noop')
5
- const NoopDogStatsDClient = require('./dogstatsd')
6
4
  const NoopLLMObsSDK = require('../llmobs/noop')
7
5
  const NoopFlaggingProvider = require('../openfeature/noop')
8
6
  const NoopAIGuardSDK = require('../aiguard/noop')
7
+ const NoopDogStatsDClient = require('./dogstatsd')
8
+ const NoopTracer = require('./tracer')
9
9
 
10
10
  const noop = new NoopTracer()
11
11
  const noopAppsec = new NoopAppsecSdk()
@@ -1,8 +1,8 @@
1
1
  'use strict'
2
2
 
3
- const NoopSpanContext = require('./span_context')
4
3
  const id = require('../id')
5
4
  const { storage } = require('../../../datadog-core') // TODO: noop storage?
5
+ const NoopSpanContext = require('./span_context')
6
6
 
7
7
  class NoopSpan {
8
8
  constructor (tracer, parent) {
@@ -1,9 +1,9 @@
1
1
  'use strict'
2
2
 
3
+ const { channel } = require('dc-polyfill')
3
4
  const log = require('../log')
4
5
  const ExposuresWriter = require('./writers/exposures')
5
6
  const { setAgentStrategy } = require('./writers/util')
6
- const { channel } = require('dc-polyfill')
7
7
 
8
8
  const exposureSubmitCh = channel('ffe:exposure:submit')
9
9
  const flushCh = channel('ffe:writers:flush')
@@ -12,7 +12,7 @@ let exposuresWriter = null
12
12
 
13
13
  /**
14
14
  * @private
15
- * @param {Object|Array<Object>} exposureEvents - Exposure events channel subscriber
15
+ * @param {object | Array<object>} exposureEvents - Exposure events channel subscriber
16
16
  * @returns {void}
17
17
  */
18
18
  function _handleExposureSubmit (exposureEvents) {
@@ -9,7 +9,7 @@ const { NOOP_REASON } = require('./constants/constants')
9
9
  */
10
10
  class NoopFlaggingProvider {
11
11
  /**
12
- * @param {Object} [noopTracer] - Optional noop tracer instance
12
+ * @param {object} [noopTracer] - Optional noop tracer instance
13
13
  */
14
14
  constructor (noopTracer) {
15
15
  this._tracer = noopTracer
@@ -22,8 +22,8 @@ class NoopFlaggingProvider {
22
22
  /**
23
23
  * @param {string} flagKey - Flag key
24
24
  * @param {boolean} defaultValue - Default value to return
25
- * @param {Object} context - Evaluation context
26
- * @param {Object} logger - Logger instance
25
+ * @param {object} context - Evaluation context
26
+ * @param {object} logger - Logger instance
27
27
  * @returns {Promise<{value: boolean, reason: string}>} Resolution details
28
28
  */
29
29
  resolveBooleanEvaluation (flagKey, defaultValue, context, logger) {
@@ -36,8 +36,8 @@ class NoopFlaggingProvider {
36
36
  /**
37
37
  * @param {string} flagKey - Flag key
38
38
  * @param {string} defaultValue - Default value to return
39
- * @param {Object} context - Evaluation context
40
- * @param {Object} logger - Logger instance
39
+ * @param {object} context - Evaluation context
40
+ * @param {object} logger - Logger instance
41
41
  * @returns {Promise<{value: string, reason: string}>} Resolution details
42
42
  */
43
43
  resolveStringEvaluation (flagKey, defaultValue, context, logger) {
@@ -50,8 +50,8 @@ class NoopFlaggingProvider {
50
50
  /**
51
51
  * @param {string} flagKey - Flag key
52
52
  * @param {number} defaultValue - Default value to return
53
- * @param {Object} context - Evaluation context
54
- * @param {Object} logger - Logger instance
53
+ * @param {object} context - Evaluation context
54
+ * @param {object} logger - Logger instance
55
55
  * @returns {Promise<{value: number, reason: string}>} Resolution details
56
56
  */
57
57
  resolveNumberEvaluation (flagKey, defaultValue, context, logger) {
@@ -63,10 +63,10 @@ class NoopFlaggingProvider {
63
63
 
64
64
  /**
65
65
  * @param {string} flagKey - Flag key
66
- * @param {Object} defaultValue - Default value to return
67
- * @param {Object} context - Evaluation context
68
- * @param {Object} logger - Logger instance
69
- * @returns {Promise<{value: Object, reason: string}>} Resolution details
66
+ * @param {object} defaultValue - Default value to return
67
+ * @param {object} context - Evaluation context
68
+ * @param {object} logger - Logger instance
69
+ * @returns {Promise<{value: object, reason: string}>} Resolution details
70
70
  */
71
71
  resolveObjectEvaluation (flagKey, defaultValue, context, logger) {
72
72
  return Promise.resolve({
@@ -76,14 +76,14 @@ class NoopFlaggingProvider {
76
76
  }
77
77
 
78
78
  /**
79
- * @returns {Object} Current configuration
79
+ * @returns {object} Current configuration
80
80
  */
81
81
  getConfiguration () {
82
82
  return this._config
83
83
  }
84
84
 
85
85
  /**
86
- * @param {Object} config - Configuration to set
86
+ * @param {object} config - Configuration to set
87
87
  */
88
88
  setConfiguration (config) {
89
89
  this._config = config
@@ -91,7 +91,7 @@ class NoopFlaggingProvider {
91
91
 
92
92
  /**
93
93
  * @internal
94
- * @param {Object} ufc - Universal Flag Configuration object
94
+ * @param {object} ufc - Universal Flag Configuration object
95
95
  */
96
96
  _setConfiguration (ufc) {
97
97
  this.setConfiguration(ufc)