dd-trace 5.80.0 → 5.82.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (460) hide show
  1. package/LICENSE-3rdparty.csv +79 -88
  2. package/ext/tags.d.ts +1 -0
  3. package/ext/tags.js +1 -0
  4. package/index.d.ts +42 -35
  5. package/loader-hook.mjs +16 -4
  6. package/package.json +33 -56
  7. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  8. package/packages/datadog-esbuild/index.js +44 -26
  9. package/packages/datadog-esbuild/src/utils.js +14 -2
  10. package/packages/datadog-instrumentations/index.js +1 -0
  11. package/packages/datadog-instrumentations/src/aerospike.js +3 -2
  12. package/packages/datadog-instrumentations/src/ai.js +2 -2
  13. package/packages/datadog-instrumentations/src/amqp10.js +1 -1
  14. package/packages/datadog-instrumentations/src/amqplib.js +4 -4
  15. package/packages/datadog-instrumentations/src/anthropic.js +14 -2
  16. package/packages/datadog-instrumentations/src/apollo-server-core.js +2 -2
  17. package/packages/datadog-instrumentations/src/apollo-server.js +1 -1
  18. package/packages/datadog-instrumentations/src/apollo.js +3 -2
  19. package/packages/datadog-instrumentations/src/avsc.js +1 -1
  20. package/packages/datadog-instrumentations/src/aws-sdk.js +6 -2
  21. package/packages/datadog-instrumentations/src/azure-event-hubs.js +4 -3
  22. package/packages/datadog-instrumentations/src/azure-functions.js +2 -2
  23. package/packages/datadog-instrumentations/src/azure-service-bus.js +3 -4
  24. package/packages/datadog-instrumentations/src/bluebird.js +1 -1
  25. package/packages/datadog-instrumentations/src/bullmq.js +11 -0
  26. package/packages/datadog-instrumentations/src/bunyan.js +1 -1
  27. package/packages/datadog-instrumentations/src/cassandra-driver.js +1 -1
  28. package/packages/datadog-instrumentations/src/child_process.js +2 -2
  29. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +3 -3
  30. package/packages/datadog-instrumentations/src/couchbase.js +1 -1
  31. package/packages/datadog-instrumentations/src/crypto.js +1 -1
  32. package/packages/datadog-instrumentations/src/cucumber.js +12 -13
  33. package/packages/datadog-instrumentations/src/cypress.js +1 -1
  34. package/packages/datadog-instrumentations/src/dns.js +1 -1
  35. package/packages/datadog-instrumentations/src/elasticsearch.js +1 -1
  36. package/packages/datadog-instrumentations/src/express-mongo-sanitize.js +1 -1
  37. package/packages/datadog-instrumentations/src/express.js +1 -1
  38. package/packages/datadog-instrumentations/src/find-my-way.js +6 -5
  39. package/packages/datadog-instrumentations/src/fs.js +1 -1
  40. package/packages/datadog-instrumentations/src/generic-pool.js +1 -1
  41. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +137 -15
  42. package/packages/datadog-instrumentations/src/google-cloud-vertexai.js +2 -3
  43. package/packages/datadog-instrumentations/src/google-genai.js +120 -0
  44. package/packages/datadog-instrumentations/src/graphql.js +21 -1
  45. package/packages/datadog-instrumentations/src/grpc/client.js +1 -1
  46. package/packages/datadog-instrumentations/src/grpc/server.js +1 -1
  47. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +1 -1
  48. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
  49. package/packages/datadog-instrumentations/src/helpers/hooks.js +5 -1
  50. package/packages/datadog-instrumentations/src/helpers/instrument.js +11 -1
  51. package/packages/datadog-instrumentations/src/helpers/register.js +12 -5
  52. package/packages/datadog-instrumentations/src/helpers/rewriter/compiler.js +27 -0
  53. package/packages/datadog-instrumentations/src/helpers/rewriter/index.js +152 -0
  54. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/bullmq.json +106 -0
  55. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/index.js +6 -0
  56. package/packages/datadog-instrumentations/src/helpers/rewriter/instrumentations/langchain.js +237 -0
  57. package/packages/datadog-instrumentations/src/helpers/rewriter/loader.js +9 -0
  58. package/packages/datadog-instrumentations/src/helpers/rewriter/loader.mjs +11 -0
  59. package/packages/datadog-instrumentations/src/helpers/rewriter/transforms.js +139 -0
  60. package/packages/datadog-instrumentations/src/helpers/router-helper.js +1 -1
  61. package/packages/datadog-instrumentations/src/helpers/shared-utils.js +9 -0
  62. package/packages/datadog-instrumentations/src/hono.js +55 -10
  63. package/packages/datadog-instrumentations/src/ioredis.js +1 -1
  64. package/packages/datadog-instrumentations/src/iovalkey.js +1 -1
  65. package/packages/datadog-instrumentations/src/jest.js +2 -2
  66. package/packages/datadog-instrumentations/src/kafkajs.js +3 -3
  67. package/packages/datadog-instrumentations/src/knex.js +1 -1
  68. package/packages/datadog-instrumentations/src/langchain.js +3 -109
  69. package/packages/datadog-instrumentations/src/ldapjs.js +1 -1
  70. package/packages/datadog-instrumentations/src/light-my-request.js +93 -0
  71. package/packages/datadog-instrumentations/src/limitd-client.js +1 -1
  72. package/packages/datadog-instrumentations/src/lodash.js +1 -2
  73. package/packages/datadog-instrumentations/src/mariadb.js +1 -2
  74. package/packages/datadog-instrumentations/src/memcached.js +1 -1
  75. package/packages/datadog-instrumentations/src/mocha/main.js +1 -1
  76. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  77. package/packages/datadog-instrumentations/src/mongodb.js +1 -1
  78. package/packages/datadog-instrumentations/src/mongoose.js +1 -1
  79. package/packages/datadog-instrumentations/src/mquery.js +1 -1
  80. package/packages/datadog-instrumentations/src/mysql.js +1 -1
  81. package/packages/datadog-instrumentations/src/mysql2.js +2 -2
  82. package/packages/datadog-instrumentations/src/net.js +1 -1
  83. package/packages/datadog-instrumentations/src/next.js +1 -1
  84. package/packages/datadog-instrumentations/src/nyc.js +1 -1
  85. package/packages/datadog-instrumentations/src/openai.js +2 -2
  86. package/packages/datadog-instrumentations/src/opensearch.js +1 -1
  87. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  88. package/packages/datadog-instrumentations/src/otel-sdk-trace.js +1 -1
  89. package/packages/datadog-instrumentations/src/pg.js +3 -3
  90. package/packages/datadog-instrumentations/src/pino.js +1 -1
  91. package/packages/datadog-instrumentations/src/playwright.js +46 -17
  92. package/packages/datadog-instrumentations/src/prisma.js +52 -37
  93. package/packages/datadog-instrumentations/src/process.js +1 -1
  94. package/packages/datadog-instrumentations/src/promise-js.js +1 -1
  95. package/packages/datadog-instrumentations/src/promise.js +1 -1
  96. package/packages/datadog-instrumentations/src/protobufjs.js +1 -1
  97. package/packages/datadog-instrumentations/src/q.js +1 -1
  98. package/packages/datadog-instrumentations/src/redis.js +1 -1
  99. package/packages/datadog-instrumentations/src/rhea.js +1 -1
  100. package/packages/datadog-instrumentations/src/router.js +1 -1
  101. package/packages/datadog-instrumentations/src/selenium.js +4 -2
  102. package/packages/datadog-instrumentations/src/sequelize.js +1 -2
  103. package/packages/datadog-instrumentations/src/sharedb.js +1 -1
  104. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  105. package/packages/datadog-instrumentations/src/undici.js +4 -4
  106. package/packages/datadog-instrumentations/src/url.js +1 -1
  107. package/packages/datadog-instrumentations/src/vitest.js +1 -1
  108. package/packages/datadog-instrumentations/src/vm.js +1 -1
  109. package/packages/datadog-instrumentations/src/when.js +1 -1
  110. package/packages/datadog-instrumentations/src/winston.js +1 -1
  111. package/packages/datadog-instrumentations/src/ws.js +38 -19
  112. package/packages/datadog-plugin-amqp10/src/index.js +1 -1
  113. package/packages/datadog-plugin-amqplib/src/index.js +1 -1
  114. package/packages/datadog-plugin-anthropic/src/index.js +1 -1
  115. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/index.js +1 -1
  116. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +4 -4
  117. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  118. package/packages/datadog-plugin-aws-sdk/src/util.js +3 -3
  119. package/packages/datadog-plugin-azure-event-hubs/src/index.js +1 -1
  120. package/packages/datadog-plugin-azure-event-hubs/src/producer.js +19 -5
  121. package/packages/datadog-plugin-azure-service-bus/src/index.js +1 -1
  122. package/packages/datadog-plugin-azure-service-bus/src/producer.js +4 -0
  123. package/packages/datadog-plugin-bullmq/src/consumer.js +60 -0
  124. package/packages/datadog-plugin-bullmq/src/index.js +18 -0
  125. package/packages/datadog-plugin-bullmq/src/producer.js +178 -0
  126. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +1 -1
  127. package/packages/datadog-plugin-confluentinc-kafka-javascript/src/index.js +1 -1
  128. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +23 -2
  129. package/packages/datadog-plugin-cypress/src/plugin.js +2 -2
  130. package/packages/datadog-plugin-cypress/src/support.js +73 -31
  131. package/packages/datadog-plugin-express/src/index.js +1 -1
  132. package/packages/datadog-plugin-fastify/src/index.js +1 -1
  133. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +13 -3
  134. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +171 -12
  135. package/packages/datadog-plugin-google-cloud-pubsub/src/index.js +1 -2
  136. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +160 -13
  137. package/packages/datadog-plugin-google-cloud-pubsub/src/pubsub-push-subscription.js +217 -0
  138. package/packages/datadog-plugin-google-cloud-vertexai/src/index.js +1 -1
  139. package/packages/datadog-plugin-google-genai/src/index.js +17 -0
  140. package/packages/datadog-plugin-google-genai/src/tracing.js +41 -0
  141. package/packages/datadog-plugin-graphql/src/resolve.js +1 -1
  142. package/packages/datadog-plugin-graphql/src/tools/transforms.js +5 -4
  143. package/packages/datadog-plugin-grpc/src/index.js +1 -1
  144. package/packages/datadog-plugin-http/src/client.js +2 -1
  145. package/packages/datadog-plugin-http/src/index.js +25 -5
  146. package/packages/datadog-plugin-http2/src/client.js +2 -2
  147. package/packages/datadog-plugin-http2/src/index.js +1 -1
  148. package/packages/datadog-plugin-jest/src/util.js +1 -1
  149. package/packages/datadog-plugin-kafkajs/src/index.js +1 -1
  150. package/packages/datadog-plugin-langchain/src/index.js +1 -1
  151. package/packages/datadog-plugin-langchain/src/tracing.js +7 -3
  152. package/packages/datadog-plugin-moleculer/src/index.js +1 -1
  153. package/packages/datadog-plugin-mongodb-core/src/index.js +6 -2
  154. package/packages/datadog-plugin-next/src/index.js +11 -3
  155. package/packages/datadog-plugin-openai/src/index.js +1 -1
  156. package/packages/datadog-plugin-openai/src/stream-helpers.js +30 -10
  157. package/packages/datadog-plugin-openai/src/tracing.js +2 -2
  158. package/packages/datadog-plugin-rhea/src/index.js +1 -1
  159. package/packages/datadog-plugin-ws/src/close.js +56 -3
  160. package/packages/datadog-plugin-ws/src/index.js +4 -0
  161. package/packages/datadog-plugin-ws/src/producer.js +39 -4
  162. package/packages/datadog-plugin-ws/src/receiver.js +39 -3
  163. package/packages/datadog-plugin-ws/src/server.js +13 -1
  164. package/packages/datadog-plugin-ws/src/util.js +107 -0
  165. package/packages/datadog-shimmer/src/shimmer.js +2 -2
  166. package/packages/dd-trace/src/aiguard/sdk.js +21 -13
  167. package/packages/dd-trace/src/appsec/api_security_sampler.js +1 -1
  168. package/packages/dd-trace/src/appsec/graphql.js +2 -2
  169. package/packages/dd-trace/src/appsec/iast/analyzers/code-injection-analyzer.js +1 -1
  170. package/packages/dd-trace/src/appsec/iast/analyzers/command-injection-analyzer.js +1 -1
  171. package/packages/dd-trace/src/appsec/iast/analyzers/cookie-analyzer.js +1 -1
  172. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-base-analyzer.js +1 -1
  173. package/packages/dd-trace/src/appsec/iast/analyzers/injection-analyzer.js +1 -1
  174. package/packages/dd-trace/src/appsec/iast/analyzers/ldap-injection-analyzer.js +1 -1
  175. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +3 -3
  176. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +1 -1
  177. package/packages/dd-trace/src/appsec/iast/analyzers/ssrf-analyzer.js +1 -1
  178. package/packages/dd-trace/src/appsec/iast/analyzers/untrusted-deserialization-analyzer.js +1 -1
  179. package/packages/dd-trace/src/appsec/iast/analyzers/unvalidated-redirect-analyzer.js +1 -1
  180. package/packages/dd-trace/src/appsec/iast/analyzers/weak-cipher-analyzer.js +1 -1
  181. package/packages/dd-trace/src/appsec/iast/analyzers/weak-hash-analyzer.js +3 -2
  182. package/packages/dd-trace/src/appsec/iast/analyzers/weak-randomness-analyzer.js +1 -1
  183. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  184. package/packages/dd-trace/src/appsec/iast/index.js +5 -5
  185. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +1 -1
  186. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +1 -1
  187. package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +1 -2
  188. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +1 -1
  189. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -1
  190. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  191. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +11 -16
  192. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +1 -1
  193. package/packages/dd-trace/src/appsec/iast/telemetry/namespaces.js +1 -1
  194. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +4 -4
  195. package/packages/dd-trace/src/appsec/index.js +8 -8
  196. package/packages/dd-trace/src/appsec/rasp/command_injection.js +1 -1
  197. package/packages/dd-trace/src/appsec/rasp/index.js +1 -1
  198. package/packages/dd-trace/src/appsec/rasp/lfi.js +1 -1
  199. package/packages/dd-trace/src/appsec/rc-products.js +10 -0
  200. package/packages/dd-trace/src/appsec/recommended.json +230 -3
  201. package/packages/dd-trace/src/appsec/remote_config.js +177 -0
  202. package/packages/dd-trace/src/appsec/reporter.js +3 -7
  203. package/packages/dd-trace/src/appsec/rule_manager.js +37 -20
  204. package/packages/dd-trace/src/appsec/sdk/index.js +1 -1
  205. package/packages/dd-trace/src/appsec/sdk/set_user.js +1 -1
  206. package/packages/dd-trace/src/appsec/sdk/track_event.js +2 -2
  207. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -2
  208. package/packages/dd-trace/src/appsec/user_tracking.js +2 -2
  209. package/packages/dd-trace/src/appsec/waf/index.js +17 -3
  210. package/packages/dd-trace/src/appsec/waf/waf_manager.js +11 -0
  211. package/packages/dd-trace/src/azure_metadata.js +8 -2
  212. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +8 -6
  213. package/packages/dd-trace/src/ci-visibility/exporters/agentless/index.js +2 -2
  214. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +1 -1
  215. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/index.js +1 -1
  216. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +4 -2
  217. package/packages/dd-trace/src/config/remote_config.js +34 -0
  218. package/packages/dd-trace/src/config.js +109 -34
  219. package/packages/dd-trace/src/config_defaults.js +16 -3
  220. package/packages/dd-trace/src/constants.js +5 -0
  221. package/packages/dd-trace/src/crashtracking/crashtracker.js +10 -1
  222. package/packages/dd-trace/src/datastreams/checkpointer.js +2 -2
  223. package/packages/dd-trace/src/datastreams/encoding.js +23 -6
  224. package/packages/dd-trace/src/datastreams/index.js +1 -1
  225. package/packages/dd-trace/src/datastreams/pathway.js +41 -2
  226. package/packages/dd-trace/src/datastreams/processor.js +3 -3
  227. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
  228. package/packages/dd-trace/src/datastreams/writer.js +2 -2
  229. package/packages/dd-trace/src/debugger/config.js +1 -0
  230. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +15 -5
  231. package/packages/dd-trace/src/debugger/devtools_client/condition.js +1 -1
  232. package/packages/dd-trace/src/debugger/devtools_client/config.js +3 -1
  233. package/packages/dd-trace/src/debugger/devtools_client/index.js +37 -17
  234. package/packages/dd-trace/src/debugger/devtools_client/inspector_promises_polyfill.js +2 -0
  235. package/packages/dd-trace/src/debugger/devtools_client/json-buffer.js +24 -18
  236. package/packages/dd-trace/src/debugger/devtools_client/send.js +21 -11
  237. package/packages/dd-trace/src/debugger/devtools_client/session.js +1 -1
  238. package/packages/dd-trace/src/debugger/devtools_client/snapshot/collector.js +103 -15
  239. package/packages/dd-trace/src/debugger/devtools_client/snapshot/constants.js +25 -0
  240. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +56 -25
  241. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +64 -23
  242. package/packages/dd-trace/src/debugger/devtools_client/snapshot/symbols.js +3 -1
  243. package/packages/dd-trace/src/debugger/devtools_client/snapshot-pruner.js +404 -0
  244. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +1 -1
  245. package/packages/dd-trace/src/debugger/devtools_client/state.js +8 -3
  246. package/packages/dd-trace/src/debugger/devtools_client/status.js +3 -3
  247. package/packages/dd-trace/src/debugger/index.js +2 -2
  248. package/packages/dd-trace/src/dogstatsd.js +3 -2
  249. package/packages/dd-trace/src/encode/0.4.js +1 -1
  250. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +2 -2
  251. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  252. package/packages/dd-trace/src/encode/span-stats.js +13 -2
  253. package/packages/dd-trace/src/exporter.js +2 -2
  254. package/packages/dd-trace/src/exporters/agent/index.js +1 -1
  255. package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +1 -1
  256. package/packages/dd-trace/src/exporters/common/request.js +2 -2
  257. package/packages/dd-trace/src/exporters/common/writer.js +1 -1
  258. package/packages/dd-trace/src/exporters/span-stats/index.js +1 -1
  259. package/packages/dd-trace/src/external-logger/src/index.js +1 -2
  260. package/packages/dd-trace/src/flare/index.js +1 -1
  261. package/packages/dd-trace/src/guardrails/index.js +6 -3
  262. package/packages/dd-trace/src/histogram.js +1 -1
  263. package/packages/dd-trace/src/id.js +60 -0
  264. package/packages/dd-trace/src/index.js +1 -1
  265. package/packages/dd-trace/src/lambda/handler.js +4 -4
  266. package/packages/dd-trace/src/lambda/index.js +1 -1
  267. package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
  268. package/packages/dd-trace/src/lambda/runtime/ritm.js +2 -2
  269. package/packages/dd-trace/src/llmobs/constants/tags.js +8 -1
  270. package/packages/dd-trace/src/llmobs/index.js +8 -9
  271. package/packages/dd-trace/src/llmobs/plugins/ai/index.js +38 -7
  272. package/packages/dd-trace/src/llmobs/plugins/ai/util.js +30 -9
  273. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +3 -3
  274. package/packages/dd-trace/src/llmobs/plugins/genai/index.js +104 -0
  275. package/packages/dd-trace/src/llmobs/plugins/genai/util.js +486 -0
  276. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +1 -1
  277. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +1 -1
  278. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/embedding.js +1 -1
  279. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/llm.js +1 -1
  280. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/vectorstore.js +1 -1
  281. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +2 -2
  282. package/packages/dd-trace/src/llmobs/plugins/openai/constants.js +16 -0
  283. package/packages/dd-trace/src/llmobs/plugins/{openai.js → openai/index.js} +63 -6
  284. package/packages/dd-trace/src/llmobs/plugins/openai/utils.js +126 -0
  285. package/packages/dd-trace/src/llmobs/plugins/vertexai.js +1 -1
  286. package/packages/dd-trace/src/llmobs/sdk.js +20 -22
  287. package/packages/dd-trace/src/llmobs/span_processor.js +15 -14
  288. package/packages/dd-trace/src/llmobs/tagger.js +4 -0
  289. package/packages/dd-trace/src/llmobs/telemetry.js +3 -4
  290. package/packages/dd-trace/src/llmobs/writers/base.js +2 -2
  291. package/packages/dd-trace/src/llmobs/writers/spans.js +1 -2
  292. package/packages/dd-trace/src/log/index.js +1 -1
  293. package/packages/dd-trace/src/noop/proxy.js +2 -2
  294. package/packages/dd-trace/src/noop/span.js +1 -1
  295. package/packages/dd-trace/src/openfeature/index.js +2 -2
  296. package/packages/dd-trace/src/openfeature/noop.js +14 -14
  297. package/packages/dd-trace/src/openfeature/remote_config.js +31 -0
  298. package/packages/dd-trace/src/openfeature/writers/base.js +5 -5
  299. package/packages/dd-trace/src/openfeature/writers/exposures.js +9 -9
  300. package/packages/dd-trace/src/opentelemetry/context_manager.js +2 -2
  301. package/packages/dd-trace/src/opentelemetry/logs/index.js +2 -2
  302. package/packages/dd-trace/src/opentelemetry/logs/logger.js +3 -2
  303. package/packages/dd-trace/src/opentelemetry/logs/logger_provider.js +4 -4
  304. package/packages/dd-trace/src/opentelemetry/logs/otlp_http_log_exporter.js +5 -3
  305. package/packages/dd-trace/src/opentelemetry/logs/otlp_transformer.js +17 -16
  306. package/packages/dd-trace/src/opentelemetry/metrics/constants.js +34 -0
  307. package/packages/dd-trace/src/opentelemetry/metrics/index.js +81 -0
  308. package/packages/dd-trace/src/opentelemetry/metrics/instruments.js +225 -0
  309. package/packages/dd-trace/src/opentelemetry/metrics/meter.js +171 -0
  310. package/packages/dd-trace/src/opentelemetry/metrics/meter_provider.js +54 -0
  311. package/packages/dd-trace/src/opentelemetry/metrics/otlp_http_metric_exporter.js +62 -0
  312. package/packages/dd-trace/src/opentelemetry/metrics/otlp_transformer.js +251 -0
  313. package/packages/dd-trace/src/opentelemetry/metrics/periodic_metric_reader.js +557 -0
  314. package/packages/dd-trace/src/opentelemetry/otlp/otlp_http_exporter_base.js +10 -18
  315. package/packages/dd-trace/src/opentelemetry/otlp/otlp_transformer_base.js +47 -32
  316. package/packages/dd-trace/src/opentelemetry/otlp/protobuf_loader.js +1 -1
  317. package/packages/dd-trace/src/opentelemetry/span.js +3 -3
  318. package/packages/dd-trace/src/opentelemetry/tracer.js +4 -4
  319. package/packages/dd-trace/src/opentelemetry/tracer_provider.js +1 -1
  320. package/packages/dd-trace/src/opentracing/propagation/text_map.js +24 -8
  321. package/packages/dd-trace/src/opentracing/span.js +3 -3
  322. package/packages/dd-trace/src/opentracing/tracer.js +5 -5
  323. package/packages/dd-trace/src/payload-tagging/index.js +8 -4
  324. package/packages/dd-trace/src/plugin_manager.js +5 -3
  325. package/packages/dd-trace/src/plugins/apollo.js +1 -1
  326. package/packages/dd-trace/src/plugins/ci_plugin.js +27 -27
  327. package/packages/dd-trace/src/plugins/database.js +1 -1
  328. package/packages/dd-trace/src/plugins/index.js +6 -1
  329. package/packages/dd-trace/src/plugins/log_plugin.js +1 -1
  330. package/packages/dd-trace/src/plugins/outbound.js +1 -1
  331. package/packages/dd-trace/src/plugins/tracing.js +1 -1
  332. package/packages/dd-trace/src/plugins/util/ci.js +1 -1
  333. package/packages/dd-trace/src/plugins/util/git.js +8 -8
  334. package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
  335. package/packages/dd-trace/src/plugins/util/test.js +27 -27
  336. package/packages/dd-trace/src/plugins/util/url.js +119 -1
  337. package/packages/dd-trace/src/plugins/util/user-provided-git.js +1 -1
  338. package/packages/dd-trace/src/plugins/util/web.js +18 -46
  339. package/packages/dd-trace/src/priority_sampler.js +15 -16
  340. package/packages/dd-trace/src/process-tags/index.js +83 -0
  341. package/packages/dd-trace/src/profiling/config.js +33 -22
  342. package/packages/dd-trace/src/profiling/exporter_cli.js +4 -4
  343. package/packages/dd-trace/src/profiling/exporters/agent.js +5 -5
  344. package/packages/dd-trace/src/profiling/index.js +1 -1
  345. package/packages/dd-trace/src/profiling/libuv-size.js +1 -1
  346. package/packages/dd-trace/src/profiling/profiler.js +4 -5
  347. package/packages/dd-trace/src/profiling/profilers/event_plugins/event.js +1 -1
  348. package/packages/dd-trace/src/profiling/profilers/events.js +11 -2
  349. package/packages/dd-trace/src/profiling/profilers/wall.js +4 -4
  350. package/packages/dd-trace/src/proxy.js +17 -18
  351. package/packages/dd-trace/src/rate_limiter.js +1 -1
  352. package/packages/dd-trace/src/remote_config/index.js +541 -137
  353. package/packages/dd-trace/src/require-package-json.js +1 -1
  354. package/packages/dd-trace/src/ritm.js +50 -27
  355. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +1 -1
  356. package/packages/dd-trace/src/serverless.js +16 -0
  357. package/packages/dd-trace/src/service-naming/schemas/v0/messaging.js +8 -0
  358. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +4 -0
  359. package/packages/dd-trace/src/service-naming/schemas/v1/messaging.js +8 -0
  360. package/packages/dd-trace/src/service-naming/schemas/v1/web.js +4 -0
  361. package/packages/dd-trace/src/span_format.js +10 -5
  362. package/packages/dd-trace/src/span_processor.js +8 -3
  363. package/packages/dd-trace/src/span_stats.js +21 -8
  364. package/packages/dd-trace/src/spanleak.js +1 -1
  365. package/packages/dd-trace/src/standalone/index.js +1 -1
  366. package/packages/dd-trace/src/startup-log.js +3 -3
  367. package/packages/dd-trace/src/supported-configurations.json +16 -0
  368. package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
  369. package/packages/dd-trace/src/telemetry/endpoints.js +8 -8
  370. package/packages/dd-trace/src/telemetry/logs/index.js +1 -1
  371. package/packages/dd-trace/src/telemetry/telemetry.js +22 -8
  372. package/packages/dd-trace/src/tracer.js +3 -3
  373. package/packages/dd-trace/src/tracer_metadata.js +19 -15
  374. package/vendor/dist/@datadog/sketches-js/LICENSE +39 -0
  375. package/vendor/dist/@datadog/sketches-js/index.js +1 -0
  376. package/vendor/dist/@datadog/source-map/LICENSE +28 -0
  377. package/vendor/dist/@datadog/source-map/index.js +1 -0
  378. package/vendor/dist/@isaacs/ttlcache/LICENSE +55 -0
  379. package/vendor/dist/@isaacs/ttlcache/index.js +1 -0
  380. package/vendor/dist/@opentelemetry/core/LICENSE +201 -0
  381. package/vendor/dist/@opentelemetry/core/index.js +1 -0
  382. package/vendor/dist/@opentelemetry/resources/LICENSE +201 -0
  383. package/vendor/dist/@opentelemetry/resources/index.js +1 -0
  384. package/vendor/dist/astring/LICENSE +19 -0
  385. package/vendor/dist/astring/index.js +1 -0
  386. package/vendor/dist/crypto-randomuuid/index.js +1 -0
  387. package/vendor/dist/escape-string-regexp/LICENSE +9 -0
  388. package/vendor/dist/escape-string-regexp/index.js +1 -0
  389. package/vendor/dist/esquery/LICENSE +24 -0
  390. package/vendor/dist/esquery/index.js +1 -0
  391. package/vendor/dist/ignore/LICENSE +21 -0
  392. package/vendor/dist/ignore/index.js +1 -0
  393. package/vendor/dist/istanbul-lib-coverage/LICENSE +24 -0
  394. package/vendor/dist/istanbul-lib-coverage/index.js +1 -0
  395. package/vendor/dist/jest-docblock/LICENSE +21 -0
  396. package/vendor/dist/jest-docblock/index.js +1 -0
  397. package/vendor/dist/jsonpath-plus/LICENSE +22 -0
  398. package/vendor/dist/jsonpath-plus/index.js +1 -0
  399. package/vendor/dist/limiter/LICENSE +19 -0
  400. package/vendor/dist/limiter/index.js +1 -0
  401. package/vendor/dist/lodash.sortby/LICENSE +47 -0
  402. package/vendor/dist/lodash.sortby/index.js +1 -0
  403. package/vendor/dist/lru-cache/LICENSE +15 -0
  404. package/vendor/dist/lru-cache/index.js +1 -0
  405. package/vendor/dist/meriyah/LICENSE +7 -0
  406. package/vendor/dist/meriyah/index.js +1 -0
  407. package/vendor/dist/module-details-from-path/LICENSE +21 -0
  408. package/vendor/dist/module-details-from-path/index.js +1 -0
  409. package/vendor/dist/mutexify/promise/LICENSE +21 -0
  410. package/vendor/dist/mutexify/promise/index.js +1 -0
  411. package/vendor/dist/opentracing/LICENSE +201 -0
  412. package/vendor/dist/opentracing/binary_carrier.d.ts +11 -0
  413. package/vendor/dist/opentracing/constants.d.ts +61 -0
  414. package/vendor/dist/opentracing/examples/demo/demo.d.ts +2 -0
  415. package/vendor/dist/opentracing/ext/tags.d.ts +90 -0
  416. package/vendor/dist/opentracing/functions.d.ts +20 -0
  417. package/vendor/dist/opentracing/global_tracer.d.ts +14 -0
  418. package/vendor/dist/opentracing/index.d.ts +12 -0
  419. package/vendor/dist/opentracing/index.js +1 -0
  420. package/vendor/dist/opentracing/mock_tracer/index.d.ts +5 -0
  421. package/vendor/dist/opentracing/mock_tracer/mock_context.d.ts +13 -0
  422. package/vendor/dist/opentracing/mock_tracer/mock_report.d.ts +16 -0
  423. package/vendor/dist/opentracing/mock_tracer/mock_span.d.ts +50 -0
  424. package/vendor/dist/opentracing/mock_tracer/mock_tracer.d.ts +26 -0
  425. package/vendor/dist/opentracing/noop.d.ts +8 -0
  426. package/vendor/dist/opentracing/reference.d.ts +33 -0
  427. package/vendor/dist/opentracing/span.d.ts +147 -0
  428. package/vendor/dist/opentracing/span_context.d.ts +26 -0
  429. package/vendor/dist/opentracing/test/api_compatibility.d.ts +16 -0
  430. package/vendor/dist/opentracing/test/mocktracer_implemenation.d.ts +3 -0
  431. package/vendor/dist/opentracing/test/noop_implementation.d.ts +4 -0
  432. package/vendor/dist/opentracing/test/opentracing_api.d.ts +3 -0
  433. package/vendor/dist/opentracing/test/unittest.d.ts +2 -0
  434. package/vendor/dist/opentracing/tracer.d.ts +127 -0
  435. package/vendor/dist/path-to-regexp/LICENSE +21 -0
  436. package/vendor/dist/path-to-regexp/index.js +1 -0
  437. package/vendor/dist/pprof-format/LICENSE +8 -0
  438. package/vendor/dist/pprof-format/index.js +1 -0
  439. package/vendor/dist/protobufjs/LICENSE +39 -0
  440. package/vendor/dist/protobufjs/index.js +1 -0
  441. package/vendor/dist/protobufjs/minimal/LICENSE +39 -0
  442. package/vendor/dist/protobufjs/minimal/index.js +1 -0
  443. package/vendor/dist/retry/LICENSE +21 -0
  444. package/vendor/dist/retry/index.js +1 -0
  445. package/vendor/dist/rfdc/LICENSE +15 -0
  446. package/vendor/dist/rfdc/index.js +1 -0
  447. package/vendor/dist/semifies/LICENSE +201 -0
  448. package/vendor/dist/semifies/index.js +1 -0
  449. package/vendor/dist/shell-quote/LICENSE +24 -0
  450. package/vendor/dist/shell-quote/index.js +1 -0
  451. package/vendor/dist/source-map/LICENSE +28 -0
  452. package/vendor/dist/source-map/index.js +1 -0
  453. package/vendor/dist/source-map/lib/util/LICENSE +28 -0
  454. package/vendor/dist/source-map/lib/util/index.js +1 -0
  455. package/vendor/dist/source-map/mappings.wasm +0 -0
  456. package/vendor/dist/tlhunter-sorted-set/LICENSE +21 -0
  457. package/vendor/dist/tlhunter-sorted-set/index.js +1 -0
  458. package/vendor/dist/ttl-set/LICENSE +21 -0
  459. package/vendor/dist/ttl-set/index.js +1 -0
  460. package/packages/dd-trace/src/remote_config/manager.js +0 -368
