dd-trace 5.53.0 → 5.55.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 (368) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/ci/cypress/plugin.js +8 -0
  3. package/ci/cypress/polyfills.js +23 -0
  4. package/ci/init.js +8 -7
  5. package/index.d.ts +33 -16
  6. package/initialize.mjs +5 -6
  7. package/package.json +40 -38
  8. package/packages/datadog-code-origin/index.js +22 -4
  9. package/packages/datadog-core/src/utils/src/get.js +1 -1
  10. package/packages/datadog-core/src/utils/src/has.js +1 -1
  11. package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
  12. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  13. package/packages/datadog-core/src/utils/src/pick.js +2 -2
  14. package/packages/datadog-core/src/utils/src/set.js +1 -1
  15. package/packages/datadog-core/src/utils/src/uniq.js +1 -1
  16. package/packages/datadog-instrumentations/src/amqp10.js +19 -17
  17. package/packages/datadog-instrumentations/src/amqplib.js +52 -35
  18. package/packages/datadog-instrumentations/src/apollo.js +2 -2
  19. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  20. package/packages/datadog-instrumentations/src/cassandra-driver.js +10 -10
  21. package/packages/datadog-instrumentations/src/child_process.js +1 -2
  22. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +89 -75
  23. package/packages/datadog-instrumentations/src/cookie-parser.js +1 -1
  24. package/packages/datadog-instrumentations/src/couchbase.js +6 -9
  25. package/packages/datadog-instrumentations/src/cucumber.js +108 -68
  26. package/packages/datadog-instrumentations/src/cypress.js +2 -1
  27. package/packages/datadog-instrumentations/src/dns.js +5 -5
  28. package/packages/datadog-instrumentations/src/elasticsearch.js +9 -10
  29. package/packages/datadog-instrumentations/src/fastify.js +7 -9
  30. package/packages/datadog-instrumentations/src/fs.js +1 -1
  31. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +35 -43
  32. package/packages/datadog-instrumentations/src/graphql.js +7 -10
  33. package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
  34. package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
  35. package/packages/datadog-instrumentations/src/hapi.js +10 -11
  36. package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
  37. package/packages/datadog-instrumentations/src/helpers/fetch.js +4 -5
  38. package/packages/datadog-instrumentations/src/helpers/hook.js +2 -3
  39. package/packages/datadog-instrumentations/src/helpers/hooks.js +0 -1
  40. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
  41. package/packages/datadog-instrumentations/src/helpers/register.js +11 -12
  42. package/packages/datadog-instrumentations/src/http/client.js +14 -20
  43. package/packages/datadog-instrumentations/src/jest.js +201 -143
  44. package/packages/datadog-instrumentations/src/kafkajs.js +52 -44
  45. package/packages/datadog-instrumentations/src/knex.js +4 -4
  46. package/packages/datadog-instrumentations/src/koa.js +2 -3
  47. package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
  48. package/packages/datadog-instrumentations/src/mariadb.js +49 -65
  49. package/packages/datadog-instrumentations/src/mocha/main.js +116 -73
  50. package/packages/datadog-instrumentations/src/mocha/utils.js +36 -12
  51. package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
  52. package/packages/datadog-instrumentations/src/mocha.js +3 -1
  53. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  54. package/packages/datadog-instrumentations/src/mysql.js +30 -37
  55. package/packages/datadog-instrumentations/src/mysql2.js +53 -47
  56. package/packages/datadog-instrumentations/src/net.js +1 -1
  57. package/packages/datadog-instrumentations/src/next.js +1 -0
  58. package/packages/datadog-instrumentations/src/nyc.js +3 -2
  59. package/packages/datadog-instrumentations/src/openai.js +22 -24
  60. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  61. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +4 -3
  62. package/packages/datadog-instrumentations/src/pg.js +3 -5
  63. package/packages/datadog-instrumentations/src/playwright.js +123 -83
  64. package/packages/datadog-instrumentations/src/protobufjs.js +3 -4
  65. package/packages/datadog-instrumentations/src/redis.js +4 -4
  66. package/packages/datadog-instrumentations/src/restify.js +9 -13
  67. package/packages/datadog-instrumentations/src/rhea.js +42 -54
  68. package/packages/datadog-instrumentations/src/router.js +30 -32
  69. package/packages/datadog-instrumentations/src/tedious.js +2 -3
  70. package/packages/datadog-instrumentations/src/vitest.js +87 -52
  71. package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
  72. package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
  73. package/packages/datadog-plugin-amqplib/src/client.js +6 -2
  74. package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
  75. package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
  76. package/packages/datadog-plugin-amqplib/src/util.js +1 -1
  77. package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
  78. package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
  79. package/packages/datadog-plugin-avsc/src/schema_iterator.js +12 -12
  80. package/packages/datadog-plugin-aws-sdk/src/base.js +15 -10
  81. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  82. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
  83. package/packages/datadog-plugin-aws-sdk/src/services/cloudwatchlogs.js +3 -5
  84. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +28 -43
  85. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  86. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +10 -11
  87. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +4 -6
  88. package/packages/datadog-plugin-aws-sdk/src/services/redshift.js +3 -5
  89. package/packages/datadog-plugin-aws-sdk/src/services/s3.js +3 -5
  90. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +2 -3
  91. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +11 -15
  92. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  93. package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
  94. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  95. package/packages/datadog-plugin-child_process/src/index.js +4 -4
  96. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
  97. package/packages/datadog-plugin-cucumber/src/index.js +60 -4
  98. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +99 -28
  99. package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
  100. package/packages/datadog-plugin-cypress/src/support.js +24 -5
  101. package/packages/datadog-plugin-dd-trace-api/src/index.js +2 -1
  102. package/packages/datadog-plugin-elasticsearch/src/index.js +1 -1
  103. package/packages/datadog-plugin-express/src/code_origin.js +30 -0
  104. package/packages/datadog-plugin-express/src/index.js +10 -12
  105. package/packages/datadog-plugin-express/src/tracing.js +19 -0
  106. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
  107. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
  108. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
  109. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +27 -10
  110. package/packages/datadog-plugin-graphql/src/execute.js +2 -2
  111. package/packages/datadog-plugin-graphql/src/index.js +10 -8
  112. package/packages/datadog-plugin-graphql/src/resolve.js +19 -12
  113. package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
  114. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
  115. package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
  116. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  117. package/packages/datadog-plugin-grpc/src/util.js +2 -2
  118. package/packages/datadog-plugin-http/src/client.js +23 -13
  119. package/packages/datadog-plugin-http2/src/client.js +24 -25
  120. package/packages/datadog-plugin-jest/src/index.js +26 -23
  121. package/packages/datadog-plugin-jest/src/util.js +8 -8
  122. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
  123. package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
  124. package/packages/datadog-plugin-kafkajs/src/producer.js +8 -3
  125. package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
  126. package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
  127. package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
  128. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
  129. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
  130. package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
  131. package/packages/datadog-plugin-mariadb/src/index.js +3 -9
  132. package/packages/datadog-plugin-mocha/src/index.js +39 -14
  133. package/packages/datadog-plugin-mongodb-core/src/index.js +3 -2
  134. package/packages/datadog-plugin-mysql/src/index.js +22 -9
  135. package/packages/datadog-plugin-mysql2/src/index.js +16 -0
  136. package/packages/datadog-plugin-net/src/tcp.js +1 -1
  137. package/packages/datadog-plugin-next/src/index.js +7 -6
  138. package/packages/datadog-plugin-openai/src/services.js +6 -10
  139. package/packages/datadog-plugin-openai/src/tracing.js +12 -18
  140. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  141. package/packages/datadog-plugin-playwright/src/index.js +25 -4
  142. package/packages/datadog-plugin-protobufjs/src/schema_iterator.js +8 -9
  143. package/packages/datadog-plugin-redis/src/index.js +2 -4
  144. package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
  145. package/packages/datadog-plugin-rhea/src/producer.js +5 -2
  146. package/packages/datadog-plugin-router/src/index.js +1 -1
  147. package/packages/datadog-plugin-selenium/src/index.js +1 -6
  148. package/packages/datadog-plugin-vitest/src/index.js +52 -35
  149. package/packages/datadog-shimmer/src/shimmer.js +4 -8
  150. package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
  151. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  152. package/packages/dd-trace/src/appsec/blocking.js +6 -20
  153. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +0 -1
  154. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +0 -1
  155. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +0 -1
  156. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +0 -1
  157. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
  158. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +5 -8
  159. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
  160. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
  161. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
  162. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
  163. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  164. package/packages/dd-trace/src/appsec/iast/index.js +1 -0
  165. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
  166. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
  167. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +16 -24
  168. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
  169. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
  170. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
  171. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
  172. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +2 -8
  173. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
  174. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  175. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +7 -8
  176. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  177. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +7 -7
  178. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +2 -3
  179. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/range-utils.js +10 -11
  180. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  181. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
  182. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
  183. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -28
  184. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
  185. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
  186. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
  187. package/packages/dd-trace/src/appsec/iast/vulnerabilities.js +0 -1
  188. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
  189. package/packages/dd-trace/src/appsec/index.js +5 -5
  190. package/packages/dd-trace/src/appsec/rasp/index.js +15 -15
  191. package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
  192. package/packages/dd-trace/src/appsec/reporter.js +232 -41
  193. package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
  194. package/packages/dd-trace/src/appsec/sdk/set_user.js +2 -2
  195. package/packages/dd-trace/src/appsec/sdk/track_event.js +3 -3
  196. package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
  197. package/packages/dd-trace/src/appsec/telemetry/index.js +31 -1
  198. package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -5
  199. package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
  200. package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
  201. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +8 -4
  202. package/packages/dd-trace/src/azure_metadata.js +9 -9
  203. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +9 -8
  204. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
  205. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +3 -2
  206. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
  207. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +3 -2
  208. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +3 -2
  209. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +3 -2
  210. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
  211. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +6 -5
  212. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +7 -6
  213. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
  214. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +3 -2
  215. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +5 -4
  216. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +12 -8
  217. package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
  218. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +3 -2
  219. package/packages/dd-trace/src/config-helper.js +89 -0
  220. package/packages/dd-trace/src/config.js +159 -129
  221. package/packages/dd-trace/src/config_stable.js +10 -7
  222. package/packages/dd-trace/src/datastreams/encoding.js +9 -9
  223. package/packages/dd-trace/src/datastreams/fnv.js +2 -2
  224. package/packages/dd-trace/src/datastreams/pathway.js +4 -4
  225. package/packages/dd-trace/src/datastreams/processor.js +5 -7
  226. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +7 -7
  227. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
  228. package/packages/dd-trace/src/datastreams/size.js +1 -1
  229. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +75 -69
  230. package/packages/dd-trace/src/debugger/devtools_client/condition.js +7 -10
  231. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
  232. package/packages/dd-trace/src/debugger/devtools_client/index.js +9 -2
  233. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
  234. package/packages/dd-trace/src/debugger/devtools_client/send.js +3 -2
  235. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +1 -2
  236. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +1 -1
  237. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +11 -14
  238. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +4 -4
  239. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
  240. package/packages/dd-trace/src/debugger/devtools_client/state.js +10 -3
  241. package/packages/dd-trace/src/debugger/index.js +1 -0
  242. package/packages/dd-trace/src/dogstatsd.js +7 -6
  243. package/packages/dd-trace/src/encode/0.4.js +14 -11
  244. package/packages/dd-trace/src/encode/0.5.js +4 -6
  245. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +8 -8
  246. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  247. package/packages/dd-trace/src/encode/tags-processors.js +1 -1
  248. package/packages/dd-trace/src/exporter.js +7 -6
  249. package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
  250. package/packages/dd-trace/src/exporters/common/docker.js +4 -3
  251. package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
  252. package/packages/dd-trace/src/exporters/common/request.js +5 -2
  253. package/packages/dd-trace/src/exporters/common/util.js +4 -2
  254. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  255. package/packages/dd-trace/src/flare/file.js +1 -5
  256. package/packages/dd-trace/src/format.js +1 -1
  257. package/packages/dd-trace/src/git_properties.js +1 -1
  258. package/packages/dd-trace/src/id.js +15 -9
  259. package/packages/dd-trace/src/iitm.js +10 -22
  260. package/packages/dd-trace/src/index.js +4 -3
  261. package/packages/dd-trace/src/lambda/handler.js +7 -6
  262. package/packages/dd-trace/src/lambda/index.js +2 -1
  263. package/packages/dd-trace/src/lambda/runtime/patch.js +7 -6
  264. package/packages/dd-trace/src/lambda/runtime/ritm.js +4 -3
  265. package/packages/dd-trace/src/llmobs/constants/tags.js +1 -0
  266. package/packages/dd-trace/src/llmobs/index.js +21 -5
  267. package/packages/dd-trace/src/llmobs/noop.js +18 -20
  268. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
  269. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
  270. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
  271. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/index.js +11 -13
  272. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
  273. package/packages/dd-trace/src/llmobs/plugins/openai.js +2 -3
  274. package/packages/dd-trace/src/llmobs/sdk.js +4 -3
  275. package/packages/dd-trace/src/llmobs/span_processor.js +1 -1
  276. package/packages/dd-trace/src/llmobs/tagger.js +129 -102
  277. package/packages/dd-trace/src/llmobs/util.js +9 -9
  278. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  279. package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
  280. package/packages/dd-trace/src/log/index.js +9 -8
  281. package/packages/dd-trace/src/log/log.js +1 -1
  282. package/packages/dd-trace/src/log/writer.js +3 -4
  283. package/packages/dd-trace/src/msgpack/chunk.js +3 -3
  284. package/packages/dd-trace/src/msgpack/encoder.js +31 -31
  285. package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
  286. package/packages/dd-trace/src/noop/span.js +4 -6
  287. package/packages/dd-trace/src/noop/tracer.js +1 -2
  288. package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
  289. package/packages/dd-trace/src/opentelemetry/tracer.js +7 -6
  290. package/packages/dd-trace/src/opentracing/propagation/log.js +10 -13
  291. package/packages/dd-trace/src/opentracing/propagation/text_map.js +40 -37
  292. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
  293. package/packages/dd-trace/src/opentracing/span.js +16 -20
  294. package/packages/dd-trace/src/opentracing/tracer.js +9 -6
  295. package/packages/dd-trace/src/payload-tagging/config/index.js +17 -21
  296. package/packages/dd-trace/src/payload-tagging/index.js +1 -1
  297. package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
  298. package/packages/dd-trace/src/pkg.js +1 -1
  299. package/packages/dd-trace/src/plugin_manager.js +4 -3
  300. package/packages/dd-trace/src/plugins/ci_plugin.js +87 -11
  301. package/packages/dd-trace/src/plugins/consumer.js +2 -2
  302. package/packages/dd-trace/src/plugins/inbound.js +5 -1
  303. package/packages/dd-trace/src/plugins/index.js +0 -1
  304. package/packages/dd-trace/src/plugins/outbound.js +4 -5
  305. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  306. package/packages/dd-trace/src/plugins/producer.js +2 -2
  307. package/packages/dd-trace/src/plugins/storage.js +2 -2
  308. package/packages/dd-trace/src/plugins/util/ci.js +28 -20
  309. package/packages/dd-trace/src/plugins/util/git.js +166 -12
  310. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
  311. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  312. package/packages/dd-trace/src/plugins/util/llm.js +27 -10
  313. package/packages/dd-trace/src/plugins/util/stacktrace.js +9 -2
  314. package/packages/dd-trace/src/plugins/util/test.js +315 -51
  315. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  316. package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
  317. package/packages/dd-trace/src/plugins/util/user-provided-git.js +14 -4
  318. package/packages/dd-trace/src/plugins/util/web.js +8 -8
  319. package/packages/dd-trace/src/priority_sampler.js +64 -53
  320. package/packages/dd-trace/src/profiling/config.js +51 -35
  321. package/packages/dd-trace/src/profiling/exporter_cli.js +20 -20
  322. package/packages/dd-trace/src/profiling/exporters/agent.js +1 -1
  323. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +7 -6
  324. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  325. package/packages/dd-trace/src/profiling/index.js +2 -1
  326. package/packages/dd-trace/src/profiling/profiler.js +44 -6
  327. package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
  328. package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
  329. package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
  330. package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
  331. package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
  332. package/packages/dd-trace/src/profiling/ssi-telemetry-mock-profiler.js +3 -1
  333. package/packages/dd-trace/src/profiling/tagger.js +21 -13
  334. package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
  335. package/packages/dd-trace/src/proxy.js +9 -10
  336. package/packages/dd-trace/src/random_sampler.js +40 -0
  337. package/packages/dd-trace/src/rate_limiter.js +4 -4
  338. package/packages/dd-trace/src/remote_config/index.js +3 -7
  339. package/packages/dd-trace/src/remote_config/manager.js +25 -13
  340. package/packages/dd-trace/src/require-package-json.js +1 -1
  341. package/packages/dd-trace/src/ritm.js +8 -8
  342. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +5 -4
  343. package/packages/dd-trace/src/sampler.js +41 -4
  344. package/packages/dd-trace/src/sampling_rule.js +12 -3
  345. package/packages/dd-trace/src/scope.js +1 -1
  346. package/packages/dd-trace/src/serverless.js +11 -4
  347. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  348. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
  349. package/packages/dd-trace/src/span_processor.js +5 -4
  350. package/packages/dd-trace/src/span_sampler.js +4 -1
  351. package/packages/dd-trace/src/standalone/tracesource.js +2 -3
  352. package/packages/dd-trace/src/standalone/tracesource_priority_sampler.js +1 -2
  353. package/packages/dd-trace/src/startup-log.js +6 -18
  354. package/packages/dd-trace/src/supported-configurations.json +439 -0
  355. package/packages/dd-trace/src/telemetry/dependencies.js +64 -59
  356. package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
  357. package/packages/dd-trace/src/telemetry/metrics.js +10 -5
  358. package/packages/dd-trace/src/telemetry/send-data.js +8 -7
  359. package/packages/dd-trace/src/telemetry/telemetry.js +31 -45
  360. package/packages/dd-trace/src/tracer.js +3 -7
  361. package/packages/dd-trace/src/util.js +1 -6
  362. package/version.js +1 -0
  363. package/packages/datadog-instrumentations/src/paperplane.js +0 -77
  364. package/packages/datadog-plugin-paperplane/src/index.js +0 -25
  365. package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
  366. package/packages/datadog-plugin-paperplane/src/server.js +0 -24
  367. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +0 -122
  368. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/header-sensitive-analyzer.js +0 -20
