dd-trace 5.81.0 → 5.82.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/index.d.ts +7 -0
  2. package/loader-hook.mjs +7 -2
  3. package/package.json +13 -18
  4. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  5. package/packages/datadog-esbuild/index.js +8 -7
  6. package/packages/datadog-esbuild/src/utils.js +14 -2
  7. package/packages/datadog-instrumentations/src/aerospike.js +3 -2
  8. package/packages/datadog-instrumentations/src/ai.js +2 -2
  9. package/packages/datadog-instrumentations/src/amqp10.js +1 -1
  10. package/packages/datadog-instrumentations/src/amqplib.js +4 -4
  11. package/packages/datadog-instrumentations/src/anthropic.js +2 -2
  12. package/packages/datadog-instrumentations/src/apollo-server-core.js +2 -2
  13. package/packages/datadog-instrumentations/src/apollo-server.js +1 -1
  14. package/packages/datadog-instrumentations/src/apollo.js +3 -2
  15. package/packages/datadog-instrumentations/src/avsc.js +1 -1
  16. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  17. package/packages/datadog-instrumentations/src/azure-event-hubs.js +4 -3
  18. package/packages/datadog-instrumentations/src/azure-functions.js +2 -2
  19. package/packages/datadog-instrumentations/src/azure-service-bus.js +3 -4
  20. package/packages/datadog-instrumentations/src/bluebird.js +1 -1
  21. package/packages/datadog-instrumentations/src/bullmq.js +11 -0
  22. package/packages/datadog-instrumentations/src/bunyan.js +1 -1
  23. package/packages/datadog-instrumentations/src/cassandra-driver.js +1 -1
  24. package/packages/datadog-instrumentations/src/child_process.js +2 -2
  25. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +3 -3
  26. package/packages/datadog-instrumentations/src/couchbase.js +1 -1
  27. package/packages/datadog-instrumentations/src/crypto.js +1 -1
  28. package/packages/datadog-instrumentations/src/cucumber.js +12 -13
  29. package/packages/datadog-instrumentations/src/cypress.js +1 -1
  30. package/packages/datadog-instrumentations/src/dns.js +1 -1
  31. package/packages/datadog-instrumentations/src/elasticsearch.js +1 -1
  32. package/packages/datadog-instrumentations/src/express-mongo-sanitize.js +1 -1
  33. package/packages/datadog-instrumentations/src/express.js +1 -1
  34. package/packages/datadog-instrumentations/src/fs.js +1 -1
  35. package/packages/datadog-instrumentations/src/generic-pool.js +1 -1
  36. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +137 -15
  37. package/packages/datadog-instrumentations/src/google-cloud-vertexai.js +2 -3
  38. package/packages/datadog-instrumentations/src/google-genai.js +3 -3
  39. package/packages/datadog-instrumentations/src/graphql.js +1 -1
  40. package/packages/datadog-instrumentations/src/grpc/client.js +1 -1
  41. package/packages/datadog-instrumentations/src/grpc/server.js +1 -1
  42. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +1 -1
  43. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
  44. package/packages/datadog-instrumentations/src/helpers/hooks.js +4 -1
  45. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -1
  46. package/packages/datadog-instrumentations/src/helpers/register.js +6 -4
  47. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +2 -2
  48. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/bullmq.json +106 -0
  49. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +2 -1
  50. package/packages/datadog-instrumentations/src/helpers/router-helper.js +1 -1
  51. package/packages/datadog-instrumentations/src/helpers/shared-utils.js +9 -0
  52. package/packages/datadog-instrumentations/src/hono.js +55 -10
  53. package/packages/datadog-instrumentations/src/ioredis.js +1 -1
  54. package/packages/datadog-instrumentations/src/iovalkey.js +1 -1
  55. package/packages/datadog-instrumentations/src/jest.js +2 -2
  56. package/packages/datadog-instrumentations/src/kafkajs.js +3 -3
  57. package/packages/datadog-instrumentations/src/knex.js +1 -1
  58. package/packages/datadog-instrumentations/src/ldapjs.js +1 -1
  59. package/packages/datadog-instrumentations/src/light-my-request.js +93 -0
  60. package/packages/datadog-instrumentations/src/limitd-client.js +1 -1
  61. package/packages/datadog-instrumentations/src/lodash.js +1 -2
  62. package/packages/datadog-instrumentations/src/mariadb.js +1 -2
  63. package/packages/datadog-instrumentations/src/memcached.js +1 -1
  64. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  65. package/packages/datadog-instrumentations/src/mongodb.js +1 -1
  66. package/packages/datadog-instrumentations/src/mongoose.js +1 -1
  67. package/packages/datadog-instrumentations/src/mquery.js +1 -1
  68. package/packages/datadog-instrumentations/src/mysql.js +1 -1
  69. package/packages/datadog-instrumentations/src/mysql2.js +1 -1
  70. package/packages/datadog-instrumentations/src/net.js +1 -1
  71. package/packages/datadog-instrumentations/src/next.js +1 -1
  72. package/packages/datadog-instrumentations/src/nyc.js +1 -1
  73. package/packages/datadog-instrumentations/src/openai.js +2 -2
  74. package/packages/datadog-instrumentations/src/opensearch.js +1 -1
  75. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  76. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +1 -1
  77. package/packages/datadog-instrumentations/src/pg.js +3 -3
  78. package/packages/datadog-instrumentations/src/pino.js +1 -1
  79. package/packages/datadog-instrumentations/src/playwright.js +1 -1
  80. package/packages/datadog-instrumentations/src/prisma.js +52 -37
  81. package/packages/datadog-instrumentations/src/process.js +1 -1
  82. package/packages/datadog-instrumentations/src/promise-js.js +1 -1
  83. package/packages/datadog-instrumentations/src/promise.js +1 -1
  84. package/packages/datadog-instrumentations/src/protobufjs.js +1 -1
  85. package/packages/datadog-instrumentations/src/q.js +1 -1
  86. package/packages/datadog-instrumentations/src/redis.js +1 -1
  87. package/packages/datadog-instrumentations/src/rhea.js +1 -1
  88. package/packages/datadog-instrumentations/src/selenium.js +1 -1
  89. package/packages/datadog-instrumentations/src/sequelize.js +1 -2
  90. package/packages/datadog-instrumentations/src/sharedb.js +1 -1
  91. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  92. package/packages/datadog-instrumentations/src/undici.js +4 -4
  93. package/packages/datadog-instrumentations/src/url.js +1 -1
  94. package/packages/datadog-instrumentations/src/vitest.js +1 -1
  95. package/packages/datadog-instrumentations/src/vm.js +1 -1
  96. package/packages/datadog-instrumentations/src/when.js +1 -1
  97. package/packages/datadog-instrumentations/src/winston.js +1 -1
  98. package/packages/datadog-instrumentations/src/ws.js +3 -2
  99. package/packages/datadog-plugin-amqp10/src/index.js +1 -1
  100. package/packages/datadog-plugin-amqplib/src/index.js +1 -1
  101. package/packages/datadog-plugin-anthropic/src/index.js +1 -1
  102. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/index.js +1 -1
  103. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +4 -4
  104. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  105. package/packages/datadog-plugin-aws-sdk/src/util.js +3 -3
  106. package/packages/datadog-plugin-azure-event-hubs/src/index.js +1 -1
  107. package/packages/datadog-plugin-azure-event-hubs/src/producer.js +19 -5
  108. package/packages/datadog-plugin-azure-service-bus/src/index.js +1 -1
  109. package/packages/datadog-plugin-azure-service-bus/src/producer.js +4 -0
  110. package/packages/datadog-plugin-bullmq/src/consumer.js +60 -0
  111. package/packages/datadog-plugin-bullmq/src/index.js +18 -0
  112. package/packages/datadog-plugin-bullmq/src/producer.js +178 -0
  113. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/index.js +1 -1
  114. package/packages/datadog-plugin-cypress/src/plugin.js +1 -1
  115. package/packages/datadog-plugin-express/src/index.js +1 -1
  116. package/packages/datadog-plugin-fastify/src/index.js +1 -1
  117. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +13 -3
  118. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +171 -12
  119. package/packages/datadog-plugin-google-cloud-pubsub/src/index.js +1 -2
  120. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +160 -13
  121. package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +217 -0
  122. package/packages/datadog-plugin-google-cloud-vertexai/src/index.js +1 -1
  123. package/packages/datadog-plugin-google-genai/src/index.js +1 -1
  124. package/packages/datadog-plugin-graphql/src/resolve.js +1 -1
  125. package/packages/datadog-plugin-grpc/src/index.js +1 -1
  126. package/packages/datadog-plugin-http/src/client.js +2 -1
  127. package/packages/datadog-plugin-http/src/index.js +25 -5
  128. package/packages/datadog-plugin-http2/src/client.js +2 -2
  129. package/packages/datadog-plugin-http2/src/index.js +1 -1
  130. package/packages/datadog-plugin-kafkajs/src/index.js +1 -1
  131. package/packages/datadog-plugin-langchain/src/index.js +1 -1
  132. package/packages/datadog-plugin-moleculer/src/index.js +1 -1
  133. package/packages/datadog-plugin-mongodb-core/src/index.js +6 -2
  134. package/packages/datadog-plugin-openai/src/index.js +1 -1
  135. package/packages/datadog-plugin-openai/src/stream-helpers.js +30 -10
  136. package/packages/datadog-plugin-openai/src/tracing.js +2 -2
  137. package/packages/datadog-plugin-rhea/src/index.js +1 -1
  138. package/packages/datadog-plugin-ws/src/close.js +56 -3
  139. package/packages/datadog-plugin-ws/src/index.js +4 -0
  140. package/packages/datadog-plugin-ws/src/producer.js +39 -4
  141. package/packages/datadog-plugin-ws/src/receiver.js +39 -3
  142. package/packages/datadog-plugin-ws/src/server.js +13 -1
  143. package/packages/datadog-plugin-ws/src/util.js +107 -0
  144. package/packages/datadog-shimmer/src/shimmer.js +2 -2
  145. package/packages/dd-trace/src/aiguard/sdk.js +3 -3
  146. package/packages/dd-trace/src/appsec/graphql.js +2 -2
  147. package/packages/dd-trace/src/appsec/iast/analyzers/code-injection-analyzer.js +1 -1
  148. package/packages/dd-trace/src/appsec/iast/analyzers/command-injection-analyzer.js +1 -1
  149. package/packages/dd-trace/src/appsec/iast/analyzers/cookie-analyzer.js +1 -1
  150. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-base-analyzer.js +1 -1
  151. package/packages/dd-trace/src/appsec/iast/analyzers/injection-analyzer.js +1 -1
  152. package/packages/dd-trace/src/appsec/iast/analyzers/ldap-injection-analyzer.js +1 -1
  153. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +3 -3
  154. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +1 -1
  155. package/packages/dd-trace/src/appsec/iast/analyzers/ssrf-analyzer.js +1 -1
  156. package/packages/dd-trace/src/appsec/iast/analyzers/untrusted-deserialization-analyzer.js +1 -1
  157. package/packages/dd-trace/src/appsec/iast/analyzers/unvalidated-redirect-analyzer.js +1 -1
  158. package/packages/dd-trace/src/appsec/iast/analyzers/weak-cipher-analyzer.js +1 -1
  159. package/packages/dd-trace/src/appsec/iast/analyzers/weak-hash-analyzer.js +3 -2
  160. package/packages/dd-trace/src/appsec/iast/analyzers/weak-randomness-analyzer.js +1 -1
  161. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  162. package/packages/dd-trace/src/appsec/iast/index.js +5 -5
  163. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +1 -1
  164. package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +1 -2
  165. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +1 -1
  166. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -1
  167. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +10 -14
  168. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +1 -1
  169. package/packages/dd-trace/src/appsec/iast/telemetry/namespaces.js +1 -1
  170. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +3 -3
  171. package/packages/dd-trace/src/appsec/index.js +8 -8
  172. package/packages/dd-trace/src/appsec/rasp/command_injection.js +1 -1
  173. package/packages/dd-trace/src/appsec/rasp/index.js +1 -1
  174. package/packages/dd-trace/src/appsec/rasp/lfi.js +1 -1
  175. package/packages/dd-trace/src/appsec/rc-products.js +10 -0
  176. package/packages/dd-trace/src/appsec/recommended.json +230 -3
  177. package/packages/dd-trace/src/appsec/remote_config.js +177 -0
  178. package/packages/dd-trace/src/appsec/reporter.js +3 -3
  179. package/packages/dd-trace/src/appsec/rule_manager.js +37 -20
  180. package/packages/dd-trace/src/appsec/sdk/index.js +1 -1
  181. package/packages/dd-trace/src/appsec/sdk/set_user.js +1 -1
  182. package/packages/dd-trace/src/appsec/sdk/track_event.js +2 -2
  183. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -2
  184. package/packages/dd-trace/src/appsec/user_tracking.js +2 -2
  185. package/packages/dd-trace/src/appsec/waf/index.js +17 -3
  186. package/packages/dd-trace/src/appsec/waf/waf_manager.js +11 -0
  187. package/packages/dd-trace/src/azure_metadata.js +8 -2
  188. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +6 -0
  189. package/packages/dd-trace/src/ci-visibility/exporters/agentless/index.js +2 -2
  190. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +1 -1
  191. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +1 -1
  192. package/packages/dd-trace/src/config/remote_config.js +34 -0
  193. package/packages/dd-trace/src/config.js +29 -28
  194. package/packages/dd-trace/src/config_defaults.js +2 -1
  195. package/packages/dd-trace/src/constants.js +5 -0
  196. package/packages/dd-trace/src/crashtracking/crashtracker.js +10 -1
  197. package/packages/dd-trace/src/datastreams/checkpointer.js +2 -2
  198. package/packages/dd-trace/src/datastreams/index.js +1 -1
  199. package/packages/dd-trace/src/datastreams/pathway.js +7 -7
  200. package/packages/dd-trace/src/datastreams/processor.js +2 -2
  201. package/packages/dd-trace/src/datastreams/writer.js +2 -2
  202. package/packages/dd-trace/src/debugger/config.js +1 -0
  203. package/packages/dd-trace/src/debugger/devtools_client/config.js +1 -1
  204. package/packages/dd-trace/src/debugger/devtools_client/index.js +7 -2
  205. package/packages/dd-trace/src/debugger/devtools_client/send.js +3 -3
  206. package/packages/dd-trace/src/debugger/devtools_client/session.js +1 -1
  207. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +5 -5
  208. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +2 -2
  209. package/packages/dd-trace/src/debugger/devtools_client/state.js +1 -1
  210. package/packages/dd-trace/src/debugger/devtools_client/status.js +2 -2
  211. package/packages/dd-trace/src/debugger/index.js +1 -1
  212. package/packages/dd-trace/src/dogstatsd.js +3 -2
  213. package/packages/dd-trace/src/encode/0.4.js +1 -1
  214. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +2 -2
  215. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  216. package/packages/dd-trace/src/encode/span-stats.js +6 -1
  217. package/packages/dd-trace/src/exporter.js +2 -2
  218. package/packages/dd-trace/src/exporters/agent/index.js +1 -1
  219. package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +1 -1
  220. package/packages/dd-trace/src/exporters/common/request.js +2 -2
  221. package/packages/dd-trace/src/exporters/common/writer.js +1 -1
  222. package/packages/dd-trace/src/exporters/span-stats/index.js +1 -1
  223. package/packages/dd-trace/src/external-logger/src/index.js +1 -2
  224. package/packages/dd-trace/src/flare/index.js +1 -1
  225. package/packages/dd-trace/src/guardrails/index.js +6 -3
  226. package/packages/dd-trace/src/id.js +1 -1
  227. package/packages/dd-trace/src/index.js +1 -1
  228. package/packages/dd-trace/src/lambda/handler.js +4 -4
  229. package/packages/dd-trace/src/lambda/index.js +1 -1
  230. package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
  231. package/packages/dd-trace/src/lambda/runtime/ritm.js +1 -1
  232. package/packages/dd-trace/src/llmobs/constants/tags.js +7 -1
  233. package/packages/dd-trace/src/llmobs/index.js +8 -9
  234. package/packages/dd-trace/src/llmobs/plugins/ai/index.js +38 -7
  235. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +30 -9
  236. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +3 -3
  237. package/packages/dd-trace/src/llmobs/plugins/genai/util.js +2 -2
  238. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +1 -1
  239. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +1 -1
  240. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/embedding.js +1 -1
  241. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/llm.js +1 -1
  242. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/vectorstore.js +1 -1
  243. package/packages/dd-trace/src/llmobs/plugins/openai/constants.js +16 -0
  244. package/packages/dd-trace/src/llmobs/plugins/openai/index.js +16 -1
  245. package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +22 -10
  246. package/packages/dd-trace/src/llmobs/plugins/vertexai.js +1 -1
  247. package/packages/dd-trace/src/llmobs/sdk.js +15 -22
  248. package/packages/dd-trace/src/llmobs/span_processor.js +9 -13
  249. package/packages/dd-trace/src/llmobs/telemetry.js +3 -4
  250. package/packages/dd-trace/src/llmobs/writers/base.js +2 -2
  251. package/packages/dd-trace/src/llmobs/writers/spans.js +1 -2
  252. package/packages/dd-trace/src/log/index.js +1 -1
  253. package/packages/dd-trace/src/noop/proxy.js +2 -2
  254. package/packages/dd-trace/src/noop/span.js +1 -1
  255. package/packages/dd-trace/src/openfeature/index.js +2 -2
  256. package/packages/dd-trace/src/openfeature/noop.js +14 -14
  257. package/packages/dd-trace/src/openfeature/remote_config.js +31 -0
  258. package/packages/dd-trace/src/openfeature/writers/base.js +5 -5
  259. package/packages/dd-trace/src/openfeature/writers/exposures.js +9 -9
  260. package/packages/dd-trace/src/opentelemetry/context_manager.js +2 -2
  261. package/packages/dd-trace/src/opentelemetry/logs/logger.js +1 -1
  262. package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +4 -4
  263. package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +9 -8
  264. package/packages/dd-trace/src/opentelemetry/metrics/instruments.js +3 -3
  265. package/packages/dd-trace/src/opentelemetry/metrics/meter.js +2 -2
  266. package/packages/dd-trace/src/opentelemetry/metrics/otlp_transformer.js +4 -4
  267. package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +36 -11
  268. package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +11 -10
  269. package/packages/dd-trace/src/opentelemetry/otlp/protobuf_loader.js +1 -1
  270. package/packages/dd-trace/src/opentelemetry/span.js +2 -2
  271. package/packages/dd-trace/src/opentelemetry/tracer.js +3 -3
  272. package/packages/dd-trace/src/opentracing/propagation/text_map.js +24 -8
  273. package/packages/dd-trace/src/opentracing/span.js +3 -3
  274. package/packages/dd-trace/src/opentracing/tracer.js +5 -5
  275. package/packages/dd-trace/src/payload-tagging/index.js +6 -2
  276. package/packages/dd-trace/src/plugin_manager.js +1 -1
  277. package/packages/dd-trace/src/plugins/apollo.js +1 -1
  278. package/packages/dd-trace/src/plugins/ci_plugin.js +27 -27
  279. package/packages/dd-trace/src/plugins/database.js +1 -1
  280. package/packages/dd-trace/src/plugins/index.js +5 -1
  281. package/packages/dd-trace/src/plugins/log_plugin.js +1 -1
  282. package/packages/dd-trace/src/plugins/outbound.js +1 -1
  283. package/packages/dd-trace/src/plugins/tracing.js +1 -1
  284. package/packages/dd-trace/src/plugins/util/ci.js +1 -1
  285. package/packages/dd-trace/src/plugins/util/git.js +8 -8
  286. package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
  287. package/packages/dd-trace/src/plugins/util/test.js +24 -24
  288. package/packages/dd-trace/src/plugins/util/user-provided-git.js +1 -1
  289. package/packages/dd-trace/src/plugins/util/web.js +8 -5
  290. package/packages/dd-trace/src/priority_sampler.js +15 -16
  291. package/packages/dd-trace/src/process-tags/index.js +31 -29
  292. package/packages/dd-trace/src/profiling/config.js +32 -21
  293. package/packages/dd-trace/src/profiling/exporter_cli.js +4 -4
  294. package/packages/dd-trace/src/profiling/exporters/agent.js +5 -5
  295. package/packages/dd-trace/src/profiling/index.js +1 -1
  296. package/packages/dd-trace/src/profiling/libuv-size.js +1 -1
  297. package/packages/dd-trace/src/profiling/profiler.js +4 -5
  298. package/packages/dd-trace/src/profiling/profilers/event_plugins/event.js +1 -1
  299. package/packages/dd-trace/src/profiling/profilers/events.js +2 -2
  300. package/packages/dd-trace/src/profiling/profilers/wall.js +4 -4
  301. package/packages/dd-trace/src/proxy.js +12 -18
  302. package/packages/dd-trace/src/remote_config/index.js +541 -137
  303. package/packages/dd-trace/src/require-package-json.js +1 -1
  304. package/packages/dd-trace/src/ritm.js +50 -27
  305. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +1 -1
  306. package/packages/dd-trace/src/serverless.js +16 -0
  307. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +8 -0
  308. package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +8 -0
  309. package/packages/dd-trace/src/span_format.js +1 -1
  310. package/packages/dd-trace/src/span_processor.js +2 -2
  311. package/packages/dd-trace/src/span_stats.js +6 -4
  312. package/packages/dd-trace/src/standalone/index.js +1 -1
  313. package/packages/dd-trace/src/startup-log.js +3 -3
  314. package/packages/dd-trace/src/supported-configurations.json +3 -0
  315. package/packages/dd-trace/src/telemetry/dependencies.js +3 -3
  316. package/packages/dd-trace/src/telemetry/endpoints.js +8 -8
  317. package/packages/dd-trace/src/telemetry/logs/index.js +1 -1
  318. package/packages/dd-trace/src/telemetry/telemetry.js +11 -6
  319. package/packages/dd-trace/src/tracer.js +3 -3
  320. package/packages/dd-trace/src/tracer_metadata.js +19 -15
  321. package/packages/dd-trace/src/remote_config/manager.js +0 -368