@@ -0,0 +1,177 @@
1
+ 'use strict'
2
+
3
+ const log = require('../log')
4
+ const { updateConfig } = require('../telemetry')
5
+ const RemoteConfigCapabilities = require('../remote_config/capabilities')
6
+ const { setCollectionMode } = require('./user_tracking')
7
+ const Activation = require('./activation')
8
+
9
+ let autoUserInstrumModeId
10
+ let rc
11
+
12
+ /**
13
+ * Configures remote config handlers for appsec features
14
+ *
15
+ * @param {object} rcInstance - RemoteConfig instance
16
+ * @param {object} config - Tracer config
17
+ * @param {object} appsec - Appsec module
18
+ */
19
+ function enable (rcInstance, config, appsec) {
20
+ rc = rcInstance
21
+ const activation = Activation.fromConfig(config)
22
+
23
+ if (activation !== Activation.DISABLED) {
24
+ if (activation === Activation.ONECLICK) {
25
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_ACTIVATION, true)
26
+ }
27
+
28
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_AUTO_USER_INSTRUM_MODE, true)
29
+
30
+ rc.setProductHandler('ASM_FEATURES', (action, rcConfig, configId) => {
31
+ if (!rcConfig) return
32
+
33
+ // this is put before other handlers because it can reject the config
34
+ if (typeof rcConfig.auto_user_instrum?.mode === 'string') {
35
+ if (action === 'apply' || action === 'modify') {
36
+ // check if there is already a config applied with this field
37
+ if (autoUserInstrumModeId && configId !== autoUserInstrumModeId) {
38
+ log.error('[RC] Multiple auto_user_instrum received in ASM_FEATURES. Discarding config')
39
+ // eslint-disable-next-line no-throw-literal
40
+ throw 'Multiple auto_user_instrum.mode received in ASM_FEATURES'
41
+ }
42
+
43
+ setCollectionMode(rcConfig.auto_user_instrum.mode)
44
+ autoUserInstrumModeId = configId
45
+ } else if (configId === autoUserInstrumModeId) {
46
+ setCollectionMode(config.appsec.eventTracking.mode)
47
+ autoUserInstrumModeId = null
48
+ }
49
+ }
50
+
51
+ if (activation === Activation.ONECLICK) {
52
+ enableOrDisableAppsec(action, rcConfig, config, appsec)
53
+ }
54
+ })
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Enables or disables appsec based on remote config
60
+ *
61
+ * @param {string} action - 'apply', 'modify', or 'unapply'
62
+ * @param {object} rcConfig - Remote config
63
+ * @param {object} config - Tracer config
64
+ * @param {object} appsec - Appsec module
65
+ */
66
+ function enableOrDisableAppsec (action, rcConfig, config, appsec) {
67
+ if (typeof rcConfig.asm?.enabled === 'boolean') {
68
+ const isRemoteConfigControlling = action === 'apply' || action === 'modify'
69
+ const shouldEnable = isRemoteConfigControlling
70
+ ? rcConfig.asm.enabled // take control
71
+ : config.appsec.enabled // give back control to local config
72
+
73
+ if (shouldEnable) {
74
+ appsec.enable(config)
75
+ } else {
76
+ appsec.disable()
77
+ }
78
+
79
+ updateConfig([
80
+ {
81
+ name: 'appsec.enabled',
82
+ origin: isRemoteConfigControlling ? 'remote_config' : config.getOrigin('appsec.enabled'),
83
+ value: shouldEnable
84
+ }
85
+ ], config)
86
+ }
87
+ }
88
+
89
+ /**
90
+ * Enables WAF update capabilities for remote config
91
+ *
92
+ * @param {object} appsecConfig - Appsec config
93
+ */
94
+ function enableWafUpdate (appsecConfig) {
95
+ if (rc && appsecConfig && !appsecConfig.rules) {
96
+ // dirty require to make startup faster for serverless
97
+ const { ASM_WAF_PRODUCTS } = require('./rc-products')
98
+ const RuleManager = require('./rule_manager')
99
+
100
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_IP_BLOCKING, true)
101
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_USER_BLOCKING, true)
102
+ // TODO: we should have a different capability for rule override
103
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_DD_RULES, true)
104
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_EXCLUSIONS, true)
105
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_REQUEST_BLOCKING, true)
106
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_RESPONSE_BLOCKING, true)
107
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_CUSTOM_RULES, true)
108
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_CUSTOM_BLOCKING_RESPONSE, true)
109
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_TRUSTED_IPS, true)
110
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_PROCESSOR_OVERRIDES, true)
111
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_CUSTOM_DATA_SCANNERS, true)
112
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_EXCLUSION_DATA, true)
113
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_ENDPOINT_FINGERPRINT, true)
114
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_SESSION_FINGERPRINT, true)
115
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_NETWORK_FINGERPRINT, true)
116
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_HEADER_FINGERPRINT, true)
117
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_DD_MULTICONFIG, true)
118
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_TRACE_TAGGING_RULES, true)
119
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_EXTENDED_DATA_COLLECTION, true)
120
+
121
+ if (appsecConfig.rasp?.enabled) {
122
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_RASP_SQLI, true)
123
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_RASP_SSRF, true)
124
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_RASP_LFI, true)
125
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_RASP_SHI, true)
126
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_RASP_CMDI, true)
127
+ }
128
+
129
+ rc.subscribeProducts(...ASM_WAF_PRODUCTS)
130
+ rc.setBatchHandler(ASM_WAF_PRODUCTS, RuleManager.updateWafFromRC)
131
+ }
132
+ }
133
+
134
+ /**
135
+ * Disables WAF update capabilities for remote config
136
+ */
137
+ function disableWafUpdate () {
138
+ if (rc) {
139
+ const { ASM_WAF_PRODUCTS } = require('./rc-products')
140
+ const RuleManager = require('./rule_manager')
141
+
142
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_IP_BLOCKING, false)
143
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_USER_BLOCKING, false)
144
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_DD_RULES, false)
145
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_EXCLUSIONS, false)
146
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_REQUEST_BLOCKING, false)
147
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_RESPONSE_BLOCKING, false)
148
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_CUSTOM_RULES, false)
149
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_CUSTOM_BLOCKING_RESPONSE, false)
150
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_TRUSTED_IPS, false)
151
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_PROCESSOR_OVERRIDES, false)
152
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_CUSTOM_DATA_SCANNERS, false)
153
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_EXCLUSION_DATA, false)
154
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_ENDPOINT_FINGERPRINT, false)
155
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_SESSION_FINGERPRINT, false)
156
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_NETWORK_FINGERPRINT, false)
157
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_HEADER_FINGERPRINT, false)
158
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_DD_MULTICONFIG, false)
159
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_TRACE_TAGGING_RULES, false)
160
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_EXTENDED_DATA_COLLECTION, false)
161
+
162
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_RASP_SQLI, false)
163
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_RASP_SSRF, false)
164
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_RASP_LFI, false)
165
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_RASP_SHI, false)
166
+ rc.updateCapabilities(RemoteConfigCapabilities.ASM_RASP_CMDI, false)
167
+
168
+ rc.unsubscribeProducts(...ASM_WAF_PRODUCTS)
169
+ rc.removeBatchHandler(RuleManager.updateWafFromRC)
170
+ }
171
+ }
172
+
173
+ module.exports = {
174
+ enable,
175
+ enableWafUpdate,
176
+ disableWafUpdate
177
+ }
@@ -1,11 +1,13 @@
1
1
  'use strict'