@@ -1,27 +1,15 @@
1
1
  'use strict'
2
2
 
3
- const satisfies = require('semifies')
4
- const logger = require('./log')
5
3
  const { addHook } = require('import-in-the-middle')
6
4
  const dc = require('dc-polyfill')
7
5
 
8
- if (satisfies(process.versions.node, '>=14.13.1')) {
9
- const moduleLoadStartChannel = dc.channel('dd-trace:moduleLoadStart')
10
- addHook((name, namespace) => {
11
- if (moduleLoadStartChannel.hasSubscribers) {
12
- moduleLoadStartChannel.publish({
13
- filename: name,
14
- module: namespace
15
- })
16
- }
17
- })
18
- module.exports = require('import-in-the-middle')
19
- } else {
20
- logger.warn('ESM is not fully supported by this version of Node.js, ' +
21
- 'so dd-trace will not intercept ESM loading.')
22
- module.exports = () => ({
23
- unhook: () => {}
24
- })
25
- module.exports.addHook = () => {}
26
- module.exports.removeHook = () => {}
27
- }
6
+ const moduleLoadStartChannel = dc.channel('dd-trace:moduleLoadStart')
7
+ addHook((name, namespace) => {
8
+ if (moduleLoadStartChannel.hasSubscribers) {
9
+ moduleLoadStartChannel.publish({
10
+ filename: name,
11
+ module: namespace
12
+ })
13
+ }
14
+ })
15
+ module.exports = require('import-in-the-middle')
@@ -1,13 +1,14 @@
1
1
  'use strict'