@@ -1,8 +1,8 @@
1
1
  'use strict'
2
2
 
3
3
  const { errorMonitor } = require('events')
4
- const { channel, addHook } = require('./helpers/instrument')
5
4
  const shimmer = require('../../datadog-shimmer')
5
+ const { channel, addHook } = require('./helpers/instrument')
6
6
 
7
7
  const startChannel = channel('apm:fs:operation:start')
8
8
  const finishChannel = channel('apm:fs:operation:finish')
@@ -1,7 +1,7 @@
1
1
  'use strict'
2
2
 
3
- const { addHook, AsyncResource } = require('./helpers/instrument')
4
3
  const shimmer = require('../../datadog-shimmer')
4
+ const { addHook, AsyncResource } = require('./helpers/instrument')
5
5
 
6
6
  function createWrapAcquire () {
7
7
  return function wrapAcquire (acquire) {
@@ -1,10 +1,10 @@
1
1
  'use strict'
2
2
 
3
+ const shimmer = require('../../datadog-shimmer')
3
4
  const {
4
5
  channel,
5
6
  addHook
6
7
  } = require('./helpers/instrument')
7
- const shimmer = require('../../datadog-shimmer')
8
8
 
9
9
  const requestStartCh = channel('apm:google-cloud-pubsub:request:start')
10
10
  const requestFinishCh = channel('apm:google-cloud-pubsub:request:finish')
@@ -14,6 +14,21 @@ const receiveStartCh = channel('apm:google-cloud-pubsub:receive:start')
14
14
  const receiveFinishCh = channel('apm:google-cloud-pubsub:receive:finish')
15
15
  const receiveErrorCh = channel('apm:google-cloud-pubsub:receive:error')
16
16
 
17
+ /**
18
+ * Message-level channels for trace context injection and async context propagation:
19
+ * - messagePublishCh: Inject trace context when Topic.publish() is called
20
+ * - messageAckStoreCh: Store async context when message.ack() is called (PULL)
21
+ * - messageAckRetrieveCh: Retrieve stored context when acknowledge() API is called (PULL)
22
+ * - messageStoreCh: Propagate context when Subscription emits 'message' event (PULL)
23
+ */
24
+ const messagePublishCh = channel('apm:google-cloud-pubsub:message:publish')
25
+ const messageAckStoreCh = channel('apm:google-cloud-pubsub:message:ack-store')
26
+ const messageAckRetrieveCh = channel('apm:google-cloud-pubsub:message:ack-retrieve')
27
+ const messageStoreCh = channel('apm:google-cloud-pubsub:message:store')
28
+
29
+ // WeakMap for passing context between LeaseManager._dispense and LeaseManager.remove
30
+ const messageContexts = new WeakMap()
31
+
17
32
  const publisherMethods = [
18
33
  'createTopic',
19
34
  'updateTopic',
@@ -65,6 +80,21 @@ function wrapMethod (method) {
65
80
  if (!requestStartCh.hasSubscribers) return method.apply(this, arguments)
66
81
 
67
82
  const ctx = { request, api, projectId: this.auth._cachedProjectId }
83
+
84
+ /**
85
+ * For acknowledge/modifyAckDeadline: retrieve stored context from consumer plugin.
86
+ * These APIs only have ackIds (no Message objects), so async context is lost.
87
+ * Plugin sets ctx.storedContext, which client.js uses to link the acknowledge span.
88
+ */
89
+ const isAckOperation = api === 'acknowledge' || api === 'modifyAckDeadline'
90
+ if (isAckOperation && request?.ackIds?.length > 0) {
91
+ messageAckRetrieveCh.publish({
92
+ ackIds: request.ackIds,
93
+ api,
94
+ ctx
95
+ })
96
+ }
97
+
68
98
  return requestStartCh.runStores(ctx, () => {
69
99
  const cb = arguments[arguments.length - 1]
70
100
 
@@ -74,12 +104,11 @@ function wrapMethod (method) {
74
104
  ctx.error = error
75
105
  requestErrorCh.publish(ctx)
76
106
  }
77
-
78
107
  return requestFinishCh.runStores(ctx, cb, this, ...arguments)
79
108
  })
80
-
81
109
  return method.apply(this, arguments)
82
110
  }
111
+
83
112
  return method.apply(this, arguments)
84
113
  .then(
85
114
  response => {
@@ -108,12 +137,16 @@ function massWrap (obj, methods, wrapper) {
108
137
  addHook({ name: '@google-cloud/pubsub', versions: ['>=1.2'] }, (obj) => {
109
138
  const Subscription = obj.Subscription
110
139
 
140
+ /**
141
+ * PULL: Intercept 'message' events and propagate async context via runStores.
142
+ * This ensures the consumer plugin creates spans in the correct context.
143
+ */
111
144
  shimmer.wrap(Subscription.prototype, 'emit', emit => function (eventName, message) {
112
145
  if (eventName !== 'message' || !message) return emit.apply(this, arguments)
113
146
 
114
- const ctx = {}
147
+ const ctx = { message }
115
148
  try {
116
- return emit.apply(this, arguments)
149
+ return messageStoreCh.runStores(ctx, emit, this, ...arguments)
117
150
  } catch (err) {
118
151
  ctx.error = err
119
152
  receiveErrorCh.publish(ctx)
@@ -124,26 +157,70 @@ addHook({ name: '@google-cloud/pubsub', versions: ['>=1.2'] }, (obj) => {
124
157
  return obj
125
158
  })
126
159
 
160
+ addHook({ name: '@google-cloud/pubsub', versions: ['>=1.2'], file: 'build/src/subscriber.js' }, (obj) => {
161
+ const Message = obj.Message
162
+
163
+ /**
164
+ * PULL: Capture async context when message.ack() is called.
165
+ * This is our last chance before context is lost. The acknowledge() API call happens
166
+ * later (often batched), and we'll retrieve this stored context to link spans.
167
+ * Flow: message.ack() -> store context -> acknowledge() API -> retrieve context
168
+ */
169
+ if (Message?.prototype?.ack) {
170
+ shimmer.wrap(Message.prototype, 'ack', originalAck => function () {
171
+ if (this.ackId) {
172
+ const ctx = {
173
+ message: this,
174
+ ackId: this.ackId
175
+ }
176
+
177
+ return messageAckStoreCh.runStores(ctx, originalAck, this, ...arguments)
178
+ }
179
+
180
+ return originalAck.apply(this, arguments)
181
+ })
182
+ }
183
+
184
+ return obj
185
+ })
186
+
187
+ /**
188
+ * PULL: Hook LeaseManager to track message lifecycle (dispense/remove/clear).
189
+ * _dispense: Message given to handler -> create span
190
+ * remove: Message removed from lease (ack/nack/timeout) -> finish span
191
+ * clear: Subscription closed -> finish all remaining spans
192
+ */
127
193
  addHook({ name: '@google-cloud/pubsub', versions: ['>=1.2'], file: 'build/src/lease-manager.js' }, (obj) => {
128
194
  const LeaseManager = obj.LeaseManager
129
- const ctx = {}
195
+ if (!LeaseManager) {
196
+ return obj
197
+ }
130
198
 
131
199
  shimmer.wrap(LeaseManager.prototype, '_dispense', dispense => function (message) {
132
- if (receiveStartCh.hasSubscribers) {
133
- ctx.message = message
134
- return receiveStartCh.runStores(ctx, dispense, this, ...arguments)
135
- }
136
- return dispense.apply(this, arguments)
200
+ const ctx = { message }
201
+ messageContexts.set(message, ctx)
202
+
203
+ return receiveStartCh.runStores(ctx, dispense, this, ...arguments)
137
204
  })
138
205
 
139
206
  shimmer.wrap(LeaseManager.prototype, 'remove', remove => function (message) {
140
- return receiveFinishCh.runStores(ctx, remove, this, ...arguments)
207
+ const ctx = messageContexts.get(message)
208
+ if (ctx) {
209
+ messageContexts.delete(message)
210
+ }
211
+
212
+ return receiveFinishCh.runStores(ctx || { message }, remove, this, ...arguments)
141
213
  })
142
214
 
143
215
  shimmer.wrap(LeaseManager.prototype, 'clear', clear => function () {
144
- for (const message of this._messages) {
145
- ctx.message = message
146
- receiveFinishCh.publish(ctx)
216
+ if (this._messages) {
217
+ for (const message of this._messages.values()) {
218
+ const ctx = messageContexts.get(message)
219
+ if (ctx) {
220
+ receiveFinishCh.publish(ctx)
221
+ messageContexts.delete(message)
222
+ }
223
+ }
147
224
  }
148
225
  return clear.apply(this, arguments)
149
226
  })
@@ -151,6 +228,51 @@ addHook({ name: '@google-cloud/pubsub', versions: ['>=1.2'], file: 'build/src/le
151
228
  return obj
152
229
  })
153
230
 
231
+ /**
232
+ * Inject trace context into individual messages via Topic.publish()/publishMessage().
233
+ * Flow: User calls topic.publish() -> inject context (here) -> SDK batches messages ->
234
+ * publish() API called -> producer plugin creates batch span + metadata
235
+ */
236
+ addHook({ name: '@google-cloud/pubsub', versions: ['>=1.2'] }, (obj) => {
237
+ if (!obj.Topic?.prototype) return obj
238
+
239
+ if (typeof obj.Topic.prototype.publishMessage === 'function') {
240
+ shimmer.wrap(obj.Topic.prototype, 'publishMessage', publishMessage => {
241
+ return function (data, attributesOrCallback, callback) {
242
+ if (data && typeof data === 'object') {
243
+ if (!data.attributes) data.attributes = {}
244
+ messagePublishCh.publish({
245
+ attributes: data.attributes,
246
+ pubsub: this.pubsub,
247
+ topicName: this.name
248
+ })
249
+ }
250
+ return publishMessage.apply(this, arguments)
251
+ }
252
+ })
253
+ }
254
+
255
+ if (typeof obj.Topic.prototype.publish === 'function') {
256
+ shimmer.wrap(obj.Topic.prototype, 'publish', publish => function (buffer, attributesOrCallback, callback) {
257
+ if (typeof attributesOrCallback === 'function' || !attributesOrCallback) {
258
+ arguments[1] = {}
259
+ arguments[2] = attributesOrCallback
260
+ }
261
+
262
+ messagePublishCh.publish({
263
+ attributes: arguments[1],
264
+ pubsub: this.pubsub,
265
+ topicName: this.name,
266
+ buffer
267
+ })
268
+
269
+ return publish.apply(this, arguments)
270
+ })
271
+ }
272
+
273
+ return obj
274
+ })
275
+
154
276
  addHook({ name: '@google-cloud/pubsub', versions: ['>=1.2'] }, (obj) => {
155
277
  const { PublisherClient, SchemaServiceClient, SubscriberClient } = obj.v1
156
278
 
@@ -1,9 +1,8 @@
1
1
  'use strict'
2
2
 
3
- const { addHook } = require('./helpers/instrument')
4
- const shimmer = require('../../datadog-shimmer')
5
-
6
3
  const vertexaiTracingChannel = require('dc-polyfill').tracingChannel('apm:vertexai:request')
4
+ const shimmer = require('../../datadog-shimmer')
5
+ const { addHook } = require('./helpers/instrument')
7
6
 
8
7
  function wrapGenerate (generate) {
9
8
  return function (request) {
@@ -1,9 +1,9 @@
1
1
  'use strict'
2
2
 
3
- const { addHook } = require('./helpers/instrument')
3
+ const { channel, tracingChannel } = require('dc-polyfill')
4
+
4
5
  const shimmer = require('../../datadog-shimmer')
5
- const tracingChannel = require('dc-polyfill').tracingChannel
6
- const channel = require('dc-polyfill').channel
6
+ const { addHook } = require('./helpers/instrument')
7
7
 
8
8
  const genaiTracingChannel = tracingChannel('apm:google:genai:request')
9
9
  const onStreamedChunkCh = channel('apm:google:genai:request:chunk')
@@ -1,10 +1,10 @@
1
1
  'use strict'
2
2
 
3
+ const shimmer = require('../../datadog-shimmer')
3
4
  const {
4
5
  addHook,
5
6
  channel
6
7
  } = require('./helpers/instrument')
7
- const shimmer = require('../../datadog-shimmer')
8
8
 
9
9
  const ddGlobal = globalThis[Symbol.for('dd-trace')] ??= {}
10
10
 
@@ -1,8 +1,8 @@
1
1
  'use strict'
2
2
 
3
- const types = require('./types')
4
3
  const { addHook, channel } = require('../helpers/instrument')
5
4
  const shimmer = require('../../../datadog-shimmer')
5
+ const types = require('./types')
6
6
 
7
7
  const patched = new WeakSet()
8
8
  const instances = new WeakMap()
@@ -1,8 +1,8 @@
1
1
  'use strict'
2
2
 
3
- const types = require('./types')
4
3
  const { channel, addHook } = require('../helpers/instrument')
5
4
  const shimmer = require('../../../datadog-shimmer')
5
+ const types = require('./types')
6
6
 
7
7
  const startChannel = channel('apm:grpc:server:request:start')
8
8
  const asyncStartChannel = channel('apm:grpc:server:request:asyncStart')
@@ -2,6 +2,7 @@
2
2
 
3
3
  const dc = require('dc-polyfill')
4
4
 
5
+ const log = require('../../../dd-trace/src/log')
5
6
  const {
6
7
  filename,
7
8
  loadChannel,
@@ -9,7 +10,6 @@ const {
9
10
  } = require('./register.js')
10
11
  const hooks = require('./hooks')
11
12
  const instrumentations = require('./instrumentations')
12
- const log = require('../../../dd-trace/src/log')
13
13
 
14
14
  const CHANNEL = 'dd-trace:bundler:load'
15
15
 
@@ -1,6 +1,6 @@
1
1
  'use strict'
2
- const iitm = require('../../../dd-trace/src/iitm')
3
2
  const path = require('path')
3
+ const iitm = require('../../../dd-trace/src/iitm')
4
4
  const ritm = require('../../../dd-trace/src/ritm')
5
5
 
6
6
  /**
@@ -29,7 +29,8 @@ module.exports = {
29
29
  '@node-redis/client': () => require('../redis'),
30
30
  '@opensearch-project/opensearch': () => require('../opensearch'),
31
31
  '@opentelemetry/sdk-trace-node': () => require('../otel-sdk-trace'),
32
- '@prisma/client': () => require('../prisma'),
32
+ '@prisma/client': { esmFirst: true, fn: () => require('../prisma') },
33
+ './runtime/library.js': () => require('../prisma'),
33
34
  '@redis/client': () => require('../redis'),
34
35
  '@smithy/smithy-client': () => require('../aws-sdk'),
35
36
  '@vitest/runner': { esmFirst: true, fn: () => require('../vitest') },
@@ -41,6 +42,7 @@ module.exports = {
41
42
  'aws-sdk': () => require('../aws-sdk'),
42
43
  bluebird: () => require('../bluebird'),
43
44
  'body-parser': () => require('../body-parser'),
45
+ bullmq: () => require('../bullmq'),
44
46
  bunyan: () => require('../bunyan'),
45
47
  'cassandra-driver': () => require('../cassandra-driver'),
46
48
  child_process: () => require('../child_process'),
@@ -83,6 +85,7 @@ module.exports = {
83
85
  kafkajs: () => require('../kafkajs'),
84
86
  langchain: () => require('../langchain'),
85
87
  ldapjs: () => require('../ldapjs'),
88
+ 'light-my-request': () => require('../light-my-request'),
86
89
  'limitd-client': () => require('../limitd-client'),
87
90
  lodash: () => require('../lodash'),
88
91
  mariadb: () => require('../mariadb'),
@@ -1,9 +1,9 @@
1
1
  'use strict'
2
2
 
3
+ const { AsyncResource } = require('async_hooks')
3
4
  const dc = require('dc-polyfill')
4
5
  const instrumentations = require('./instrumentations')
5
6
  const rewriterInstrumentations = require('./rewriter/instrumentations')
6
- const { AsyncResource } = require('async_hooks')
7
7
 
8
8
  const channelMap = {}
9
9
  exports.channel = function (name) {
@@ -1,15 +1,16 @@
1
1
  'use strict'
2
2
 
3
- const { channel } = require('dc-polyfill')
4
3
  const path = require('path')
4
+ const { channel } = require('dc-polyfill')
5
5
  const satisfies = require('../../../../vendor/dist/semifies')
6
- const Hook = require('./hook')
7
6
  const requirePackageJson = require('../../../dd-trace/src/require-package-json')
8
7
  const log = require('../../../dd-trace/src/log')
9
- const checkRequireCache = require('./check-require-cache')
10
8
  const telemetry = require('../../../dd-trace/src/guardrails/telemetry')
11
9
  const { isInServerlessEnvironment } = require('../../../dd-trace/src/serverless')
12
10
  const { getEnvironmentVariables } = require('../../../dd-trace/src/config-helper')
11
+ const checkRequireCache = require('./check-require-cache')
12
+ const Hook = require('./hook')
13
+ const { isRelativeRequire } = require('./shared-utils')
13
14
  const rewriter = require('./rewriter')
14
15
 
15
16
  const envs = getEnvironmentVariables()
@@ -104,6 +105,8 @@ for (const packageName of names) {
104
105
  hook[HOOK_SYMBOL] ??= new WeakSet()
105
106
  let matchesFile = moduleName === fullFilename
106
107
 
108
+ if (!matchesFile && isRelativeRequire(name)) matchesFile = true
109
+
107
110
  if (fullFilePattern) {
108
111
  // Some libraries include a hash in their filenames when installed,
109
112
  // so our instrumentation has to include a '.*' to match them for more than a single version.
@@ -219,7 +222,6 @@ function parseHookInstrumentationFileName (packageName) {
219
222
  hook = hook.fn
220
223
  }
221
224
  const hookString = hook.toString()
222
-
223
225
  const regex = /require\('([^']*)'\)/
224
226
  const match = hookString.match(regex)
225
227
 
@@ -34,11 +34,11 @@ Orchestrion-JS that will need to be backported:
34
34
  const { readFileSync } = require('fs')
35
35
  const { join } = require('path')
36
36
  const semifies = require('../../../../../vendor/dist/semifies')
37
+ const log = require('../../../../dd-trace/src/log')
38
+ const { getEnvironmentVariable } = require('../../../../dd-trace/src/config-helper')
37
39
  const transforms = require('./transforms')
38
40
  const { generate, parse, traverse } = require('./compiler')
39
- const log = require('../../../../dd-trace/src/log')
40
41
  const instrumentations = require('./instrumentations')
41
- const { getEnvironmentVariable } = require('../../../../dd-trace/src/config-helper')
42
42
 
43
43
  const NODE_OPTIONS = getEnvironmentVariable('NODE_OPTIONS')
44
44
 
@@ -0,0 +1,106 @@
1
+ [
2
+ {
3
+ "module": {
4
+ "name": "bullmq",
5
+ "versionRange": ">=5.66.0",
6
+ "filePath": "dist/cjs/classes/queue.js"
7
+ },
8
+ "functionQuery": {
9
+ "methodName": "add",
10
+ "className": "Queue",
11
+ "kind": "Async"
12
+ },
13
+ "channelName": "Queue_add"
14
+ },
15
+ {
16
+ "module": {
17
+ "name": "bullmq",
18
+ "versionRange": ">=5.66.0",
19
+ "filePath": "dist/cjs/classes/queue.js"
20
+ },
21
+ "functionQuery": {
22
+ "methodName": "addBulk",
23
+ "className": "Queue",
24
+ "kind": "Async"
25
+ },
26
+ "channelName": "Queue_addBulk"
27
+ },
28
+ {
29
+ "module": {
30
+ "name": "bullmq",
31
+ "versionRange": ">=5.66.0",
32
+ "filePath": "dist/cjs/classes/worker.js"
33
+ },
34
+ "functionQuery": {
35
+ "methodName": "callProcessJob",
36
+ "className": "Worker",
37
+ "kind": "Async"
38
+ },
39
+ "channelName": "Worker_callProcessJob"
40
+ },
41
+ {
42
+ "module": {
43
+ "name": "bullmq",
44
+ "versionRange": ">=5.66.0",
45
+ "filePath": "dist/cjs/classes/flow-producer.js"
46
+ },
47
+ "functionQuery": {
48
+ "methodName": "add",
49
+ "className": "FlowProducer",
50
+ "kind": "Async"
51
+ },
52
+ "channelName": "FlowProducer_add"
53
+ },
54
+ {
55
+ "module": {
56
+ "name": "bullmq",
57
+ "versionRange": ">=5.66.0",
58
+ "filePath": "dist/esm/classes/queue.js"
59
+ },
60
+ "functionQuery": {
61
+ "methodName": "add",
62
+ "className": "Queue",
63
+ "kind": "Async"
64
+ },
65
+ "channelName": "Queue_add"
66
+ },
67
+ {
68
+ "module": {
69
+ "name": "bullmq",
70
+ "versionRange": ">=5.66.0",
71
+ "filePath": "dist/esm/classes/queue.js"
72
+ },
73
+ "functionQuery": {
74
+ "methodName": "addBulk",
75
+ "className": "Queue",
76
+ "kind": "Async"
77
+ },
78
+ "channelName": "Queue_addBulk"
79
+ },
80
+ {
81
+ "module": {
82
+ "name": "bullmq",
83
+ "versionRange": ">=5.66.0",
84
+ "filePath": "dist/esm/classes/worker.js"
85
+ },
86
+ "functionQuery": {
87
+ "methodName": "callProcessJob",
88
+ "className": "Worker",
89
+ "kind": "Async"
90
+ },
91
+ "channelName": "Worker_callProcessJob"
92
+ },
93
+ {
94
+ "module": {
95
+ "name": "bullmq",
96
+ "versionRange": ">=5.66.0",
97
+ "filePath": "dist/esm/classes/flow-producer.js"
98
+ },
99
+ "functionQuery": {
100
+ "methodName": "add",
101
+ "className": "FlowProducer",
102
+ "kind": "Async"
103
+ },
104
+ "channelName": "FlowProducer_add"
105
+ }
106
+ ]
@@ -1,5 +1,6 @@
1
1
  'use strict'
2
2
 
3
3
  module.exports = [
4
- ...require('./langchain')
4
+ ...require('./langchain'),
5
+ ...require('./bullmq')
5
6
  ]
@@ -1,7 +1,7 @@
1
1
  'use strict'
2
2
 
3
- const { channel } = require('./instrument')
4
3
  const shimmer = require('../../../datadog-shimmer')
4
+ const { channel } = require('./instrument')
5
5
 
6
6
  const routerMountPaths = new WeakMap() // to track mount paths for router instances
7
7
  const layerMatchers = new WeakMap() // to store layer matchers
@@ -0,0 +1,9 @@
1
+ 'use strict'
2
+
3
+ function isRelativeRequire (moduleName) {
4
+ return moduleName.startsWith('./') || moduleName.startsWith('../')
5
+ }
6
+
7
+ module.exports = {
8
+ isRelativeRequire
9
+ }
@@ -9,6 +9,10 @@ const {
9
9
  const routeChannel = channel('apm:hono:request:route')
10
10
  const handleChannel = channel('apm:hono:request:handle')
11
11
  const errorChannel = channel('apm:hono:request:error')
12
+ const nextChannel = channel('apm:hono:middleware:next')
13
+ const enterChannel = channel('apm:hono:middleware:enter')
14
+ const exitChannel = channel('apm:hono:middleware:exit')
15
+ const finishChannel = channel('apm:hono:middleware:finish')
12
16
 
13
17
  function wrapFetch (fetch) {
14
18
  return function (request, env, executionCtx) {
@@ -34,21 +38,62 @@ function wrapCompose (compose) {
34
38
 
35
39
  const instrumentedMiddlewares = middlewares.map(h => {
36
40
  const [[fn, meta], params] = h
37
-
38
- const instrumentedFn = (...args) => {
39
- const context = args[0]
40
- routeChannel.publish({
41
- req: context.env.incoming,
42
- route: meta?.path
43
- })
44
- return fn(...args)
45
- }
46
- return [[instrumentedFn, meta], params]
41
+ return [[wrapMiddleware(fn, meta?.path), meta], params]
47
42
  })
48
43
  return compose.call(this, instrumentedMiddlewares, instrumentedOnError, onNotFound)
49
44
  }
50
45
  }
51
46
 
47
+ function wrapNext (req, route, next) {
48
+ return shimmer.wrapFunction(
49
+ next,
50
+ (next) =>
51
+ function () {
52
+ nextChannel.publish({ req, route })
53
+
54
+ return next.apply(this, arguments)
55
+ }
56
+ )
57
+ }
58
+
59
+ function wrapMiddleware (middleware, route) {
60
+ const name = middleware.name
61
+ return shimmer.wrapFunction(
62
+ middleware,
63
+ (middleware) =>
64
+ function (context, next) {
65
+ const req = context.env.incoming
66
+ routeChannel.publish({ req, route })
67
+ enterChannel.publish({ req, name, route })
68
+ if (typeof next === 'function') {
69
+ arguments[1] = wrapNext(req, route, next)
70
+ }
71
+ try {
72
+ const result = middleware.apply(this, arguments)
73
+ if (result && typeof result.then === 'function') {
74
+ return result.then(
75
+ (result) => {
76
+ finishChannel.publish({ req })
77
+ return result
78
+ },
79
+ (error) => {
80
+ errorChannel.publish({ req, error })
81
+ throw error
82
+ }
83
+ )
84
+ }
85
+ finishChannel.publish({ req })
86
+ return result
87
+ } catch (error) {
88
+ errorChannel.publish({ req, error })
89
+ throw error
90
+ } finally {
91
+ exitChannel.publish({ req, route })
92
+ }
93
+ }
94
+ )
95
+ }
96
+
52
97
  addHook({
53
98
  name: 'hono',
54
99
  versions: ['>=4'],
@@ -1,10 +1,10 @@
1
1
  'use strict'
2
2
 
3
+ const shimmer = require('../../datadog-shimmer')
3
4
  const {
4
5
  channel,
5
6
  addHook
6
7
  } = require('./helpers/instrument')
7
- const shimmer = require('../../datadog-shimmer')
8
8
 
9
9
  const startCh = channel('apm:ioredis:command:start')
10
10
  const finishCh = channel('apm:ioredis:command:finish')
@@ -1,10 +1,10 @@
1
1
  'use strict'
2
2
 
3
+ const shimmer = require('../../datadog-shimmer')
3
4
  const {
4
5
  channel,
5
6
  addHook
6
7
  } = require('./helpers/instrument')
7
- const shimmer = require('../../datadog-shimmer')
8
8
 
9
9
  const startCh = channel('apm:iovalkey:command:start')
10
10
  const finishCh = channel('apm:iovalkey:command:finish')