2
2
 
3
- const dc = require('dc-polyfill')
4
3
  const zlib = require('zlib')
4
+ const dc = require('dc-polyfill')
5
5
 
6
6
  const { storage } = require('../../../datadog-core')
7
7
  const web = require('../plugins/util/web')
8
8
  const { ipHeaderList } = require('../plugins/util/ip_extractor')
9
+ const { keepTrace } = require('../priority_sampler')
10
+ const { ASM } = require('../standalone/product')
9
11
  const {
10
12
  incrementWafInitMetric,
11
13
  incrementWafUpdatesMetric,
@@ -16,8 +18,6 @@ const {
16
18
  updateRaspRuleSkippedMetricTags,
17
19
  getRequestMetrics
18
20
  } = require('./telemetry')
19
- const { keepTrace } = require('../priority_sampler')
20
- const { ASM } = require('../standalone/product')
21
21
  const { DIAGNOSTIC_KEYS } = require('./waf/diagnostics')
22
22
 
23
23
  const REQUEST_HEADER_TAG_PREFIX = 'http.request.headers.'
@@ -546,10 +546,6 @@ function finishRequest (req, res, storedResponseHeaders, requestBody) {
546
546
  reportRequestBody(rootSpan, requestBody)
547
547
  }
548
548
 
549
- if (tags['appsec.event'] === 'true' && typeof req.route?.path === 'string') {
550
- newTags['http.endpoint'] = req.route.path
551
- }
552
-
553
549
  rootSpan.addTags(newTags)
554
550
  }
