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
@@ -10,16 +10,35 @@ const MODEL_METADATA_KEYS = new Set([
10
10
  'stop_sequences'
11
11
  ])
12
12
 
13
+ /**
14
+ * @typedef {import('../../../opentracing/span')} Span
15
+ *
16
+ * @typedef {string | number | boolean | null | undefined | string[] | number[] | boolean[]} TagValue
17
+ * @typedef {Record<string, TagValue>} SpanTags
18
+ *
19
+ * @typedef {{ span?: Span }} CurrentStore
20
+ * @typedef {{ currentStore?: CurrentStore, attributes?: SpanTags }} AiPluginContext
21
+ */
22
+
23
+ /**
24
+ * @typedef {{
25
+ * type: string,
26
+ * value?: unknown
27
+ * }} ToolCallOutput
28
+ *
29
+ * @typedef {{ output?: ToolCallOutput, result?: unknown } & Record<string, unknown>} ToolCallResultContent
30
+ */
31
+
13
32
  /**
14
33
  * Get the span tags from the context (either the attributes or the span tags).
15
34
  *
16
- * @param {Record<string, any>} ctx
17
- * @returns {Record<string, any>}
35
+ * @param {AiPluginContext} ctx
36
+ * @returns {SpanTags}
18
37
  */
19
38
  function getSpanTags (ctx) {
20
39
  const span = ctx.currentStore?.span
21
40
  const carrier = ctx.attributes ?? span?.context()._tags ?? {}
22
- return carrier
41
+ return /** @type {SpanTags} */ (carrier)
23
42
  }
24
43
 
25
44
  /**
@@ -88,10 +107,11 @@ function getJsonStringValue (str, defaultValue) {
88
107
 
89
108
  /**
90
109
  * Get the model metadata from the span tags (top_p, top_k, temperature, etc.)
91
- * @param {Record<string, unknown>} tags
92
- * @returns {Record<string, string> | null}
110
+ * @param {SpanTags} tags
111
+ * @returns {Record<string, unknown> | null}
93
112
  */
