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
@@ -12,7 +12,7 @@ const fs = require('fs')
12
12
  * @typedef { import('module').Module } Module
13
13
  * @param {string} name
14
14
  * @param {Module} module
15
- * @returns {Object} The parsed package.json
15
+ * @returns {object} The parsed package.json
16
16
  */
17
17
  function requirePackageJson (name, module) {
18
18
  if (path.isAbsolute(name)) {
@@ -1,13 +1,16 @@
1
1
  'use strict'
2
2
 
3
3
  const path = require('path')
4
+ const fs = require('fs')
4
5
  const Module = require('module')
5
- const parse = require('../../../vendor/dist/module-details-from-path')
6
+
6
7
  const dc = require('dc-polyfill')
7
- const { getEnvironmentVariable } = require('../../dd-trace/src/config-helper')
8
8
 
9
- const origRequire = Module.prototype.require
9
+ const parse = require('../../../vendor/dist/module-details-from-path')
10
+ const { isRelativeRequire } = require('../../datadog-instrumentations/src/helpers/shared-utils')
11
+ const { getEnvironmentVariable, getValueFromEnvSources } = require('./config/helper')
10
12
 
13
+ const origRequire = Module.prototype.require
11
14
  // derived from require-in-the-middle@3 with tweaks
12
15
 
13
16
  module.exports = Hook
@@ -60,18 +63,19 @@ function Hook (modules, options, onrequire) {
60
63
  */
61
64
  let filename
62
65
  try {
66
+ // @ts-expect-error Module._resolveFilename is not typed
63
67
  filename = Module._resolveFilename(request, this)
64
68
  } catch {
65
69
  return _origRequire.apply(this, arguments)
66
70
  }
67
-
68
71
  const core = !filename.includes(path.sep)
69
72
  let name, basedir, hooks
70
73
  // return known patched modules immediately
71
74
  if (cache[filename]) {
75
+ const externalCacheEntry = require.cache[filename]
72
76
  // require.cache was potentially altered externally
73
- if (require.cache[filename] && require.cache[filename].exports !== cache[filename].original) {
74
- return require.cache[filename].exports
77
+ if (externalCacheEntry && externalCacheEntry.exports !== cache[filename].original) {
78
+ return externalCacheEntry.exports
75
79
  }
76
80
 
77
81
  return cache[filename].exports
@@ -111,38 +115,49 @@ function Hook (modules, options, onrequire) {
111
115
  name = filename
112
116
  } else {
113
117
  const inAWSLambda = getEnvironmentVariable('AWS_LAMBDA_FUNCTION_NAME') !== undefined
114
- const hasLambdaHandler = getEnvironmentVariable('DD_LAMBDA_HANDLER') !== undefined
118
+ const hasLambdaHandler = getValueFromEnvSources('DD_LAMBDA_HANDLER') !== undefined
115
119
  const segments = filename.split(path.sep)
116
120
  const filenameFromNodeModule = segments.includes('node_modules')
117
121
  // decide how to assign the stat
118
122
  // first case will only happen when patching an AWS Lambda Handler
119
123
  const stat = inAWSLambda && hasLambdaHandler && !filenameFromNodeModule ? { name: filename } : parse(filename)
120
- if (!stat) return exports // abort if filename could not be parsed
121
- name = stat.name
122
- basedir = stat.basedir
123
-
124
- hooks = moduleHooks[name]
125
- if (!hooks) return exports // abort if module name isn't on whitelist
126
124
 
127
- // figure out if this is the main module file, or a file inside the module
128
- const paths = Module._resolveLookupPaths(name, this, true)
129
- if (!paths) {
130
- // abort if _resolveLookupPaths return null
131
- return exports
132
- }
133
-
134
- let res
135
- try {
136
- res = Module._findPath(name, [basedir, ...paths])
137
- } catch {
138
- // case where the file specified in package.json "main" doesn't exist
139
- // in this case, the file is treated as module-internal
140
- }
125
+ if (stat) {
126
+ name = stat.name
127
+ basedir = stat.basedir
128
+
129
+ hooks = moduleHooks[name]
130
+ if (!hooks) return exports // abort if module name isn't on whitelist
131
+
132
+ // @ts-expect-error Module._resolveLookupPaths is not typed
133
+ const paths = Module._resolveLookupPaths(name, this, true)
134
+ if (!paths) {
135
+ // abort if _resolveLookupPaths return null
136
+ return exports
137
+ }
138
+
139
+ let res
140
+ try {
141
+ // @ts-expect-error Module._findPath is not typed
142
+ res = Module._findPath(name, [basedir, ...paths])
143
+ } catch {
144
+ // case where the file specified in package.json "main" doesn't exist
145
+ // in this case, the file is treated as module-internal
146
+ }
147
+
148
+ if (!res || res !== filename) {
149
+ // this is a module-internal file
150
+ // use the module-relative path to the file, prefixed by original module name
151
+ name = name + path.sep + path.relative(basedir, filename)
152
+ }
153
+ } else {
154
+ if (isRelativeRequire(request) && moduleHooks[request]) {
155
+ hooks = moduleHooks[request]
156
+ name = request
157
+ basedir = findProjectRoot(filename)
158
+ }
141
159
 
142
- if (!res || res !== filename) {
143
- // this is a module-internal file
144
- // use the module-relative path to the file, prefixed by original module name
145
- name = name + path.sep + path.relative(basedir, filename)
160
+ if (!hooks) return exports
146
161
  }
147
162
  }
148
163
 
@@ -167,6 +182,18 @@ Hook.reset = function () {
167
182
  moduleHooks = Object.create(null)
168
183
  }
169
184
 
185
+ function findProjectRoot (startDir) {
186
+ let dir = startDir
187
+
188
+ while (!fs.existsSync(path.join(dir, 'package.json'))) {
189
+ const parent = path.dirname(dir)
190
+ if (parent === dir) break
191
+ dir = parent
192
+ }
193
+
194
+ return dir
195
+ }
196
+
170
197
  Hook.prototype.unhook = function () {
171
198
  for (const mod of this.modules) {
172
199
  const hooks = (moduleHooks[mod] || []).filter(hook => hook !== this.onrequire)
@@ -5,15 +5,15 @@
5
5
  const v8 = require('v8')
6
6
  const os = require('os')
7
7
  const process = require('process')
8
+ const { performance, PerformanceObserver, monitorEventLoopDelay } = require('perf_hooks')
8
9
  const { DogStatsDClient, MetricsAggregationClient } = require('../dogstatsd')
9
10
  const log = require('../log')
10
- const { performance, PerformanceObserver, monitorEventLoopDelay } = require('perf_hooks')
11
- const { getEnvironmentVariable } = require('../config-helper')
11
+ const { getValueFromEnvSources } = require('../config/helper')
12
12
 
13
13
  const { NODE_MAJOR } = require('../../../../version')
14
14
  // TODO: This environment variable may not be changed, since the agent expects a flush every ten seconds.
15
15
  // It is only a variable for testing. Think about alternatives.
16
- const DD_RUNTIME_METRICS_FLUSH_INTERVAL = getEnvironmentVariable('DD_RUNTIME_METRICS_FLUSH_INTERVAL') ?? '10000'
16
+ const DD_RUNTIME_METRICS_FLUSH_INTERVAL = getValueFromEnvSources('DD_RUNTIME_METRICS_FLUSH_INTERVAL') ?? '10000'
17
17
  const INTERVAL = Number.parseInt(DD_RUNTIME_METRICS_FLUSH_INTERVAL, 10)
18
18
 
19
19
  const eventLoopDelayResolution = 4
@@ -1,6 +1,7 @@
1
1
  'use strict'
2
2
 
3
- const { getEnvironmentVariable } = require('./config-helper')
3
+ const { getEnvironmentVariable, getValueFromEnvSources } = require('./config/helper')
4
+ const { isFalse } = require('./util')
4
5
 
5
6
  function getIsGCPFunction () {
6
7
  const isDeprecatedGCPFunction =
@@ -13,6 +14,15 @@ function getIsGCPFunction () {
13
14
  return isDeprecatedGCPFunction || isNewerGCPFunction
14
15
  }
15
16
 
17
+ /**
18
+ * Enable GCP Pub/Sub PUSH subscription tracing for Cloud Run (K_SERVICE present).
19
+ * PUSH: GCP sends HTTP POST requests to the service with message data in headers.
20
+ */
21
+ function enableGCPPubSubPushSubscription () {
22
+ const isGCPPubSubPushSubscriptionEnabled = getValueFromEnvSources('DD_TRACE_GCP_PUBSUB_PUSH_ENABLED')
23
+ return getEnvironmentVariable('K_SERVICE') !== undefined && !isFalse(isGCPPubSubPushSubscriptionEnabled)
24
+ }
25
+
16
26
  function getIsAzureFunction () {
17
27
  const isAzureFunction =
18
28
  getEnvironmentVariable('FUNCTIONS_EXTENSION_VERSION') !== undefined &&
@@ -21,6 +31,10 @@ function getIsAzureFunction () {
21
31
  return isAzureFunction
22
32
  }
23
33
 
34
+ function getIsFlexConsumptionAzureFunction () {
35
+ return getIsAzureFunction() && getEnvironmentVariable('WEBSITE_SKU') === 'FlexConsumption'
36
+ }
37
+
24
38
  function isInServerlessEnvironment () {
25
39
  const inAWSLambda = getEnvironmentVariable('AWS_LAMBDA_FUNCTION_NAME') !== undefined
26
40
  const isGCPFunction = getIsGCPFunction()
@@ -32,5 +46,7 @@ function isInServerlessEnvironment () {
32
46
  module.exports = {
33
47
  getIsGCPFunction,
34
48
  getIsAzureFunction,
49
+ enableGCPPubSubPushSubscription,
50
+ getIsFlexConsumptionAzureFunction,
35
51
  isInServerlessEnvironment
36
52
  }
@@ -47,6 +47,10 @@ const messaging = {
47
47
  sns: {
48
48
  opName: () => 'aws.request',
49
49
  serviceName: awsServiceV0
50
+ },
51
+ bullmq: {
52
+ opName: () => 'bullmq.add',
53
+ serviceName: ({ tracerService }) => `${tracerService}-bullmq`
50
54
  }
51
55
  },
52
56
  consumer: {
@@ -77,6 +81,10 @@ const messaging = {
77
81
  sqs: {
78
82
  opName: () => 'aws.request',
79
83
  serviceName: awsServiceV0
84
+ },
85
+ bullmq: {
86
+ opName: () => 'bullmq.processJob',
87
+ serviceName: ({ tracerService }) => `${tracerService}-bullmq`
80
88
  }
81
89
  },
82
90
  client: {
@@ -44,6 +44,10 @@ const messaging = {
44
44
  sns: {
45
45
  opName: () => 'aws.sns.send',
46
46
  serviceName: identityService
47
+ },
48
+ bullmq: {
49
+ opName: () => 'bullmq.add',
50
+ serviceName: identityService
47
51
  }
48
52
  },
49
53
  consumer: {
@@ -65,6 +69,10 @@ const messaging = {
65
69
  sqs: {
66
70
  opName: () => 'aws.sqs.process',
67
71
  serviceName: identityService
72
+ },
73
+ bullmq: {
74
+ opName: () => 'bullmq.processJob',
75
+ serviceName: identityService
68
76
  }
69
77
  },
70
78
  client: {
@@ -1,7 +1,7 @@
1
1
  'use strict'
2
2
 
3
- const constants = require('./constants')
4
3
  const tags = require('../../../ext/tags')
4
+ const constants = require('./constants')
5
5
  const id = require('./id')
6
6
  const { isError } = require('./util')
7
7
  const { registerExtraService } = require('./service-naming/extra-services')
@@ -4,8 +4,8 @@ const log = require('./log')
4
4
  const spanFormat = require('./span_format')
5
5
  const SpanSampler = require('./span_sampler')
6
6
  const GitMetadataTagger = require('./git_metadata_tagger')
7
- const { getEnvironmentVariable } = require('./config-helper')
8
- const getProcessTags = require('./process-tags')
7
+ const processTags = require('./process-tags')
8
+ const { getValueFromEnvSources } = require('./config/helper')
9
9
 
10
10
  const startedSpans = new WeakSet()
11
11
  const finishedSpans = new WeakSet()
@@ -27,7 +27,7 @@ class SpanProcessor {
27
27
  this._gitMetadataTagger = new GitMetadataTagger(config)
28
28
 
29
29
  this._processTags = config.propagateProcessTags?.enabled
30
- ? getProcessTags().serialized
30
+ ? processTags.serialized
31
31
  : false
32
32
  }
33
33
 
@@ -88,7 +88,7 @@ class SpanProcessor {
88
88
  }
89
89
 
90
90
  _erase (trace, active) {
91
- if (getEnvironmentVariable('DD_TRACE_EXPERIMENTAL_STATE_TRACKING') === 'true') {
91
+ if (getValueFromEnvSources('DD_TRACE_EXPERIMENTAL_STATE_TRACKING') === 'true') {
92
92
  const started = new Set()
93
93
  const startedIds = new Set()
94
94
  const finished = new Set()
@@ -1,11 +1,9 @@
1
1
  'use strict'
2
2
 
3
- const os = require('os')
4
- const { version } = require('./pkg')
3
+ const os = require('node:os')
5
4
  const pkg = require('../../../package.json')
6
5
 
7
6
  const { LogCollapsingLowestDenseDDSketch } = require('../../../vendor/dist/@datadog/sketches-js')
8
- const { ORIGIN_KEY, TOP_LEVEL_KEY } = require('./constants')
9
7
  const {
10
8
  MEASURED,
11
9
  HTTP_STATUS_CODE,
@@ -13,6 +11,9 @@ const {
13
11
  HTTP_ROUTE,
14
12
  HTTP_METHOD
15
13
  } = require('../../../ext/tags')
14
+ const { ORIGIN_KEY, TOP_LEVEL_KEY } = require('./constants')
15
+ const { version } = require('./pkg')
16
+ const processTags = require('./process-tags')
16
17
 
17
18
  const { SpanStatsExporter } = require('./exporters/span-stats')
18
19
 
@@ -176,7 +177,8 @@ class SpanStatsProcessor {
176
177
  Lang: 'javascript',
177
178
  TracerVersion: pkg.version,
178
179
  RuntimeID: this.tags['runtime-id'],
179
- Sequence: ++this.sequence
180
+ Sequence: ++this.sequence,
181
+ ProcessTags: processTags.serialized
180
182
  })
181
183
  }
182
184
 
@@ -1,10 +1,10 @@
1
1
  'use strict'
2
2
 
3
3
  const { channel } = require('dc-polyfill')
4
- const TraceSourcePrioritySampler = require('./tracesource_priority_sampler')
5
4
  const { USER_KEEP } = require('../../../../ext/priority')
6
5
  const TraceState = require('../opentracing/propagation/tracestate')
7
6
  const { APM_TRACING_ENABLED_KEY } = require('../constants')
7
+ const TraceSourcePrioritySampler = require('./tracesource_priority_sampler')
8
8
  const { hasTraceSourcePropagationTag } = require('./tracesource')
9
9
 
10
10
  const startCh = channel('dd-trace:span:start')
@@ -1,11 +1,10 @@
1
1
  'use strict'
2
2
 
3
- const { info, warn } = require('./log/writer')
4
-
5
3
  const os = require('os')
6
4
  const { inspect } = require('util')
7
- const defaults = require('./config_defaults')
8
5
  const tracerVersion = require('../../../package.json').version
6
+ const defaults = require('./config/defaults')
7
+ const { info, warn } = require('./log/writer')
9
8
 
10
9
  const errors = {}
11
10
  let config
@@ -15,23 +14,15 @@ let samplingRules = []
15
14
  let alreadyRan = false
16
15
 
17
16
  /**
18
- * @param {{ agentError: { code: string, message: string } }} [options]
17
+ * @param {{ status: number, message: string } } [agentError]
19
18
  */
20
- function startupLog ({ agentError } = {}) {
21
- if (!config || !pluginManager) {
22
- return
23
- }
24
-
25
- if (alreadyRan) {
19
+ function startupLog (agentError) {
20
+ if (alreadyRan || !config || !config.startupLogs || !pluginManager) {
26
21
  return
27
22
  }
28
23
 
29
24
  alreadyRan = true
30
25
 
31
- if (!config.startupLogs) {
32
- return
33
- }
34
-
35
26
  const out = tracerInfo()
36
27
 
37
28
  if (agentError) {
@@ -42,8 +33,8 @@ function startupLog ({ agentError } = {}) {
42
33
  if (agentError) {
43
34
  warn('DATADOG TRACER DIAGNOSTIC - Agent Error: ' + agentError.message)
44
35
  errors.agentError = {
45
- code: agentError.code ?? '',
46
- message: `Agent Error:${agentError.message}`
36
+ code: agentError.status,
37
+ message: `Agent Error: ${agentError.message}`
47
38
  }
48
39
  }
49
40
  }
@@ -1,12 +1,12 @@
1
1
  'use strict'
2
2
 
3
3
  const path = require('path')
4
+ const { fileURLToPath } = require('url')
5
+ const dc = require('dc-polyfill')
4
6
  const parse = require('../../../../vendor/dist/module-details-from-path')
5
7
  const requirePackageJson = require('../require-package-json')
6
- const { sendData } = require('./send-data')
7
- const dc = require('dc-polyfill')
8
- const { fileURLToPath } = require('url')
9
8
  const { isTrue } = require('../../src/util')
9
+ const { sendData } = require('./send-data')
10
10
 
11
11
  /** @type {Set<string>} */
12
12
  const savedDependenciesToSend = new Set()
@@ -3,60 +3,106 @@
3
3
  const dc = require('dc-polyfill')
4
4
  const { sendData } = require('./send-data')
5
5
 
6
+ /**
7
+ * RetryData is information that `telemetry.js` keeps in-memory to be merged into the next payload.
8
+ *
9
+ * @callback GetRetryData
10
+ * @returns {{ payload: Record<string, unknown>, reqType: string } | null}
11
+ */
12
+ /**
13
+ * @typedef {import('./send-data').TelemetryConfig & {
14
+ * appsec?: { apiSecurity?: { endpointCollectionEnabled?: boolean, endpointCollectionMessageLimit?: number } }
15
+ * }} TelemetryConfig
16
+ */
17
+
6
18
  const fastifyRouteCh = dc.channel('apm:fastify:route:added')
7
19
  const expressRouteCh = dc.channel('apm:express:route:added')
8
20
  const routerRouteCh = dc.channel('apm:router:route:added')
9
21
 
22
+ /** @type {TelemetryConfig} */
10
23
  let config
24
+
25
+ /** @type {import('./send-data').TelemetryApplication} */
11
26
  let application
27
+
28
+ /** @type {import('./send-data').TelemetryHost} */
12
29
  let host
30
+
31
+ /** @type {GetRetryData} */
13
32
  let getRetryData
33
+
34
+ /** @type {import('./send-data').SendDataCallback} */
14
35
  let updateRetryData
15
36
 
16
37
  /**
17
38
  * Keep track of endpoints that still need to be sent.
18
- * Map key is `${METHOD} ${PATH}`, value is { method, path }
39
+ * Map key is `${METHOD} ${PATH}`, value is { method, path, operationName }
19
40
  */
41
+ /** @type {Map<string, { method: string, path: string, operationName: string }>} */
20
42
  const pendingEndpoints = new Map()
43
+
44
+ /** @type {Set<string>} */
21
45
  const wildcardEndpoints = new Set()
22
46
  let flushScheduled = false
23
47
  let isFirstPayload = true
24
48
 
49
+ /**
50
+ * @param {string} method
51
+ * @param {string} path
52
+ * @returns {string}
53
+ */
25
54
  function endpointKey (method, path) {
26
55
  return `${method.toUpperCase()} ${path}`
27
56
  }
28
57
 
58
+ /**
59
+ * @returns {void}
60
+ */
29
61
  function scheduleFlush () {
30
62
  if (flushScheduled) return
31
63
  flushScheduled = true
32
- setImmediate(flushAndSend).unref()
64
+ // this used to be setImmediate() instead, but it was making the system test flaky
65
+ // don't ask me why
66
+ setTimeout(flushAndSend).unref()
33
67
  }
34
68
 
35
- function recordEndpoint (method, path) {
69
+ /**
70
+ * @param {string} method
71
+ * @param {string} path
72
+ * @param {string} operationName
73
+ * @returns {void}
74
+ */
75
+ function recordEndpoint (method, path, operationName) {
36
76
  const key = endpointKey(method, path)
37
77
  if (pendingEndpoints.has(key)) return
38
78
 
39
- pendingEndpoints.set(key, { method: method.toUpperCase(), path })
79
+ pendingEndpoints.set(key, { method: method.toUpperCase(), path, operationName })
40
80
  scheduleFlush()
41
81
  }
42
82
 
83
+ /**
84
+ * @param {{ routeOptions?: { path?: string, method: string | string[] } } | null | undefined} routeData
85
+ */
43
86
  function onFastifyRoute (routeData) {
44
87
  const routeOptions = routeData?.routeOptions
45
88
  if (!routeOptions?.path) return
46
89
 
47
90
  const methods = Array.isArray(routeOptions.method) ? routeOptions.method : [routeOptions.method]
48
91
  for (const method of methods) {
49
- recordEndpoint(method, routeOptions.path)
92
+ recordEndpoint(method, routeOptions.path, 'fastify.request')
50
93
  }
51
94
  }
52
95
 
96
+ /**
97
+ * @param {{ method?: string, path?: string }} param0
98
+ */
53
99
  function onExpressRoute ({ method, path }) {
54
100
  if (!method || !path) return
55
101
 
56
102
  // If wildcard already recorded for this path, skip specific methods
57
103
  if (wildcardEndpoints.has(path)) return
58
104
 
59
- recordEndpoint(method, path)
105
+ recordEndpoint(method, path, 'express.request')
60
106
 
61
107
  // If this is a wildcard event, record it and mark path as wildcarded
62
108
  if (method === '*') {
@@ -66,22 +112,28 @@ function onExpressRoute ({ method, path }) {
66
112
 
67
113
  // Express automatically adds HEAD support for GET routes
68
114
  if (method.toUpperCase() === 'GET') {
69
- recordEndpoint('HEAD', path)
115
+ recordEndpoint('HEAD', path, 'express.request')
70
116
  }
71
117
  }
72
118
 
119
+ /**
120
+ * @param {{ method: string, path: string, operationName: string }[]} endpoints
121
+ */
73
122
  function buildEndpointObjects (endpoints) {
74
- return endpoints.map(({ method, path }) => {
123
+ return endpoints.map(({ method, path, operationName }) => {
75
124
  return {
76
125
  type: 'REST',
77
126
  method,
78
127
  path,
79
- operation_name: 'http.request',
128
+ operation_name: operationName,
80
129
  resource_name: endpointKey(method, path)
81
130
  }
82
131
  })
83
132
  }
84
133
 
134
+ /**
135
+ * @returns {void}
136
+ */
85
137
  function flushAndSend () {
86
138
  flushScheduled = false
87
139
  if (pendingEndpoints.size === 0) return
@@ -90,7 +142,8 @@ function flushAndSend () {
90
142
  for (const [key, endpoint] of pendingEndpoints) {
91
143
  batchEndpoints.push(endpoint)
92
144
  pendingEndpoints.delete(key)
93
- if (batchEndpoints.length >= config.appsec?.apiSecurity?.endpointCollectionMessageLimit) break
145
+ // Config is set when endpoint collection is enabled; message limit is optional
146
+ if (batchEndpoints.length >= (config.appsec?.apiSecurity?.endpointCollectionMessageLimit ?? 0)) break
94
147
  }
95
148
 
96
149
  const payloadObj = {
@@ -98,7 +151,10 @@ function flushAndSend () {
98
151
  endpoints: buildEndpointObjects(batchEndpoints)
99
152
  }
100
153
 
154
+ /** @type {import('./send-data').TelemetryRequestType} */
101
155
  let reqType = 'app-endpoints'
156
+
157
+ /** @type {import('./send-data').TelemetryPayload} */
102
158
  let payload = payloadObj
103
159
 
104
160
  const retryData = getRetryData()
@@ -120,8 +176,15 @@ function flushAndSend () {
120
176
  if (pendingEndpoints.size) scheduleFlush()
121
177
  }
122
178
 
123
- function start (_config = {}, _application, _host, getRetryDataFunction, updateRetryDataFunction) {
124
- if (!_config?.appsec?.apiSecurity?.endpointCollectionEnabled) return
179
+ /**
180
+ * @param {TelemetryConfig} _config
181
+ * @param {import('./send-data').TelemetryApplication} _application
182
+ * @param {import('./send-data').TelemetryHost} _host
183
+ * @param {GetRetryData} getRetryDataFunction
184
+ * @param {import('./send-data').SendDataCallback} updateRetryDataFunction
185
+ */
186
+ function start (_config, _application, _host, getRetryDataFunction, updateRetryDataFunction) {
187
+ if (!_config.appsec?.apiSecurity?.endpointCollectionEnabled) return
125
188
 
126
189
  config = _config
127
190
  application = _application
@@ -141,7 +204,6 @@ function stop () {
141
204
 
142
205
  pendingEndpoints.clear()
143
206
  flushScheduled = false
144
- config = application = host = getRetryData = updateRetryData = null
145
207
  }
146
208
 
147
209
  module.exports = {
@@ -1,8 +1,8 @@
1
1
  'use strict'
2
2
 
3
3
  const dc = require('dc-polyfill')
4
- const logCollector = require('./log-collector')
5
4
  const { sendData } = require('../send-data')
5
+ const logCollector = require('./log-collector')
6
6
 
7
7
  const telemetryLog = dc.channel('datadog:telemetry:log')
8
8
  const errorLog = dc.channel('datadog:log:error')