555
551
 
@@ -1,14 +1,12 @@
1
1
  'use strict'
2
2
 
3
- const fs = require('fs')
3
+ const { readFileSync } = require('node:fs')
4
+
4
5
  const waf = require('./waf')
5
6
  const { DIAGNOSTIC_KEYS } = require('./waf/diagnostics')
6
- const { ACKNOWLEDGED, ERROR } = require('../remote_config/apply_states')
7
- const Reporter = require('./reporter')
8
-
9
7
  const blocking = require('./blocking')
10
-
11
- const ASM_PRODUCTS = new Set(['ASM', 'ASM_DD', 'ASM_DATA'])
8
+ const Reporter = require('./reporter')
9
+ const { ASM_WAF_PRODUCTS_SET } = require('./rc-products')
12
10
 
13
11
  /*
14
12
  ASM Actions must be tracked in order to update the defaultBlockingActions in blocking. These actions are used
@@ -16,9 +14,21 @@ const ASM_PRODUCTS = new Set(['ASM', 'ASM_DD', 'ASM_DATA'])
16
14
  */
17
15
  let appliedActions = new Map()
18
16
 
17
+ /**
18
+ * @typedef {object} AsmConfigFile
19
+ * @property {Array<Record<string, unknown>>} [actions]
20
+ */
21
+
22
+ /**
23
+ * @typedef {import('./waf').WAFConfig & { rules?: string }} AppSecConfig
24
+ */
25
+
26
+ /**
27
+ * @param {AppSecConfig} config
28
+ */
19
29
  function loadRules (config) {
20
30
  const defaultRules = config.rules
21
- ? JSON.parse(fs.readFileSync(config.rules))
31
+ ? JSON.parse(readFileSync(config.rules, 'utf8'))
22
32
  : require('./recommended.json')
23
33
 
24
34
  waf.init(defaultRules, config)
@@ -26,19 +36,26 @@ function loadRules (config) {
26
36
  blocking.setDefaultBlockingActionParameters(defaultRules?.actions)
27
37
  }
28
38
 
29
- function updateWafFromRC ({ toUnapply, toApply, toModify }) {
39
+ /**
40
+ * Apply ASM remote-config updates to the WAF in a single batch.
41
+ *
42
+ * @param {import('../remote_config/manager').RcBatchUpdateTransaction} transaction
43
+ */
44
+ function updateWafFromRC (transaction) {
45
+ const { toUnapply, toApply, toModify } = transaction
46
+
30
47
  const newActions = new SpyMap(appliedActions)
31
48
 
32
49
  let wafUpdated = false
33
50
  let wafUpdatedFailed = false
34
51
 
35
52
  for (const item of toUnapply) {
36
- if (!ASM_PRODUCTS.has(item.product)) continue
53
+ if (!ASM_WAF_PRODUCTS_SET.has(item.product)) continue
37
54
 
38
55
  try {
39
56
  waf.removeConfig(item.path)
40
57
 
41
- item.apply_state = ACKNOWLEDGED
58
+ transaction.ack(item.path)
42
59
  wafUpdated = true
43
60
 
44
61
  // ASM actions
@@ -46,30 +63,30 @@ function updateWafFromRC ({ toUnapply, toApply, toModify }) {
46
63
  newActions.delete(item.id)
47
64
  }
48
65
  } catch (e) {
49
- item.apply_state = ERROR
50
- item.apply_error = e.toString()
66
+ transaction.error(item.path, e)
51
67
  wafUpdatedFailed = true
52
68
  }
53
69
  }
54
70
 
55
71
  for (const item of [...toApply, ...toModify]) {
56
- if (!ASM_PRODUCTS.has(item.product)) continue
72
+ if (!ASM_WAF_PRODUCTS_SET.has(item.product)) continue
57
73
 
58
74
  try {
59
75
  waf.updateConfig(item.product, item.id, item.path, item.file)
60
76
 
61
- item.apply_state = ACKNOWLEDGED
77
+ transaction.ack(item.path)
62
78
  wafUpdated = true
63
79
 
64
80
  // ASM actions
65
- if (item.product === 'ASM' && item.file?.actions?.length) {
66
- newActions.set(item.id, item.file.actions)
81
+ if (item.product === 'ASM') {
82
+ const asmFile = /** @type {AsmConfigFile} */ (item.file)
83
+ if (asmFile?.actions?.length) {
84
+ newActions.set(item.id, asmFile.actions)
85
+ }
67
86
  }
68
87
  } catch (e) {
69
- item.apply_state = ERROR
70
- item.apply_error = e instanceof waf.WafUpdateError
71
- ? JSON.stringify(extractErrors(e.diagnosticErrors))
72
- : e.toString()
88
+ const error = e instanceof waf.WafUpdateError ? JSON.stringify(extractErrors(e.diagnosticErrors)) : e
89
+ transaction.error(item.path, error)
73
90
  wafUpdatedFailed = true
74
91
  }
75
92
  }
@@ -1,5 +1,6 @@
1
1
  'use strict'
2
2
 
3
+ const { setTemplates } = require('../blocking')
3
4
  const {
4
5
  trackUserLoginSuccessEvent,
5
6
  trackUserLoginFailureEvent,
@@ -8,7 +9,6 @@ const {
8
9
  trackUserLoginFailureV2
9
10
  } = require('./track_event')
10
11
  const { checkUserAndSetUser, blockRequest } = require('./user_blocking')
11
- const { setTemplates } = require('../blocking')
12
12
  const { setUser } = require('./set_user')
13
13
 
14
14
  class EventTrackingV2 {
@@ -1,9 +1,9 @@
1
1
  'use strict'
2
2
 
3
- const { getRootSpan } = require('./utils')
4
3
  const log = require('../../log')
5
4
  const waf = require('../waf')
6
5
  const addresses = require('../addresses')
6
+ const { getRootSpan } = require('./utils')
7
7
 
8
8
  function setUserTags (user, rootSpan) {
9
9
  for (const k of Object.keys(user)) {
@@ -1,13 +1,13 @@
1
1
  'use strict'
2
2
 
3
3
  const log = require('../../log')
4
- const { getRootSpan } = require('./utils')
5
- const { setUserTags } = require('./set_user')
6
4
  const waf = require('../waf')
7
5
  const { keepTrace } = require('../../priority_sampler')
8
6
  const addresses = require('../addresses')
9
7
  const { ASM } = require('../../standalone/product')
10
8
  const { incrementSdkEventMetric } = require('../telemetry')
9
+ const { setUserTags } = require('./set_user')
10
+ const { getRootSpan } = require('./utils')
11
11
 
12
12
  /**
13
13
  * @deprecated in favor of trackUserLoginSuccessV2
@@ -2,11 +2,11 @@
2
2
 
3
3
  const { USER_ID } = require('../addresses')
4
4
  const waf = require('../waf')
5
- const { getRootSpan } = require('./utils')
6
5
  const { block, getBlockingAction } = require('../blocking')
7
6
  const { storage } = require('../../../../datadog-core')
8
- const { setUserTags } = require('./set_user')
9
7
  const log = require('../../log')
8
+ const { setUserTags } = require('./set_user')
9
+ const { getRootSpan } = require('./utils')
10
10
 
11
11
  function isUserBlocked (user) {
12
12
  const results = waf.run({ persistent: { [USER_ID]: user.id } })
@@ -2,11 +2,11 @@
2
2
 
3
3
  const crypto = require('crypto')
4
4
  const log = require('../log')
5
+ const { keepTrace } = require('../priority_sampler')
6
+ const { ASM } = require('../standalone/product')
5
7
  const telemetry = require('./telemetry')
6
8
  const addresses = require('./addresses')
7
- const { keepTrace } = require('../priority_sampler')
8
9
  const waf = require('./waf')
9
- const { ASM } = require('../standalone/product')
10
10
 
11
11
  // the RFC doesn't include '_id', but it's common in MongoDB
12
12
  const USER_ID_FIELDS = ['id', '_id', 'email', 'username', 'login', 'user']
@@ -19,7 +19,17 @@ class WafUpdateError extends Error {
19
19
 
20
20
  let limiter = new Limiter(100)
21
21
 
22
+ /** @typedef {import('./waf_manager')} WAFManager */
23
+
24
+ /** @type {typeof import('./waf_manager') | null} */
25
+ let WAFManager = null
26
+
27
+ /**
28
+ * @typedef {import('./waf_manager').WAFManagerConfig & { rateLimit: number }} WAFConfig
29
+ */
30
+
22
31
  const waf = {
32
+ /** @type {WAFManager | null} */
23
33
  wafManager: null,
24
34
  init,
25
35
  destroy,
@@ -31,13 +41,17 @@ const waf = {
31
41
  WafUpdateError
32
42
  }
33
43
 
44
+ /**
45
+ * @param {object} rules
46
+ * @param {WAFConfig} config
47
+ */
34
48
  function init (rules, config) {
35
49
  destroy()
36
50
 
37
51
  limiter = new Limiter(config.rateLimit)
38
52
 
39
- // dirty require to make startup faster for serverless
40
- const WAFManager = require('./waf_manager')
53
+ // Lazy loading improves the startup time
54
+ WAFManager = require('./waf_manager')
41
55
 
42
56
  waf.wafManager = new WAFManager(rules, config)
43
57
 
@@ -70,7 +84,7 @@ function updateConfig (product, configId, configPath, config) {
70
84
 
71
85
  try {
72
86
  if (product === 'ASM_DD') {
73
- waf.wafManager.removeConfig(waf.wafManager.constructor.defaultWafConfigPath)
87
+ waf.wafManager.removeConfig((/** @type {NonNullable<typeof WAFManager>} */ (WAFManager)).defaultWafConfigPath)
74
88
  }
75
89
 
76
90
  const updateSucceeded = waf.wafManager.updateConfig(configPath, config)
@@ -6,9 +6,20 @@ const WAFContextWrapper = require('./waf_context_wrapper')
6
6
 
7
7
  const contexts = new WeakMap()
8
8
 
9
+ /**
10
+ * @typedef {object} WAFManagerConfig
11
+ * @property {number} wafTimeout - Maximum time in microseconds for WAF execution
12
+ * @property {string} obfuscatorKeyRegex - Regex to redact sensitive data by key
13
+ * @property {string} obfuscatorValueRegex - Regex to redact sensitive data by value
14
+ */
15
+
9
16
  class WAFManager {
10
17
  static defaultWafConfigPath = 'datadog/00/ASM_DD/default/config'
11
18
 
19
+ /**
20
+ * @param {object} rules
21
+ * @param {WAFManagerConfig} config
22
+ */
12
23
  constructor (rules, config) {
13
24
  this.config = config
14
25
  this.wafTimeout = config.wafTimeout
@@ -3,8 +3,8 @@
3
3
  // Modeled after https://github.com/DataDog/libdatadog/blob/f3994857a59bb5679a65967138c5a3aec418a65f/ddcommon/src/azure_app_services.rs
4
4
 
5
5
  const os = require('os')
6
- const { getIsAzureFunction } = require('./serverless')
7
6
  const { getEnvironmentVariable, getEnvironmentVariables } = require('../../dd-trace/src/config-helper')
7
+ const { getIsAzureFunction, getIsFlexConsumptionAzureFunction } = require('./serverless')
8
8
 
9
9
  function extractSubscriptionID (ownerName) {
10
10
  if (ownerName !== undefined) {
@@ -38,6 +38,7 @@ function buildMetadata () {
38
38
  const {
39
39
  COMPUTERNAME,
40
40
  DD_AAS_DOTNET_EXTENSION_VERSION,
41
+ DD_AZURE_RESOURCE_GROUP,
41
42
  FUNCTIONS_EXTENSION_VERSION,
42
43
  FUNCTIONS_WORKER_RUNTIME,
43
44
  FUNCTIONS_WORKER_RUNTIME_VERSION,
@@ -56,7 +57,12 @@ function buildMetadata () {
56
57
  ? ['functionapp', 'function']
57
58
  : ['app', 'app']
58
59
 
59
- const resourceGroup = WEBSITE_RESOURCE_GROUP ?? extractResourceGroup(WEBSITE_OWNER_NAME)
60
+ // Azure Functions on Flex Consumption plans require the `DD_AZURE_RESOURCE_GROUP` env var.
61
+ // If this logic ever changes, update the logic in `libdatadog`, `serverless-components/src/datadog-trace-agent`,
62
+ // and the serverless compat layers accordingly.
63
+ const resourceGroup = getIsFlexConsumptionAzureFunction()
64
+ ? (DD_AZURE_RESOURCE_GROUP ?? WEBSITE_RESOURCE_GROUP ?? extractResourceGroup(WEBSITE_OWNER_NAME))
65
+ : (WEBSITE_RESOURCE_GROUP ?? extractResourceGroup(WEBSITE_OWNER_NAME))
60
66
 
61
67
  return trimObject({
62
68
  extensionVersion: DD_AAS_DOTNET_EXTENSION_VERSION,
@@ -2,6 +2,7 @@
2
2
 
3
3
  const {
4
4
  workerData: {
5
+ config,
5
6
  breakpointSetChannel,
6
7
  breakpointHitChannel,
7
8
  breakpointRemoveChannel
@@ -21,6 +22,7 @@ const {
21
22
  getStackFromCallFrames
22
23
  } = require('../../../debugger/devtools_client/state')
23
24
  const log = require('../../../log')
25
+ const processTags = require('../../../process-tags')
24
26
 
25
27
  let sessionStarted = false
26
28
 
@@ -36,7 +38,7 @@ session.on('Debugger.paused', async ({ params: { hitBreakpoints: [hitBreakpoint]
36
38
 
37
39
  const stack = getStackFromCallFrames(callFrames)
38
40
 
39
- const getLocalState = await getLocalStateForCallFrame(callFrames[0])
41
+ const { processLocalState } = await getLocalStateForCallFrame(callFrames[0])
40
42
 
41
43
  await session.post('Debugger.resume')
42
44
 
@@ -48,15 +50,15 @@ session.on('Debugger.paused', async ({ params: { hitBreakpoints: [hitBreakpoint]
48
50
  version: '0',
49
51
  location: probe.location
50
52
  },
53
+ captures: {
54
+ lines: { [probe.location.lines[0]]: { locals: processLocalState() } }
55
+ },
51
56
  stack,
52
57
  language: 'javascript'
53
58
  }
54
59
 
55
- const state = getLocalState()
56
- if (state) {
57
- snapshot.captures = {
58
- lines: { [probe.location.lines[0]]: { locals: state } }
59
- }
60
+ if (config.propagateProcessTags?.enabled) {
61
+ snapshot[processTags.DYNAMIC_INSTRUMENTATION_FIELD_NAME] = processTags.tagsObject
60
62
  }
61
63
 
62
64
  breakpointHitChannel.postMessage({ snapshot })
@@ -1,10 +1,10 @@
1
1
  'use strict'
2
2
 
3
3
  const URL = require('url').URL
4
- const Writer = require('./writer')
5
- const CoverageWriter = require('./coverage-writer')
6
4
  const CiVisibilityExporter = require('../ci-visibility-exporter')
7
5
  const log = require('../../../log')
6
+ const Writer = require('./writer')
7
+ const CoverageWriter = require('./coverage-writer')
8
8
 
9
9
  class AgentlessCiVisibilityExporter extends CiVisibilityExporter {
10
10
  constructor (config) {
@@ -2,7 +2,6 @@
2
2
 
3
3
  const URL = require('url').URL
4
4
 
5
- const { sendGitMetadata: sendGitMetadataRequest } = require('./git/git_metadata')
6
5
  const { getLibraryConfiguration: getLibraryConfigurationRequest } = require('../requests/get-library-configuration')
7
6
  const { getSkippableSuites: getSkippableSuitesRequest } = require('../intelligent-test-runner/get-skippable-suites')
8
7
  const { getKnownTests: getKnownTestsRequest } = require('../early-flake-detection/get-known-tests')
@@ -11,6 +10,7 @@ const { getTestManagementTests: getTestManagementTestsRequest } =
11
10
  const log = require('../../log')
12
11
  const AgentInfoExporter = require('../../exporters/common/agent-info-exporter')
13
12
  const { GIT_REPOSITORY_URL, GIT_COMMIT_SHA } = require('../../plugins/util/tags')
13
+ const { sendGitMetadata: sendGitMetadataRequest } = require('./git/git_metadata')
14
14
 
15
15
  function getTestConfigurationTags (tags) {
16
16
  if (!tags) {
@@ -1,6 +1,5 @@
1
1
  'use strict'
2
2
 
3
- const Writer = require('./writer')
4
3
  const {
5
4
  JEST_WORKER_COVERAGE_PAYLOAD_CODE,
6
5
  JEST_WORKER_TRACE_PAYLOAD_CODE,
@@ -12,6 +11,7 @@ const {
12
11
  VITEST_WORKER_LOGS_PAYLOAD_CODE
13
12
  } = require('../../../plugins/util/test')
14
13
  const { getEnvironmentVariable } = require('../../../config-helper')
14
+ const Writer = require('./writer')
15
15
 
16
16
  function getInterprocessTraceCode () {
17
17
  if (getEnvironmentVariable('JEST_WORKER_ID')) {
@@ -14,7 +14,8 @@ function getTestManagementTests ({
14
14
  commitMessage,
15
15
  sha,
16
16
  commitHeadSha,
17
- commitHeadMessage
17
+ commitHeadMessage,
18
+ branch
18
19
  }, done) {
19
20
  const options = {
20
21
  path: '/api/v2/test/libraries/test-management/tests',
@@ -49,7 +50,8 @@ function getTestManagementTests ({
49
50
  attributes: {
50
51
  repository_url: repositoryUrl,
51
52
  commit_message: commitHeadMessage || commitMessage,
52
- sha: commitHeadSha || sha
53
+ sha: commitHeadSha || sha,
54
+ branch
53
55
  }
54
56
  }
55
57
  })
@@ -0,0 +1,34 @@
1
+ 'use strict'
2
+
3
+ const RemoteConfigCapabilities = require('../remote_config/capabilities')
4
+
5
+ /**
6
+ * Configures remote config for core APM tracing functionality
7
+ *
8
+ * @param {object} rc - RemoteConfig instance
9
+ * @param {object} config - Tracer config
10
+ * @param {Function} enableOrDisableTracing - Function to enable/disable tracing based on config
11
+ */
12
+ function enable (rc, config, enableOrDisableTracing) {
13
+ // Register core APM tracing capabilities
14
+ rc.updateCapabilities(RemoteConfigCapabilities.APM_TRACING_CUSTOM_TAGS, true)
15
+ rc.updateCapabilities(RemoteConfigCapabilities.APM_TRACING_HTTP_HEADER_TAGS, true)
16
+ rc.updateCapabilities(RemoteConfigCapabilities.APM_TRACING_LOGS_INJECTION, true)
17
+ rc.updateCapabilities(RemoteConfigCapabilities.APM_TRACING_SAMPLE_RATE, true)
18
+ rc.updateCapabilities(RemoteConfigCapabilities.APM_TRACING_ENABLED, true)
19
+ rc.updateCapabilities(RemoteConfigCapabilities.APM_TRACING_SAMPLE_RULES, true)
20
+
21
+ // APM_TRACING product handler - manages tracer configuration
22
+ rc.setProductHandler('APM_TRACING', (action, conf) => {
23
+ if (action === 'unapply') {
24
+ config.configure({}, true)
25
+ } else {
26
+ config.configure(conf.lib_config, true)
27
+ }
28
+ enableOrDisableTracing(config, rc)
29
+ })
30
+ }
31
+
32
+ module.exports = {
33
+ enable
34
+ }