2
2
 
3
3
  const { isFalse } = require('./util')
4
+ const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
4
5
 
5
6
  // Global `jest` is only present in Jest workers.
6
7
  const inJestWorker = typeof jest !== 'undefined'
7
8
 
8
- const ddTraceDisabled = process.env.DD_TRACE_ENABLED
9
- ? isFalse(process.env.DD_TRACE_ENABLED)
10
- : String(process.env.OTEL_TRACES_EXPORTER).toLowerCase() === 'none'
9
+ const ddTraceDisabled = getEnvironmentVariable('DD_TRACE_ENABLED')
10
+ ? isFalse(getEnvironmentVariable('DD_TRACE_ENABLED'))
11
+ : String(getEnvironmentVariable('OTEL_TRACES_EXPORTER')).toLowerCase() === 'none'
11
12
 
12
13
  module.exports = ddTraceDisabled || inJestWorker
13
14
  ? require('./noop/proxy')
@@ -4,6 +4,7 @@ const log = require('../log')
4
4
  const { channel } = require('../../../datadog-instrumentations/src/helpers/instrument')
5
5
  const { ERROR_MESSAGE, ERROR_TYPE } = require('../constants')
6
6
  const { ImpendingTimeout } = require('./runtime/errors')
7
+ const { getEnvironmentVariable } = require('../config-helper')
7
8
 
