dd-trace 5.52.0 → 5.54.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 (332) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/README.md +5 -0
  3. package/index.d.ts +87 -22
  4. package/initialize.mjs +3 -4
  5. package/package.json +36 -34
  6. package/packages/datadog-core/src/utils/src/get.js +1 -1
  7. package/packages/datadog-core/src/utils/src/has.js +1 -1
  8. package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
  9. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  10. package/packages/datadog-core/src/utils/src/pick.js +2 -2
  11. package/packages/datadog-core/src/utils/src/set.js +1 -1
  12. package/packages/datadog-core/src/utils/src/uniq.js +1 -1
  13. package/packages/datadog-instrumentations/src/amqp10.js +19 -17
  14. package/packages/datadog-instrumentations/src/amqplib.js +57 -37
  15. package/packages/datadog-instrumentations/src/apollo.js +2 -2
  16. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  17. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -4
  18. package/packages/datadog-instrumentations/src/child_process.js +3 -3
  19. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +92 -62
  20. package/packages/datadog-instrumentations/src/couchbase.js +5 -4
  21. package/packages/datadog-instrumentations/src/cucumber.js +126 -84
  22. package/packages/datadog-instrumentations/src/cypress.js +2 -1
  23. package/packages/datadog-instrumentations/src/dns.js +1 -1
  24. package/packages/datadog-instrumentations/src/express.js +2 -6
  25. package/packages/datadog-instrumentations/src/fs.js +7 -6
  26. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +28 -34
  27. package/packages/datadog-instrumentations/src/graphql.js +7 -10
  28. package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
  29. package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
  30. package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
  31. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
  32. package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -1
  33. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
  34. package/packages/datadog-instrumentations/src/helpers/register.js +21 -18
  35. package/packages/datadog-instrumentations/src/http/client.js +16 -21
  36. package/packages/datadog-instrumentations/src/iovalkey.js +51 -0
  37. package/packages/datadog-instrumentations/src/jest.js +184 -87
  38. package/packages/datadog-instrumentations/src/kafkajs.js +65 -44
  39. package/packages/datadog-instrumentations/src/knex.js +4 -4
  40. package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
  41. package/packages/datadog-instrumentations/src/mariadb.js +38 -61
  42. package/packages/datadog-instrumentations/src/mocha/main.js +85 -59
  43. package/packages/datadog-instrumentations/src/mocha/utils.js +103 -82
  44. package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
  45. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  46. package/packages/datadog-instrumentations/src/mysql.js +20 -36
  47. package/packages/datadog-instrumentations/src/mysql2.js +55 -47
  48. package/packages/datadog-instrumentations/src/net.js +4 -2
  49. package/packages/datadog-instrumentations/src/next.js +7 -14
  50. package/packages/datadog-instrumentations/src/nyc.js +1 -1
  51. package/packages/datadog-instrumentations/src/openai.js +21 -23
  52. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  53. package/packages/datadog-instrumentations/src/pg.js +6 -13
  54. package/packages/datadog-instrumentations/src/playwright.js +170 -136
  55. package/packages/datadog-instrumentations/src/redis.js +3 -3
  56. package/packages/datadog-instrumentations/src/restify.js +2 -2
  57. package/packages/datadog-instrumentations/src/rhea.js +42 -54
  58. package/packages/datadog-instrumentations/src/router.js +22 -25
  59. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  60. package/packages/datadog-instrumentations/src/url.js +9 -17
  61. package/packages/datadog-instrumentations/src/vitest.js +126 -97
  62. package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
  63. package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
  64. package/packages/datadog-plugin-amqplib/src/client.js +6 -2
  65. package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
  66. package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
  67. package/packages/datadog-plugin-amqplib/src/util.js +1 -1
  68. package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
  69. package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
  70. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -2
  71. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  72. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
  73. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +24 -31
  74. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  75. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +6 -6
  76. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
  77. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -1
  78. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +4 -5
  79. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  80. package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
  81. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  82. package/packages/datadog-plugin-child_process/src/index.js +4 -4
  83. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
  84. package/packages/datadog-plugin-cucumber/src/index.js +86 -20
  85. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +97 -27
  86. package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
  87. package/packages/datadog-plugin-cypress/src/support.js +24 -5
  88. package/packages/datadog-plugin-express/src/code_origin.js +30 -0
  89. package/packages/datadog-plugin-express/src/index.js +10 -12
  90. package/packages/datadog-plugin-express/src/tracing.js +19 -0
  91. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
  92. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
  93. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
  94. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +26 -9
  95. package/packages/datadog-plugin-graphql/src/execute.js +2 -2
  96. package/packages/datadog-plugin-graphql/src/index.js +7 -6
  97. package/packages/datadog-plugin-graphql/src/resolve.js +2 -2
  98. package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
  99. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
  100. package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
  101. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  102. package/packages/datadog-plugin-grpc/src/util.js +2 -2
  103. package/packages/datadog-plugin-http/src/client.js +18 -7
  104. package/packages/datadog-plugin-http2/src/client.js +20 -20
  105. package/packages/datadog-plugin-iovalkey/src/index.js +18 -0
  106. package/packages/datadog-plugin-jest/src/index.js +36 -28
  107. package/packages/datadog-plugin-jest/src/util.js +8 -8
  108. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
  109. package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
  110. package/packages/datadog-plugin-kafkajs/src/producer.js +15 -7
  111. package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
  112. package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
  113. package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
  114. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
  115. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
  116. package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
  117. package/packages/datadog-plugin-mariadb/src/index.js +3 -9
  118. package/packages/datadog-plugin-mocha/src/index.js +88 -48
  119. package/packages/datadog-plugin-mongodb-core/src/index.js +1 -1
  120. package/packages/datadog-plugin-mysql/src/index.js +11 -9
  121. package/packages/datadog-plugin-mysql2/src/index.js +16 -0
  122. package/packages/datadog-plugin-net/src/tcp.js +1 -1
  123. package/packages/datadog-plugin-next/src/index.js +6 -5
  124. package/packages/datadog-plugin-openai/src/services.js +6 -10
  125. package/packages/datadog-plugin-openai/src/tracing.js +10 -14
  126. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  127. package/packages/datadog-plugin-playwright/src/index.js +48 -22
  128. package/packages/datadog-plugin-redis/src/index.js +9 -4
  129. package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
  130. package/packages/datadog-plugin-rhea/src/producer.js +5 -2
  131. package/packages/datadog-plugin-router/src/index.js +1 -1
  132. package/packages/datadog-plugin-selenium/src/index.js +1 -6
  133. package/packages/datadog-plugin-vitest/src/index.js +99 -72
  134. package/packages/datadog-shimmer/src/shimmer.js +163 -36
  135. package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
  136. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  137. package/packages/dd-trace/src/appsec/blocking.js +6 -20
  138. package/packages/dd-trace/src/appsec/graphql.js +2 -2
  139. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +1 -1
  140. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +1 -1
  141. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +1 -1
  142. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +4 -6
  143. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
  144. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +4 -6
  145. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
  146. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
  147. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
  148. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
  149. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  150. package/packages/dd-trace/src/appsec/iast/index.js +1 -0
  151. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
  152. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
  153. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +6 -13
  154. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
  155. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
  156. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
  157. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
  158. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -7
  159. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
  160. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  161. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +5 -7
  162. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  163. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +6 -6
  164. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -1
  165. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  166. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
  167. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
  168. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -24
  169. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
  170. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
  171. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
  172. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
  173. package/packages/dd-trace/src/appsec/index.js +15 -12
  174. package/packages/dd-trace/src/appsec/rasp/index.js +19 -17
  175. package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
  176. package/packages/dd-trace/src/appsec/rasp/utils.js +11 -6
  177. package/packages/dd-trace/src/appsec/reporter.js +233 -40
  178. package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
  179. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -2
  180. package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
  181. package/packages/dd-trace/src/appsec/telemetry/index.js +1 -2
  182. package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -14
  183. package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
  184. package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
  185. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +8 -8
  186. package/packages/dd-trace/src/azure_metadata.js +2 -7
  187. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +1 -1
  188. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
  189. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
  190. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
  191. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
  192. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
  193. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +1 -1
  194. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
  195. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +2 -2
  196. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
  197. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +1 -1
  198. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +1 -1
  199. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +8 -5
  200. package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
  201. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +1 -1
  202. package/packages/dd-trace/src/config.js +82 -51
  203. package/packages/dd-trace/src/config_stable.js +3 -3
  204. package/packages/dd-trace/src/datastreams/encoding.js +9 -9
  205. package/packages/dd-trace/src/datastreams/fnv.js +1 -1
  206. package/packages/dd-trace/src/datastreams/pathway.js +4 -4
  207. package/packages/dd-trace/src/datastreams/processor.js +5 -7
  208. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
  209. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
  210. package/packages/dd-trace/src/datastreams/size.js +1 -1
  211. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +131 -72
  212. package/packages/dd-trace/src/debugger/devtools_client/condition.js +6 -8
  213. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
  214. package/packages/dd-trace/src/debugger/devtools_client/index.js +17 -27
  215. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
  216. package/packages/dd-trace/src/debugger/devtools_client/send.js +8 -7
  217. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +16 -8
  218. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +8 -10
  219. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +3 -3
  220. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
  221. package/packages/dd-trace/src/debugger/devtools_client/state.js +31 -4
  222. package/packages/dd-trace/src/dogstatsd.js +7 -4
  223. package/packages/dd-trace/src/encode/0.4.js +9 -9
  224. package/packages/dd-trace/src/encode/0.5.js +1 -1
  225. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +3 -3
  226. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  227. package/packages/dd-trace/src/encode/tags-processors.js +1 -1
  228. package/packages/dd-trace/src/exporter.js +6 -6
  229. package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
  230. package/packages/dd-trace/src/exporters/common/docker.js +1 -1
  231. package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
  232. package/packages/dd-trace/src/exporters/common/request.js +1 -1
  233. package/packages/dd-trace/src/exporters/common/util.js +1 -1
  234. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  235. package/packages/dd-trace/src/flare/file.js +1 -5
  236. package/packages/dd-trace/src/format.js +1 -1
  237. package/packages/dd-trace/src/git_properties.js +1 -1
  238. package/packages/dd-trace/src/id.js +12 -6
  239. package/packages/dd-trace/src/iitm.js +10 -22
  240. package/packages/dd-trace/src/lambda/handler.js +6 -6
  241. package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
  242. package/packages/dd-trace/src/lambda/runtime/ritm.js +1 -1
  243. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
  244. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
  245. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
  246. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
  247. package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -1
  248. package/packages/dd-trace/src/llmobs/sdk.js +2 -2
  249. package/packages/dd-trace/src/llmobs/tagger.js +113 -99
  250. package/packages/dd-trace/src/llmobs/util.js +9 -9
  251. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  252. package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
  253. package/packages/dd-trace/src/log/index.js +4 -4
  254. package/packages/dd-trace/src/log/log.js +1 -1
  255. package/packages/dd-trace/src/log/writer.js +2 -2
  256. package/packages/dd-trace/src/msgpack/chunk.js +3 -3
  257. package/packages/dd-trace/src/msgpack/encoder.js +28 -28
  258. package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
  259. package/packages/dd-trace/src/noop/span.js +3 -5
  260. package/packages/dd-trace/src/noop/tracer.js +1 -2
  261. package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
  262. package/packages/dd-trace/src/opentelemetry/tracer.js +6 -5
  263. package/packages/dd-trace/src/opentracing/propagation/log.js +6 -8
  264. package/packages/dd-trace/src/opentracing/propagation/text_map.js +27 -23
  265. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
  266. package/packages/dd-trace/src/opentracing/span.js +9 -14
  267. package/packages/dd-trace/src/opentracing/tracer.js +9 -6
  268. package/packages/dd-trace/src/payload-tagging/index.js +1 -1
  269. package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
  270. package/packages/dd-trace/src/pkg.js +1 -1
  271. package/packages/dd-trace/src/plugins/ci_plugin.js +62 -10
  272. package/packages/dd-trace/src/plugins/consumer.js +2 -2
  273. package/packages/dd-trace/src/plugins/inbound.js +5 -1
  274. package/packages/dd-trace/src/plugins/index.js +1 -1
  275. package/packages/dd-trace/src/plugins/outbound.js +4 -5
  276. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  277. package/packages/dd-trace/src/plugins/producer.js +2 -2
  278. package/packages/dd-trace/src/plugins/storage.js +2 -2
  279. package/packages/dd-trace/src/plugins/util/ci.js +23 -15
  280. package/packages/dd-trace/src/plugins/util/git.js +165 -11
  281. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
  282. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  283. package/packages/dd-trace/src/plugins/util/llm.js +27 -10
  284. package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
  285. package/packages/dd-trace/src/plugins/util/test.js +311 -48
  286. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  287. package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
  288. package/packages/dd-trace/src/plugins/util/user-provided-git.js +12 -3
  289. package/packages/dd-trace/src/plugins/util/web.js +5 -4
  290. package/packages/dd-trace/src/priority_sampler.js +22 -22
  291. package/packages/dd-trace/src/profiling/config.js +44 -8
  292. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +5 -5
  293. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  294. package/packages/dd-trace/src/profiling/profiler.js +37 -2
  295. package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
  296. package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
  297. package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
  298. package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
  299. package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
  300. package/packages/dd-trace/src/profiling/tagger.js +3 -5
  301. package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
  302. package/packages/dd-trace/src/proxy.js +7 -13
  303. package/packages/dd-trace/src/random_sampler.js +40 -0
  304. package/packages/dd-trace/src/rate_limiter.js +4 -4
  305. package/packages/dd-trace/src/remote_config/index.js +3 -7
  306. package/packages/dd-trace/src/remote_config/manager.js +25 -13
  307. package/packages/dd-trace/src/require-package-json.js +1 -1
  308. package/packages/dd-trace/src/ritm.js +4 -4
  309. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +2 -2
  310. package/packages/dd-trace/src/sampler.js +33 -4
  311. package/packages/dd-trace/src/sampling_rule.js +12 -3
  312. package/packages/dd-trace/src/scope.js +1 -1
  313. package/packages/dd-trace/src/serverless.js +0 -48
  314. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  315. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +8 -0
  316. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
  317. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +4 -0
  318. package/packages/dd-trace/src/span_processor.js +3 -3
  319. package/packages/dd-trace/src/span_sampler.js +4 -1
  320. package/packages/dd-trace/src/standalone/tracesource.js +1 -1
  321. package/packages/dd-trace/src/startup-log.js +2 -2
  322. package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
  323. package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
  324. package/packages/dd-trace/src/telemetry/metrics.js +10 -5
  325. package/packages/dd-trace/src/telemetry/send-data.js +1 -1
  326. package/packages/dd-trace/src/telemetry/telemetry.js +23 -24
  327. package/packages/dd-trace/src/util.js +1 -1
  328. package/version.js +1 -0
  329. package/packages/datadog-instrumentations/src/paperplane.js +0 -77
  330. package/packages/datadog-plugin-paperplane/src/index.js +0 -25
  331. package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
  332. package/packages/datadog-plugin-paperplane/src/server.js +0 -24
