dd-trace 5.81.0 → 5.83.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 (371) hide show
  1. package/LICENSE-3rdparty.csv +78 -79
  2. package/ci/init.js +6 -6
  3. package/index.d.ts +159 -3
  4. package/loader-hook.mjs +8 -3
  5. package/package.json +64 -66
  6. package/packages/datadog-core/src/storage.js +7 -7
  7. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  8. package/packages/datadog-esbuild/index.js +14 -7
  9. package/packages/datadog-esbuild/src/utils.js +14 -2
  10. package/packages/datadog-instrumentations/src/aerospike.js +3 -2
  11. package/packages/datadog-instrumentations/src/ai.js +9 -5
  12. package/packages/datadog-instrumentations/src/amqp10.js +1 -1
  13. package/packages/datadog-instrumentations/src/amqplib.js +4 -4
  14. package/packages/datadog-instrumentations/src/anthropic.js +2 -2
  15. package/packages/datadog-instrumentations/src/apollo-server-core.js +2 -2
  16. package/packages/datadog-instrumentations/src/apollo-server.js +1 -1
  17. package/packages/datadog-instrumentations/src/apollo.js +3 -2
  18. package/packages/datadog-instrumentations/src/avsc.js +1 -1
  19. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  20. package/packages/datadog-instrumentations/src/azure-event-hubs.js +4 -3
  21. package/packages/datadog-instrumentations/src/azure-functions.js +2 -2
  22. package/packages/datadog-instrumentations/src/azure-service-bus.js +3 -4
  23. package/packages/datadog-instrumentations/src/bluebird.js +1 -1
  24. package/packages/datadog-instrumentations/src/bullmq.js +11 -0
  25. package/packages/datadog-instrumentations/src/bunyan.js +1 -1
  26. package/packages/datadog-instrumentations/src/cassandra-driver.js +1 -1
  27. package/packages/datadog-instrumentations/src/child_process.js +3 -3
  28. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +3 -3
  29. package/packages/datadog-instrumentations/src/couchbase.js +1 -1
  30. package/packages/datadog-instrumentations/src/crypto.js +1 -1
  31. package/packages/datadog-instrumentations/src/cucumber.js +13 -14
  32. package/packages/datadog-instrumentations/src/cypress.js +1 -1
  33. package/packages/datadog-instrumentations/src/dns.js +1 -1
  34. package/packages/datadog-instrumentations/src/elasticsearch.js +1 -1
  35. package/packages/datadog-instrumentations/src/express-mongo-sanitize.js +1 -1
  36. package/packages/datadog-instrumentations/src/express.js +1 -1
  37. package/packages/datadog-instrumentations/src/fs.js +1 -1
  38. package/packages/datadog-instrumentations/src/generic-pool.js +1 -1
  39. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +137 -15
  40. package/packages/datadog-instrumentations/src/google-cloud-vertexai.js +2 -3
  41. package/packages/datadog-instrumentations/src/google-genai.js +3 -3
  42. package/packages/datadog-instrumentations/src/graphql.js +2 -2
  43. package/packages/datadog-instrumentations/src/grpc/client.js +1 -1
  44. package/packages/datadog-instrumentations/src/grpc/server.js +1 -1
  45. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +1 -1
  46. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
  47. package/packages/datadog-instrumentations/src/helpers/hooks.js +4 -1
  48. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -1
  49. package/packages/datadog-instrumentations/src/helpers/instrumentations.js +4 -3
  50. package/packages/datadog-instrumentations/src/helpers/register.js +9 -11
  51. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +2 -2
  52. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/bullmq.json +106 -0
  53. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +2 -1
  54. package/packages/datadog-instrumentations/src/helpers/router-helper.js +1 -1
  55. package/packages/datadog-instrumentations/src/helpers/shared-utils.js +9 -0
  56. package/packages/datadog-instrumentations/src/hono.js +55 -10
  57. package/packages/datadog-instrumentations/src/http/client.js +2 -2
  58. package/packages/datadog-instrumentations/src/ioredis.js +1 -1
  59. package/packages/datadog-instrumentations/src/iovalkey.js +1 -1
  60. package/packages/datadog-instrumentations/src/jest.js +37 -16
  61. package/packages/datadog-instrumentations/src/kafkajs.js +3 -3
  62. package/packages/datadog-instrumentations/src/knex.js +1 -1
  63. package/packages/datadog-instrumentations/src/koa.js +2 -1
  64. package/packages/datadog-instrumentations/src/ldapjs.js +1 -1
  65. package/packages/datadog-instrumentations/src/light-my-request.js +93 -0
  66. package/packages/datadog-instrumentations/src/limitd-client.js +1 -1
  67. package/packages/datadog-instrumentations/src/lodash.js +1 -2
  68. package/packages/datadog-instrumentations/src/mariadb.js +1 -2
  69. package/packages/datadog-instrumentations/src/memcached.js +1 -1
  70. package/packages/datadog-instrumentations/src/mocha/main.js +2 -2
  71. package/packages/datadog-instrumentations/src/mocha/worker.js +1 -1
  72. package/packages/datadog-instrumentations/src/mocha.js +1 -1
  73. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  74. package/packages/datadog-instrumentations/src/mongodb.js +1 -1
  75. package/packages/datadog-instrumentations/src/mongoose.js +1 -1
  76. package/packages/datadog-instrumentations/src/mquery.js +1 -1
  77. package/packages/datadog-instrumentations/src/mysql.js +2 -2
  78. package/packages/datadog-instrumentations/src/mysql2.js +3 -3
  79. package/packages/datadog-instrumentations/src/net.js +14 -6
  80. package/packages/datadog-instrumentations/src/next.js +1 -1
  81. package/packages/datadog-instrumentations/src/nyc.js +2 -2
  82. package/packages/datadog-instrumentations/src/openai.js +2 -2
  83. package/packages/datadog-instrumentations/src/opensearch.js +1 -1
  84. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  85. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +5 -5
  86. package/packages/datadog-instrumentations/src/pg.js +7 -5
  87. package/packages/datadog-instrumentations/src/pino.js +1 -1
  88. package/packages/datadog-instrumentations/src/playwright.js +4 -4
  89. package/packages/datadog-instrumentations/src/prisma.js +52 -37
  90. package/packages/datadog-instrumentations/src/process.js +1 -1
  91. package/packages/datadog-instrumentations/src/promise-js.js +1 -1
  92. package/packages/datadog-instrumentations/src/promise.js +1 -1
  93. package/packages/datadog-instrumentations/src/protobufjs.js +1 -1
  94. package/packages/datadog-instrumentations/src/q.js +1 -1
  95. package/packages/datadog-instrumentations/src/redis.js +1 -1
  96. package/packages/datadog-instrumentations/src/rhea.js +1 -1
  97. package/packages/datadog-instrumentations/src/selenium.js +3 -3
  98. package/packages/datadog-instrumentations/src/sequelize.js +1 -2
  99. package/packages/datadog-instrumentations/src/sharedb.js +1 -1
  100. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  101. package/packages/datadog-instrumentations/src/undici.js +15 -4
  102. package/packages/datadog-instrumentations/src/url.js +1 -1
  103. package/packages/datadog-instrumentations/src/vitest.js +1 -1
  104. package/packages/datadog-instrumentations/src/vm.js +1 -1
  105. package/packages/datadog-instrumentations/src/when.js +1 -1
  106. package/packages/datadog-instrumentations/src/winston.js +1 -1
  107. package/packages/datadog-instrumentations/src/ws.js +3 -2
  108. package/packages/datadog-plugin-amqp10/src/index.js +1 -1
  109. package/packages/datadog-plugin-amqplib/src/index.js +1 -1
  110. package/packages/datadog-plugin-anthropic/src/index.js +1 -1
  111. package/packages/datadog-plugin-aws-sdk/src/base.js +4 -4
  112. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/index.js +1 -1
  113. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +4 -4
  114. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  115. package/packages/datadog-plugin-aws-sdk/src/util.js +3 -3
  116. package/packages/datadog-plugin-azure-event-hubs/src/index.js +1 -1
  117. package/packages/datadog-plugin-azure-event-hubs/src/producer.js +21 -7
  118. package/packages/datadog-plugin-azure-service-bus/src/index.js +1 -1
  119. package/packages/datadog-plugin-azure-service-bus/src/producer.js +6 -2
  120. package/packages/datadog-plugin-bullmq/src/consumer.js +60 -0
  121. package/packages/datadog-plugin-bullmq/src/index.js +18 -0
  122. package/packages/datadog-plugin-bullmq/src/producer.js +178 -0
  123. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/index.js +1 -1
  124. package/packages/datadog-plugin-cucumber/src/index.js +2 -2
  125. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +2 -2
  126. package/packages/datadog-plugin-cypress/src/plugin.js +1 -1
  127. package/packages/datadog-plugin-dd-trace-api/src/index.js +2 -2
  128. package/packages/datadog-plugin-express/src/code_origin.js +21 -15
  129. package/packages/datadog-plugin-express/src/index.js +1 -1
  130. package/packages/datadog-plugin-fastify/src/code_origin.js +17 -4
  131. package/packages/datadog-plugin-fastify/src/index.js +1 -1
  132. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +13 -3
  133. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +171 -12
  134. package/packages/datadog-plugin-google-cloud-pubsub/src/index.js +1 -2
  135. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +160 -13
  136. package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +217 -0
  137. package/packages/datadog-plugin-google-cloud-vertexai/src/index.js +1 -1
  138. package/packages/datadog-plugin-google-genai/src/index.js +1 -1
  139. package/packages/datadog-plugin-graphql/src/resolve.js +1 -1
  140. package/packages/datadog-plugin-grpc/src/index.js +1 -1
  141. package/packages/datadog-plugin-http/src/client.js +2 -1
  142. package/packages/datadog-plugin-http/src/index.js +25 -5
  143. package/packages/datadog-plugin-http2/src/client.js +2 -2
  144. package/packages/datadog-plugin-http2/src/index.js +1 -1
  145. package/packages/datadog-plugin-jest/src/index.js +2 -2
  146. package/packages/datadog-plugin-kafkajs/src/index.js +1 -1
  147. package/packages/datadog-plugin-langchain/src/index.js +1 -1
  148. package/packages/datadog-plugin-mocha/src/index.js +2 -2
  149. package/packages/datadog-plugin-moleculer/src/index.js +1 -1
  150. package/packages/datadog-plugin-mongodb-core/src/index.js +8 -4
  151. package/packages/datadog-plugin-openai/src/index.js +1 -1
  152. package/packages/datadog-plugin-openai/src/stream-helpers.js +30 -10
  153. package/packages/datadog-plugin-openai/src/tracing.js +2 -2
  154. package/packages/datadog-plugin-playwright/src/index.js +3 -3
  155. package/packages/datadog-plugin-rhea/src/index.js +1 -1
  156. package/packages/datadog-plugin-undici/src/index.js +305 -2
  157. package/packages/datadog-plugin-vitest/src/index.js +5 -5
  158. package/packages/datadog-plugin-ws/src/close.js +56 -3
  159. package/packages/datadog-plugin-ws/src/index.js +4 -0
  160. package/packages/datadog-plugin-ws/src/producer.js +39 -4
  161. package/packages/datadog-plugin-ws/src/receiver.js +39 -3
  162. package/packages/datadog-plugin-ws/src/server.js +13 -1
  163. package/packages/datadog-plugin-ws/src/util.js +107 -0
  164. package/packages/datadog-shimmer/src/shimmer.js +2 -2
  165. package/packages/dd-trace/index.js +19 -0
  166. package/packages/dd-trace/src/aiguard/sdk.js +3 -3
  167. package/packages/dd-trace/src/appsec/graphql.js +2 -2
  168. package/packages/dd-trace/src/appsec/iast/analyzers/code-injection-analyzer.js +1 -1
  169. package/packages/dd-trace/src/appsec/iast/analyzers/command-injection-analyzer.js +1 -1
  170. package/packages/dd-trace/src/appsec/iast/analyzers/cookie-analyzer.js +1 -1
  171. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-base-analyzer.js +1 -1
  172. package/packages/dd-trace/src/appsec/iast/analyzers/injection-analyzer.js +1 -1
  173. package/packages/dd-trace/src/appsec/iast/analyzers/ldap-injection-analyzer.js +1 -1
  174. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +3 -3
  175. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +1 -1
  176. package/packages/dd-trace/src/appsec/iast/analyzers/ssrf-analyzer.js +1 -1
  177. package/packages/dd-trace/src/appsec/iast/analyzers/untrusted-deserialization-analyzer.js +1 -1
  178. package/packages/dd-trace/src/appsec/iast/analyzers/unvalidated-redirect-analyzer.js +1 -1
  179. package/packages/dd-trace/src/appsec/iast/analyzers/weak-cipher-analyzer.js +1 -1
  180. package/packages/dd-trace/src/appsec/iast/analyzers/weak-hash-analyzer.js +3 -2
  181. package/packages/dd-trace/src/appsec/iast/analyzers/weak-randomness-analyzer.js +1 -1
  182. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  183. package/packages/dd-trace/src/appsec/iast/index.js +5 -5
  184. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +1 -1
  185. package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +1 -2
  186. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +1 -1
  187. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -1
  188. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +11 -15
  189. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +1 -1
  190. package/packages/dd-trace/src/appsec/iast/telemetry/namespaces.js +1 -1
  191. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +3 -3
  192. package/packages/dd-trace/src/appsec/index.js +8 -8
  193. package/packages/dd-trace/src/appsec/rasp/command_injection.js +1 -1
  194. package/packages/dd-trace/src/appsec/rasp/index.js +3 -5
  195. package/packages/dd-trace/src/appsec/rasp/lfi.js +1 -1
  196. package/packages/dd-trace/src/appsec/rc-products.js +10 -0
  197. package/packages/dd-trace/src/appsec/recommended.json +230 -3
  198. package/packages/dd-trace/src/appsec/remote_config.js +177 -0
  199. package/packages/dd-trace/src/appsec/reporter.js +3 -3
  200. package/packages/dd-trace/src/appsec/rule_manager.js +37 -20
  201. package/packages/dd-trace/src/appsec/sdk/index.js +1 -1
  202. package/packages/dd-trace/src/appsec/sdk/set_user.js +1 -1
  203. package/packages/dd-trace/src/appsec/sdk/track_event.js +2 -2
  204. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -2
  205. package/packages/dd-trace/src/appsec/user_tracking.js +2 -2
  206. package/packages/dd-trace/src/appsec/waf/index.js +17 -3
  207. package/packages/dd-trace/src/appsec/waf/waf_manager.js +11 -0
  208. package/packages/dd-trace/src/azure_metadata.js +15 -4
  209. package/packages/dd-trace/src/baggage.js +36 -11
  210. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +5 -1
  211. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +6 -0
  212. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +2 -2
  213. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +2 -2
  214. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +2 -2
  215. package/packages/dd-trace/src/ci-visibility/exporters/agentless/index.js +2 -2
  216. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +2 -2
  217. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +4 -3
  218. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +3 -3
  219. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +5 -5
  220. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +1 -1
  221. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +2 -2
  222. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +4 -4
  223. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +4 -4
  224. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +2 -2
  225. package/packages/dd-trace/src/{config_defaults.js → config/defaults.js} +5 -4
  226. package/packages/dd-trace/src/{config-helper.js → config/helper.js} +88 -15
  227. package/packages/dd-trace/src/{config.js → config/index.js} +115 -67
  228. package/packages/dd-trace/src/config/remote_config.js +202 -0
  229. package/packages/dd-trace/src/{config_stable.js → config/stable.js} +20 -32
  230. package/packages/dd-trace/src/{supported-configurations.json → config/supported-configurations.json} +5 -0
  231. package/packages/dd-trace/src/constants.js +5 -0
  232. package/packages/dd-trace/src/crashtracking/crashtracker.js +11 -2
  233. package/packages/dd-trace/src/datastreams/checkpointer.js +2 -2
  234. package/packages/dd-trace/src/datastreams/index.js +1 -1
  235. package/packages/dd-trace/src/datastreams/pathway.js +7 -7
  236. package/packages/dd-trace/src/datastreams/processor.js +3 -3
  237. package/packages/dd-trace/src/datastreams/writer.js +3 -3
  238. package/packages/dd-trace/src/debugger/config.js +1 -0
  239. package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -1
  240. package/packages/dd-trace/src/debugger/devtools_client/config.js +1 -1
  241. package/packages/dd-trace/src/debugger/devtools_client/index.js +7 -2
  242. package/packages/dd-trace/src/debugger/devtools_client/send.js +6 -6
  243. package/packages/dd-trace/src/debugger/devtools_client/session.js +1 -1
  244. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +5 -5
  245. package/packages/dd-trace/src/debugger/devtools_client/snapshot/constants.js +1 -1
  246. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +2 -2
  247. package/packages/dd-trace/src/debugger/devtools_client/state.js +1 -1
  248. package/packages/dd-trace/src/debugger/devtools_client/status.js +2 -2
  249. package/packages/dd-trace/src/debugger/index.js +84 -16
  250. package/packages/dd-trace/src/dogstatsd.js +5 -4
  251. package/packages/dd-trace/src/encode/0.4.js +3 -3
  252. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +2 -2
  253. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  254. package/packages/dd-trace/src/encode/span-stats.js +6 -1
  255. package/packages/dd-trace/src/exporter.js +2 -2
  256. package/packages/dd-trace/src/exporters/agent/index.js +2 -4
  257. package/packages/dd-trace/src/exporters/agent/writer.js +9 -14
  258. package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +2 -2
  259. package/packages/dd-trace/src/exporters/common/docker.js +2 -2
  260. package/packages/dd-trace/src/exporters/common/request.js +3 -3
  261. package/packages/dd-trace/src/exporters/common/util.js +2 -2
  262. package/packages/dd-trace/src/exporters/common/writer.js +1 -1
  263. package/packages/dd-trace/src/exporters/span-stats/index.js +1 -1
  264. package/packages/dd-trace/src/external-logger/src/index.js +1 -2
  265. package/packages/dd-trace/src/flare/index.js +2 -2
  266. package/packages/dd-trace/src/guardrails/index.js +6 -3
  267. package/packages/dd-trace/src/guardrails/telemetry.js +1 -1
  268. package/packages/dd-trace/src/id.js +1 -1
  269. package/packages/dd-trace/src/index.js +4 -4
  270. package/packages/dd-trace/src/lambda/handler.js +5 -5
  271. package/packages/dd-trace/src/lambda/index.js +2 -2
  272. package/packages/dd-trace/src/lambda/runtime/patch.js +6 -6
  273. package/packages/dd-trace/src/lambda/runtime/ritm.js +3 -3
  274. package/packages/dd-trace/src/llmobs/constants/tags.js +14 -1
  275. package/packages/dd-trace/src/llmobs/index.js +10 -11
  276. package/packages/dd-trace/src/llmobs/noop.js +2 -0
  277. package/packages/dd-trace/src/llmobs/plugins/ai/index.js +38 -7
  278. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +30 -9
  279. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +3 -3
  280. package/packages/dd-trace/src/llmobs/plugins/genai/util.js +2 -2
  281. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +1 -1
  282. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +1 -1
  283. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/embedding.js +1 -1
  284. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/llm.js +1 -1
  285. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/vectorstore.js +1 -1
  286. package/packages/dd-trace/src/llmobs/plugins/openai/constants.js +16 -0
  287. package/packages/dd-trace/src/llmobs/plugins/openai/index.js +19 -5
  288. package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +22 -10
  289. package/packages/dd-trace/src/llmobs/plugins/vertexai.js +1 -1
  290. package/packages/dd-trace/src/llmobs/sdk.js +46 -26
  291. package/packages/dd-trace/src/llmobs/span_processor.js +26 -20
  292. package/packages/dd-trace/src/llmobs/tagger.js +175 -1
  293. package/packages/dd-trace/src/llmobs/telemetry.js +3 -4
  294. package/packages/dd-trace/src/llmobs/writers/base.js +117 -38
  295. package/packages/dd-trace/src/llmobs/writers/spans.js +5 -5
  296. package/packages/dd-trace/src/log/index.js +5 -5
  297. package/packages/dd-trace/src/noop/proxy.js +5 -5
  298. package/packages/dd-trace/src/noop/span.js +1 -1
  299. package/packages/dd-trace/src/openfeature/index.js +2 -2
  300. package/packages/dd-trace/src/openfeature/noop.js +14 -14
  301. package/packages/dd-trace/src/openfeature/remote_config.js +31 -0
  302. package/packages/dd-trace/src/openfeature/writers/base.js +12 -13
  303. package/packages/dd-trace/src/openfeature/writers/exposures.js +9 -9
  304. package/packages/dd-trace/src/opentelemetry/context_manager.js +2 -2
  305. package/packages/dd-trace/src/opentelemetry/logs/logger.js +1 -1
  306. package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +4 -4
  307. package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +9 -8
  308. package/packages/dd-trace/src/opentelemetry/metrics/instruments.js +3 -3
  309. package/packages/dd-trace/src/opentelemetry/metrics/meter.js +2 -2
  310. package/packages/dd-trace/src/opentelemetry/metrics/otlp_transformer.js +4 -4
  311. package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +36 -11
  312. package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +2 -2
  313. package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +11 -10
  314. package/packages/dd-trace/src/opentelemetry/otlp/protobuf_loader.js +1 -1
  315. package/packages/dd-trace/src/opentelemetry/span.js +2 -2
  316. package/packages/dd-trace/src/opentelemetry/tracer.js +51 -9
  317. package/packages/dd-trace/src/opentracing/propagation/text_map.js +68 -28
  318. package/packages/dd-trace/src/opentracing/span.js +7 -7
  319. package/packages/dd-trace/src/opentracing/tracer.js +5 -5
  320. package/packages/dd-trace/src/payload-tagging/index.js +6 -2
  321. package/packages/dd-trace/src/plugin_manager.js +8 -6
  322. package/packages/dd-trace/src/plugins/apollo.js +1 -1
  323. package/packages/dd-trace/src/plugins/ci_plugin.js +27 -27
  324. package/packages/dd-trace/src/plugins/database.js +1 -1
  325. package/packages/dd-trace/src/plugins/index.js +5 -1
  326. package/packages/dd-trace/src/plugins/log_plugin.js +1 -1
  327. package/packages/dd-trace/src/plugins/outbound.js +1 -1
  328. package/packages/dd-trace/src/plugins/tracing.js +1 -1
  329. package/packages/dd-trace/src/plugins/util/ci.js +5 -8
  330. package/packages/dd-trace/src/plugins/util/git-cache.js +3 -3
  331. package/packages/dd-trace/src/plugins/util/git.js +8 -8
  332. package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
  333. package/packages/dd-trace/src/plugins/util/test.js +25 -25
  334. package/packages/dd-trace/src/plugins/util/user-provided-git.js +41 -43
  335. package/packages/dd-trace/src/plugins/util/web.js +8 -5
  336. package/packages/dd-trace/src/priority_sampler.js +15 -16
  337. package/packages/dd-trace/src/process-tags/index.js +31 -29
  338. package/packages/dd-trace/src/profiler.js +4 -39
  339. package/packages/dd-trace/src/profiling/config.js +104 -50
  340. package/packages/dd-trace/src/profiling/exporter_cli.js +8 -8
  341. package/packages/dd-trace/src/profiling/exporters/agent.js +6 -6
  342. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +9 -2
  343. package/packages/dd-trace/src/profiling/index.js +1 -1
  344. package/packages/dd-trace/src/profiling/libuv-size.js +1 -1
  345. package/packages/dd-trace/src/profiling/profiler.js +61 -7
  346. package/packages/dd-trace/src/profiling/profilers/event_plugins/event.js +1 -1
  347. package/packages/dd-trace/src/profiling/profilers/events.js +2 -2
  348. package/packages/dd-trace/src/profiling/profilers/wall.js +4 -4
  349. package/packages/dd-trace/src/proxy.js +43 -20
  350. package/packages/dd-trace/src/remote_config/capabilities.js +3 -0
  351. package/packages/dd-trace/src/remote_config/index.js +541 -137
  352. package/packages/dd-trace/src/require-package-json.js +1 -1
  353. package/packages/dd-trace/src/ritm.js +58 -31
  354. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +3 -3
  355. package/packages/dd-trace/src/serverless.js +17 -1
  356. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +8 -0
  357. package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +8 -0
  358. package/packages/dd-trace/src/span_format.js +1 -1
  359. package/packages/dd-trace/src/span_processor.js +4 -4
  360. package/packages/dd-trace/src/span_stats.js +6 -4
  361. package/packages/dd-trace/src/standalone/index.js +1 -1
  362. package/packages/dd-trace/src/startup-log.js +7 -16
  363. package/packages/dd-trace/src/telemetry/dependencies.js +3 -3
  364. package/packages/dd-trace/src/telemetry/endpoints.js +75 -13
  365. package/packages/dd-trace/src/telemetry/logs/index.js +1 -1
  366. package/packages/dd-trace/src/telemetry/send-data.js +103 -4
  367. package/packages/dd-trace/src/telemetry/telemetry.js +238 -114
  368. package/packages/dd-trace/src/tracer.js +3 -3
  369. package/packages/dd-trace/src/tracer_metadata.js +19 -15
  370. package/packages/dd-trace/src/remote_config/manager.js +0 -368
  371. /package/packages/dd-trace/src/{git_properties.js → config/git_properties.js} +0 -0