8
9
  const globalTracer = global._ddtrace
9
10
  const tracer = globalTracer._tracer
@@ -25,11 +26,11 @@ let __lambdaTimeout
25
26
  function checkTimeout (context) {
26
27
  const remainingTimeInMillis = context.getRemainingTimeInMillis()
27
28
 
28
- let apmFlushDeadline = parseInt(process.env.DD_APM_FLUSH_DEADLINE_MILLISECONDS) || 100
29
+ let apmFlushDeadline = Number.parseInt(getEnvironmentVariable('DD_APM_FLUSH_DEADLINE_MILLISECONDS')) || 100
29
30
  apmFlushDeadline = apmFlushDeadline < 0 ? 100 : apmFlushDeadline
30
31
 
31
32
  __lambdaTimeout = setTimeout(() => {
32
- timeoutChannel.publish(undefined)
33
+ timeoutChannel.publish()
33
34
  }, remainingTimeInMillis - apmFlushDeadline)
34
35
  }
35
36
 
@@ -43,14 +44,14 @@ function checkTimeout (context) {
43
44
  */
44
45
  function crashFlush () {
45
46
  const activeSpan = tracer.scope().active()
46
- if (activeSpan !== null) {
47
+ if (activeSpan === null) {
48
+ log.debug('An impending timeout was reached, but no root span was found. No error will be tagged.')
49
+ } else {
47
50
  const error = new ImpendingTimeout('Datadog detected an impending timeout')
48
51
  activeSpan.addTags({
49
52
  [ERROR_MESSAGE]: error.message,
50
53
  [ERROR_TYPE]: error.name
51
54
  })
52
- } else {
53
- log.debug('An impending timeout was reached, but no root span was found. No error will be tagged.')
54
55
  }
55
56
 
56
57
  tracer._processor.killAll()
@@ -70,7 +71,7 @@ function extractContext (args) {
70
71
  if (context === undefined || context.getRemainingTimeInMillis === undefined) {
71
72
  context = args.length > 2 ? args[2] : undefined
72
73
  if (context === undefined || context.getRemainingTimeInMillis === undefined) {
73
- throw Error('Could not extract context')
74
+ throw new Error('Could not extract context')
74
75
  }
75
76
  }
76
77
  return context
@@ -1,12 +1,13 @@
1
1
  'use strict'
2
2
 
3
3
  const { registerLambdaHook } = require('./runtime/ritm')
4
+ const { getEnvironmentVariable } = require('../config-helper')
4
5
 
5
6
  /**
6
7
  * It is safe to do it this way, since customers will never be expected to disable
7
8
  * this specific instrumentation through the init config object.
8
9
  */
9
- const _DD_TRACE_DISABLED_INSTRUMENTATIONS = process.env.DD_TRACE_DISABLED_INSTRUMENTATIONS || ''
10
+ const _DD_TRACE_DISABLED_INSTRUMENTATIONS = getEnvironmentVariable('DD_TRACE_DISABLED_INSTRUMENTATIONS') || ''
10
11
  const _disabledInstrumentations = new Set(
11
12
  _DD_TRACE_DISABLED_INSTRUMENTATIONS ? _DD_TRACE_DISABLED_INSTRUMENTATIONS.split(',') : []
12
13
  )
@@ -6,6 +6,7 @@ const { _extractModuleNameAndHandlerPath, _extractModuleRootAndHandler, _getLamb
6
6
  const { datadog } = require('../handler')
7
7
  const { addHook } = require('../../../../datadog-instrumentations/src/helpers/instrument')
8
8
  const shimmer = require('../../../../datadog-shimmer')
9
+ const { getEnvironmentVariable } = require('../../config-helper')
9
10
 
10
11
  /**
11
12
  * Patches a Datadog Lambda module by calling `patchDatadogLambdaHandler`
@@ -57,10 +58,13 @@ function patchLambdaHandler (lambdaHandler) {
57
58
  return datadog(lambdaHandler)
58
59
  }
59
60
 
60
- const lambdaTaskRoot = process.env.LAMBDA_TASK_ROOT
61
- const originalLambdaHandler = process.env.DD_LAMBDA_HANDLER
61
+ const lambdaTaskRoot = getEnvironmentVariable('LAMBDA_TASK_ROOT')
62
+ const originalLambdaHandler = getEnvironmentVariable('DD_LAMBDA_HANDLER')
62
63
 
63
- if (originalLambdaHandler !== undefined) {
64
+ if (originalLambdaHandler === undefined) {
65
+ // Instrumentation is done manually.
66
+ addHook({ name: 'datadog-lambda-js' }, patchDatadogLambdaModule)
67
+ } else {
64
68
  const [moduleRoot, moduleAndHandler] = _extractModuleRootAndHandler(originalLambdaHandler)
65
69
  const [_module, handlerPath] = _extractModuleNameAndHandlerPath(moduleAndHandler)
66
70
 
@@ -70,7 +74,4 @@ if (originalLambdaHandler !== undefined) {
70
74
  for (const lambdaFilePath of lambdaFilePaths) {
71
75
  addHook({ name: lambdaFilePath }, patchLambdaModule(handlerPath))
72
76
  }
73
- } else {
74
- // Instrumentation is done manually.
75
- addHook({ name: 'datadog-lambda-js' }, patchDatadogLambdaModule)
76
77
  }
@@ -10,6 +10,7 @@
10
10
  const path = require('path')
11
11
 
12
12
  const log = require('../../log')
13
+ const { getEnvironmentVariable } = require('../../config-helper')
13
14
  const Hook = require('../../../../datadog-instrumentations/src/helpers/hook')
14
15
  const instrumentations = require('../../../../datadog-instrumentations/src/helpers/instrumentations')
15
16
  const {
@@ -31,7 +32,7 @@ const {
31
32
  */
32
33
  function _extractModuleRootAndHandler (fullHandler) {
33
34
  const handlerString = path.basename(fullHandler)
34
- const moduleRoot = fullHandler.substring(0, fullHandler.indexOf(handlerString))
35
+ const moduleRoot = fullHandler.slice(0, Math.max(0, fullHandler.indexOf(handlerString)))
35
36
 
36
37
  return [moduleRoot, handlerString]
37
38
  }
@@ -78,8 +79,8 @@ function _getLambdaFilePaths (lambdaStylePath) {
78
79
  * the file is required.
79
80
  */
80
81
  const registerLambdaHook = () => {
81
- const lambdaTaskRoot = process.env.LAMBDA_TASK_ROOT
82
- const originalLambdaHandler = process.env.DD_LAMBDA_HANDLER
82
+ const lambdaTaskRoot = getEnvironmentVariable('LAMBDA_TASK_ROOT')
83
+ const originalLambdaHandler = getEnvironmentVariable('DD_LAMBDA_HANDLER')
83
84
 
84
85
  if (originalLambdaHandler !== undefined && lambdaTaskRoot !== undefined) {
85
86
  const [moduleRoot, moduleAndHandler] = _extractModuleRootAndHandler(originalLambdaHandler)
@@ -10,6 +10,7 @@ module.exports = {
10
10
  METRICS: '_ml_obs.metrics',
11
11
  ML_APP: '_ml_obs.meta.ml_app',
12
12
  PROPAGATED_PARENT_ID_KEY: '_dd.p.llmobs_parent_id',
13
+ PROPAGATED_ML_APP_KEY: '_dd.p.llmobs_ml_app',
13
14
  PARENT_ID_KEY: '_ml_obs.llmobs_parent_id',
14
15
  TAGS: '_ml_obs.tags',
15
16
  NAME: '_ml_obs.name',
@@ -1,7 +1,11 @@
1
1
  'use strict'
2
2
 
3
3
  const log = require('../log')
4
- const { PROPAGATED_PARENT_ID_KEY } = require('./constants/tags')
4
+ const {
5
+ ML_APP,
6
+ PROPAGATED_ML_APP_KEY,
7
+ PROPAGATED_PARENT_ID_KEY
8
+ } = require('./constants/tags')
5
9
  const { storage } = require('./storage')
6
10
 
7
11
  const telemetry = require('./telemetry')
@@ -14,6 +18,7 @@ const flushCh = channel('llmobs:writers:flush')
14
18
  const injectCh = channel('dd-trace:span:inject')
15
19
 
16
20
  const LLMObsEvalMetricsWriter = require('./writers/evaluations')
21
+ const LLMObsTagger = require('./tagger')
17
22
  const LLMObsSpanWriter = require('./writers/spans')
18
23
  const { setAgentStrategy } = require('./writers/util')
19
24
 
@@ -35,7 +40,12 @@ let spanWriter
35
40
  /** @type {LLMObsEvalMetricsWriter | null} */
36
41
  let evalWriter
37
42
 
43
+ /** @type {import('../config')} */
44
+ let globalTracerConfig
45
+
38
46
  function enable (config) {
47
+ globalTracerConfig = config
48
+
39
49
  const startTime = performance.now()
40
50
  // create writers and eval writer append and flush channels
41
51
  // span writer append is handled by the span processor
@@ -83,14 +93,20 @@ function disable () {
83
93
  }
84
94
 
85
95
  // since LLMObs traces can extend between services and be the same trace,
86
- // we need to propogate the parent id.
96
+ // we need to propagate the parent id and mlApp.
87
97
  function handleLLMObsParentIdInjection ({ carrier }) {
88
98
  const parent = storage.getStore()?.span
89
- if (!parent) return
99
+ const mlObsSpanTags = LLMObsTagger.tagMap.get(parent)
90
100
 
91
- const parentId = parent?.context().toSpanId()
101
+ const parentContext = parent?.context()
102
+ const parentId = parentContext?.toSpanId()
103
+ const mlApp =
104
+ mlObsSpanTags?.[ML_APP] ||
105
+ parentContext?._trace?.tags?.[PROPAGATED_ML_APP_KEY] ||
106
+ globalTracerConfig.llmobs.mlApp
92
107
 
93
- carrier['x-datadog-tags'] += `,${PROPAGATED_PARENT_ID_KEY}=${parentId}`
108
+ if (parentId) carrier['x-datadog-tags'] += `,${PROPAGATED_PARENT_ID_KEY}=${parentId}`
109
+ if (mlApp) carrier['x-datadog-tags'] += `,${PROPAGATED_ML_APP_KEY}=${mlApp}`
94
110
  }
95
111
 
96
112
  function handleFlush () {
@@ -44,27 +44,25 @@ class NoopLLMObs {
44
44
  if (ctx.kind !== 'method') return target
45
45
 
46
46
  return llmobs.wrap({ name: ctx.name, _decorator: true, ...options }, target)
47
- } else {
48
- const propertyKey = ctxOrPropertyKey
49
- if (descriptor) {
50
- if (typeof descriptor.value !== 'function') return descriptor
51
-
52
- const original = descriptor.value
53
- descriptor.value = llmobs.wrap({ name: propertyKey, _decorator: true, ...options }, original)
54
-
55
- return descriptor
56
- } else {
57
- if (typeof target[propertyKey] !== 'function') return target[propertyKey]
58
-
59
- const original = target[propertyKey]
60
- Object.defineProperty(target, propertyKey, {
61
- ...Object.getOwnPropertyDescriptor(target, propertyKey),
62
- value: llmobs.wrap({ name: propertyKey, _decorator: true, ...options }, original)
63
- })
64
-
65
- return target
66
- }
67
47
  }
48
+ const propertyKey = ctxOrPropertyKey
49
+ if (descriptor) {
50
+ if (typeof descriptor.value !== 'function') return descriptor
51
+
52
+ const original = descriptor.value
53
+ descriptor.value = llmobs.wrap({ name: propertyKey, _decorator: true, ...options }, original)
54
+
55
+ return descriptor
56
+ }
57
+ if (typeof target[propertyKey] !== 'function') return target[propertyKey]
58
+
59
+ const original = target[propertyKey]
60
+ Object.defineProperty(target, propertyKey, {
61
+ ...Object.getOwnPropertyDescriptor(target, propertyKey),
62
+ value: llmobs.wrap({ name: propertyKey, _decorator: true, ...options }, original)
63
+ })
64
+
65
+ return target
68
66
  }
69
67
  }
70
68
 
@@ -9,7 +9,7 @@ const {
9
9
  parseModelId
10
10
  } = require('../../../../datadog-plugin-aws-sdk/src/services/bedrockruntime/utils')
11
11
 
12
- const ENABLED_OPERATIONS = ['invokeModel']
12
+ const ENABLED_OPERATIONS = new Set(['invokeModel'])
13
13
 
14
14
  const requestIdsToTokens = {}
15
15
 
@@ -21,7 +21,7 @@ class BedrockRuntimeLLMObsPlugin extends BaseLLMObsPlugin {
21
21
  const request = response.request
22
22
  const operation = request.operation
23
23
  // avoids instrumenting other non supported runtime operations
24
- if (!ENABLED_OPERATIONS.includes(operation)) {
24
+ if (!ENABLED_OPERATIONS.has(operation)) {
25
25
  return
26
26
  }
27
27
  const { modelProvider, modelName } = parseModelId(request.params.modelId)
@@ -40,8 +40,8 @@ class BedrockRuntimeLLMObsPlugin extends BaseLLMObsPlugin {
40
40
  const outputTokenCount = headers['x-amzn-bedrock-output-token-count']
41
41
 
42
42
  requestIdsToTokens[requestId] = {
43
- inputTokensFromHeaders: inputTokenCount && parseInt(inputTokenCount),
44
- outputTokensFromHeaders: outputTokenCount && parseInt(outputTokenCount)
43
+ inputTokensFromHeaders: inputTokenCount && Number.parseInt(inputTokenCount),
44
+ outputTokensFromHeaders: outputTokenCount && Number.parseInt(outputTokenCount)
45
45
  }
46
46
  })
47
47
  }
@@ -64,8 +64,8 @@ class BedrockRuntimeLLMObsPlugin extends BaseLLMObsPlugin {
64
64
 
65
65
  // add metadata tags
66
66
  this._tagger.tagMetadata(span, {
67
- temperature: parseFloat(requestParams.temperature) || 0.0,
68
- max_tokens: parseInt(requestParams.maxTokens) || 0
67
+ temperature: Number.parseFloat(requestParams.temperature) || 0,
68
+ max_tokens: Number.parseInt(requestParams.maxTokens) || 0
69
69
  })
70
70
 
71
71
  // add I/O tags
@@ -5,16 +5,12 @@ const { spanHasError } = require('../../../util')
5
5
 
6
6
  class LangChainLLMObsChainHandler extends LangChainLLMObsHandler {
7
7
  setMetaTags ({ span, inputs, results }) {
8
- let input, output
8
+ let input
9
9
  if (inputs) {
10
10
  input = this.formatIO(inputs)
11
11
  }
12
12
 
13
- if (!results || spanHasError(span)) {
14
- output = ''
15
- } else {
16
- output = this.formatIO(results)
17
- }
13
+ const output = !results || spanHasError(span) ? '' : this.formatIO(results)
18
14
 
19
15
  // chain spans will always be workflows
20
16
  this._tagger.tagTextIO(span, input, output)
@@ -61,12 +61,12 @@ class LangChainLLMObsChatModelHandler extends LangChainLLMObsHandler {
61
61
 
62
62
  if (!isWorkflow && !tokensSetTopLevel) {
63
63
  const { tokens, runId } = this.checkTokenUsageFromAIMessage(chatCompletionMessage)
64
- if (!tokensPerRunId[runId]) {
65
- tokensPerRunId[runId] = tokens
66
- } else {
64
+ if (tokensPerRunId[runId]) {
67
65
  tokensPerRunId[runId].inputTokens += tokens.inputTokens
68
66
  tokensPerRunId[runId].outputTokens += tokens.outputTokens
69
67
  tokensPerRunId[runId].totalTokens += tokens.totalTokens
68
+ } else {
69
+ tokensPerRunId[runId] = tokens
70
70
  }
71
71
  }
72
72
  }
@@ -23,26 +23,24 @@ class LangChainLLMObsHandler {
23
23
  return formatted
24
24
  } else if (Array.isArray(messages)) {
25
25
  return messages.map(message => this.formatIO(message))
26
- } else { // either a BaseMesage type or a string
27
- return this.getContentFromMessage(messages)
28
- }
26
+ } // either a BaseMesage type or a string
27
+ return this.getContentFromMessage(messages)
29
28
  }
30
29
 
31
30
  getContentFromMessage (message) {
32
31
  if (typeof message === 'string') {
33
32
  return message
34
- } else {
35
- try {
36
- const messageContent = {}
37
- messageContent.content = message.content || ''
33
+ }
34
+ try {
35
+ const messageContent = {}
36
+ messageContent.content = message.content || ''
38
37
 
39
- const role = this.getRole(message)
40
- if (role) messageContent.role = role
38
+ const role = this.getRole(message)
39
+ if (role) messageContent.role = role
41
40
 
42
- return messageContent
43
- } catch {
44
- return JSON.stringify(message)
45
- }
41
+ return messageContent
42
+ } catch {
43
+ return JSON.stringify(message)
46
44
  }
47
45
  }
48
46
 
@@ -9,8 +9,8 @@ const ANTHROPIC_PROVIDER_NAME = 'anthropic'
9
9
  const BEDROCK_PROVIDER_NAME = 'amazon_bedrock'
10
10
  const OPENAI_PROVIDER_NAME = 'openai'
11
11
 
12
- const SUPPORTED_INTEGRATIONS = ['openai']
13
- const LLM_SPAN_TYPES = ['llm', 'chat_model', 'embedding']
12
+ const SUPPORTED_INTEGRATIONS = new Set(['openai'])
13
+ const LLM_SPAN_TYPES = new Set(['llm', 'chat_model', 'embedding'])
14
14
  const LLM = 'llm'
15
15
  const WORKFLOW = 'workflow'
16
16
  const EMBEDDING = 'embedding'
@@ -94,18 +94,18 @@ class BaseLangChainLLMObsPlugin extends LLMObsPlugin {
94
94
  span?.context()._tags[`langchain.request.${provider}.parameters.model_kwargs.max_tokens`]
95
95
 
96
96
  if (temperature) {
97
- metadata.temperature = parseFloat(temperature)
97
+ metadata.temperature = Number.parseFloat(temperature)
98
98
  }
99
99
 
100
100
  if (maxTokens) {
101
- metadata.maxTokens = parseInt(maxTokens)
101
+ metadata.maxTokens = Number.parseInt(maxTokens)
102
102
  }
103
103
 
104
104
  this._tagger.tagMetadata(span, metadata)
105
105
  }
106
106
 
107
107
  getKind (type, provider) {
108
- if (LLM_SPAN_TYPES.includes(type)) {
108
+ if (LLM_SPAN_TYPES.has(type)) {
109
109
  const llmobsIntegration = this.getIntegrationName(type, provider)
110
110
 
111
111
  if (!this.isLLMIntegrationEnabled(llmobsIntegration)) {
@@ -129,7 +129,7 @@ class BaseLangChainLLMObsPlugin extends LLMObsPlugin {
129
129
  }
130
130
 
131
131
  isLLMIntegrationEnabled (integration) {
132
- return SUPPORTED_INTEGRATIONS.includes(integration) && pluginManager?._pluginsByName[integration]?.llmobs?._enabled
132
+ return SUPPORTED_INTEGRATIONS.has(integration) && pluginManager?._pluginsByName[integration]?.llmobs?._enabled
133
133
  }
134
134
  }
135
135
 
@@ -68,9 +68,8 @@ class OpenAiLLMObsPlugin extends LLMObsPlugin {
68
68
  return { modelProvider: 'azure_openai', client: 'AzureOpenAI' }
69
69
  } else if (baseUrl.includes('deepseek')) {
70
70
  return { modelProvider: 'deepseek', client: 'DeepSeek' }
71
- } else {
72
- return { modelProvider: 'openai', client: 'OpenAI' }
73
71
  }
72
+ return { modelProvider: 'openai', client: 'OpenAI' }
74
73
  }
75
74
 
76
75
  _extractMetrics (response) {
@@ -105,7 +104,7 @@ class OpenAiLLMObsPlugin extends LLMObsPlugin {
105
104
  const embeddingInput = embeddingInputs.map(input => ({ text: input }))
106
105
 
107
106
  if (error) {
108
- this._tagger.tagEmbeddingIO(span, embeddingInput, undefined)
107
+ this._tagger.tagEmbeddingIO(span, embeddingInput)
109
108
  return
110
109
  }
111
110
 
@@ -14,6 +14,7 @@ const Span = require('../opentracing/span')
14
14
 
15
15
  const tracerVersion = require('../../../../package.json').version
16
16
  const logger = require('../log')
17
+ const { getEnvironmentVariable } = require('../config-helper')
17
18
  const telemetry = require('./telemetry')
18
19
 
19
20
  const LLMObsTagger = require('./tagger')
@@ -47,7 +48,7 @@ class LLMObs extends NoopLLMObs {
47
48
 
48
49
  const { mlApp, agentlessEnabled } = options
49
50
 
50
- const { DD_LLMOBS_ENABLED } = process.env
51
+ const DD_LLMOBS_ENABLED = getEnvironmentVariable('DD_LLMOBS_ENABLED')
51
52
 
52
53
  const llmobsConfig = {
53
54
  mlApp,
@@ -121,7 +122,7 @@ class LLMObs extends NoopLLMObs {
121
122
  }
122
123
 
123
124
  const kind = validateKind(options.kind) // will throw if kind is undefined or not an expected kind
124
- let name = options.name || (fn?.name ? fn.name : undefined) || kind
125
+ let name = options.name || fn?.name || kind
125
126
 
126
127
  if (!name) {
127
128
  logger.warn('No span name provided for `wrap`. Defaulting to "unnamed-anonymous-function".')
@@ -285,7 +286,7 @@ class LLMObs extends NoopLLMObs {
285
286
  }
286
287
  if (!(span instanceof Span)) {
287
288
  err = 'invalid_span'
288
- throw new Error('Span must be a valid Span object.')
289
+ throw new TypeError('Span must be a valid Span object.')
289
290
  }
290
291
  if (!LLMObsTagger.tagMap.has(span)) {
291
292
  err = 'invalid_span'
@@ -158,7 +158,7 @@ class LLMObsSpanProcessor {
158
158
  const add = (obj, carrier) => {
159
159
  for (const key in obj) {
160
160
  const value = obj[key]
161
- if (!Object.prototype.hasOwnProperty.call(obj, key)) continue
161
+ if (!Object.hasOwn(obj, key)) continue
162
162
  if (typeof value === 'bigint' || isCircular(value)) {
163
163
  // mark as unserializable instead of dropping
164
164
  logger.warn(`Unserializable property found in metadata: ${key}`)