94
113
  function getModelMetadata (tags) {
114
+ /** @type {Record<string, unknown>} */
95
115
  const modelMetadata = {}
96
116
  for (const metadata of MODEL_METADATA_KEYS) {
97
117
  const metadataTagKey = `gen_ai.request.${metadata}`
@@ -106,10 +126,11 @@ function getModelMetadata (tags) {
106
126
 
107
127
  /**
108
128
  * Get the generation metadata from the span tags (maxSteps, maxRetries, etc.)
109
- * @param {Record<string, string>} tags
110
- * @returns {Record<string, string> | null}
129
+ * @param {SpanTags} tags
130
+ * @returns {Record<string, unknown> | null}
111
131
  */
112
132
  function getGenerationMetadata (tags) {
133
+ /** @type {Record<string, unknown>} */
113
134
  const metadata = {}
114
135
 
115
136
  for (const tag of Object.keys(tags)) {
@@ -131,7 +152,7 @@ function getGenerationMetadata (tags) {
131
152
  * If the tool name is a parsable number, or is not found, null is returned.
132
153
  * Older versions of the ai sdk would tag the tool name as its index in the tools array.
133
154
  *
134
- * @param {Record<string, string>} tags
155
+ * @param {SpanTags} tags
135
156
  * @returns {string | null}
136
157
  */
137
158
  function getToolNameFromTags (tags) {
@@ -147,7 +168,7 @@ function getToolNameFromTags (tags) {
147
168
  /**
148
169
  * Get the content of a tool call result.
149
170
  * Version 5 of the ai sdk sets this tag as `content.output`, with a `
150
- * @param {Record<string, any>} content
171
+ * @param {{ output?: { type: string, value: unknown }, result?: unknown }} content
151
172
  * @returns {string}
152
173
  */
153
174
  function getToolCallResultContent (content) {
@@ -1,16 +1,16 @@
1
1
  'use strict'
2
2
 
3
- const BaseLLMObsPlugin = require('./base')
4
3
  const { storage } = require('../../../../datadog-core')
5
- const llmobsStore = storage('llmobs')
6
4
  const telemetry = require('../telemetry')
7
-
8
5
  const {
9
6
  extractRequestParams,
10
7
  extractTextAndResponseReason,
11
8
  parseModelId,
12
9
  extractTextAndResponseReasonFromStream
13
10
  } = require('../../../../datadog-plugin-aws-sdk/src/services/bedrockruntime/utils')
11
+ const BaseLLMObsPlugin = require('./base')
12
+
13
+ const llmobsStore = storage('llmobs')
14
14
 
15
15
  const ENABLED_OPERATIONS = new Set(['invokeModel', 'invokeModelWithResponseStream'])
16
16
 
@@ -0,0 +1,104 @@
1
+ 'use strict'
2
+
3
+ const LLMObsPlugin = require('../base')
4
+ const {
5
+ getOperation,
6
+ extractMetrics,
7
+ extractMetadata,
8
+ aggregateStreamingChunks,
9
+ formatInputMessages,
10
+ formatEmbeddingInput,
11
+ formatOutputMessages,
12
+ formatEmbeddingOutput
13
+ } = require('./util')
14
+
15
+ class GenAiLLMObsPlugin extends LLMObsPlugin {
16
+ static id = 'google-genai'
17
+ static integration = 'google_genai'
18
+ static prefix = 'tracing:apm:google:genai:request'
19
+
20
+ constructor () {
21
+ super(...arguments)
22
+
23
+ // Subscribe to streaming chunk events
24
+ this.addSub('apm:google:genai:request:chunk', ({ ctx, chunk, done }) => {
25
+ ctx.isStreaming = true
26
+ ctx.chunks = ctx.chunks || []
27
+
28
+ if (chunk) ctx.chunks.push(chunk)
29
+ if (!done) return
30
+
31
+ // Aggregate streaming chunks into a single response
32
+ ctx.result = aggregateStreamingChunks(ctx.chunks)
33
+ })
34
+ }
35
+
36
+ getLLMObsSpanRegisterOptions (ctx) {
37
+ const { args, methodName } = ctx
38
+ if (!methodName) return
39
+
40
+ const inputs = args[0]
41
+ const operation = getOperation(methodName)
42
+
43
+ return {
44
+ modelProvider: 'google',
45
+ modelName: inputs.model,
46
+ kind: operation,
47
+ name: 'google_genai.request'
48
+ }
49
+ }
50
+
51
+ setLLMObsTags (ctx) {
52
+ const { args, methodName } = ctx
53
+ const span = ctx.currentStore?.span
54
+ if (!methodName) return
55
+
56
+ const inputs = args[0]
57
+ const response = ctx.result
58
+ const error = !!span.context()._tags.error
59
+
60
+ const operation = getOperation(methodName)
61
+
62
+ if (operation === 'llm') {
63
+ this.#tagGenerateContent(span, inputs, response, error, ctx.isStreaming)
64
+ } else if (operation === 'embedding') {
65
+ this.#tagEmbedding(span, inputs, response, error)
66
+ }
67
+
68
+ if (!error && response) {
69
+ const metrics = extractMetrics(response)
70
+ this._tagger.tagMetrics(span, metrics)
71
+ }
72
+ }
73
+
74
+ #tagGenerateContent (span, inputs, response, error, isStreaming = false) {
75
+ const { config = {} } = inputs
76
+
77
+ const inputMessages = formatInputMessages(inputs.contents)
78
+
79
+ const metadata = extractMetadata(config)
80
+ this._tagger.tagMetadata(span, metadata)
81
+
82
+ if (error) {
83
+ this._tagger.tagLLMIO(span, inputMessages, [{ content: '' }])
84
+ return
85
+ }
86
+
87
+ const outputMessages = formatOutputMessages(response, isStreaming)
88
+ this._tagger.tagLLMIO(span, inputMessages, outputMessages)
89
+ }
90
+
91
+ #tagEmbedding (span, inputs, response, error) {
92
+ const embeddingInput = formatEmbeddingInput(inputs.contents)
93
+
94
+ if (error) {
95
+ this._tagger.tagEmbeddingIO(span, embeddingInput)
96
+ return
97
+ }
98
+
99
+ const embeddingOutput = formatEmbeddingOutput(response)
100
+ this._tagger.tagEmbeddingIO(span, embeddingInput, embeddingOutput)
101
+ }
102
+ }
103
+
104
+ module.exports = GenAiLLMObsPlugin
@@ -0,0 +1,486 @@
1
+ 'use strict'
2
+
3
+ // Constants for role mapping
4
+ const ROLES = {
5
+ MODEL: 'model',
6
+ ASSISTANT: 'assistant',
7
+ USER: 'user',
8
+ REASONING: 'reasoning'
9
+ }
10
+
11
+ /**
12
+ * Get the operation type from the method name
13
+ * @param {string} methodName
14
+ * @returns {'embedding' | 'llm'}
15
+ */
16
+ function getOperation (methodName) {
17
+ return methodName.includes('embed') ? 'embedding' : 'llm'
18
+ }
19
+
20
+ /**
21
+ * Extract text parts from an array of parts
22
+ * @param {Array<{text?: string}>} parts
23
+ * @returns {string[]}
24
+ */
25
+ function extractTextParts (parts) {
26
+ return parts
27
+ .filter(part => part.text)
28
+ .map(part => part.text)
29
+ }
30
+
31
+ /**
32
+ * Group parts by role (reasoning vs assistant)
33
+ * @param {Array<{text?: string, thought?: boolean}>} parts
34
+ * @returns {{reasoning: string, assistant: string}}
35
+ */
36
+ function groupPartsByRole (parts) {
37
+ const grouped = {
38
+ reasoning: '',
39
+ assistant: ''
40
+ }
41
+
42
+ for (const part of parts) {
43
+ if (!part.text) continue
44
+
45
+ if (part.thought === true) {
46
+ grouped.reasoning += part.text
47
+ } else {
48
+ grouped.assistant += part.text
49
+ }
50
+ }
51
+
52
+ return grouped
53
+ }
54
+
55
+ /**
56
+ * Check if parts contain thought/reasoning content
57
+ * @param {Array<{thought?: boolean}>} parts
58
+ * @returns {boolean}
59
+ */
60
+ function hasThoughtParts (parts) {
61
+ return parts.some(part => part.thought === true)
62
+ }
63
+
64
+ /**
65
+ * Determine the role from a candidate and its parts
66
+ * @param {object} candidate
67
+ * @param {Array<{thought?: boolean}>} parts
68
+ * @returns {string}
69
+ */
70
+ function determineRole (candidate, parts = []) {
71
+ // Check parts for thought indicators
72
+ if (hasThoughtParts(parts)) {
73
+ return ROLES.REASONING
74
+ }
75
+
76
+ // Extract role from various possible locations
77
+ const rawRole = candidate.role ||
78
+ candidate.content?.role ||
79
+ candidate[0]?.content?.role
80
+
81
+ return normalizeRole(rawRole)
82
+ }
83
+
84
+ /**
85
+ * Normalize role to standard values
86
+ * @param {string} role
87
+ * @returns {string}
88
+ */
89
+ function normalizeRole (role) {
90
+ if (role === ROLES.MODEL) return ROLES.ASSISTANT
91
+ if (role === ROLES.ASSISTANT) return ROLES.ASSISTANT
92
+ if (role === ROLES.USER) return ROLES.USER
93
+ if (role === ROLES.REASONING) return ROLES.REASONING
94
+ return ROLES.USER // default
95
+ }
96
+
97
+ /**
98
+ * Extract metrics from response
99
+ * @param {object} response
100
+ * @returns {object}
101
+ */
102
+ function extractMetrics (response) {
103
+ const metrics = {}
104
+ const tokenUsage = response.usageMetadata
105
+
106
+ if (!tokenUsage) return metrics
107
+
108
+ if (tokenUsage.promptTokenCount) {
109
+ metrics.inputTokens = tokenUsage.promptTokenCount
110
+ }
111
+
112
+ if (tokenUsage.candidatesTokenCount) {
113
+ metrics.outputTokens = tokenUsage.candidatesTokenCount
114
+ }
115
+
116
+ const totalTokens = tokenUsage.totalTokenCount ||
117
+ (tokenUsage.promptTokenCount || 0) + (tokenUsage.candidatesTokenCount || 0)
118
+ if (totalTokens) {
119
+ metrics.totalTokens = totalTokens
120
+ }
121
+
122
+ return metrics
123
+ }
124
+
125
+ /**
126
+ * Extract metadata from config
127
+ * @param {object} config
128
+ * @returns {object}
129
+ */
130
+ function extractMetadata (config) {
131
+ if (!config) return {}
132
+
133
+ const fieldMap = {
134
+ temperature: 'temperature',
135
+ top_p: 'topP',
136
+ top_k: 'topK',
137
+ candidate_count: 'candidateCount',
138
+ max_output_tokens: 'maxOutputTokens',
139
+ stop_sequences: 'stopSequences',
140
+ response_logprobs: 'responseLogprobs',
141
+ logprobs: 'logprobs',
142
+ presence_penalty: 'presencePenalty',
143
+ frequency_penalty: 'frequencyPenalty',
144
+ seed: 'seed',
145
+ response_mime_type: 'responseMimeType',
146
+ safety_settings: 'safetySettings',
147
+ automatic_function_calling: 'automaticFunctionCalling'
148
+ }
149
+
150
+ const metadata = {}
151
+ for (const [metadataKey, configKey] of Object.entries(fieldMap)) {
152
+ metadata[metadataKey] = config[configKey] ?? null
153
+ }
154
+
155
+ return metadata
156
+ }
157
+
158
+ /**
159
+ * Format function call message
160
+ * @param {Array} parts
161
+ * @param {Array} functionCalls
162
+ * @param {string} role
163
+ * @returns {object}
164
+ */
165
+ function formatFunctionCallMessage (parts, functionCalls, role) {
166
+ const toolCalls = functionCalls.map(part => ({
167
+ name: part.functionCall.name,
168
+ arguments: part.functionCall.args,
169
+ toolId: part.functionCall.id || '',
170
+ type: 'function_call'
171
+ }))
172
+
173
+ const textParts = extractTextParts(parts)
174
+ const content = textParts.length > 0 ? textParts.join('\n') : undefined
175
+ const message = { role, toolCalls }
176
+
177
+ if (content) message.content = content
178
+
179
+ return message
180
+ }
181
+
182
+ /**
183
+ * Format function response message
184
+ * @param {Array} functionResponses
185
+ * @param {string} role
186
+ * @returns {object}
187
+ */
188
+ function formatFunctionResponseMessage (functionResponses, role) {
189
+ const toolResults = functionResponses.map(part => ({
190
+ name: part.functionResponse.name,
191
+ result: JSON.stringify(part.functionResponse.response),
192
+ toolId: part.functionResponse.id,
193
+ type: 'function_response'
194
+ }))
195
+
196
+ return {
197
+ role,
198
+ toolResults
199
+ }
200
+ }
201
+
202
+ /**
203
+ * Aggregate streaming chunks into a single response
204
+ * @param {Array} chunks
205
+ * @returns {object}
206
+ */
207
+ function aggregateStreamingChunks (chunks) {
208
+ const response = { candidates: [] }
209
+
210
+ for (const chunk of chunks) {
211
+ if (chunk.candidates) {
212
+ // Flatten candidates array
213
+ response.candidates.push(...chunk.candidates)
214
+ }
215
+ if (chunk.usageMetadata) {
216
+ response.usageMetadata = chunk.usageMetadata
217
+ }
218
+ }
219
+
220
+ return response
221
+ }
222
+
223
+ /**
224
+ * Format a content object into a message
225
+ * @param {object} content
226
+ * @returns {object}
227
+ */
228
+ function formatContentObject (content) {
229
+ const parts = content.parts || []
230
+ const role = determineRole(content, parts)
231
+
232
+ // Check if this is a thought/reasoning part
233
+ if (hasThoughtParts(parts)) {
234
+ return {
235
+ role: ROLES.REASONING,
236
+ content: extractTextParts(parts).join('\n')
237
+ }
238
+ }
239
+
240
+ // Check for function calls
241
+ const functionCalls = parts.filter(part => part.functionCall)
242
+ if (functionCalls.length > 0) {
243
+ return formatFunctionCallMessage(parts, functionCalls, role)
244
+ }
245
+
246
+ // Check for function responses
247
+ const functionResponses = parts.filter(part => part.functionResponse)
248
+ if (functionResponses.length > 0) {
249
+ return formatFunctionResponseMessage(functionResponses, role)
250
+ }
251
+
252
+ // Regular text content
253
+ return {
254
+ role,
255
+ content: extractTextParts(parts).join('\n')
256
+ }
257
+ }
258
+
259
+ /**
260
+ * Format input messages from contents
261
+ * @param {[string|{text: string}|{parts: Array<string|{text: string}>}]} [contents]
262
+ * @returns {Array}
263
+ */
264
+ function formatInputMessages (contents) {
265
+ if (!contents) return []
266
+
267
+ const contentArray = Array.isArray(contents) ? contents : [contents]
268
+ const messages = []
269
+
270
+ for (const content of contentArray) {
271
+ if (typeof content === 'string') {
272
+ messages.push({ role: ROLES.USER, content })
273
+ } else if (content.text) {
274
+ messages.push({ role: ROLES.USER, content: content.text })
275
+ } else if (content.parts) {
276
+ const message = formatContentObject(content)
277
+ if (message) messages.push(message)
278
+ } else {
279
+ messages.push({ role: ROLES.USER, content: JSON.stringify(content) })
280
+ }
281
+ }
282
+
283
+ return messages
284
+ }
285
+
286
+ /**
287
+ * Format embedding input from contents
288
+ * @param {[string|{text: string}|{parts: Array<string|{text: string}>}]} [contents]
289
+ * @returns {Array}
290
+ */
291
+ function formatEmbeddingInput (contents) {
292
+ if (!contents) return []
293
+
294
+ const contentArray = Array.isArray(contents) ? contents : [contents]
295
+ const documents = []
296
+
297
+ for (const content of contentArray) {
298
+ if (typeof content === 'string') {
299
+ documents.push({ text: content })
300
+ } else if (content.text) {
301
+ documents.push({ text: content.text })
302
+ } else if (content.parts) {
303
+ for (const part of content.parts) {
304
+ if (typeof part === 'string') {
305
+ documents.push({ text: part })
306
+ } else if (part.text) {
307
+ documents.push({ text: part.text })
308
+ }
309
+ }
310
+ }
311
+ }
312
+
313
+ return documents
314
+ }
315
+
316
+ /**
317
+ * Format a non-streaming candidate into messages
318
+ * @param {object} candidate
319
+ * @returns {Array}
320
+ */
321
+ function formatNonStreamingCandidate (candidate) {
322
+ const messages = []
323
+ const content = Array.isArray(candidate) ? candidate[0].content : candidate.content
324
+
325
+ if (!content?.parts) return messages
326
+
327
+ const { parts } = content
328
+
329
+ // Check for function calls
330
+ const functionCalls = parts.filter(part => part.functionCall)
331
+ if (functionCalls.length > 0) {
332
+ messages.push(formatFunctionCallMessage(parts, functionCalls, ROLES.ASSISTANT))
333
+ return messages
334
+ }
335
+
336
+ // Check for executable code
337
+ const executableCode = parts.find(part => part.executableCode)
338
+ if (executableCode) {
339
+ messages.push({
340
+ role: ROLES.ASSISTANT,
341
+ content: JSON.stringify({
342
+ language: executableCode.executableCode.language,
343
+ code: executableCode.executableCode.code
344
+ })
345
+ })
346
+ return messages
347
+ }
348
+
349
+ // Check for code execution result
350
+ const codeExecutionResult = parts.find(part => part.codeExecutionResult)
351
+ if (codeExecutionResult) {
352
+ messages.push({
353
+ role: ROLES.ASSISTANT,
354
+ content: JSON.stringify({
355
+ outcome: codeExecutionResult.codeExecutionResult.outcome,
356
+ output: codeExecutionResult.codeExecutionResult.output
357
+ })
358
+ })
359
+ return messages
360
+ }
361
+
362
+ // Regular text content - may contain both reasoning and assistant parts
363
+ const partsByRole = groupPartsByRole(parts)
364
+
365
+ if (partsByRole.reasoning) {
366
+ messages.push({
367
+ role: ROLES.REASONING,
368
+ content: partsByRole.reasoning
369
+ })
370
+ }
371
+
372
+ if (partsByRole.assistant) {
373
+ messages.push({
374
+ role: ROLES.ASSISTANT,
375
+ content: partsByRole.assistant
376
+ })
377
+ }
378
+
379
+ return messages
380
+ }
381
+
382
+ /**
383
+ * Format streaming output from response
384
+ * @param {object} response
385
+ * @returns {Array}
386
+ */
387
+ function formatStreamingOutput (response) {
388
+ const messages = []
389
+ const messagesByRole = new Map()
390
+
391
+ for (const candidate of response.candidates) {
392
+ const content = Array.isArray(candidate) ? candidate[0].content : candidate.content
393
+ if (!content?.parts) continue
394
+
395
+ // Skip special cases in streaming (handle them as non-streaming)
396
+ if (content.parts.some(part => part.functionCall ||
397
+ part.executableCode ||
398
+ part.codeExecutionResult)) {
399
+ messages.push(...formatNonStreamingCandidate(candidate))
400
+ continue
401
+ }
402
+
403
+ // Accumulate text parts by role
404
+ const partsByRole = groupPartsByRole(content.parts)
405
+
406
+ for (const [partRole, textContent] of Object.entries(partsByRole)) {
407
+ if (!textContent) continue
408
+
409
+ if (messagesByRole.has(partRole)) {
410
+ const index = messagesByRole.get(partRole)
411
+ messages[index].content += textContent
412
+ } else {
413
+ const messageIndex = messages.length
414
+ messages.push({ role: partRole, content: textContent })
415
+ messagesByRole.set(partRole, messageIndex)
416
+ }
417
+ }
418
+ }
419
+
420
+ return messages.length > 0 ? messages : [{ content: '' }]
421
+ }
422
+
423
+ /**
424
+ * Format non-streaming output from response
425
+ * @param {object} response
426
+ * @returns {Array}
427
+ */
428
+ function formatNonStreamingOutput (response) {
429
+ const messages = []
430
+
431
+ for (const candidate of response.candidates) {
432
+ messages.push(...formatNonStreamingCandidate(candidate))
433
+ }
434
+
435
+ return messages.length > 0 ? messages : [{ content: '' }]
436
+ }
437
+
438
+ /**
439
+ * Format output messages from response
440
+ * @param {object} response
441
+ * @param {boolean} isStreaming
442
+ * @returns {Array}
443
+ */
444
+ function formatOutputMessages (response, isStreaming = false) {
445
+ if (!response?.candidates?.length) {
446
+ return [{ content: '' }]
447
+ }
448
+
449
+ if (isStreaming) {
450
+ return formatStreamingOutput(response)
451
+ }
452
+
453
+ return formatNonStreamingOutput(response)
454
+ }
455
+
456
+ /**
457
+ * Format embedding output from response
458
+ * @param {object} response
459
+ * @returns {string}
460
+ */
461
+ function formatEmbeddingOutput (response) {
462
+ if (!response?.embeddings?.length) {
463
+ return ''
464
+ }
465
+
466
+ const embeddingCount = response.embeddings.length
467
+ const firstEmbedding = response.embeddings[0]
468
+
469
+ if (firstEmbedding.values && Array.isArray(firstEmbedding.values)) {
470
+ const embeddingDim = firstEmbedding.values.length
471
+ return `[${embeddingCount} embedding(s) returned with size ${embeddingDim}]`
472
+ }
473
+
474
+ return `[${embeddingCount} embedding(s) returned]`
475
+ }
476
+
477
+ module.exports = {
478
+ getOperation,
479
+ extractMetrics,
480
+ extractMetadata,
481
+ aggregateStreamingChunks,
482
+ formatInputMessages,
483
+ formatEmbeddingInput,
484
+ formatOutputMessages,
485
+ formatEmbeddingOutput
486
+ }
@@ -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 LangChainLLMObsChainHandler extends LangChainLLMObsHandler {
7
7
  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
  const LLM = 'llm'
8
8