dd-trace 5.80.0 → 5.82.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (460) hide show
  1. package/LICENSE-3rdparty.csv +79 -88
  2. package/ext/tags.d.ts +1 -0
  3. package/ext/tags.js +1 -0
  4. package/index.d.ts +42 -35
  5. package/loader-hook.mjs +16 -4
  6. package/package.json +33 -56
  7. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  8. package/packages/datadog-esbuild/index.js +44 -26
  9. package/packages/datadog-esbuild/src/utils.js +14 -2
  10. package/packages/datadog-instrumentations/index.js +1 -0
  11. package/packages/datadog-instrumentations/src/aerospike.js +3 -2
  12. package/packages/datadog-instrumentations/src/ai.js +2 -2
  13. package/packages/datadog-instrumentations/src/amqp10.js +1 -1
  14. package/packages/datadog-instrumentations/src/amqplib.js +4 -4
  15. package/packages/datadog-instrumentations/src/anthropic.js +14 -2
  16. package/packages/datadog-instrumentations/src/apollo-server-core.js +2 -2
  17. package/packages/datadog-instrumentations/src/apollo-server.js +1 -1
  18. package/packages/datadog-instrumentations/src/apollo.js +3 -2
  19. package/packages/datadog-instrumentations/src/avsc.js +1 -1
  20. package/packages/datadog-instrumentations/src/aws-sdk.js +6 -2
  21. package/packages/datadog-instrumentations/src/azure-event-hubs.js +4 -3
  22. package/packages/datadog-instrumentations/src/azure-functions.js +2 -2
  23. package/packages/datadog-instrumentations/src/azure-service-bus.js +3 -4
  24. package/packages/datadog-instrumentations/src/bluebird.js +1 -1
  25. package/packages/datadog-instrumentations/src/bullmq.js +11 -0
  26. package/packages/datadog-instrumentations/src/bunyan.js +1 -1
  27. package/packages/datadog-instrumentations/src/cassandra-driver.js +1 -1
  28. package/packages/datadog-instrumentations/src/child_process.js +2 -2
  29. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +3 -3
  30. package/packages/datadog-instrumentations/src/couchbase.js +1 -1
  31. package/packages/datadog-instrumentations/src/crypto.js +1 -1
  32. package/packages/datadog-instrumentations/src/cucumber.js +12 -13
  33. package/packages/datadog-instrumentations/src/cypress.js +1 -1
  34. package/packages/datadog-instrumentations/src/dns.js +1 -1
  35. package/packages/datadog-instrumentations/src/elasticsearch.js +1 -1
  36. package/packages/datadog-instrumentations/src/express-mongo-sanitize.js +1 -1
  37. package/packages/datadog-instrumentations/src/express.js +1 -1
  38. package/packages/datadog-instrumentations/src/find-my-way.js +6 -5
  39. package/packages/datadog-instrumentations/src/fs.js +1 -1
  40. package/packages/datadog-instrumentations/src/generic-pool.js +1 -1
  41. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +137 -15
  42. package/packages/datadog-instrumentations/src/google-cloud-vertexai.js +2 -3
  43. package/packages/datadog-instrumentations/src/google-genai.js +120 -0
  44. package/packages/datadog-instrumentations/src/graphql.js +21 -1
  45. package/packages/datadog-instrumentations/src/grpc/client.js +1 -1
  46. package/packages/datadog-instrumentations/src/grpc/server.js +1 -1
  47. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +1 -1
  48. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
  49. package/packages/datadog-instrumentations/src/helpers/hooks.js +5 -1
  50. package/packages/datadog-instrumentations/src/helpers/instrument.js +11 -1
  51. package/packages/datadog-instrumentations/src/helpers/register.js +12 -5
  52. package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +27 -0
  53. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +152 -0
  54. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/bullmq.json +106 -0
  55. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +6 -0
  56. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/langchain.js +237 -0
  57. package/packages/datadog-instrumentations/src/helpers/rewriter/loader.js +9 -0
  58. package/packages/datadog-instrumentations/src/helpers/rewriter/loader.mjs +11 -0
  59. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +139 -0
  60. package/packages/datadog-instrumentations/src/helpers/router-helper.js +1 -1
  61. package/packages/datadog-instrumentations/src/helpers/shared-utils.js +9 -0
  62. package/packages/datadog-instrumentations/src/hono.js +55 -10
  63. package/packages/datadog-instrumentations/src/ioredis.js +1 -1
  64. package/packages/datadog-instrumentations/src/iovalkey.js +1 -1
  65. package/packages/datadog-instrumentations/src/jest.js +2 -2
  66. package/packages/datadog-instrumentations/src/kafkajs.js +3 -3
  67. package/packages/datadog-instrumentations/src/knex.js +1 -1
  68. package/packages/datadog-instrumentations/src/langchain.js +3 -109
  69. package/packages/datadog-instrumentations/src/ldapjs.js +1 -1
  70. package/packages/datadog-instrumentations/src/light-my-request.js +93 -0
  71. package/packages/datadog-instrumentations/src/limitd-client.js +1 -1
  72. package/packages/datadog-instrumentations/src/lodash.js +1 -2
  73. package/packages/datadog-instrumentations/src/mariadb.js +1 -2
  74. package/packages/datadog-instrumentations/src/memcached.js +1 -1
  75. package/packages/datadog-instrumentations/src/mocha/main.js +1 -1
  76. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  77. package/packages/datadog-instrumentations/src/mongodb.js +1 -1
  78. package/packages/datadog-instrumentations/src/mongoose.js +1 -1
  79. package/packages/datadog-instrumentations/src/mquery.js +1 -1
  80. package/packages/datadog-instrumentations/src/mysql.js +1 -1
  81. package/packages/datadog-instrumentations/src/mysql2.js +2 -2
  82. package/packages/datadog-instrumentations/src/net.js +1 -1
  83. package/packages/datadog-instrumentations/src/next.js +1 -1
  84. package/packages/datadog-instrumentations/src/nyc.js +1 -1
  85. package/packages/datadog-instrumentations/src/openai.js +2 -2
  86. package/packages/datadog-instrumentations/src/opensearch.js +1 -1
  87. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  88. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +1 -1
  89. package/packages/datadog-instrumentations/src/pg.js +3 -3
  90. package/packages/datadog-instrumentations/src/pino.js +1 -1
  91. package/packages/datadog-instrumentations/src/playwright.js +46 -17
  92. package/packages/datadog-instrumentations/src/prisma.js +52 -37
  93. package/packages/datadog-instrumentations/src/process.js +1 -1
  94. package/packages/datadog-instrumentations/src/promise-js.js +1 -1
  95. package/packages/datadog-instrumentations/src/promise.js +1 -1
  96. package/packages/datadog-instrumentations/src/protobufjs.js +1 -1
  97. package/packages/datadog-instrumentations/src/q.js +1 -1
  98. package/packages/datadog-instrumentations/src/redis.js +1 -1
  99. package/packages/datadog-instrumentations/src/rhea.js +1 -1
  100. package/packages/datadog-instrumentations/src/router.js +1 -1
  101. package/packages/datadog-instrumentations/src/selenium.js +4 -2
  102. package/packages/datadog-instrumentations/src/sequelize.js +1 -2
  103. package/packages/datadog-instrumentations/src/sharedb.js +1 -1
  104. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  105. package/packages/datadog-instrumentations/src/undici.js +4 -4
  106. package/packages/datadog-instrumentations/src/url.js +1 -1
  107. package/packages/datadog-instrumentations/src/vitest.js +1 -1
  108. package/packages/datadog-instrumentations/src/vm.js +1 -1
  109. package/packages/datadog-instrumentations/src/when.js +1 -1
  110. package/packages/datadog-instrumentations/src/winston.js +1 -1
  111. package/packages/datadog-instrumentations/src/ws.js +38 -19
  112. package/packages/datadog-plugin-amqp10/src/index.js +1 -1
  113. package/packages/datadog-plugin-amqplib/src/index.js +1 -1
  114. package/packages/datadog-plugin-anthropic/src/index.js +1 -1
  115. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/index.js +1 -1
  116. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +4 -4
  117. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  118. package/packages/datadog-plugin-aws-sdk/src/util.js +3 -3
  119. package/packages/datadog-plugin-azure-event-hubs/src/index.js +1 -1
  120. package/packages/datadog-plugin-azure-event-hubs/src/producer.js +19 -5
  121. package/packages/datadog-plugin-azure-service-bus/src/index.js +1 -1
  122. package/packages/datadog-plugin-azure-service-bus/src/producer.js +4 -0
  123. package/packages/datadog-plugin-bullmq/src/consumer.js +60 -0
  124. package/packages/datadog-plugin-bullmq/src/index.js +18 -0
  125. package/packages/datadog-plugin-bullmq/src/producer.js +178 -0
  126. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +1 -1
  127. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/index.js +1 -1
  128. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +23 -2
  129. package/packages/datadog-plugin-cypress/src/plugin.js +2 -2
  130. package/packages/datadog-plugin-cypress/src/support.js +73 -31
  131. package/packages/datadog-plugin-express/src/index.js +1 -1
  132. package/packages/datadog-plugin-fastify/src/index.js +1 -1
  133. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +13 -3
  134. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +171 -12
  135. package/packages/datadog-plugin-google-cloud-pubsub/src/index.js +1 -2
  136. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +160 -13
  137. package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +217 -0
  138. package/packages/datadog-plugin-google-cloud-vertexai/src/index.js +1 -1
  139. package/packages/datadog-plugin-google-genai/src/index.js +17 -0
  140. package/packages/datadog-plugin-google-genai/src/tracing.js +41 -0
  141. package/packages/datadog-plugin-graphql/src/resolve.js +1 -1
  142. package/packages/datadog-plugin-graphql/src/tools/transforms.js +5 -4
  143. package/packages/datadog-plugin-grpc/src/index.js +1 -1
  144. package/packages/datadog-plugin-http/src/client.js +2 -1
  145. package/packages/datadog-plugin-http/src/index.js +25 -5
  146. package/packages/datadog-plugin-http2/src/client.js +2 -2
  147. package/packages/datadog-plugin-http2/src/index.js +1 -1
  148. package/packages/datadog-plugin-jest/src/util.js +1 -1
  149. package/packages/datadog-plugin-kafkajs/src/index.js +1 -1
  150. package/packages/datadog-plugin-langchain/src/index.js +1 -1
  151. package/packages/datadog-plugin-langchain/src/tracing.js +7 -3
  152. package/packages/datadog-plugin-moleculer/src/index.js +1 -1
  153. package/packages/datadog-plugin-mongodb-core/src/index.js +6 -2
  154. package/packages/datadog-plugin-next/src/index.js +11 -3
  155. package/packages/datadog-plugin-openai/src/index.js +1 -1
  156. package/packages/datadog-plugin-openai/src/stream-helpers.js +30 -10
  157. package/packages/datadog-plugin-openai/src/tracing.js +2 -2
  158. package/packages/datadog-plugin-rhea/src/index.js +1 -1
  159. package/packages/datadog-plugin-ws/src/close.js +56 -3
  160. package/packages/datadog-plugin-ws/src/index.js +4 -0
  161. package/packages/datadog-plugin-ws/src/producer.js +39 -4
  162. package/packages/datadog-plugin-ws/src/receiver.js +39 -3
  163. package/packages/datadog-plugin-ws/src/server.js +13 -1
  164. package/packages/datadog-plugin-ws/src/util.js +107 -0
  165. package/packages/datadog-shimmer/src/shimmer.js +2 -2
  166. package/packages/dd-trace/src/aiguard/sdk.js +21 -13
  167. package/packages/dd-trace/src/appsec/api_security_sampler.js +1 -1
  168. package/packages/dd-trace/src/appsec/graphql.js +2 -2
  169. package/packages/dd-trace/src/appsec/iast/analyzers/code-injection-analyzer.js +1 -1
  170. package/packages/dd-trace/src/appsec/iast/analyzers/command-injection-analyzer.js +1 -1
  171. package/packages/dd-trace/src/appsec/iast/analyzers/cookie-analyzer.js +1 -1
  172. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-base-analyzer.js +1 -1
  173. package/packages/dd-trace/src/appsec/iast/analyzers/injection-analyzer.js +1 -1
  174. package/packages/dd-trace/src/appsec/iast/analyzers/ldap-injection-analyzer.js +1 -1
  175. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +3 -3
  176. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +1 -1
  177. package/packages/dd-trace/src/appsec/iast/analyzers/ssrf-analyzer.js +1 -1
  178. package/packages/dd-trace/src/appsec/iast/analyzers/untrusted-deserialization-analyzer.js +1 -1
  179. package/packages/dd-trace/src/appsec/iast/analyzers/unvalidated-redirect-analyzer.js +1 -1
  180. package/packages/dd-trace/src/appsec/iast/analyzers/weak-cipher-analyzer.js +1 -1
  181. package/packages/dd-trace/src/appsec/iast/analyzers/weak-hash-analyzer.js +3 -2
  182. package/packages/dd-trace/src/appsec/iast/analyzers/weak-randomness-analyzer.js +1 -1
  183. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  184. package/packages/dd-trace/src/appsec/iast/index.js +5 -5
  185. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +1 -1
  186. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +1 -1
  187. package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +1 -2
  188. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +1 -1
  189. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -1
  190. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  191. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +11 -16
  192. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +1 -1
  193. package/packages/dd-trace/src/appsec/iast/telemetry/namespaces.js +1 -1
  194. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +4 -4
  195. package/packages/dd-trace/src/appsec/index.js +8 -8
  196. package/packages/dd-trace/src/appsec/rasp/command_injection.js +1 -1
  197. package/packages/dd-trace/src/appsec/rasp/index.js +1 -1
  198. package/packages/dd-trace/src/appsec/rasp/lfi.js +1 -1
  199. package/packages/dd-trace/src/appsec/rc-products.js +10 -0
  200. package/packages/dd-trace/src/appsec/recommended.json +230 -3
  201. package/packages/dd-trace/src/appsec/remote_config.js +177 -0
  202. package/packages/dd-trace/src/appsec/reporter.js +3 -7
  203. package/packages/dd-trace/src/appsec/rule_manager.js +37 -20
  204. package/packages/dd-trace/src/appsec/sdk/index.js +1 -1
  205. package/packages/dd-trace/src/appsec/sdk/set_user.js +1 -1
  206. package/packages/dd-trace/src/appsec/sdk/track_event.js +2 -2
  207. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -2
  208. package/packages/dd-trace/src/appsec/user_tracking.js +2 -2
  209. package/packages/dd-trace/src/appsec/waf/index.js +17 -3
  210. package/packages/dd-trace/src/appsec/waf/waf_manager.js +11 -0
  211. package/packages/dd-trace/src/azure_metadata.js +8 -2
  212. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +8 -6
  213. package/packages/dd-trace/src/ci-visibility/exporters/agentless/index.js +2 -2
  214. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +1 -1
  215. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +1 -1
  216. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +4 -2
  217. package/packages/dd-trace/src/config/remote_config.js +34 -0
  218. package/packages/dd-trace/src/config.js +109 -34
  219. package/packages/dd-trace/src/config_defaults.js +16 -3
  220. package/packages/dd-trace/src/constants.js +5 -0
  221. package/packages/dd-trace/src/crashtracking/crashtracker.js +10 -1
  222. package/packages/dd-trace/src/datastreams/checkpointer.js +2 -2
  223. package/packages/dd-trace/src/datastreams/encoding.js +23 -6
  224. package/packages/dd-trace/src/datastreams/index.js +1 -1
  225. package/packages/dd-trace/src/datastreams/pathway.js +41 -2
  226. package/packages/dd-trace/src/datastreams/processor.js +3 -3
  227. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
  228. package/packages/dd-trace/src/datastreams/writer.js +2 -2
  229. package/packages/dd-trace/src/debugger/config.js +1 -0
  230. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +15 -5
  231. package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -1
  232. package/packages/dd-trace/src/debugger/devtools_client/config.js +3 -1
  233. package/packages/dd-trace/src/debugger/devtools_client/index.js +37 -17
  234. package/packages/dd-trace/src/debugger/devtools_client/inspector_promises_polyfill.js +2 -0
  235. package/packages/dd-trace/src/debugger/devtools_client/json-buffer.js +24 -18
  236. package/packages/dd-trace/src/debugger/devtools_client/send.js +21 -11
  237. package/packages/dd-trace/src/debugger/devtools_client/session.js +1 -1
  238. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +103 -15
  239. package/packages/dd-trace/src/debugger/devtools_client/snapshot/constants.js +25 -0
  240. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +56 -25
  241. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +64 -23
  242. package/packages/dd-trace/src/debugger/devtools_client/snapshot/symbols.js +3 -1
  243. package/packages/dd-trace/src/debugger/devtools_client/snapshot-pruner.js +404 -0
  244. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +1 -1
  245. package/packages/dd-trace/src/debugger/devtools_client/state.js +8 -3
  246. package/packages/dd-trace/src/debugger/devtools_client/status.js +3 -3
  247. package/packages/dd-trace/src/debugger/index.js +2 -2
  248. package/packages/dd-trace/src/dogstatsd.js +3 -2
  249. package/packages/dd-trace/src/encode/0.4.js +1 -1
  250. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +2 -2
  251. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  252. package/packages/dd-trace/src/encode/span-stats.js +13 -2
  253. package/packages/dd-trace/src/exporter.js +2 -2
  254. package/packages/dd-trace/src/exporters/agent/index.js +1 -1
  255. package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +1 -1
  256. package/packages/dd-trace/src/exporters/common/request.js +2 -2
  257. package/packages/dd-trace/src/exporters/common/writer.js +1 -1
  258. package/packages/dd-trace/src/exporters/span-stats/index.js +1 -1
  259. package/packages/dd-trace/src/external-logger/src/index.js +1 -2
  260. package/packages/dd-trace/src/flare/index.js +1 -1
  261. package/packages/dd-trace/src/guardrails/index.js +6 -3
  262. package/packages/dd-trace/src/histogram.js +1 -1
  263. package/packages/dd-trace/src/id.js +60 -0
  264. package/packages/dd-trace/src/index.js +1 -1
  265. package/packages/dd-trace/src/lambda/handler.js +4 -4
  266. package/packages/dd-trace/src/lambda/index.js +1 -1
  267. package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
  268. package/packages/dd-trace/src/lambda/runtime/ritm.js +2 -2
  269. package/packages/dd-trace/src/llmobs/constants/tags.js +8 -1
  270. package/packages/dd-trace/src/llmobs/index.js +8 -9
  271. package/packages/dd-trace/src/llmobs/plugins/ai/index.js +38 -7
  272. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +30 -9
  273. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +3 -3
  274. package/packages/dd-trace/src/llmobs/plugins/genai/index.js +104 -0
  275. package/packages/dd-trace/src/llmobs/plugins/genai/util.js +486 -0
  276. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +1 -1
  277. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +1 -1
  278. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/embedding.js +1 -1
  279. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/llm.js +1 -1
  280. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/vectorstore.js +1 -1
  281. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +2 -2
  282. package/packages/dd-trace/src/llmobs/plugins/openai/constants.js +16 -0
  283. package/packages/dd-trace/src/llmobs/plugins/{openai.js → openai/index.js} +63 -6
  284. package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +126 -0
  285. package/packages/dd-trace/src/llmobs/plugins/vertexai.js +1 -1
  286. package/packages/dd-trace/src/llmobs/sdk.js +20 -22
  287. package/packages/dd-trace/src/llmobs/span_processor.js +15 -14
  288. package/packages/dd-trace/src/llmobs/tagger.js +4 -0
  289. package/packages/dd-trace/src/llmobs/telemetry.js +3 -4
  290. package/packages/dd-trace/src/llmobs/writers/base.js +2 -2
  291. package/packages/dd-trace/src/llmobs/writers/spans.js +1 -2
  292. package/packages/dd-trace/src/log/index.js +1 -1
  293. package/packages/dd-trace/src/noop/proxy.js +2 -2
  294. package/packages/dd-trace/src/noop/span.js +1 -1
  295. package/packages/dd-trace/src/openfeature/index.js +2 -2
  296. package/packages/dd-trace/src/openfeature/noop.js +14 -14
  297. package/packages/dd-trace/src/openfeature/remote_config.js +31 -0
  298. package/packages/dd-trace/src/openfeature/writers/base.js +5 -5
  299. package/packages/dd-trace/src/openfeature/writers/exposures.js +9 -9
  300. package/packages/dd-trace/src/opentelemetry/context_manager.js +2 -2
  301. package/packages/dd-trace/src/opentelemetry/logs/index.js +2 -2
  302. package/packages/dd-trace/src/opentelemetry/logs/logger.js +3 -2
  303. package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +4 -4
  304. package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +5 -3
  305. package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +17 -16
  306. package/packages/dd-trace/src/opentelemetry/metrics/constants.js +34 -0
  307. package/packages/dd-trace/src/opentelemetry/metrics/index.js +81 -0
  308. package/packages/dd-trace/src/opentelemetry/metrics/instruments.js +225 -0
  309. package/packages/dd-trace/src/opentelemetry/metrics/meter.js +171 -0
  310. package/packages/dd-trace/src/opentelemetry/metrics/meter_provider.js +54 -0
  311. package/packages/dd-trace/src/opentelemetry/metrics/otlp_http_metric_exporter.js +62 -0
  312. package/packages/dd-trace/src/opentelemetry/metrics/otlp_transformer.js +251 -0
  313. package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +557 -0
  314. package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +10 -18
  315. package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +47 -32
  316. package/packages/dd-trace/src/opentelemetry/otlp/protobuf_loader.js +1 -1
  317. package/packages/dd-trace/src/opentelemetry/span.js +3 -3
  318. package/packages/dd-trace/src/opentelemetry/tracer.js +4 -4
  319. package/packages/dd-trace/src/opentelemetry/tracer_provider.js +1 -1
  320. package/packages/dd-trace/src/opentracing/propagation/text_map.js +24 -8
  321. package/packages/dd-trace/src/opentracing/span.js +3 -3
  322. package/packages/dd-trace/src/opentracing/tracer.js +5 -5
  323. package/packages/dd-trace/src/payload-tagging/index.js +8 -4
  324. package/packages/dd-trace/src/plugin_manager.js +5 -3
  325. package/packages/dd-trace/src/plugins/apollo.js +1 -1
  326. package/packages/dd-trace/src/plugins/ci_plugin.js +27 -27
  327. package/packages/dd-trace/src/plugins/database.js +1 -1
  328. package/packages/dd-trace/src/plugins/index.js +6 -1
  329. package/packages/dd-trace/src/plugins/log_plugin.js +1 -1
  330. package/packages/dd-trace/src/plugins/outbound.js +1 -1
  331. package/packages/dd-trace/src/plugins/tracing.js +1 -1
  332. package/packages/dd-trace/src/plugins/util/ci.js +1 -1
  333. package/packages/dd-trace/src/plugins/util/git.js +8 -8
  334. package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
  335. package/packages/dd-trace/src/plugins/util/test.js +27 -27
  336. package/packages/dd-trace/src/plugins/util/url.js +119 -1
  337. package/packages/dd-trace/src/plugins/util/user-provided-git.js +1 -1
  338. package/packages/dd-trace/src/plugins/util/web.js +18 -46
  339. package/packages/dd-trace/src/priority_sampler.js +15 -16
  340. package/packages/dd-trace/src/process-tags/index.js +83 -0
  341. package/packages/dd-trace/src/profiling/config.js +33 -22
  342. package/packages/dd-trace/src/profiling/exporter_cli.js +4 -4
  343. package/packages/dd-trace/src/profiling/exporters/agent.js +5 -5
  344. package/packages/dd-trace/src/profiling/index.js +1 -1
  345. package/packages/dd-trace/src/profiling/libuv-size.js +1 -1
  346. package/packages/dd-trace/src/profiling/profiler.js +4 -5
  347. package/packages/dd-trace/src/profiling/profilers/event_plugins/event.js +1 -1
  348. package/packages/dd-trace/src/profiling/profilers/events.js +11 -2
  349. package/packages/dd-trace/src/profiling/profilers/wall.js +4 -4
  350. package/packages/dd-trace/src/proxy.js +17 -18
  351. package/packages/dd-trace/src/rate_limiter.js +1 -1
  352. package/packages/dd-trace/src/remote_config/index.js +541 -137
  353. package/packages/dd-trace/src/require-package-json.js +1 -1
  354. package/packages/dd-trace/src/ritm.js +50 -27
  355. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +1 -1
  356. package/packages/dd-trace/src/serverless.js +16 -0
  357. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +8 -0
  358. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +4 -0
  359. package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +8 -0
  360. package/packages/dd-trace/src/service-naming/schemas/v1/web.js +4 -0
  361. package/packages/dd-trace/src/span_format.js +10 -5
  362. package/packages/dd-trace/src/span_processor.js +8 -3
  363. package/packages/dd-trace/src/span_stats.js +21 -8
  364. package/packages/dd-trace/src/spanleak.js +1 -1
  365. package/packages/dd-trace/src/standalone/index.js +1 -1
  366. package/packages/dd-trace/src/startup-log.js +3 -3
  367. package/packages/dd-trace/src/supported-configurations.json +16 -0
  368. package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
  369. package/packages/dd-trace/src/telemetry/endpoints.js +8 -8
  370. package/packages/dd-trace/src/telemetry/logs/index.js +1 -1
  371. package/packages/dd-trace/src/telemetry/telemetry.js +22 -8
  372. package/packages/dd-trace/src/tracer.js +3 -3
  373. package/packages/dd-trace/src/tracer_metadata.js +19 -15
  374. package/vendor/dist/@datadog/sketches-js/LICENSE +39 -0
  375. package/vendor/dist/@datadog/sketches-js/index.js +1 -0
  376. package/vendor/dist/@datadog/source-map/LICENSE +28 -0
  377. package/vendor/dist/@datadog/source-map/index.js +1 -0
  378. package/vendor/dist/@isaacs/ttlcache/LICENSE +55 -0
  379. package/vendor/dist/@isaacs/ttlcache/index.js +1 -0
  380. package/vendor/dist/@opentelemetry/core/LICENSE +201 -0
  381. package/vendor/dist/@opentelemetry/core/index.js +1 -0
  382. package/vendor/dist/@opentelemetry/resources/LICENSE +201 -0
  383. package/vendor/dist/@opentelemetry/resources/index.js +1 -0
  384. package/vendor/dist/astring/LICENSE +19 -0
  385. package/vendor/dist/astring/index.js +1 -0
  386. package/vendor/dist/crypto-randomuuid/index.js +1 -0
  387. package/vendor/dist/escape-string-regexp/LICENSE +9 -0
  388. package/vendor/dist/escape-string-regexp/index.js +1 -0
  389. package/vendor/dist/esquery/LICENSE +24 -0
  390. package/vendor/dist/esquery/index.js +1 -0
  391. package/vendor/dist/ignore/LICENSE +21 -0
  392. package/vendor/dist/ignore/index.js +1 -0
  393. package/vendor/dist/istanbul-lib-coverage/LICENSE +24 -0
  394. package/vendor/dist/istanbul-lib-coverage/index.js +1 -0
  395. package/vendor/dist/jest-docblock/LICENSE +21 -0
  396. package/vendor/dist/jest-docblock/index.js +1 -0
  397. package/vendor/dist/jsonpath-plus/LICENSE +22 -0
  398. package/vendor/dist/jsonpath-plus/index.js +1 -0
  399. package/vendor/dist/limiter/LICENSE +19 -0
  400. package/vendor/dist/limiter/index.js +1 -0
  401. package/vendor/dist/lodash.sortby/LICENSE +47 -0
  402. package/vendor/dist/lodash.sortby/index.js +1 -0
  403. package/vendor/dist/lru-cache/LICENSE +15 -0
  404. package/vendor/dist/lru-cache/index.js +1 -0
  405. package/vendor/dist/meriyah/LICENSE +7 -0
  406. package/vendor/dist/meriyah/index.js +1 -0
  407. package/vendor/dist/module-details-from-path/LICENSE +21 -0
  408. package/vendor/dist/module-details-from-path/index.js +1 -0
  409. package/vendor/dist/mutexify/promise/LICENSE +21 -0
  410. package/vendor/dist/mutexify/promise/index.js +1 -0
  411. package/vendor/dist/opentracing/LICENSE +201 -0
  412. package/vendor/dist/opentracing/binary_carrier.d.ts +11 -0
  413. package/vendor/dist/opentracing/constants.d.ts +61 -0
  414. package/vendor/dist/opentracing/examples/demo/demo.d.ts +2 -0
  415. package/vendor/dist/opentracing/ext/tags.d.ts +90 -0
  416. package/vendor/dist/opentracing/functions.d.ts +20 -0
  417. package/vendor/dist/opentracing/global_tracer.d.ts +14 -0
  418. package/vendor/dist/opentracing/index.d.ts +12 -0
  419. package/vendor/dist/opentracing/index.js +1 -0
  420. package/vendor/dist/opentracing/mock_tracer/index.d.ts +5 -0
  421. package/vendor/dist/opentracing/mock_tracer/mock_context.d.ts +13 -0
  422. package/vendor/dist/opentracing/mock_tracer/mock_report.d.ts +16 -0
  423. package/vendor/dist/opentracing/mock_tracer/mock_span.d.ts +50 -0
  424. package/vendor/dist/opentracing/mock_tracer/mock_tracer.d.ts +26 -0
  425. package/vendor/dist/opentracing/noop.d.ts +8 -0
  426. package/vendor/dist/opentracing/reference.d.ts +33 -0
  427. package/vendor/dist/opentracing/span.d.ts +147 -0
  428. package/vendor/dist/opentracing/span_context.d.ts +26 -0
  429. package/vendor/dist/opentracing/test/api_compatibility.d.ts +16 -0
  430. package/vendor/dist/opentracing/test/mocktracer_implemenation.d.ts +3 -0
  431. package/vendor/dist/opentracing/test/noop_implementation.d.ts +4 -0
  432. package/vendor/dist/opentracing/test/opentracing_api.d.ts +3 -0
  433. package/vendor/dist/opentracing/test/unittest.d.ts +2 -0
  434. package/vendor/dist/opentracing/tracer.d.ts +127 -0
  435. package/vendor/dist/path-to-regexp/LICENSE +21 -0
  436. package/vendor/dist/path-to-regexp/index.js +1 -0
  437. package/vendor/dist/pprof-format/LICENSE +8 -0
  438. package/vendor/dist/pprof-format/index.js +1 -0
  439. package/vendor/dist/protobufjs/LICENSE +39 -0
  440. package/vendor/dist/protobufjs/index.js +1 -0
  441. package/vendor/dist/protobufjs/minimal/LICENSE +39 -0
  442. package/vendor/dist/protobufjs/minimal/index.js +1 -0
  443. package/vendor/dist/retry/LICENSE +21 -0
  444. package/vendor/dist/retry/index.js +1 -0
  445. package/vendor/dist/rfdc/LICENSE +15 -0
  446. package/vendor/dist/rfdc/index.js +1 -0
  447. package/vendor/dist/semifies/LICENSE +201 -0
  448. package/vendor/dist/semifies/index.js +1 -0
  449. package/vendor/dist/shell-quote/LICENSE +24 -0
  450. package/vendor/dist/shell-quote/index.js +1 -0
  451. package/vendor/dist/source-map/LICENSE +28 -0
  452. package/vendor/dist/source-map/index.js +1 -0
  453. package/vendor/dist/source-map/lib/util/LICENSE +28 -0
  454. package/vendor/dist/source-map/lib/util/index.js +1 -0
  455. package/vendor/dist/source-map/mappings.wasm +0 -0
  456. package/vendor/dist/tlhunter-sorted-set/LICENSE +21 -0
  457. package/vendor/dist/tlhunter-sorted-set/index.js +1 -0
  458. package/vendor/dist/ttl-set/LICENSE +21 -0
  459. package/vendor/dist/ttl-set/index.js +1 -0
  460. package/packages/dd-trace/src/remote_config/manager.js +0 -368