@@ -1,5 +1,6 @@
1
1
  'use strict'
2
2
 
3
+ const { getValueFromEnvSources } = require('../../config/helper')
3
4
  const {
4
5
  GIT_COMMIT_SHA,
5
6
  GIT_BRANCH,
@@ -19,18 +20,16 @@ const {
19
20
 
20
21
  const { normalizeRef } = require('./ci')
21
22
  const { filterSensitiveInfoFromRepository } = require('./url')
22
- const { getEnvironmentVariables } = require('../../config-helper')
23
23
 
24
- function removeEmptyValues (tags) {
25
- return Object.keys(tags).reduce((filteredTags, tag) => {
26
- if (!tags[tag]) {
27
- return filteredTags
24
+ function removeEmptyValues (tagsAndValues) {
25
+ const filteredTags = {}
26
+ for (let i = 0; i < tagsAndValues.length; i += 2) {
27
+ const value = tagsAndValues[i + 1]
28
+ if (value) {
29
+ filteredTags[tagsAndValues[i]] = value
28
30
  }
29
- return {
30
- ...filteredTags,
31
- [tag]: tags[tag]
32
- }
33
- }, {})
31
+ }
32
+ return filteredTags
34
33
  }
35
34
 
36
35
  // The regex is inspired by
@@ -47,47 +46,46 @@ function validateGitCommitSha (gitCommitSha) {
47
46
  }
48
47
 
49
48
  function getUserProviderGitMetadata () {
50
- const {
51
- DD_GIT_COMMIT_SHA,
52
- DD_GIT_BRANCH,
53
- DD_GIT_REPOSITORY_URL,
54
- DD_GIT_TAG,
55
- DD_GIT_COMMIT_MESSAGE,
56
- DD_GIT_COMMIT_COMMITTER_NAME,
57
- DD_GIT_COMMIT_COMMITTER_EMAIL,
58
- DD_GIT_COMMIT_COMMITTER_DATE,
59
- DD_GIT_COMMIT_AUTHOR_NAME,
60
- DD_GIT_COMMIT_AUTHOR_EMAIL,
61
- DD_GIT_COMMIT_AUTHOR_DATE,
62
- DD_GIT_PULL_REQUEST_BASE_BRANCH,
63
- DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA,
64
- DD_GIT_COMMIT_HEAD_SHA
65
- } = getEnvironmentVariables()
49
+ const DD_GIT_COMMIT_SHA = getValueFromEnvSources('DD_GIT_COMMIT_SHA')
50
+ const DD_GIT_BRANCH = getValueFromEnvSources('DD_GIT_BRANCH')
51
+ const DD_GIT_REPOSITORY_URL = getValueFromEnvSources('DD_GIT_REPOSITORY_URL')
52
+ const DD_GIT_TAG = getValueFromEnvSources('DD_GIT_TAG')
53
+ const DD_GIT_COMMIT_MESSAGE = getValueFromEnvSources('DD_GIT_COMMIT_MESSAGE')
54
+ const DD_GIT_COMMIT_COMMITTER_NAME = getValueFromEnvSources('DD_GIT_COMMIT_COMMITTER_NAME')
55
+ const DD_GIT_COMMIT_COMMITTER_EMAIL = getValueFromEnvSources('DD_GIT_COMMIT_COMMITTER_EMAIL')
56
+ const DD_GIT_COMMIT_COMMITTER_DATE = getValueFromEnvSources('DD_GIT_COMMIT_COMMITTER_DATE')
57
+ const DD_GIT_COMMIT_AUTHOR_NAME = getValueFromEnvSources('DD_GIT_COMMIT_AUTHOR_NAME')
58
+ const DD_GIT_COMMIT_AUTHOR_EMAIL = getValueFromEnvSources('DD_GIT_COMMIT_AUTHOR_EMAIL')
59
+ const DD_GIT_COMMIT_AUTHOR_DATE = getValueFromEnvSources('DD_GIT_COMMIT_AUTHOR_DATE')
60
+ const DD_GIT_PULL_REQUEST_BASE_BRANCH = getValueFromEnvSources('DD_GIT_PULL_REQUEST_BASE_BRANCH')
61
+ const DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA = getValueFromEnvSources('DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA')
62
+ const DD_GIT_COMMIT_HEAD_SHA = getValueFromEnvSources('DD_GIT_COMMIT_HEAD_SHA')
66
63
 
67
64
  const branch = normalizeRef(DD_GIT_BRANCH)
68
65
  let tag = normalizeRef(DD_GIT_TAG)
69
66
 
70
67
  // if DD_GIT_BRANCH is a tag, we associate its value to TAG too
71
- if ((DD_GIT_BRANCH || '').includes('origin/tags') || (DD_GIT_BRANCH || '').includes('refs/heads/tags')) {
68
+ if ((DD_GIT_BRANCH ?? '').includes('origin/tags') || (DD_GIT_BRANCH ?? '').includes('refs/heads/tags')) {
72
69
  tag = normalizeRef(DD_GIT_BRANCH)
73
70
  }
74
71
 
75
- return removeEmptyValues({
76
- [GIT_COMMIT_SHA]: DD_GIT_COMMIT_SHA,
77
- [GIT_BRANCH]: branch,
78
- [GIT_REPOSITORY_URL]: filterSensitiveInfoFromRepository(DD_GIT_REPOSITORY_URL),
79
- [GIT_TAG]: tag,
80
- [GIT_COMMIT_MESSAGE]: DD_GIT_COMMIT_MESSAGE,
81
- [GIT_COMMIT_COMMITTER_NAME]: DD_GIT_COMMIT_COMMITTER_NAME,
82
- [GIT_COMMIT_COMMITTER_DATE]: DD_GIT_COMMIT_COMMITTER_DATE,
83
- [GIT_COMMIT_COMMITTER_EMAIL]: DD_GIT_COMMIT_COMMITTER_EMAIL,
84
- [GIT_COMMIT_AUTHOR_NAME]: DD_GIT_COMMIT_AUTHOR_NAME,
85
- [GIT_COMMIT_AUTHOR_EMAIL]: DD_GIT_COMMIT_AUTHOR_EMAIL,
86
- [GIT_COMMIT_AUTHOR_DATE]: DD_GIT_COMMIT_AUTHOR_DATE,
87
- [GIT_PULL_REQUEST_BASE_BRANCH]: DD_GIT_PULL_REQUEST_BASE_BRANCH,
88
- [GIT_PULL_REQUEST_BASE_BRANCH_SHA]: DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA,
89
- [GIT_COMMIT_HEAD_SHA]: DD_GIT_COMMIT_HEAD_SHA
90
- })
72
+ // Key value pairs are grouped in pairs of two
73
+ return removeEmptyValues([
74
+ GIT_COMMIT_SHA, DD_GIT_COMMIT_SHA,
75
+ GIT_BRANCH, branch,
76
+ GIT_REPOSITORY_URL, filterSensitiveInfoFromRepository(DD_GIT_REPOSITORY_URL),
77
+ GIT_TAG, tag,
78
+ GIT_COMMIT_MESSAGE, DD_GIT_COMMIT_MESSAGE,
79
+ GIT_COMMIT_COMMITTER_NAME, DD_GIT_COMMIT_COMMITTER_NAME,
80
+ GIT_COMMIT_COMMITTER_DATE, DD_GIT_COMMIT_COMMITTER_DATE,
81
+ GIT_COMMIT_COMMITTER_EMAIL, DD_GIT_COMMIT_COMMITTER_EMAIL,
82
+ GIT_COMMIT_AUTHOR_NAME, DD_GIT_COMMIT_AUTHOR_NAME,
83
+ GIT_COMMIT_AUTHOR_EMAIL, DD_GIT_COMMIT_AUTHOR_EMAIL,
84
+ GIT_COMMIT_AUTHOR_DATE, DD_GIT_COMMIT_AUTHOR_DATE,
85
+ GIT_PULL_REQUEST_BASE_BRANCH, DD_GIT_PULL_REQUEST_BASE_BRANCH,
86
+ GIT_PULL_REQUEST_BASE_BRANCH_SHA, DD_GIT_PULL_REQUEST_BASE_BRANCH_SHA,
87
+ GIT_COMMIT_HEAD_SHA, DD_GIT_COMMIT_HEAD_SHA
88
+ ])
91
89
  }
92
90
 
93
91
  module.exports = { getUserProviderGitMetadata, validateGitRepositoryUrl, validateGitCommitSha }
@@ -7,10 +7,10 @@ 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
14
  const { extractURL, obfuscateQs, calculateHttpEndpoint } = require('./url')
15
15
 
16
16
  let extractIp
@@ -274,11 +274,14 @@ const web = {
274
274
  return context.middleware.at(-1)
275
275
  },
276
276
 
277
- // Extract the parent span from the headers and start a new span as its child
278
277
  startChildSpan (tracer, config, name, req, traceCtx) {
279
278
  const headers = req.headers
280
279
  const reqCtx = contexts.get(req)
281
- 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)
282
285
 
283
286
  // we may have headers signaling a router proxy span should be created (such as for AWS API Gateway)
284
287
  if (tracer._config?.inferredProxyServicesEnabled) {
@@ -503,7 +506,7 @@ function addResourceTag (context) {
503
506
  const { req, span } = context
504
507
  const tags = span.context()._tags
505
508
 
506
- if (tags['resource.name']) return
509
+ if (tags[RESOURCE_NAME]) return
507
510
 
508
511
  const resource = [req.method, tags[HTTP_ROUTE]]
509
512
  .filter(Boolean)
@@ -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.
@@ -1,25 +1,10 @@
1
1
  'use strict'
2
2
 
3
3
  const path = require('node:path')
4
- const pkg = require('../pkg')
5
4
 
6
5
  const CURRENT_WORKING_DIRECTORY = process.cwd()
7
6
  const ENTRYPOINT_PATH = require.main?.filename || ''
8
7
 
9
- const TRACING_FIELD_NAME = '_dd.tags.process'
10
- const DSM_FIELD_NAME = 'ProcessTags'
11
- const PROFILING_FIELD_NAME = 'process_tags'
12
-
13
- module.exports.TRACING_FIELD_NAME = TRACING_FIELD_NAME
14
- module.exports.DSM_FIELD_NAME = DSM_FIELD_NAME
15
- module.exports.PROFILING_FIELD_NAME = PROFILING_FIELD_NAME
16
-
17
- // TODO CRASH_TRACKING_FIELD_NAME /process_tags /application/process_tags
18
- // TODO: TELEMETRY_FIELD_NAME /application/process_tags
19
- // TODO: DYNAMIC_INSTRUMENTATION_FIELD_NAME process_tags
20
- // TODO: CLIENT_TRACE_STATISTICS_FIELD_NAME process_tags
21
- // TODO: REMOTE_CONFIG_FIELD_NAME process_tags
22
-
23
8
  // $ cd /foo/bar && node baz/banana.js
24
9
  // entrypoint.workdir = bar
25
10
  // entrypoint.name = banana
@@ -27,7 +12,11 @@ module.exports.PROFILING_FIELD_NAME = PROFILING_FIELD_NAME
27
12
  // entrypoint.basedir = baz
28
13
  // package.json.name = <from package.json>
29
14
 
30
- module.exports = function getProcessTags () {
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
+
31
20
  // this list is sorted alphabetically for consistent serialization
32
21
  const tags = [
33
22
  // the parent directory name of the entrypoint script, e.g. /foo/bar/baz/banana.js -> baz
@@ -46,25 +35,38 @@ module.exports = function getProcessTags () {
46
35
  ['package.json.name', pkg.name || undefined]
47
36
  ]
48
37
 
49
- const serialized = serialize(tags)
38
+ const tagsArray = []
39
+ const tagsObject = {}
50
40
 
51
- return {
52
- tags,
53
- serialized
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
+ }
54
47
  }
55
- }
56
48
 
57
- function serialize (tags) {
58
- const intermediary = []
59
- for (const [name, value] of tags) {
60
- // if we don't have a value we should send nothing at all
61
- if (value === undefined) continue
62
- intermediary.push(`${name}:${sanitize(value)}`)
49
+ const serialized = tagsArray.join(',')
50
+
51
+ return {
52
+ tags,
53
+ serialized,
54
+ tagsObject,
55
+ tagsArray
63
56
  }
64
- return intermediary.join(',')
65
57
  }
66
58
 
67
- module.exports.serialize = serialize
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'
68
70
 
69
71
  /**
70
72
  * Sanitize a process tag value
@@ -1,49 +1,14 @@
1
1
  'use strict'
2
2
 
3
- const log = require('./log')
4
3
  const { profiler } = require('./profiling')
5
4
 
6
- // Stop profiler upon exit in order to collect and export the current profile
7
- process.once('beforeExit', () => { profiler.stop() })
5
+ globalThis[Symbol.for('dd-trace')].beforeExitHandlers.add(() => { profiler.stop() })
8
6
 
9
7
  module.exports = {
10
8
  start: config => {
11
- const { service, version, env, url, hostname, port, tags, repositoryUrl, commitSHA, injectionEnabled } = config
12
- const { enabled, sourceMap, exporters } = config.profiling
13
- const { heartbeatInterval } = config.telemetry
14
-
15
- const logger = {
16
- debug: (message) => log.debug(message),
17
- info: (message) => log.info(message),
18
- warn: (message) => log.warn(message),
19
- error: (...args) => log.error(...args)
20
- }
21
-
22
- const libraryInjected = injectionEnabled.length > 0
23
- let activation
24
- if (enabled === 'auto') {
25
- activation = 'auto'
26
- } else if (enabled === 'true') {
27
- activation = 'manual'
28
- } // else activation = undefined
29
-
30
- return profiler.start({
31
- service,
32
- version,
33
- env,
34
- logger,
35
- sourceMap,
36
- exporters,
37
- url,
38
- hostname,
39
- port,
40
- tags,
41
- repositoryUrl,
42
- commitSHA,
43
- libraryInjected,
44
- activation,
45
- heartbeatInterval
46
- })
9
+ // Forward the full tracer config to the profiling layer.
10
+ // Profiling code is responsible for deriving the specific options it needs.
11
+ return profiler.start(config)
47
12
  },
48
13
 
49
14
  stop: () => {
@@ -4,6 +4,11 @@ const os = require('os')
4
4
  const path = require('path')
5
5
  const { URL, format, pathToFileURL } = require('url')
6
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 { getEnvironmentVariable, getValueFromEnvSources } = require('../config/helper')
7
12
  const { AgentExporter } = require('./exporters/agent')
8
13
  const { FileExporter } = require('./exporters/file')
9
14
  const { ConsoleLogger } = require('./loggers/console')
@@ -11,20 +16,17 @@ const WallProfiler = require('./profilers/wall')
11
16
  const SpaceProfiler = require('./profilers/space')
12
17
  const EventsProfiler = require('./profilers/events')
13
18
  const { oomExportStrategies, snapshotKinds } = require('./constants')
14
- const { GIT_REPOSITORY_URL, GIT_COMMIT_SHA } = require('../plugins/util/tags')
15
19
  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
20
  class Config {
22
21
  constructor (options = {}) {
22
+ // TODO: Remove entries that were already resolved in config.
23
+ // For the others, move them over to config.
24
+ const AWS_LAMBDA_FUNCTION_NAME = getEnvironmentVariable('AWS_LAMBDA_FUNCTION_NAME')
25
+ const NODE_OPTIONS = getEnvironmentVariable('NODE_OPTIONS')
26
+
27
+ // TODO: Move initialization of these values to packages/dd-trace/src/config/index.js, and just read from config
23
28
  const {
24
- AWS_LAMBDA_FUNCTION_NAME: functionname,
25
- DD_AGENT_HOST,
26
- DD_ENV,
27
- DD_INTERNAL_PROFILING_TIMELINE_SAMPLING_ENABLED, // used for testing
29
+ DD_INTERNAL_PROFILING_TIMELINE_SAMPLING_ENABLED,
28
30
  DD_PROFILING_ASYNC_CONTEXT_FRAME_ENABLED,
29
31
  DD_PROFILING_CODEHOTSPOTS_ENABLED,
30
32
  DD_PROFILING_CPU_ENABLED,
@@ -39,41 +41,38 @@ class Config {
39
41
  DD_PROFILING_HEAP_SAMPLING_INTERVAL,
40
42
  DD_PROFILING_PPROF_PREFIX,
41
43
  DD_PROFILING_PROFILERS,
42
- DD_PROFILING_SOURCE_MAP,
43
44
  DD_PROFILING_TIMELINE_ENABLED,
44
45
  DD_PROFILING_UPLOAD_PERIOD,
45
46
  DD_PROFILING_UPLOAD_TIMEOUT,
46
47
  DD_PROFILING_V8_PROFILER_BUG_WORKAROUND,
47
48
  DD_PROFILING_WALLTIME_ENABLED,
48
- DD_SERVICE,
49
- DD_TAGS,
50
- DD_TRACE_AGENT_PORT,
51
- DD_TRACE_AGENT_URL,
52
- DD_VERSION,
53
- NODE_OPTIONS
54
- } = getEnvironmentVariables()
55
-
56
- const env = options.env ?? DD_ENV
57
- const service = options.service || DD_SERVICE || 'node'
49
+ DD_TAGS
50
+ } = getProfilingEnvValues()
51
+
58
52
  const host = os.hostname()
59
- const version = options.version ?? DD_VERSION
60
53
  // Must be longer than one minute so pad with five seconds
61
54
  const flushInterval = options.interval ?? (Number(DD_PROFILING_UPLOAD_PERIOD) * 1000 || 65 * 1000)
62
55
  const uploadTimeout = options.uploadTimeout ?? (Number(DD_PROFILING_UPLOAD_TIMEOUT) || 60 * 1000)
63
- const sourceMap = options.sourceMap ?? DD_PROFILING_SOURCE_MAP ?? true
64
56
  const pprofPrefix = options.pprofPrefix ?? DD_PROFILING_PPROF_PREFIX ?? ''
65
57
 
66
- this.service = service
67
- this.env = env
58
+ // TODO: Remove the fallback. Just use the value from the config.
59
+ this.service = options.service || 'node'
60
+ this.env = options.env
68
61
  this.host = host
69
- this.functionname = functionname
62
+ this.functionname = AWS_LAMBDA_FUNCTION_NAME
70
63
 
71
- this.version = version
64
+ this.version = options.version
72
65
  this.tags = Object.assign(
73
66
  tagger.parse(DD_TAGS),
74
67
  tagger.parse(options.tags),
75
- tagger.parse({ env, host, service, version, functionname }),
76
- getAzureTagsFromMetadata(getAzureAppMetadata())
68
+ tagger.parse({
69
+ env: options.env,
70
+ host,
71
+ service: this.service,
72
+ version: this.version,
73
+ functionname: AWS_LAMBDA_FUNCTION_NAME
74
+ }),
75
+ getAzureTagsFromMetadata(getIsAzureFunction() ? getAzureFunctionMetadata() : getAzureAppMetadata())
77
76
  )
78
77
 
79
78
  // Add source code integration tags if available
@@ -103,7 +102,7 @@ class Config {
103
102
 
104
103
  this.flushInterval = flushInterval
105
104
  this.uploadTimeout = uploadTimeout
106
- this.sourceMap = sourceMap
105
+ this.sourceMap = options.sourceMap
107
106
  this.debugSourceMaps = isTrue(options.debugSourceMaps ?? DD_PROFILING_DEBUG_SOURCE_MAPS)
108
107
  this.endpointCollectionEnabled = isTrue(options.endpointCollection ??
109
108
  DD_PROFILING_ENDPOINT_COLLECTION_ENABLED ?? samplingContextsAvailable)
@@ -112,12 +111,10 @@ class Config {
112
111
  this.pprofPrefix = pprofPrefix
113
112
  this.v8ProfilerBugWorkaroundEnabled = isTrue(options.v8ProfilerBugWorkaround ??
114
113
  DD_PROFILING_V8_PROFILER_BUG_WORKAROUND ?? true)
115
- const hostname = (options.hostname ?? DD_AGENT_HOST) || defaults.hostname
116
- const port = (options.port ?? DD_TRACE_AGENT_PORT) || defaults.port
117
- this.url = new URL(options.url ?? DD_TRACE_AGENT_URL ?? format({
114
+ this.url = new URL(options.url || format({
118
115
  protocol: 'http:',
119
- hostname,
120
- port
116
+ hostname: options.hostname,
117
+ port: options.port
121
118
  }))
122
119
 
123
120
  this.libraryInjected = options.libraryInjected
@@ -178,6 +175,9 @@ class Config {
178
175
 
179
176
  this.heapSamplingInterval = options.heapSamplingInterval ??
180
177
  (Number(DD_PROFILING_HEAP_SAMPLING_INTERVAL) || 512 * 1024)
178
+
179
+ const isAtLeast24 = satisfies(process.versions.node, '>=24.0.0')
180
+
181
181
  const uploadCompression0 = options.uploadCompression ?? DD_PROFILING_DEBUG_UPLOAD_COMPRESSION ?? 'on'
182
182
  let [uploadCompression, level0] = uploadCompression0.split('-')
183
183
  if (!['on', 'off', 'gzip', 'zstd'].includes(uploadCompression)) {
@@ -205,9 +205,12 @@ class Config {
205
205
  }
206
206
  }
207
207
 
208
- // Default to gzip
208
+ // Default to either zstd (on Node.js 24+) or gzip (earlier Node.js). We could default to ztsd
209
+ // everywhere as we ship a Rust zstd compressor for older Node.js versions, but on 24+ we use
210
+ // the built-in one that runs asynchronously on libuv worker threads, just as gzip does. This is
211
+ // the least disruptive choice.
209
212
  if (uploadCompression === 'on') {
210
- uploadCompression = 'gzip'
213
+ uploadCompression = isAtLeast24 ? 'zstd' : 'gzip'
211
214
  }
212
215
 
213
216
  this.uploadCompression = { method: uploadCompression, level }
@@ -221,20 +224,24 @@ class Config {
221
224
 
222
225
  const hasExecArg = (arg) => process.execArgv.includes(arg) || String(NODE_OPTIONS).includes(arg)
223
226
 
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
- }
227
+ let canUseAsyncContextFrame = false
228
+ if (samplingContextsAvailable) {
229
+ if (isAtLeast24) {
230
+ canUseAsyncContextFrame = !hasExecArg('--no-async-context-frame')
231
+ } else if (satisfies(process.versions.node, '>=22.9.0')) {
232
+ canUseAsyncContextFrame = hasExecArg('--experimental-async-context-frame')
233
+ }
234
+ }
235
+ this.asyncContextFrameEnabled = isTrue(DD_PROFILING_ASYNC_CONTEXT_FRAME_ENABLED ?? canUseAsyncContextFrame)
236
+ if (this.asyncContextFrameEnabled && !canUseAsyncContextFrame) {
237
+ if (!samplingContextsAvailable) {
238
+ turnOffAsyncContextFrame(`on ${process.platform}`)
239
+ } else if (isAtLeast24) {
240
+ turnOffAsyncContextFrame('with --no-async-context-frame')
241
+ } else if (satisfies(process.versions.node, '>=22.9.0')) {
242
+ turnOffAsyncContextFrame('without --experimental-async-context-frame')
234
243
  } 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')
244
+ turnOffAsyncContextFrame('but it requires at least Node.js 22.9.0')
238
245
  }
239
246
  }
240
247
 
@@ -428,3 +435,50 @@ function buildExportCommand (options) {
428
435
  path.join(__dirname, 'exporter_cli.js'),
429
436
  urls.join(','), tags, 'space']
430
437
  }
438
+
439
+ function getProfilingEnvValues () {
440
+ return {
441
+ DD_INTERNAL_PROFILING_TIMELINE_SAMPLING_ENABLED:
442
+ getValueFromEnvSources('DD_INTERNAL_PROFILING_TIMELINE_SAMPLING_ENABLED'),
443
+ DD_PROFILING_ASYNC_CONTEXT_FRAME_ENABLED:
444
+ getValueFromEnvSources('DD_PROFILING_ASYNC_CONTEXT_FRAME_ENABLED'),
445
+ DD_PROFILING_CODEHOTSPOTS_ENABLED:
446
+ getValueFromEnvSources('DD_PROFILING_CODEHOTSPOTS_ENABLED'),
447
+ DD_PROFILING_CPU_ENABLED:
448
+ getValueFromEnvSources('DD_PROFILING_CPU_ENABLED'),
449
+ DD_PROFILING_DEBUG_SOURCE_MAPS:
450
+ getValueFromEnvSources('DD_PROFILING_DEBUG_SOURCE_MAPS'),
451
+ DD_PROFILING_DEBUG_UPLOAD_COMPRESSION:
452
+ getValueFromEnvSources('DD_PROFILING_DEBUG_UPLOAD_COMPRESSION'),
453
+ DD_PROFILING_ENDPOINT_COLLECTION_ENABLED:
454
+ getValueFromEnvSources('DD_PROFILING_ENDPOINT_COLLECTION_ENABLED'),
455
+ DD_PROFILING_EXPERIMENTAL_OOM_EXPORT_STRATEGIES:
456
+ getValueFromEnvSources('DD_PROFILING_EXPERIMENTAL_OOM_EXPORT_STRATEGIES'),
457
+ DD_PROFILING_EXPERIMENTAL_OOM_HEAP_LIMIT_EXTENSION_SIZE:
458
+ getValueFromEnvSources('DD_PROFILING_EXPERIMENTAL_OOM_HEAP_LIMIT_EXTENSION_SIZE'),
459
+ DD_PROFILING_EXPERIMENTAL_OOM_MAX_HEAP_EXTENSION_COUNT:
460
+ getValueFromEnvSources('DD_PROFILING_EXPERIMENTAL_OOM_MAX_HEAP_EXTENSION_COUNT'),
461
+ DD_PROFILING_EXPERIMENTAL_OOM_MONITORING_ENABLED:
462
+ getValueFromEnvSources('DD_PROFILING_EXPERIMENTAL_OOM_MONITORING_ENABLED'),
463
+ DD_PROFILING_HEAP_ENABLED:
464
+ getValueFromEnvSources('DD_PROFILING_HEAP_ENABLED'),
465
+ DD_PROFILING_HEAP_SAMPLING_INTERVAL:
466
+ getValueFromEnvSources('DD_PROFILING_HEAP_SAMPLING_INTERVAL'),
467
+ DD_PROFILING_PPROF_PREFIX:
468
+ getValueFromEnvSources('DD_PROFILING_PPROF_PREFIX'),
469
+ DD_PROFILING_PROFILERS:
470
+ getValueFromEnvSources('DD_PROFILING_PROFILERS'),
471
+ DD_PROFILING_TIMELINE_ENABLED:
472
+ getValueFromEnvSources('DD_PROFILING_TIMELINE_ENABLED'),
473
+ DD_PROFILING_UPLOAD_PERIOD:
474
+ getValueFromEnvSources('DD_PROFILING_UPLOAD_PERIOD'),
475
+ DD_PROFILING_UPLOAD_TIMEOUT:
476
+ getValueFromEnvSources('DD_PROFILING_UPLOAD_TIMEOUT'),
477
+ DD_PROFILING_V8_PROFILER_BUG_WORKAROUND:
478
+ getValueFromEnvSources('DD_PROFILING_V8_PROFILER_BUG_WORKAROUND'),
479
+ DD_PROFILING_WALLTIME_ENABLED:
480
+ getValueFromEnvSources('DD_PROFILING_WALLTIME_ENABLED'),
481
+ DD_TAGS:
482
+ getValueFromEnvSources('DD_TAGS')
483
+ }
484
+ }
@@ -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 { getValueFromEnvSources } = 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
@@ -17,9 +17,9 @@ function exporterFromURL (url) {
17
17
  if (url.protocol === 'file:') {
18
18
  return new FileExporter({ pprofPrefix: fileURLToPath(url) })
19
19
  }
20
- const injectionEnabled = (getEnvironmentVariable('DD_INJECTION_ENABLED') ?? '').split(',')
20
+ const injectionEnabled = (getValueFromEnvSources('DD_INJECTION_ENABLED') ?? '').split(',')
21
21
  const libraryInjected = injectionEnabled.length > 0
22
- const profilingEnabled = (getEnvironmentVariable('DD_PROFILING_ENABLED') ?? '').toLowerCase()
22
+ const profilingEnabled = (getValueFromEnvSources('DD_PROFILING_ENABLED') ?? '').toLowerCase()
23
23
  const activation = ['true', '1'].includes(profilingEnabled)
24
24
  ? 'manual'
25
25
  : profilingEnabled === 'auto'
@@ -62,12 +62,12 @@ async function exportProfile (urls, tags, profileType, profile) {
62
62
  * Expected command line arguments are:
63
63
  * - Comma separated list of URLs (eg. "http://127.0.0.1:8126/,file:///tmp/foo.pprof")
64
64
  * - Tags (eg. "service:nodejs_oom_test,version:1.0.0")
65
- * - Profiletype (eg. space,wall,cpu)
65
+ * - Profile type (eg. space,wall,cpu)
66
66
  * - JSON profile filepath
67
67
  */
68
68
  const urls = process.argv[2].split(',').map(s => new URL(s))
69
69
  const tags = tagger.parse(process.argv[3])
70
70
  const profileType = process.argv[4]
71
- const profile = JSON.parse(fs.readFileSync(process.argv[5]))
71
+ const profile = JSON.parse(fs.readFileSync(process.argv[5], 'utf8'))
72
72
 
73
73
  exportProfile(urls, tags, profileType, profile)
@@ -1,19 +1,19 @@
1
1
  'use strict'
2
2
 
3
- const retry = require('../../../../../vendor/dist/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 = []
@@ -73,7 +73,7 @@ function getBody (stream, callback) {
73
73
  callback(err)
74
74
  })
75
75
  stream.on('data', chunk => chunks.push(chunk))
76
- stream.on('end', () => {
76
+ stream.once('end', () => {
77
77
  callback(null, Buffer.concat(chunks))
78
78
  })
79
79
  }