@@ -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
  }
@@ -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
 
@@ -105,7 +105,7 @@ class OpenAiLLMObsPlugin extends LLMObsPlugin {
105
105
  const embeddingInput = embeddingInputs.map(input => ({ text: input }))
106
106
 
107
107
  if (error) {
108
- this._tagger.tagEmbeddingIO(span, embeddingInput, undefined)
108
+ this._tagger.tagEmbeddingIO(span, embeddingInput)
109
109
  return
110
110
  }
111
111
 
@@ -121,7 +121,7 @@ class LLMObs extends NoopLLMObs {
121
121
  }
122
122
 
123
123
  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
124
+ let name = options.name || fn?.name || kind
125
125
 
126
126
  if (!name) {
127
127
  logger.warn('No span name provided for `wrap`. Defaulting to "unnamed-anonymous-function".')
@@ -285,7 +285,7 @@ class LLMObs extends NoopLLMObs {
285
285
  }
286
286
  if (!(span instanceof Span)) {
287
287
  err = 'invalid_span'
288
- throw new Error('Span must be a valid Span object.')
288
+ throw new TypeError('Span must be a valid Span object.')
289
289
  }
290
290
  if (!LLMObsTagger.tagMap.has(span)) {
291
291
  err = 'invalid_span'
@@ -86,23 +86,23 @@ class LLMObsTagger {
86
86
  // TODO: similarly for the following `tag` methods,
87
87
  // how can we transition from a span weakmap to core API functionality
88
88
  tagLLMIO (span, inputData, outputData) {
89
- this._tagMessages(span, inputData, INPUT_MESSAGES)
90
- this._tagMessages(span, outputData, OUTPUT_MESSAGES)
89
+ this.#tagMessages(span, inputData, INPUT_MESSAGES)
90
+ this.#tagMessages(span, outputData, OUTPUT_MESSAGES)
91
91
  }
92
92
 
93
93
  tagEmbeddingIO (span, inputData, outputData) {
94
- this._tagDocuments(span, inputData, INPUT_DOCUMENTS)
95
- this._tagText(span, outputData, OUTPUT_VALUE)
94
+ this.#tagDocuments(span, inputData, INPUT_DOCUMENTS)
95
+ this.#tagText(span, outputData, OUTPUT_VALUE)
96
96
  }
97
97
 
98
98
  tagRetrievalIO (span, inputData, outputData) {
99
- this._tagText(span, inputData, INPUT_VALUE)
100
- this._tagDocuments(span, outputData, OUTPUT_DOCUMENTS)
99
+ this.#tagText(span, inputData, INPUT_VALUE)
100
+ this.#tagDocuments(span, outputData, OUTPUT_DOCUMENTS)
101
101
  }
102
102
 
103
103
  tagTextIO (span, inputData, outputData) {
104
- this._tagText(span, inputData, INPUT_VALUE)
105
- this._tagText(span, outputData, OUTPUT_VALUE)
104
+ this.#tagText(span, inputData, INPUT_VALUE)
105
+ this.#tagText(span, outputData, OUTPUT_VALUE)
106
106
  }
107
107
 
108
108
  tagMetadata (span, metadata) {
@@ -135,7 +135,7 @@ class LLMObsTagger {
135
135
  if (typeof value === 'number') {
136
136
  filterdMetrics[processedKey] = value
137
137
  } else {
138
- this._handleFailure(`Value for metric '${key}' must be a number, instead got ${value}`, 'invalid_metrics')
138
+ this.#handleFailure(`Value for metric '${key}' must be a number, instead got ${value}`, 'invalid_metrics')
139
139
  }
140
140
  }
141
141
 
@@ -148,19 +148,19 @@ class LLMObsTagger {
148
148
  }
149
149
 
150
150
  tagSpanTags (span, tags) {
151
- // new tags will be merged with existing tags
152
151
  const currentTags = registry.get(span)?.[TAGS]
153
152
  if (currentTags) {
154
- Object.assign(tags, currentTags)
153
+ Object.assign(currentTags, tags)
154
+ } else {
155
+ this._setTag(span, TAGS, tags)
155
156
  }
156
- this._setTag(span, TAGS, tags)
157
157
  }
158
158
 
159
159
  changeKind (span, newKind) {
160
160
  this._setTag(span, SPAN_KIND, newKind)
161
161
  }
162
162
 
163
- _tagText (span, data, key) {
163
+ #tagText (span, data, key) {
164
164
  if (data) {
165
165
  if (typeof data === 'string') {
166
166
  this._setTag(span, key, data)
@@ -169,142 +169,156 @@ class LLMObsTagger {
169
169
  this._setTag(span, key, JSON.stringify(data))
170
170
  } catch {
171
171
  const type = key === INPUT_VALUE ? 'input' : 'output'
172
- this._handleFailure(`Failed to parse ${type} value, must be JSON serializable.`, 'invalid_io_text')
172
+ this.#handleFailure(`Failed to parse ${type} value, must be JSON serializable.`, 'invalid_io_text')
173
173
  }
174
174
  }
175
175
  }
176
176
  }
177
177
 
178
- _tagDocuments (span, data, key) {
179
- if (data) {
180
- if (!Array.isArray(data)) {
181
- data = [data]
182
- }
178
+ #tagDocuments (span, data, key) {
179
+ if (!data) {
180
+ return
181
+ }
183
182
 
184
- const documents = data.map(document => {
185
- if (typeof document === 'string') {
186
- return { text: document }
187
- }
183
+ if (!Array.isArray(data)) {
184
+ data = [data]
185
+ }
188
186
 
189
- if (document == null || typeof document !== 'object') {
190
- this._handleFailure('Documents must be a string, object, or list of objects.', 'invalid_embedding_io')
191
- return undefined
192
- }
187
+ const documents = []
188
+ for (const document of data) {
189
+ if (typeof document === 'string') {
190
+ documents.push({ text: document })
191
+ continue
192
+ }
193
193
 
194
- const { text, name, id, score } = document
195
- let validDocument = true
194
+ if (document == null || typeof document !== 'object') {
195
+ this.#handleFailure('Documents must be a string, object, or list of objects.', 'invalid_embedding_io')
196
+ continue
197
+ }
196
198
 
197
- if (typeof text !== 'string') {
198
- this._handleFailure('Document text must be a string.', 'invalid_embedding_io')
199
- validDocument = false
200
- }
199
+ const { text, name, id, score } = document
201
200
 
202
- const documentObj = { text }
201
+ const valid = typeof text === 'string'
202
+ if (!valid) {
203
+ this.#handleFailure('Document text must be a string.', 'invalid_embedding_io')
204
+ }
203
205
 
204
- validDocument = this._tagConditionalString(name, 'Document name', documentObj, 'name') && validDocument
205
- validDocument = this._tagConditionalString(id, 'Document ID', documentObj, 'id') && validDocument
206
- validDocument = this._tagConditionalNumber(score, 'Document score', documentObj, 'score') && validDocument
206
+ const documentObj = { text }
207
207
 
208
- return validDocument ? documentObj : undefined
209
- }).filter(doc => !!doc)
208
+ const condition1 = this.#tagConditionalString(name, 'Document name', documentObj, 'name')
209
+ const condition2 = this.#tagConditionalString(id, 'Document ID', documentObj, 'id')
210
+ const condition3 = this.#tagConditionalNumber(score, 'Document score', documentObj, 'score')
210
211
 
211
- if (documents.length) {
212
- this._setTag(span, key, documents)
212
+ if (valid && condition1 && condition2 && condition3) {
213
+ documents.push(documentObj)
213
214
  }
214
215
  }
215
- }
216
216
 
217
- _tagMessages (span, data, key) {
218
- if (data) {
219
- if (!Array.isArray(data)) {
220
- data = [data]
221
- }
217
+ if (documents.length) {
218
+ this._setTag(span, key, documents)
219
+ }
220
+ }
222
221
 
223
- const messages = data.map(message => {
224
- if (typeof message === 'string') {
225
- return { content: message }
226
- }
222
+ #filterToolCalls (toolCalls) {
223
+ if (!Array.isArray(toolCalls)) {
224
+ toolCalls = [toolCalls]
225
+ }
227
226
 
228
- if (message == null || typeof message !== 'object') {
229
- this._handleFailure('Messages must be a string, object, or list of objects', 'invalid_io_messages')
230
- return undefined
231
- }
227
+ const filteredToolCalls = []
228
+ for (const toolCall of toolCalls) {
229
+ if (typeof toolCall !== 'object') {
230
+ this.#handleFailure('Tool call must be an object.', 'invalid_io_messages')
231
+ continue
232
+ }
232
233
 
233
- let validMessage = true
234
+ const { name, arguments: args, toolId, type } = toolCall
235
+ const toolCallObj = {}
234
236
 
235
- const { content = '', role } = message
236
- let toolCalls = message.toolCalls
237
- const messageObj = { content }
237
+ const condition1 = this.#tagConditionalString(name, 'Tool name', toolCallObj, 'name')
238
+ const condition2 = this.#tagConditionalObject(args, 'Tool arguments', toolCallObj, 'arguments')
239
+ const condition3 = this.#tagConditionalString(toolId, 'Tool ID', toolCallObj, 'tool_id')
240
+ const condition4 = this.#tagConditionalString(type, 'Tool type', toolCallObj, 'type')
238
241
 
239
- if (typeof content !== 'string') {
240
- this._handleFailure('Message content must be a string.', 'invalid_io_messages')
241
- validMessage = false
242
- }
242
+ if (condition1 && condition2 && condition3 && condition4) {
243
+ filteredToolCalls.push(toolCallObj)
244
+ }
245
+ }
246
+ return filteredToolCalls
247
+ }
243
248
 
244
- validMessage = this._tagConditionalString(role, 'Message role', messageObj, 'role') && validMessage
249
+ #tagMessages (span, data, key) {
250
+ if (!data) {
251
+ return
252
+ }
253
+ if (!Array.isArray(data)) {
254
+ data = [data]
255
+ }
245
256
 
246
- if (toolCalls) {
247
- if (!Array.isArray(toolCalls)) {
248
- toolCalls = [toolCalls]
249
- }
257
+ const messages = []
250
258
 
251
- const filteredToolCalls = toolCalls.map(toolCall => {
252
- if (typeof toolCall !== 'object') {
253
- this._handleFailure('Tool call must be an object.', 'invalid_io_messages')
254
- return undefined
255
- }
259
+ for (const message of data) {
260
+ if (typeof message === 'string') {
261
+ messages.push({ content: message })
262
+ continue
263
+ }
264
+ if (message == null || typeof message !== 'object') {
265
+ this.#handleFailure('Messages must be a string, object, or list of objects', 'invalid_io_messages')
266
+ continue
267
+ }
256
268
 
257
- let validTool = true
269
+ const { content = '', role } = message
270
+ const toolCalls = message.toolCalls
271
+ const messageObj = { content }
258
272
 
259
- const { name, arguments: args, toolId, type } = toolCall
260
- const toolCallObj = {}
273
+ const valid = typeof content === 'string'
274
+ if (!valid) {
275
+ this.#handleFailure('Message content must be a string.', 'invalid_io_messages')
276
+ }
261
277
 
262
- validTool = this._tagConditionalString(name, 'Tool name', toolCallObj, 'name') && validTool
263
- validTool = this._tagConditionalObject(args, 'Tool arguments', toolCallObj, 'arguments') && validTool
264
- validTool = this._tagConditionalString(toolId, 'Tool ID', toolCallObj, 'tool_id') && validTool
265
- validTool = this._tagConditionalString(type, 'Tool type', toolCallObj, 'type') && validTool
278
+ const condition = this.#tagConditionalString(role, 'Message role', messageObj, 'role')
266
279
 
267
- return validTool ? toolCallObj : undefined
268
- }).filter(toolCall => !!toolCall)
280
+ if (toolCalls) {
281
+ const filteredToolCalls = this.#filterToolCalls(toolCalls)
269
282
 
270
- if (filteredToolCalls.length) {
271
- messageObj.tool_calls = filteredToolCalls
272
- }
283
+ if (filteredToolCalls.length) {
284
+ messageObj.tool_calls = filteredToolCalls
273
285
  }
286
+ }
274
287
 
275
- return validMessage ? messageObj : undefined
276
- }).filter(msg => !!msg)
277
-
278
- if (messages.length) {
279
- this._setTag(span, key, messages)
288
+ if (valid && condition) {
289
+ messages.push(messageObj)
280
290
  }
281
291
  }
292
+
293
+ if (messages.length) {
294
+ this._setTag(span, key, messages)
295
+ }
282
296
  }
283
297
 
284
- _tagConditionalString (data, type, carrier, key) {
298
+ #tagConditionalString (data, type, carrier, key) {
285
299
  if (!data) return true
286
300
  if (typeof data !== 'string') {
287
- this._handleFailure(`"${type}" must be a string.`)
301
+ this.#handleFailure(`"${type}" must be a string.`)
288
302
  return false
289
303
  }
290
304
  carrier[key] = data
291
305
  return true
292
306
  }
293
307
 
294
- _tagConditionalNumber (data, type, carrier, key) {
308
+ #tagConditionalNumber (data, type, carrier, key) {
295
309
  if (!data) return true
296
310
  if (typeof data !== 'number') {
297
- this._handleFailure(`"${type}" must be a number.`)
311
+ this.#handleFailure(`"${type}" must be a number.`)
298
312
  return false
299
313
  }
300
314
  carrier[key] = data
301
315
  return true
302
316
  }
303
317
 
304
- _tagConditionalObject (data, type, carrier, key) {
318
+ #tagConditionalObject (data, type, carrier, key) {
305
319
  if (!data) return true
306
320
  if (typeof data !== 'object') {
307
- this._handleFailure(`"${type}" must be an object.`)
321
+ this.#handleFailure(`"${type}" must be an object.`)
308
322
  return false
309
323
  }
310
324
  carrier[key] = data
@@ -313,7 +327,7 @@ class LLMObsTagger {
313
327
 
314
328
  // any public-facing LLMObs APIs using this tagger should not soft fail
315
329
  // auto-instrumentation should soft fail
316
- _handleFailure (msg, errorTag) {
330
+ #handleFailure (msg, errorTag) {
317
331
  if (this.softFail) {
318
332
  log.warn(msg)
319
333
  } else {
@@ -328,7 +342,7 @@ class LLMObsTagger {
328
342
  _register (span) {
329
343
  if (!this._config.llmobs.enabled) return
330
344
  if (registry.has(span)) {
331
- this._handleFailure(`LLMObs Span "${span._name}" already registered.`)
345
+ this.#handleFailure(`LLMObs Span "${span._name}" already registered.`)
332
346
  return
333
347
  }
334
348
 
@@ -338,7 +352,7 @@ class LLMObsTagger {
338
352
  _setTag (span, key, value) {
339
353
  if (!this._config.llmobs.enabled) return
340
354
  if (!registry.has(span)) {
341
- this._handleFailure(`Span "${span._name}" must be an LLMObs generated span.`)
355
+ this.#handleFailure(`Span "${span._name}" must be an LLMObs generated span.`)
342
356
  return
343
357
  }
344
358
 
@@ -2,15 +2,13 @@
2
2
 
3
3
  const { SPAN_KINDS } = require('./constants/tags')
4
4
 
5
- function encodeUnicode (str) {
6
- if (!str) return str
7
- return str.split('').map(char => {
8
- const code = char.charCodeAt(0)
9
- if (code > 127) {
10
- return `\\u${code.toString(16).padStart(4, '0')}`
11
- }
12
- return char
13
- }).join('')
5
+ function encodeUnicode (str = '') {
6
+ let result = ''
7
+ for (let i = 0; i < str.length; i++) {
8
+ const code = str.charCodeAt(i)
9
+ result += code > 127 ? `\\u${code.toString(16).padStart(4, '0')}` : str[i]
10
+ }
11
+ return result
14
12
  }
15
13
 
16
14
  function validateKind (kind) {
@@ -107,6 +105,8 @@ function findArgumentsBounds (str) {
107
105
  let end = -1
108
106
  let closerCount = 0
109
107
 
108
+ // TODO(BridgeAR): This "breaks" up codePoints.
109
+ // Investigate if this is a problem.
110
110
  for (let i = 0; i < str.length; i++) {
111
111
  const char = str[i]
112
112
 
@@ -157,7 +157,7 @@ class BaseLLMObsWriter {
157
157
  return encodeUnicode(value) // serialize unicode characters
158
158
  }
159
159
  return value
160
- }).replace(/\\\\u/g, '\\u') // remove double escaping
160
+ }).replace(/\\\\u/g, String.raw`\u`) // remove double escaping
161
161
  }
162
162
  }
163
163
 
@@ -27,7 +27,7 @@ function setAgentStrategy (config, setWritersAgentlessValue) {
27
27
  }
28
28
 
29
29
  const endpoints = agentInfo.endpoints
30
- const hasEndpoint = Array.isArray(endpoints) && endpoints.some(endpoint => endpoint === EVP_PROXY_AGENT_BASE_PATH)
30
+ const hasEndpoint = Array.isArray(endpoints) && endpoints.includes(EVP_PROXY_AGENT_BASE_PATH)
31
31
  setWritersAgentlessValue(!hasEndpoint)
32
32
  })
33
33
  }
@@ -95,7 +95,7 @@ const log = {
95
95
  return this._deprecate(code, message)
96
96
  },
97
97
 
98
- isEnabled (fleetStableConfigValue = undefined, localStableConfigValue = undefined) {
98
+ isEnabled (fleetStableConfigValue, localStableConfigValue) {
99
99
  return isTrue(coalesce(
100
100
  fleetStableConfigValue,
101
101
  process.env?.DD_TRACE_DEBUG,
@@ -106,9 +106,9 @@ const log = {
106
106
  },
107
107
 
108
108
  getLogLevel (
109
- optionsValue = undefined,
110
- fleetStableConfigValue = undefined,
111
- localStableConfigValue = undefined
109
+ optionsValue,
110
+ fleetStableConfigValue,
111
+ localStableConfigValue
112
112
  ) {
113
113
  return coalesce(
114
114
  optionsValue,
@@ -23,7 +23,7 @@ class Log {
23
23
  static parse (...args) {
24
24
  let message, cause, delegate
25
25
 
26
- const lastArg = args[args.length - 1]
26
+ const lastArg = args.at(-1)
27
27
  if (lastArg && typeof lastArg === 'object' && lastArg.stack) { // lastArg instanceof Error?
28
28
  cause = args.pop()
29
29
  }
@@ -42,7 +42,7 @@ function toggle (enable, level) {
42
42
  }
43
43
 
44
44
  function use (newLogger) {
45
- if (newLogger && newLogger.debug instanceof Function && newLogger.error instanceof Function) {
45
+ if (typeof newLogger?.debug === 'function' && typeof newLogger.error === 'function') {
46
46
  logger = newLogger
47
47
  }
48
48
  }
@@ -54,7 +54,7 @@ function reset () {
54
54
  }
55
55
 
56
56
  function getErrorLog (err) {
57
- if (err && typeof err.delegate === 'function') {
57
+ if (typeof err?.delegate === 'function') {
58
58
  const result = err.delegate()
59
59
  return Array.isArray(result) ? Log.parse(...result) : Log.parse(result)
60
60
  } else {
@@ -21,10 +21,10 @@ class Chunk {
21
21
 
22
22
  if (length < 0x20) { // fixstr
23
23
  this.reserve(length + 1)
24
- this.buffer[offset] = length | 0xa0
25
- } else if (length < 0x100000000) { // str 32
24
+ this.buffer[offset] = length | 0xA0
25
+ } else if (length < 0x1_00_00_00_00) { // str 32
26
26
  this.reserve(length + 5)
27
- this.buffer[offset] = 0xdb
27
+ this.buffer[offset] = 0xDB
28
28
  this.buffer[offset + 1] = length >> 24
29
29
  this.buffer[offset + 2] = length >> 16
30
30
  this.buffer[offset + 3] = length >> 8