@@ -5,25 +5,22 @@ const fs = require('fs')
5
5
  const { URL } = require('url')
6
6
  const log = require('../../log')
7
7
  const { getEnvironmentVariable } = require('../../config-helper')
8
- const satisfies = require('semifies')
8
+ const satisfies = require('../../../../../vendor/dist/semifies')
9
9
 
10
- const istanbul = require('istanbul-lib-coverage')
11
- const ignore = require('ignore')
10
+ const istanbul = require('../../../../../vendor/dist/istanbul-lib-coverage')
11
+ const ignore = require('../../../../../vendor/dist/ignore')
12
12
 
13
+ const id = require('../../id')
13
14
  const {
14
- getGitMetadata,
15
- getGitInformationDiscrepancy,
16
- getGitDiff,
17
- getGitRemoteName,
18
- getSourceBranch,
19
- checkAndFetchBranch,
20
- getLocalBranches,
21
- getMergeBase,
22
- getCounts
23
- } = require('./git')
24
- const { getUserProviderGitMetadata, validateGitRepositoryUrl, validateGitCommitSha } = require('./user-provided-git')
25
- const { getCIMetadata } = require('./ci')
26
- const { getRuntimeAndOSMetadata } = require('./env')
15
+ incrementCountMetric,
16
+ TELEMETRY_GIT_COMMIT_SHA_DISCREPANCY,
17
+ TELEMETRY_GIT_SHA_MATCH
18
+ } = require('../../ci-visibility/telemetry')
19
+
20
+ const { SPAN_TYPE, RESOURCE_NAME, SAMPLING_PRIORITY } = require('../../../../../ext/tags')
21
+ const { SAMPLING_RULE_DECISION } = require('../../constants')
22
+ const { AUTO_KEEP } = require('../../../../../ext/priority')
23
+ const { version: ddTraceVersion } = require('../../../../../package.json')
27
24
  const {
28
25
  GIT_BRANCH,
29
26
  GIT_COMMIT_SHA,
@@ -37,17 +34,20 @@ const {
37
34
  CI_JOB_NAME,
38
35
  GIT_COMMIT_HEAD_SHA
39
36
  } = require('./tags')
40
- const id = require('../../id')
37
+ const { getRuntimeAndOSMetadata } = require('./env')
38
+ const { getCIMetadata } = require('./ci')
39
+ const { getUserProviderGitMetadata, validateGitRepositoryUrl, validateGitCommitSha } = require('./user-provided-git')
41
40
  const {
42
- incrementCountMetric,
43
- TELEMETRY_GIT_COMMIT_SHA_DISCREPANCY,
44
- TELEMETRY_GIT_SHA_MATCH
45
- } = require('../../ci-visibility/telemetry')
46
-
47
- const { SPAN_TYPE, RESOURCE_NAME, SAMPLING_PRIORITY } = require('../../../../../ext/tags')
48
- const { SAMPLING_RULE_DECISION } = require('../../constants')
49
- const { AUTO_KEEP } = require('../../../../../ext/priority')
50
- const { version: ddTraceVersion } = require('../../../../../package.json')
41
+ getGitMetadata,
42
+ getGitInformationDiscrepancy,
43
+ getGitDiff,
44
+ getGitRemoteName,
45
+ getSourceBranch,
46
+ checkAndFetchBranch,
47
+ getLocalBranches,
48
+ getMergeBase,
49
+ getCounts
50
+ } = require('./git')
51
51
 
52
52
  /**
53
53
  * JSDoc types for test environment metadata helpers.
@@ -813,7 +813,7 @@ function getTestEndLine (testFn, startLine = 0) {
813
813
 
814
814
  /**
815
815
  * Gets an object of test tags from an Playwright annotations array.
816
- * @param {Object[]} annotations - Annotations from a Playwright test.
816
+ * @param {object[]} annotations - Annotations from a Playwright test.
817
817
  * @param {string} annotations[].type - Type of annotation. A string of the shape DD_TAGS[$tag_name].
818
818
  * @param {string} annotations[].description - Value of the tag.
819
819
  */
@@ -2,6 +2,118 @@
2
2
 
3
3
  const { URL } = require('url')
4
4
 
5
+ const HTTP2_HEADER_AUTHORITY = ':authority'
6
+ const HTTP2_HEADER_SCHEME = ':scheme'
7
+ const HTTP2_HEADER_PATH = ':path'
8
+
9
+ const PATH_REGEX = /^(?:[a-z]+:\/\/(?:[^?/]+))?(?<path>\/[^?]*)(?:(\?).*)?$/
10
+
11
+ const INT_SEGMENT = /^[1-9][0-9]+$/ // Integer of size at least 2 (>=10)
12
+ const INT_ID_SEGMENT = /^(?=.*[0-9].*)[0-9._-]{3,}$/ // Mixed string with digits and delimiters
13
+ const HEX_SEGMENT = /^(?=.*[0-9].*)[A-Fa-f0-9]{6,}$/ // Hexadecimal digits of size at least 6 with at least one decimal digit
14
+ const HEX_ID_SEGMENT = /^(?=.*[0-9].*)[A-Fa-f0-9._-]{6,}$/ // Mixed string with hex digits and delimiters
15
+ const STRING_SEGMENT = /^.{20,}|.*[%&'()*+,:=@].*$/ // Long string or a string containing special characters
16
+
17
+ /**
18
+ * Extract full URL from HTTP request
19
+ * @param {import('http').IncomingMessage} req
20
+ * @returns {string} Full URL
21
+ */
22
+ function extractURL (req) {
23
+ const headers = req.headers
24
+
25
+ if (req.stream) {
26
+ return `${headers[HTTP2_HEADER_SCHEME]}://${headers[HTTP2_HEADER_AUTHORITY]}${headers[HTTP2_HEADER_PATH]}`
27
+ }
28
+
29
+ const protocol = getProtocol(req)
30
+ return `${protocol}://${req.headers.host}${req.originalUrl || req.url}`
31
+ }
32
+
33
+ function getProtocol (req) {
34
+ return (req.socket?.encrypted || req.connection?.encrypted) ? 'https' : 'http'
35
+ }
36
+
37
+ /**
38
+ * Obfuscate query string
39
+ *
40
+ * @param {object} config
41
+ * @param {string} url
42
+ * @returns {string} obfuscated URL
43
+ */
44
+ function obfuscateQs (config, url) {
45
+ const { queryStringObfuscation } = config
46
+
47
+ if (queryStringObfuscation === false) return url
48
+
49
+ const i = url.indexOf('?')
50
+ if (i === -1) return url
51
+
52
+ const path = url.slice(0, i)
53
+ if (queryStringObfuscation === true) return path
54
+
55
+ let qs = url.slice(i + 1)
56
+
57
+ qs = qs.replace(queryStringObfuscation, '<redacted>')
58
+
59
+ return `${path}?${qs}`
60
+ }
61
+
62
+ /**
63
+ * Extract URL path from URL using regex pattern instead of Node.js URL API because:
64
+ *
65
+ * - Handles edge cases like malformed URLs
66
+ * - Works with relative paths
67
+ * - Cross tracers compatibility
68
+ *
69
+ * @param {string} url
70
+ * @returns {string} Url path
71
+ */
72
+ function extractPathFromUrl (url) {
73
+ if (!url) return '/'
74
+ const match = url.match(PATH_REGEX)
75
+
76
+ return match?.groups?.path || '/'
77
+ }
78
+
79
+ /**
80
+ * Calculate http.endpoint from URL path
81
+ *
82
+ * @param {string} url
83
+ * @returns {string} The normalized endpoint
84
+ */
85
+ function calculateHttpEndpoint (url) {
86
+ const path = extractPathFromUrl(url)
87
+
88
+ // Split path by '/' and filter empty elements
89
+ const elements = path.split('/').filter(Boolean)
90
+
91
+ // Keep only first 8 non-empty elements
92
+ const limitedElements = elements.slice(0, 8)
93
+
94
+ // Apply regex replacements to each element respecting this order
95
+ const normalizedElements = limitedElements.map(element => {
96
+ if (INT_SEGMENT.test(element)) return '{param:int}'
97
+
98
+ if (INT_ID_SEGMENT.test(element)) return '{param:int_id}'
99
+
100
+ if (HEX_SEGMENT.test(element)) return '{param:hex}'
101
+
102
+ if (HEX_ID_SEGMENT.test(element)) return '{param:hex_id}'
103
+
104
+ if (STRING_SEGMENT.test(element)) return '{param:str}'
105
+
106
+ // No match
107
+ return element
108
+ })
109
+
110
+ const endpoint = normalizedElements.length > 0
111
+ ? '/' + normalizedElements.join('/')
112
+ : '/'
113
+
114
+ return endpoint
115
+ }
116
+
5
117
  function filterSensitiveInfoFromRepository (repositoryUrl) {
6
118
  if (!repositoryUrl) {
7
119
  return ''
@@ -25,4 +137,10 @@ function filterSensitiveInfoFromRepository (repositoryUrl) {
25
137
  }
26
138
  }
27
139
 
28
- module.exports = { filterSensitiveInfoFromRepository }
140
+ module.exports = {
141
+ extractURL,
142
+ obfuscateQs,
143
+ calculateHttpEndpoint,
144
+ filterSensitiveInfoFromRepository,
145
+ extractPathFromUrl // test only
146
+ }
@@ -1,5 +1,6 @@
1
1
  'use strict'
2
2
 
3
+ const { getEnvironmentVariables } = require('../../config-helper')
3
4
  const {
4
5
  GIT_COMMIT_SHA,
5
6
  GIT_BRANCH,
@@ -19,7 +20,6 @@ const {
19
20
 
20
21
  const { normalizeRef } = require('./ci')
21
22
  const { filterSensitiveInfoFromRepository } = require('./url')
22
- const { getEnvironmentVariables } = require('../../config-helper')
23
23
 
24
24
  function removeEmptyValues (tags) {
25
25
  return Object.keys(tags).reduce((filteredTags, tag) => {
@@ -7,10 +7,11 @@ const log = require('../../log')
7
7
  const tags = require('../../../../../ext/tags')
8
8
  const types = require('../../../../../ext/types')
9
9
  const kinds = require('../../../../../ext/kinds')
10
- const urlFilter = require('./urlfilter')
11
10
  const { ERROR_MESSAGE, ERROR_TYPE, ERROR_STACK } = require('../../constants')
12
- const { createInferredProxySpan, finishInferredProxySpan } = require('./inferred_proxy')
13
11
  const TracingPlugin = require('../tracing')
12
+ const urlFilter = require('./urlfilter')
13
+ const { createInferredProxySpan, finishInferredProxySpan } = require('./inferred_proxy')
14
+ const { extractURL, obfuscateQs, calculateHttpEndpoint } = require('./url')
14
15
 
15
16
  let extractIp
16
17
 
@@ -25,16 +26,13 @@ const HTTP_METHOD = tags.HTTP_METHOD
25
26
  const HTTP_URL = tags.HTTP_URL
26
27
  const HTTP_STATUS_CODE = tags.HTTP_STATUS_CODE
27
28
  const HTTP_ROUTE = tags.HTTP_ROUTE
29
+ const HTTP_ENDPOINT = tags.HTTP_ENDPOINT
28
30
  const HTTP_REQUEST_HEADERS = tags.HTTP_REQUEST_HEADERS
29
31
  const HTTP_RESPONSE_HEADERS = tags.HTTP_RESPONSE_HEADERS
30
32
  const HTTP_USERAGENT = tags.HTTP_USERAGENT
31
33
  const HTTP_CLIENT_IP = tags.HTTP_CLIENT_IP
32
34
  const MANUAL_DROP = tags.MANUAL_DROP
33
35
 
34
- const HTTP2_HEADER_AUTHORITY = ':authority'
35
- const HTTP2_HEADER_SCHEME = ':scheme'
36
- const HTTP2_HEADER_PATH = ':path'
37
-
38
36
  const contexts = new WeakMap()
39
37
  const ends = new WeakMap()
40
38
 
@@ -276,11 +274,14 @@ const web = {
276
274
  return context.middleware.at(-1)
277
275
  },
278
276
 
279
- // Extract the parent span from the headers and start a new span as its child
280
277
  startChildSpan (tracer, config, name, req, traceCtx) {
281
278
  const headers = req.headers
282
279
  const reqCtx = contexts.get(req)
283
- let childOf = tracer.extract(FORMAT_HTTP_HEADERS, headers)
280
+ const { storage } = require('../../../../datadog-core')
281
+ const store = storage('legacy').getStore()
282
+ const pubsubSpan = store?.span?._name === 'pubsub.push.receive' ? store.span : null
283
+
284
+ let childOf = pubsubSpan || tracer.extract(FORMAT_HTTP_HEADERS, headers)
284
285
 
285
286
  // we may have headers signaling a router proxy span should be created (such as for AWS API Gateway)
286
287
  if (tracer._config?.inferredProxyServicesEnabled) {
@@ -363,24 +364,6 @@ const web = {
363
364
  finishInferredProxySpan(context)
364
365
  },
365
366
 
366
- obfuscateQs (config, url) {
367
- const { queryStringObfuscation } = config
368
-
369
- if (queryStringObfuscation === false) return url
370
-
371
- const i = url.indexOf('?')
372
- if (i === -1) return url
373
-
374
- const path = url.slice(0, i)
375
- if (queryStringObfuscation === true) return path
376
-
377
- let qs = url.slice(i + 1)
378
-
379
- qs = qs.replace(queryStringObfuscation, '<redacted>')
380
-
381
- return `${path}?${qs}`
382
- },
383
-
384
367
  wrapWriteHead (context) {
385
368
  const { req, res } = context
386
369
  const writeHead = res.writeHead
@@ -475,7 +458,7 @@ function addRequestTags (context, spanType) {
475
458
  const url = extractURL(req)
476
459
 
477
460
  span.addTags({
478
- [HTTP_URL]: web.obfuscateQs(config, url),
461
+ [HTTP_URL]: obfuscateQs(config, url),
479
462
  [HTTP_METHOD]: req.method,
480
463
  [SPAN_KIND]: SERVER,
481
464
  [SPAN_TYPE]: spanType,
@@ -496,11 +479,17 @@ function addRequestTags (context, spanType) {
496
479
  }
497
480
 
498
481
  function addResponseTags (context) {
499
- const { req, res, paths, span, inferredProxySpan } = context
482
+ const { req, res, paths, span, inferredProxySpan, config } = context
500
483
 
501
484
  const route = paths.join('')
502
485
  if (route) {
486
+ // Use http.route from trusted framework instrumentation
503
487
  span.setTag(HTTP_ROUTE, route)
488
+ } else if (config.resourceRenamingEnabled) {
489
+ // Route is unavailable, compute http.endpoint instead
490
+ const url = span.context()._tags[HTTP_URL]
491
+ const endpoint = url ? calculateHttpEndpoint(url) : '/'
492
+ span.setTag(HTTP_ENDPOINT, endpoint)
504
493
  }
505
494
 
506
495
  span.addTags({
@@ -517,7 +506,7 @@ function addResourceTag (context) {
517
506
  const { req, span } = context
518
507
  const tags = span.context()._tags
519
508
 
520
- if (tags['resource.name']) return
509
+ if (tags[RESOURCE_NAME]) return
521
510
 
522
511
  const resource = [req.method, tags[HTTP_ROUTE]]
523
512
  .filter(Boolean)
@@ -545,23 +534,6 @@ function addHeaders (context) {
545
534
  })
546
535
  }
547
536
 
548
- function extractURL (req) {
549
- const headers = req.headers
550
-
551
- if (req.stream) {
552
- return `${headers[HTTP2_HEADER_SCHEME]}://${headers[HTTP2_HEADER_AUTHORITY]}${headers[HTTP2_HEADER_PATH]}`
553
- }
554
- const protocol = getProtocol(req)
555
- return `${protocol}://${req.headers.host}${req.originalUrl || req.url}`
556
- }
557
-
558
- function getProtocol (req) {
559
- if (req.socket && req.socket.encrypted) return 'https'
560
- if (req.connection && req.connection.encrypted) return 'https'
561
-
562
- return 'http'
563
- }
564
-
565
537
  function getHeadersToRecord (config) {
566
538
  if (Array.isArray(config.headers)) {
567
539
  try {
@@ -1,5 +1,19 @@
1
1
  'use strict'
2
2
 
3
+ const {
4
+ tags: {
5
+ MANUAL_KEEP,
6
+ MANUAL_DROP,
7
+ SAMPLING_PRIORITY,
8
+ SERVICE_NAME
9
+ },
10
+ priority: {
11
+ AUTO_REJECT,
12
+ AUTO_KEEP,
13
+ USER_REJECT,
14
+ USER_KEEP
15
+ }
16
+ } = require('../../../ext')
3
17
  const log = require('./log')
4
18
  const RateLimiter = require('./rate_limiter')
5
19
  const Sampler = require('./sampler')
@@ -19,21 +33,6 @@ const {
19
33
  DECISION_MAKER_KEY
20
34
  } = require('./constants')
21
35
 
22
- const {
23
- tags: {
24
- MANUAL_KEEP,
25
- MANUAL_DROP,
26
- SAMPLING_PRIORITY,
27
- SERVICE_NAME
28
- },
29
- priority: {
30
- AUTO_REJECT,
31
- AUTO_KEEP,
32
- USER_REJECT,
33
- USER_KEEP
34
- }
35
- } = require('../../../ext')
36
-
37
36
  const DEFAULT_KEY = 'service:,env:'
38
37
 
39
38
  const defaultSampler = new Sampler(AUTO_KEEP)
@@ -54,7 +53,7 @@ class PrioritySampler {
54
53
  /**
55
54
  * Creates an instance of PrioritySampler.
56
55
  *
57
- * @typedef {Object} SamplingConfig
56
+ * @typedef {object} SamplingConfig
58
57
  * @property {number} [sampleRate] - The default sample rate for traces.
59
58
  * @property {string} [provenance] - Optional rule provenance ("customer" or "dynamic").
60
59
  * @property {number} [rateLimit=100] - The maximum number of traces to sample per second.
@@ -0,0 +1,83 @@
1
+ 'use strict'
2
+
3
+ const path = require('node:path')
4
+
5
+ const CURRENT_WORKING_DIRECTORY = process.cwd()
6
+ const ENTRYPOINT_PATH = require.main?.filename || ''
7
+
8
+ // $ cd /foo/bar && node baz/banana.js
9
+ // entrypoint.workdir = bar
10
+ // entrypoint.name = banana
11
+ // entrypoint.type = script
12
+ // entrypoint.basedir = baz
13
+ // package.json.name = <from package.json>
14
+
15
+ // process tags are constant throughout the lifetime of a process
16
+ function getProcessTags () {
17
+ // Lazy load pkg to avoid issues with require.main during test initialization
18
+ const pkg = require('../pkg')
19
+
20
+ // this list is sorted alphabetically for consistent serialization
21
+ const tags = [
22
+ // the parent directory name of the entrypoint script, e.g. /foo/bar/baz/banana.js -> baz
23
+ ['entrypoint.basedir', ENTRYPOINT_PATH === '' ? undefined : path.basename(path.dirname(ENTRYPOINT_PATH))],
24
+
25
+ // the entrypoint script filename without the extension, e.g. /foo/bar/baz/banana.js -> banana
26
+ ['entrypoint.name', path.basename(ENTRYPOINT_PATH, path.extname(ENTRYPOINT_PATH)) || undefined],
27
+
28
+ // always script for JavaScript applications
29
+ ['entrypoint.type', 'script'],
30
+
31
+ // last segment of the current working directory, e.g. /foo/bar/baz/ -> baz
32
+ ['entrypoint.workdir', path.basename(CURRENT_WORKING_DIRECTORY) || undefined],
33
+
34
+ // the .name field from the application's package.json
35
+ ['package.json.name', pkg.name || undefined]
36
+ ]
37
+
38
+ const tagsArray = []
39
+ const tagsObject = {}
40
+
41
+ for (const [key, value] of tags) {
42
+ if (value !== undefined) {
43
+ const sanitizedValue = sanitize(value)
44
+ tagsArray.push(`${key}:${sanitizedValue}`)
45
+ tagsObject[key] = sanitizedValue
46
+ }
47
+ }
48
+
49
+ const serialized = tagsArray.join(',')
50
+
51
+ return {
52
+ tags,
53
+ serialized,
54
+ tagsObject,
55
+ tagsArray
56
+ }
57
+ }
58
+
59
+ // Export the singleton
60
+ module.exports = getProcessTags()
61
+
62
+ module.exports.TRACING_FIELD_NAME = '_dd.tags.process'
63
+ module.exports.DSM_FIELD_NAME = 'ProcessTags'
64
+ module.exports.PROFILING_FIELD_NAME = 'process_tags'
65
+ module.exports.DYNAMIC_INSTRUMENTATION_FIELD_NAME = 'process_tags'
66
+ module.exports.TELEMETRY_FIELD_NAME = 'process_tags'
67
+ module.exports.REMOTE_CONFIG_FIELD_NAME = 'process_tags'
68
+ module.exports.CRASH_TRACKING_FIELD_NAME = 'process_tags'
69
+ module.exports.CLIENT_TRACE_STATISTICS_FIELD_NAME = 'ProcessTags'
70
+
71
+ /**
72
+ * Sanitize a process tag value
73
+ *
74
+ * @param {string} value
75
+ * @returns {string}
76
+ */
77
+ function sanitize (value) {
78
+ return String(value)
79
+ .toLowerCase()
80
+ .replaceAll(/[^a-zA-Z0-9/_.-]+/g, '_')
81
+ }
82
+
83
+ module.exports.sanitize = sanitize
@@ -3,7 +3,13 @@
3
3
  const os = require('os')
4
4
  const path = require('path')
5
5
  const { URL, format, pathToFileURL } = require('url')
6
- const satisfies = require('semifies')
6
+ const satisfies = require('../../../../vendor/dist/semifies')
7
+ const { GIT_REPOSITORY_URL, GIT_COMMIT_SHA } = require('../plugins/util/tags')
8
+ const { getIsAzureFunction } = require('../serverless')
9
+ const { isFalse, isTrue } = require('../util')
10
+ const { getAzureTagsFromMetadata, getAzureAppMetadata, getAzureFunctionMetadata } = require('../azure_metadata')
11
+ const { getEnvironmentVariables } = require('../config-helper')
12
+ const defaults = require('../config_defaults')
7
13
  const { AgentExporter } = require('./exporters/agent')
8
14
  const { FileExporter } = require('./exporters/file')
9
15
  const { ConsoleLogger } = require('./loggers/console')
@@ -11,12 +17,7 @@ const WallProfiler = require('./profilers/wall')
11
17
  const SpaceProfiler = require('./profilers/space')
12
18
  const EventsProfiler = require('./profilers/events')
13
19
  const { oomExportStrategies, snapshotKinds } = require('./constants')
14
- const { GIT_REPOSITORY_URL, GIT_COMMIT_SHA } = require('../plugins/util/tags')
15
20
  const { tagger } = require('./tagger')
16
- const { isFalse, isTrue } = require('../util')
17
- const { getAzureTagsFromMetadata, getAzureAppMetadata } = require('../azure_metadata')
18
- const { getEnvironmentVariables } = require('../config-helper')
19
- const defaults = require('../config_defaults')
20
21
 
21
22
  class Config {
22
23
  constructor (options = {}) {
@@ -73,7 +74,7 @@ class Config {
73
74
  tagger.parse(DD_TAGS),
74
75
  tagger.parse(options.tags),
75
76
  tagger.parse({ env, host, service, version, functionname }),
76
- getAzureTagsFromMetadata(getAzureAppMetadata())
77
+ getAzureTagsFromMetadata(getIsAzureFunction() ? getAzureFunctionMetadata() : getAzureAppMetadata())
77
78
  )
78
79
 
79
80
  // Add source code integration tags if available
@@ -178,6 +179,9 @@ class Config {
178
179
 
179
180
  this.heapSamplingInterval = options.heapSamplingInterval ??
180
181
  (Number(DD_PROFILING_HEAP_SAMPLING_INTERVAL) || 512 * 1024)
182
+
183
+ const isAtLeast24 = satisfies(process.versions.node, '>=24.0.0')
184
+
181
185
  const uploadCompression0 = options.uploadCompression ?? DD_PROFILING_DEBUG_UPLOAD_COMPRESSION ?? 'on'
182
186
  let [uploadCompression, level0] = uploadCompression0.split('-')
183
187
  if (!['on', 'off', 'gzip', 'zstd'].includes(uploadCompression)) {
@@ -205,9 +209,12 @@ class Config {
205
209
  }
206
210
  }
207
211
 
208
- // Default to gzip
212
+ // Default to either zstd (on Node.js 24+) or gzip (earlier Node.js). We could default to ztsd
213
+ // everywhere as we ship a Rust zstd compressor for older Node.js versions, but on 24+ we use
214
+ // the built-in one that runs asynchronously on libuv worker threads, just as gzip does. This is
215
+ // the least disruptive choice.
209
216
  if (uploadCompression === 'on') {
210
- uploadCompression = 'gzip'
217
+ uploadCompression = isAtLeast24 ? 'zstd' : 'gzip'
211
218
  }
212
219
 
213
220
  this.uploadCompression = { method: uploadCompression, level }
@@ -221,20 +228,24 @@ class Config {
221
228
 
222
229
  const hasExecArg = (arg) => process.execArgv.includes(arg) || String(NODE_OPTIONS).includes(arg)
223
230
 
224
- this.asyncContextFrameEnabled = isTrue(options.useAsyncContextFrame ?? DD_PROFILING_ASYNC_CONTEXT_FRAME_ENABLED)
225
- if (this.asyncContextFrameEnabled) {
226
- if (satisfies(process.versions.node, '>=24.0.0')) {
227
- if (hasExecArg('--no-async-context-frame')) {
228
- turnOffAsyncContextFrame('with --no-async-context-frame')
229
- }
230
- } else if (satisfies(process.versions.node, '>=23.0.0')) {
231
- if (!hasExecArg('--experimental-async-context-frame')) {
232
- turnOffAsyncContextFrame('without --experimental-async-context-frame')
233
- }
231
+ let canUseAsyncContextFrame = false
232
+ if (samplingContextsAvailable) {
233
+ if (isAtLeast24) {
234
+ canUseAsyncContextFrame = !hasExecArg('--no-async-context-frame')
235
+ } else if (satisfies(process.versions.node, '>=22.9.0')) {
236
+ canUseAsyncContextFrame = hasExecArg('--experimental-async-context-frame')
237
+ }
238
+ }
239
+ this.asyncContextFrameEnabled = isTrue(DD_PROFILING_ASYNC_CONTEXT_FRAME_ENABLED ?? canUseAsyncContextFrame)
240
+ if (this.asyncContextFrameEnabled && !canUseAsyncContextFrame) {
241
+ if (!samplingContextsAvailable) {
242
+ turnOffAsyncContextFrame(`on ${process.platform}`)
243
+ } else if (isAtLeast24) {
244
+ turnOffAsyncContextFrame('with --no-async-context-frame')
245
+ } else if (satisfies(process.versions.node, '>=22.9.0')) {
246
+ turnOffAsyncContextFrame('without --experimental-async-context-frame')
234
247
  } else {
235
- // NOTE: technically, this should work starting with 22.7.0 which is when
236
- // AsyncContextFrame debuted, but it would require a change in pprof-nodejs too.
237
- turnOffAsyncContextFrame('but it requires at least Node.js 23')
248
+ turnOffAsyncContextFrame('but it requires at least Node.js 22.9.0')
238
249
  }
239
250
  }
240
251
 
@@ -1,14 +1,14 @@
1
1
  'use strict'
2
2
 
3
+ const fs = require('fs')
4
+ const { fileURLToPath } = require('url')
5
+ const { SourceMapper, heap, encode } = require('@datadog/pprof')
6
+ const { getEnvironmentVariable } = require('../config-helper')
3
7
  const { AgentExporter } = require('./exporters/agent')
4
8
  const { FileExporter } = require('./exporters/file')
5
9
 
6
- const { SourceMapper, heap, encode } = require('@datadog/pprof')
7
10
  const { ConsoleLogger } = require('./loggers/console')
8
11
  const { tagger } = require('./tagger')
9
- const fs = require('fs')
10
- const { fileURLToPath } = require('url')
11
- const { getEnvironmentVariable } = require('../config-helper')
12
12
 
13
13
  const logger = new ConsoleLogger()
14
14
  const timeoutMs = 15 * 1000
@@ -1,19 +1,19 @@
1
1
  'use strict'
2
2
 
3
- const retry = require('retry')
4
3
  const { request: httpRequest } = require('http')
5
4
  const { request: httpsRequest } = require('https')
6
- const { EventSerializer } = require('./event_serializer')
5
+ const perf = require('perf_hooks').performance
6
+ const { urlToHttpOptions } = require('url')
7
7
 
8
+ const retry = require('../../../../../vendor/dist/retry')
8
9
  // TODO: avoid using dd-trace internals. Make this a separate module?
9
10
  const docker = require('../../exporters/common/docker')
10
11
  const FormData = require('../../exporters/common/form-data')
11
12
  const { storage } = require('../../../../datadog-core')
12
13
  const version = require('../../../../../package.json').version
13
- const { urlToHttpOptions } = require('url')
14
- const perf = require('perf_hooks').performance
15
-
16
14
  const telemetryMetrics = require('../../telemetry/metrics')
15
+ const { EventSerializer } = require('./event_serializer')
16
+
17
17
  const profilersNamespace = telemetryMetrics.manager.namespace('profilers')
18
18
 
19
19
  const statusCodeCounters = []
@@ -1,12 +1,12 @@
1
1
  'use strict'
2
2
 
3
+ const { getEnvironmentVariable } = require('../config-helper')
3
4
  const { Profiler, ServerlessProfiler } = require('./profiler')
4
5
  const WallProfiler = require('./profilers/wall')
5
6
  const SpaceProfiler = require('./profilers/space')
6
7
  const { AgentExporter } = require('./exporters/agent')
7
8
  const { FileExporter } = require('./exporters/file')
8
9
  const { ConsoleLogger } = require('./loggers/console')
9
- const { getEnvironmentVariable } = require('../config-helper')
10
10
 
11
11
  const profiler = getEnvironmentVariable('AWS_LAMBDA_FUNCTION_NAME') ? new ServerlessProfiler() : new Profiler()
12
12
 
@@ -1,7 +1,7 @@
1
1
  'use strict'
2
2
 
3
- const { getEnvironmentVariable } = require('../config-helper')
4
3
  const os = require('node:os')
4
+ const { getEnvironmentVariable } = require('../config-helper')
5
5
 
6
6
  function getLibuvThreadPoolSize (envVar) {
7
7
  if (envVar === undefined) {