dd-trace 5.52.0 → 5.54.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 (332) hide show
  1. package/LICENSE-3rdparty.csv +2 -1
  2. package/README.md +5 -0
  3. package/index.d.ts +87 -22
  4. package/initialize.mjs +3 -4
  5. package/package.json +36 -34
  6. package/packages/datadog-core/src/utils/src/get.js +1 -1
  7. package/packages/datadog-core/src/utils/src/has.js +1 -1
  8. package/packages/datadog-core/src/utils/src/kebabcase.js +4 -6
  9. package/packages/datadog-core/src/utils/src/parse-tags.js +1 -1
  10. package/packages/datadog-core/src/utils/src/pick.js +2 -2
  11. package/packages/datadog-core/src/utils/src/set.js +1 -1
  12. package/packages/datadog-core/src/utils/src/uniq.js +1 -1
  13. package/packages/datadog-instrumentations/src/amqp10.js +19 -17
  14. package/packages/datadog-instrumentations/src/amqplib.js +57 -37
  15. package/packages/datadog-instrumentations/src/apollo.js +2 -2
  16. package/packages/datadog-instrumentations/src/aws-sdk.js +1 -1
  17. package/packages/datadog-instrumentations/src/cassandra-driver.js +5 -4
  18. package/packages/datadog-instrumentations/src/child_process.js +3 -3
  19. package/packages/datadog-instrumentations/src/confluentinc-kafka-javascript.js +92 -62
  20. package/packages/datadog-instrumentations/src/couchbase.js +5 -4
  21. package/packages/datadog-instrumentations/src/cucumber.js +126 -84
  22. package/packages/datadog-instrumentations/src/cypress.js +2 -1
  23. package/packages/datadog-instrumentations/src/dns.js +1 -1
  24. package/packages/datadog-instrumentations/src/express.js +2 -6
  25. package/packages/datadog-instrumentations/src/fs.js +7 -6
  26. package/packages/datadog-instrumentations/src/google-cloud-pubsub.js +28 -34
  27. package/packages/datadog-instrumentations/src/graphql.js +7 -10
  28. package/packages/datadog-instrumentations/src/grpc/client.js +11 -23
  29. package/packages/datadog-instrumentations/src/grpc/server.js +7 -20
  30. package/packages/datadog-instrumentations/src/helpers/extract-package-and-module-path.js +16 -10
  31. package/packages/datadog-instrumentations/src/helpers/hook.js +1 -1
  32. package/packages/datadog-instrumentations/src/helpers/hooks.js +1 -1
  33. package/packages/datadog-instrumentations/src/helpers/instrument.js +1 -41
  34. package/packages/datadog-instrumentations/src/helpers/register.js +21 -18
  35. package/packages/datadog-instrumentations/src/http/client.js +16 -21
  36. package/packages/datadog-instrumentations/src/iovalkey.js +51 -0
  37. package/packages/datadog-instrumentations/src/jest.js +184 -87
  38. package/packages/datadog-instrumentations/src/kafkajs.js +65 -44
  39. package/packages/datadog-instrumentations/src/knex.js +4 -4
  40. package/packages/datadog-instrumentations/src/ldapjs.js +3 -4
  41. package/packages/datadog-instrumentations/src/mariadb.js +38 -61
  42. package/packages/datadog-instrumentations/src/mocha/main.js +85 -59
  43. package/packages/datadog-instrumentations/src/mocha/utils.js +103 -82
  44. package/packages/datadog-instrumentations/src/mocha/worker.js +6 -0
  45. package/packages/datadog-instrumentations/src/mongodb-core.js +1 -1
  46. package/packages/datadog-instrumentations/src/mysql.js +20 -36
  47. package/packages/datadog-instrumentations/src/mysql2.js +55 -47
  48. package/packages/datadog-instrumentations/src/net.js +4 -2
  49. package/packages/datadog-instrumentations/src/next.js +7 -14
  50. package/packages/datadog-instrumentations/src/nyc.js +1 -1
  51. package/packages/datadog-instrumentations/src/openai.js +21 -23
  52. package/packages/datadog-instrumentations/src/oracledb.js +1 -1
  53. package/packages/datadog-instrumentations/src/pg.js +6 -13
  54. package/packages/datadog-instrumentations/src/playwright.js +170 -136
  55. package/packages/datadog-instrumentations/src/redis.js +3 -3
  56. package/packages/datadog-instrumentations/src/restify.js +2 -2
  57. package/packages/datadog-instrumentations/src/rhea.js +42 -54
  58. package/packages/datadog-instrumentations/src/router.js +22 -25
  59. package/packages/datadog-instrumentations/src/tedious.js +1 -1
  60. package/packages/datadog-instrumentations/src/url.js +9 -17
  61. package/packages/datadog-instrumentations/src/vitest.js +126 -97
  62. package/packages/datadog-plugin-amqp10/src/consumer.js +7 -3
  63. package/packages/datadog-plugin-amqp10/src/producer.js +7 -3
  64. package/packages/datadog-plugin-amqplib/src/client.js +6 -2
  65. package/packages/datadog-plugin-amqplib/src/consumer.js +7 -3
  66. package/packages/datadog-plugin-amqplib/src/producer.js +7 -3
  67. package/packages/datadog-plugin-amqplib/src/util.js +1 -1
  68. package/packages/datadog-plugin-apollo/src/gateway/request.js +5 -6
  69. package/packages/datadog-plugin-apollo/src/gateway/validate.js +2 -3
  70. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -2
  71. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/tracing.js +2 -2
  72. package/packages/datadog-plugin-aws-sdk/src/services/bedrockruntime/utils.js +13 -13
  73. package/packages/datadog-plugin-aws-sdk/src/services/dynamodb.js +24 -31
  74. package/packages/datadog-plugin-aws-sdk/src/services/eventbridge.js +2 -2
  75. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +6 -6
  76. package/packages/datadog-plugin-aws-sdk/src/services/lambda.js +1 -1
  77. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +1 -1
  78. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +4 -5
  79. package/packages/datadog-plugin-aws-sdk/src/services/stepfunctions.js +1 -1
  80. package/packages/datadog-plugin-aws-sdk/src/util.js +5 -6
  81. package/packages/datadog-plugin-cassandra-driver/src/index.js +1 -1
  82. package/packages/datadog-plugin-child_process/src/index.js +4 -4
  83. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +23 -23
  84. package/packages/datadog-plugin-cucumber/src/index.js +86 -20
  85. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +97 -27
  86. package/packages/datadog-plugin-cypress/src/plugin.js +11 -1
  87. package/packages/datadog-plugin-cypress/src/support.js +24 -5
  88. package/packages/datadog-plugin-express/src/code_origin.js +30 -0
  89. package/packages/datadog-plugin-express/src/index.js +10 -12
  90. package/packages/datadog-plugin-express/src/tracing.js +19 -0
  91. package/packages/datadog-plugin-google-cloud-pubsub/src/client.js +7 -3
  92. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +12 -7
  93. package/packages/datadog-plugin-google-cloud-pubsub/src/producer.js +6 -2
  94. package/packages/datadog-plugin-google-cloud-vertexai/src/tracing.js +26 -9
  95. package/packages/datadog-plugin-graphql/src/execute.js +2 -2
  96. package/packages/datadog-plugin-graphql/src/index.js +7 -6
  97. package/packages/datadog-plugin-graphql/src/resolve.js +2 -2
  98. package/packages/datadog-plugin-graphql/src/tools/index.js +1 -0
  99. package/packages/datadog-plugin-graphql/src/tools/signature.js +1 -0
  100. package/packages/datadog-plugin-graphql/src/tools/transforms.js +1 -0
  101. package/packages/datadog-plugin-grpc/src/client.js +2 -2
  102. package/packages/datadog-plugin-grpc/src/util.js +2 -2
  103. package/packages/datadog-plugin-http/src/client.js +18 -7
  104. package/packages/datadog-plugin-http2/src/client.js +20 -20
  105. package/packages/datadog-plugin-iovalkey/src/index.js +18 -0
  106. package/packages/datadog-plugin-jest/src/index.js +36 -28
  107. package/packages/datadog-plugin-jest/src/util.js +8 -8
  108. package/packages/datadog-plugin-kafkajs/src/batch-consumer.js +3 -1
  109. package/packages/datadog-plugin-kafkajs/src/consumer.js +9 -5
  110. package/packages/datadog-plugin-kafkajs/src/producer.js +15 -7
  111. package/packages/datadog-plugin-kafkajs/src/utils.js +1 -1
  112. package/packages/datadog-plugin-langchain/src/handlers/chain.js +7 -7
  113. package/packages/datadog-plugin-langchain/src/handlers/embedding.js +2 -2
  114. package/packages/datadog-plugin-langchain/src/handlers/language_models/chat_model.js +6 -4
  115. package/packages/datadog-plugin-langchain/src/handlers/language_models/llm.js +5 -4
  116. package/packages/datadog-plugin-langchain/src/tracing.js +11 -10
  117. package/packages/datadog-plugin-mariadb/src/index.js +3 -9
  118. package/packages/datadog-plugin-mocha/src/index.js +88 -48
  119. package/packages/datadog-plugin-mongodb-core/src/index.js +1 -1
  120. package/packages/datadog-plugin-mysql/src/index.js +11 -9
  121. package/packages/datadog-plugin-mysql2/src/index.js +16 -0
  122. package/packages/datadog-plugin-net/src/tcp.js +1 -1
  123. package/packages/datadog-plugin-next/src/index.js +6 -5
  124. package/packages/datadog-plugin-openai/src/services.js +6 -10
  125. package/packages/datadog-plugin-openai/src/tracing.js +10 -14
  126. package/packages/datadog-plugin-oracledb/src/index.js +1 -1
  127. package/packages/datadog-plugin-playwright/src/index.js +48 -22
  128. package/packages/datadog-plugin-redis/src/index.js +9 -4
  129. package/packages/datadog-plugin-rhea/src/consumer.js +8 -6
  130. package/packages/datadog-plugin-rhea/src/producer.js +5 -2
  131. package/packages/datadog-plugin-router/src/index.js +1 -1
  132. package/packages/datadog-plugin-selenium/src/index.js +1 -6
  133. package/packages/datadog-plugin-vitest/src/index.js +99 -72
  134. package/packages/datadog-shimmer/src/shimmer.js +163 -36
  135. package/packages/dd-trace/src/appsec/api_security_sampler.js +2 -2
  136. package/packages/dd-trace/src/appsec/blocked_templates.js +1 -1
  137. package/packages/dd-trace/src/appsec/blocking.js +6 -20
  138. package/packages/dd-trace/src/appsec/graphql.js +2 -2
  139. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-password-rules.js +1 -1
  140. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secret-rules.js +1 -1
  141. package/packages/dd-trace/src/appsec/iast/analyzers/hardcoded-secrets-rules.js +1 -1
  142. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +4 -6
  143. package/packages/dd-trace/src/appsec/iast/analyzers/hsts-header-missing-analyzer.js +7 -12
  144. package/packages/dd-trace/src/appsec/iast/analyzers/missing-header-analyzer.js +4 -6
  145. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +4 -0
  146. package/packages/dd-trace/src/appsec/iast/analyzers/path-traversal-analyzer.js +9 -12
  147. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +5 -4
  148. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +2 -3
  149. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +3 -3
  150. package/packages/dd-trace/src/appsec/iast/index.js +1 -0
  151. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +102 -7
  152. package/packages/dd-trace/src/appsec/iast/path-line.js +7 -8
  153. package/packages/dd-trace/src/appsec/iast/security-controls/index.js +6 -13
  154. package/packages/dd-trace/src/appsec/iast/security-controls/parser.js +6 -6
  155. package/packages/dd-trace/src/appsec/iast/taint-tracking/filter.js +2 -2
  156. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +3 -3
  157. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +4 -28
  158. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +1 -7
  159. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +3 -4
  160. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter-esm.mjs +1 -1
  161. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +5 -7
  162. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +2 -2
  163. package/packages/dd-trace/src/appsec/iast/telemetry/span-tags.js +6 -6
  164. package/packages/dd-trace/src/appsec/iast/telemetry/verbosity.js +1 -1
  165. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +1 -1
  166. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +1 -1
  167. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +7 -7
  168. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +23 -24
  169. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-regex.js +3 -3
  170. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/index.js +4 -4
  171. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +6 -11
  172. package/packages/dd-trace/src/appsec/iast/vulnerability-reporter.js +9 -11
  173. package/packages/dd-trace/src/appsec/index.js +15 -12
  174. package/packages/dd-trace/src/appsec/rasp/index.js +19 -17
  175. package/packages/dd-trace/src/appsec/rasp/lfi.js +2 -1
  176. package/packages/dd-trace/src/appsec/rasp/utils.js +11 -6
  177. package/packages/dd-trace/src/appsec/reporter.js +233 -40
  178. package/packages/dd-trace/src/appsec/rule_manager.js +2 -2
  179. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +2 -2
  180. package/packages/dd-trace/src/appsec/stack_trace.js +2 -4
  181. package/packages/dd-trace/src/appsec/telemetry/index.js +1 -2
  182. package/packages/dd-trace/src/appsec/telemetry/rasp.js +3 -14
  183. package/packages/dd-trace/src/appsec/telemetry/waf.js +3 -5
  184. package/packages/dd-trace/src/appsec/user_tracking.js +3 -5
  185. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +8 -8
  186. package/packages/dd-trace/src/azure_metadata.js +2 -7
  187. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/index.js +1 -1
  188. package/packages/dd-trace/src/ci-visibility/dynamic-instrumentation/worker/index.js +2 -2
  189. package/packages/dd-trace/src/ci-visibility/early-flake-detection/get-known-tests.js +1 -1
  190. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +3 -3
  191. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +1 -1
  192. package/packages/dd-trace/src/ci-visibility/exporters/agentless/di-logs-writer.js +1 -1
  193. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +1 -1
  194. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +6 -4
  195. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +2 -2
  196. package/packages/dd-trace/src/ci-visibility/exporters/test-worker/writer.js +0 -2
  197. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +1 -1
  198. package/packages/dd-trace/src/ci-visibility/log-submission/log-submission-plugin.js +1 -1
  199. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +8 -5
  200. package/packages/dd-trace/src/ci-visibility/telemetry.js +4 -0
  201. package/packages/dd-trace/src/ci-visibility/test-management/get-test-management-tests.js +1 -1
  202. package/packages/dd-trace/src/config.js +82 -51
  203. package/packages/dd-trace/src/config_stable.js +3 -3
  204. package/packages/dd-trace/src/datastreams/encoding.js +9 -9
  205. package/packages/dd-trace/src/datastreams/fnv.js +1 -1
  206. package/packages/dd-trace/src/datastreams/pathway.js +4 -4
  207. package/packages/dd-trace/src/datastreams/processor.js +5 -7
  208. package/packages/dd-trace/src/datastreams/schemas/schema_builder.js +1 -1
  209. package/packages/dd-trace/src/datastreams/schemas/schema_sampler.js +4 -6
  210. package/packages/dd-trace/src/datastreams/size.js +1 -1
  211. package/packages/dd-trace/src/debugger/devtools_client/breakpoints.js +131 -72
  212. package/packages/dd-trace/src/debugger/devtools_client/condition.js +6 -8
  213. package/packages/dd-trace/src/debugger/devtools_client/defaults.js +1 -1
  214. package/packages/dd-trace/src/debugger/devtools_client/index.js +17 -27
  215. package/packages/dd-trace/src/debugger/devtools_client/remote_config.js +18 -38
  216. package/packages/dd-trace/src/debugger/devtools_client/send.js +8 -7
  217. package/packages/dd-trace/src/debugger/devtools_client/snapshot/index.js +16 -8
  218. package/packages/dd-trace/src/debugger/devtools_client/snapshot/processor.js +8 -10
  219. package/packages/dd-trace/src/debugger/devtools_client/snapshot/redaction.js +3 -3
  220. package/packages/dd-trace/src/debugger/devtools_client/source-maps.js +2 -10
  221. package/packages/dd-trace/src/debugger/devtools_client/state.js +31 -4
  222. package/packages/dd-trace/src/dogstatsd.js +7 -4
  223. package/packages/dd-trace/src/encode/0.4.js +9 -9
  224. package/packages/dd-trace/src/encode/0.5.js +1 -1
  225. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +3 -3
  226. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +1 -1
  227. package/packages/dd-trace/src/encode/tags-processors.js +1 -1
  228. package/packages/dd-trace/src/exporter.js +6 -6
  229. package/packages/dd-trace/src/exporters/agent/writer.js +1 -5
  230. package/packages/dd-trace/src/exporters/common/docker.js +1 -1
  231. package/packages/dd-trace/src/exporters/common/form-data.js +6 -4
  232. package/packages/dd-trace/src/exporters/common/request.js +1 -1
  233. package/packages/dd-trace/src/exporters/common/util.js +1 -1
  234. package/packages/dd-trace/src/external-logger/src/index.js +5 -5
  235. package/packages/dd-trace/src/flare/file.js +1 -5
  236. package/packages/dd-trace/src/format.js +1 -1
  237. package/packages/dd-trace/src/git_properties.js +1 -1
  238. package/packages/dd-trace/src/id.js +12 -6
  239. package/packages/dd-trace/src/iitm.js +10 -22
  240. package/packages/dd-trace/src/lambda/handler.js +6 -6
  241. package/packages/dd-trace/src/lambda/runtime/patch.js +4 -4
  242. package/packages/dd-trace/src/lambda/runtime/ritm.js +1 -1
  243. package/packages/dd-trace/src/llmobs/plugins/bedrockruntime.js +6 -6
  244. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chain.js +2 -6
  245. package/packages/dd-trace/src/llmobs/plugins/langchain/handlers/chat_model.js +3 -3
  246. package/packages/dd-trace/src/llmobs/plugins/langchain/index.js +6 -6
  247. package/packages/dd-trace/src/llmobs/plugins/openai.js +1 -1
  248. package/packages/dd-trace/src/llmobs/sdk.js +2 -2
  249. package/packages/dd-trace/src/llmobs/tagger.js +113 -99
  250. package/packages/dd-trace/src/llmobs/util.js +9 -9
  251. package/packages/dd-trace/src/llmobs/writers/base.js +1 -1
  252. package/packages/dd-trace/src/llmobs/writers/util.js +1 -1
  253. package/packages/dd-trace/src/log/index.js +4 -4
  254. package/packages/dd-trace/src/log/log.js +1 -1
  255. package/packages/dd-trace/src/log/writer.js +2 -2
  256. package/packages/dd-trace/src/msgpack/chunk.js +3 -3
  257. package/packages/dd-trace/src/msgpack/encoder.js +28 -28
  258. package/packages/dd-trace/src/noop/dogstatsd.js +6 -6
  259. package/packages/dd-trace/src/noop/span.js +3 -5
  260. package/packages/dd-trace/src/noop/tracer.js +1 -2
  261. package/packages/dd-trace/src/opentelemetry/span_processor.js +2 -2
  262. package/packages/dd-trace/src/opentelemetry/tracer.js +6 -5
  263. package/packages/dd-trace/src/opentracing/propagation/log.js +6 -8
  264. package/packages/dd-trace/src/opentracing/propagation/text_map.js +27 -23
  265. package/packages/dd-trace/src/opentracing/propagation/tracestate.js +8 -4
  266. package/packages/dd-trace/src/opentracing/span.js +9 -14
  267. package/packages/dd-trace/src/opentracing/tracer.js +9 -6
  268. package/packages/dd-trace/src/payload-tagging/index.js +1 -1
  269. package/packages/dd-trace/src/payload-tagging/tagging.js +6 -6
  270. package/packages/dd-trace/src/pkg.js +1 -1
  271. package/packages/dd-trace/src/plugins/ci_plugin.js +62 -10
  272. package/packages/dd-trace/src/plugins/consumer.js +2 -2
  273. package/packages/dd-trace/src/plugins/inbound.js +5 -1
  274. package/packages/dd-trace/src/plugins/index.js +1 -1
  275. package/packages/dd-trace/src/plugins/outbound.js +4 -5
  276. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  277. package/packages/dd-trace/src/plugins/producer.js +2 -2
  278. package/packages/dd-trace/src/plugins/storage.js +2 -2
  279. package/packages/dd-trace/src/plugins/util/ci.js +23 -15
  280. package/packages/dd-trace/src/plugins/util/git.js +165 -11
  281. package/packages/dd-trace/src/plugins/util/inferred_proxy.js +1 -1
  282. package/packages/dd-trace/src/plugins/util/ip_extractor.js +1 -1
  283. package/packages/dd-trace/src/plugins/util/llm.js +27 -10
  284. package/packages/dd-trace/src/plugins/util/stacktrace.js +1 -1
  285. package/packages/dd-trace/src/plugins/util/test.js +311 -48
  286. package/packages/dd-trace/src/plugins/util/url.js +1 -1
  287. package/packages/dd-trace/src/plugins/util/urlfilter.js +13 -17
  288. package/packages/dd-trace/src/plugins/util/user-provided-git.js +12 -3
  289. package/packages/dd-trace/src/plugins/util/web.js +5 -4
  290. package/packages/dd-trace/src/priority_sampler.js +22 -22
  291. package/packages/dd-trace/src/profiling/config.js +44 -8
  292. package/packages/dd-trace/src/profiling/exporters/event_serializer.js +5 -5
  293. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  294. package/packages/dd-trace/src/profiling/profiler.js +37 -2
  295. package/packages/dd-trace/src/profiling/profilers/events.js +14 -17
  296. package/packages/dd-trace/src/profiling/profilers/shared.js +6 -1
  297. package/packages/dd-trace/src/profiling/profilers/space.js +3 -3
  298. package/packages/dd-trace/src/profiling/profilers/wall.js +6 -7
  299. package/packages/dd-trace/src/profiling/ssi-heuristics.js +3 -5
  300. package/packages/dd-trace/src/profiling/tagger.js +3 -5
  301. package/packages/dd-trace/src/profiling/webspan-utils.js +1 -1
  302. package/packages/dd-trace/src/proxy.js +7 -13
  303. package/packages/dd-trace/src/random_sampler.js +40 -0
  304. package/packages/dd-trace/src/rate_limiter.js +4 -4
  305. package/packages/dd-trace/src/remote_config/index.js +3 -7
  306. package/packages/dd-trace/src/remote_config/manager.js +25 -13
  307. package/packages/dd-trace/src/require-package-json.js +1 -1
  308. package/packages/dd-trace/src/ritm.js +4 -4
  309. package/packages/dd-trace/src/runtime_metrics/runtime_metrics.js +2 -2
  310. package/packages/dd-trace/src/sampler.js +33 -4
  311. package/packages/dd-trace/src/sampling_rule.js +12 -3
  312. package/packages/dd-trace/src/scope.js +1 -1
  313. package/packages/dd-trace/src/serverless.js +0 -48
  314. package/packages/dd-trace/src/service-naming/schemas/util.js +1 -1
  315. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +8 -0
  316. package/packages/dd-trace/src/service-naming/schemas/v0/web.js +2 -3
  317. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +4 -0
  318. package/packages/dd-trace/src/span_processor.js +3 -3
  319. package/packages/dd-trace/src/span_sampler.js +4 -1
  320. package/packages/dd-trace/src/standalone/tracesource.js +1 -1
  321. package/packages/dd-trace/src/startup-log.js +2 -2
  322. package/packages/dd-trace/src/telemetry/dependencies.js +4 -4
  323. package/packages/dd-trace/src/telemetry/logs/log-collector.js +9 -10
  324. package/packages/dd-trace/src/telemetry/metrics.js +10 -5
  325. package/packages/dd-trace/src/telemetry/send-data.js +1 -1
  326. package/packages/dd-trace/src/telemetry/telemetry.js +23 -24
  327. package/packages/dd-trace/src/util.js +1 -1
  328. package/version.js +1 -0
  329. package/packages/datadog-instrumentations/src/paperplane.js +0 -77
  330. package/packages/datadog-plugin-paperplane/src/index.js +0 -25
  331. package/packages/datadog-plugin-paperplane/src/logger.js +0 -11
  332. package/packages/datadog-plugin-paperplane/src/server.js +0 -24
@@ -18,9 +18,23 @@ const zlib = require('zlib')
18
18
  const { keepTrace } = require('../priority_sampler')
19
19
  const { ASM } = require('../standalone/product')
20
20
 
21
+ const REQUEST_HEADER_TAG_PREFIX = 'http.request.headers.'
22
+ const RESPONSE_HEADER_TAG_PREFIX = 'http.response.headers.'
23
+
24
+ const COLLECTED_REQUEST_BODY_MAX_STRING_LENGTH = 4096
25
+ const COLLECTED_REQUEST_BODY_MAX_DEPTH = 20
26
+ const COLLECTED_REQUEST_BODY_MAX_ELEMENTS_PER_NODE = 256
27
+
21
28
  // default limiter, configurable with setRateLimit()
22
29
  let limiter = new Limiter(100)
23
30
 
31
+ const config = {
32
+ headersExtendedCollectionEnabled: false,
33
+ maxHeadersCollected: 0,
34
+ headersRedaction: false,
35
+ raspBodyCollection: false
36
+ }
37
+
24
38
  const metricsQueue = new Map()
25
39
 
26
40
  // following header lists are ordered in the same way the spec orders them, it doesn't matter but it's easier to compare
@@ -31,17 +45,6 @@ const contentHeaderList = [
31
45
  'content-language'
32
46
  ]
33
47
 
34
- const EVENT_HEADERS_MAP = mapHeaderAndTags([
35
- ...ipHeaderList,
36
- 'x-forwarded',
37
- 'forwarded',
38
- 'via',
39
- ...contentHeaderList,
40
- 'host',
41
- 'accept-encoding',
42
- 'accept-language'
43
- ], 'http.request.headers.')
44
-
45
48
  const identificationHeaders = [
46
49
  'x-amzn-trace-id',
47
50
  'cloudfront-viewer-ja3-fingerprint',
@@ -53,18 +56,56 @@ const identificationHeaders = [
53
56
  'akamai-user-risk'
54
57
  ]
55
58
 
56
- // these request headers are always collected - it breaks the expected spec orders
57
- const REQUEST_HEADERS_MAP = mapHeaderAndTags([
59
+ const eventHeadersList = [
60
+ ...ipHeaderList,
61
+ 'x-forwarded',
62
+ 'forwarded',
63
+ 'via',
64
+ ...contentHeaderList,
65
+ 'host',
66
+ 'accept-encoding',
67
+ 'accept-language'
68
+ ]
69
+
70
+ const requestHeadersList = [
58
71
  'content-type',
59
72
  'user-agent',
60
73
  'accept',
61
74
  ...identificationHeaders
62
- ], 'http.request.headers.')
75
+ ]
76
+
77
+ // these request headers are always collected - it breaks the expected spec orders
78
+ const REQUEST_HEADERS_MAP = mapHeaderAndTags(requestHeadersList, REQUEST_HEADER_TAG_PREFIX)
79
+
80
+ const EVENT_HEADERS_MAP = mapHeaderAndTags(eventHeadersList, REQUEST_HEADER_TAG_PREFIX)
81
+
82
+ const RESPONSE_HEADERS_MAP = mapHeaderAndTags(contentHeaderList, RESPONSE_HEADER_TAG_PREFIX)
83
+
84
+ const NON_EXTENDED_REQUEST_HEADERS = new Set([...requestHeadersList, ...eventHeadersList])
85
+ const NON_EXTENDED_RESPONSE_HEADERS = new Set(contentHeaderList)
86
+
87
+ function init (_config) {
88
+ limiter = new Limiter(_config.rateLimit)
89
+ config.headersExtendedCollectionEnabled = _config.extendedHeadersCollection.enabled
90
+ config.maxHeadersCollected = _config.extendedHeadersCollection.maxHeaders
91
+ config.headersRedaction = _config.extendedHeadersCollection.redaction
92
+ config.raspBodyCollection = _config.rasp.bodyCollection
93
+ }
94
+
95
+ function formatHeaderName (name) {
96
+ return name
97
+ .trim()
98
+ .slice(0, 200)
99
+ .replace(/[^a-zA-Z0-9_\-:/]/g, '_')
100
+ .toLowerCase()
101
+ }
63
102
 
64
- const RESPONSE_HEADERS_MAP = mapHeaderAndTags(contentHeaderList, 'http.response.headers.')
103
+ function getHeaderTag (tagPrefix, headerName) {
104
+ return `${tagPrefix}${formatHeaderName(headerName)}`
105
+ }
65
106
 
66
107
  function mapHeaderAndTags (headerList, tagPrefix) {
67
- return new Map(headerList.map(headerName => [headerName, `${tagPrefix}${formatHeaderName(headerName)}`]))
108
+ return new Map(headerList.map(headerName => [headerName, getHeaderTag(tagPrefix, headerName)]))
68
109
  }
69
110
 
70
111
  function filterHeaders (headers, map) {
@@ -82,12 +123,92 @@ function filterHeaders (headers, map) {
82
123
  return result
83
124
  }
84
125
 
85
- function formatHeaderName (name) {
86
- return name
87
- .trim()
88
- .slice(0, 200)
89
- .replace(/[^a-zA-Z0-9_\-:/]/g, '_')
90
- .toLowerCase()
126
+ function filterExtendedHeaders (headers, excludedHeaderNames, tagPrefix, limit = 0) {
127
+ const result = {}
128
+
129
+ if (!headers) return result
130
+
131
+ let counter = 0
132
+ for (const [headerName, headerValue] of Object.entries(headers)) {
133
+ if (counter >= limit) break
134
+ if (!excludedHeaderNames.has(headerName)) {
135
+ result[getHeaderTag(tagPrefix, headerName)] = '' + headerValue
136
+ counter++
137
+ }
138
+ }
139
+
140
+ return result
141
+ }
142
+
143
+ function getCollectedHeaders (req, res, shouldCollectEventHeaders) {
144
+ // Mandatory
145
+ const mandatoryCollectedHeaders = filterHeaders(req.headers, REQUEST_HEADERS_MAP)
146
+
147
+ // Basic collection
148
+ if (!shouldCollectEventHeaders) return mandatoryCollectedHeaders
149
+
150
+ const responseHeaders = res.getHeaders()
151
+
152
+ const requestEventCollectedHeaders = filterHeaders(req.headers, EVENT_HEADERS_MAP)
153
+ const responseEventCollectedHeaders = filterHeaders(responseHeaders, RESPONSE_HEADERS_MAP)
154
+
155
+ if (!config.headersExtendedCollectionEnabled || config.headersRedaction) {
156
+ // Standard collection
157
+ return Object.assign(
158
+ mandatoryCollectedHeaders,
159
+ requestEventCollectedHeaders,
160
+ responseEventCollectedHeaders
161
+ )
162
+ }
163
+
164
+ // Extended collection
165
+ const requestExtendedHeadersAvailableCount =
166
+ config.maxHeadersCollected -
167
+ Object.keys(mandatoryCollectedHeaders).length -
168
+ Object.keys(requestEventCollectedHeaders).length
169
+
170
+ const requestEventExtendedCollectedHeaders =
171
+ filterExtendedHeaders(
172
+ req.headers,
173
+ NON_EXTENDED_REQUEST_HEADERS,
174
+ REQUEST_HEADER_TAG_PREFIX,
175
+ requestExtendedHeadersAvailableCount
176
+ )
177
+
178
+ const responseExtendedHeadersAvailableCount =
179
+ config.maxHeadersCollected -
180
+ Object.keys(responseEventCollectedHeaders).length
181
+
182
+ const responseEventExtendedCollectedHeaders =
183
+ filterExtendedHeaders(
184
+ responseHeaders,
185
+ NON_EXTENDED_RESPONSE_HEADERS,
186
+ RESPONSE_HEADER_TAG_PREFIX,
187
+ responseExtendedHeadersAvailableCount
188
+ )
189
+
190
+ const headersTags = Object.assign(
191
+ mandatoryCollectedHeaders,
192
+ requestEventCollectedHeaders,
193
+ requestEventExtendedCollectedHeaders,
194
+ responseEventCollectedHeaders,
195
+ responseEventExtendedCollectedHeaders
196
+ )
197
+
198
+ // Check discarded headers
199
+ const requestHeadersCount = Object.keys(req.headers).length
200
+ if (requestHeadersCount > config.maxHeadersCollected) {
201
+ headersTags['_dd.appsec.request.header_collection.discarded'] =
202
+ requestHeadersCount - config.maxHeadersCollected
203
+ }
204
+
205
+ const responseHeadersCount = Object.keys(responseHeaders).length
206
+ if (responseHeadersCount > config.maxHeadersCollected) {
207
+ headersTags['_dd.appsec.response.header_collection.discarded'] =
208
+ responseHeadersCount - config.maxHeadersCollected
209
+ }
210
+
211
+ return headersTags
91
212
  }
92
213
 
93
214
  function reportWafInit (wafVersion, rulesVersion, diagnosticsRules = {}, success = false) {
@@ -163,17 +284,97 @@ function reportAttack (attackData) {
163
284
  const currentJson = currentTags['_dd.appsec.json']
164
285
 
165
286
  // merge JSON arrays without parsing them
166
- if (currentJson) {
167
- newTags['_dd.appsec.json'] = currentJson.slice(0, -2) + ',' + attackData.slice(1) + '}'
168
- } else {
169
- newTags['_dd.appsec.json'] = '{"triggers":' + attackData + '}'
170
- }
287
+ const attackDataStr = JSON.stringify(attackData)
288
+ newTags['_dd.appsec.json'] = currentJson
289
+ ? currentJson.slice(0, -2) + ',' + attackDataStr.slice(1) + '}'
290
+ : '{"triggers":' + attackDataStr + '}'
171
291
 
172
292
  if (req.socket) {
173
293
  newTags['network.client.ip'] = req.socket.remoteAddress
174
294
  }
175
295
 
176
296
  rootSpan.addTags(newTags)
297
+
298
+ if (config.raspBodyCollection && isRaspAttack(attackData)) {
299
+ reportRequestBody(rootSpan, req.body)
300
+ }
301
+ }
302
+
303
+ function truncateRequestBody (target, depth = 0) {
304
+ let wasTruncated = false
305
+
306
+ switch (typeof target) {
307
+ case 'string':
308
+ if (target.length > COLLECTED_REQUEST_BODY_MAX_STRING_LENGTH) {
309
+ return { value: target.slice(0, COLLECTED_REQUEST_BODY_MAX_STRING_LENGTH), truncated: true }
310
+ }
311
+ return { value: target, truncated: false }
312
+ case 'object': {
313
+ if (target === null) {
314
+ return { value: target, truncated: false }
315
+ }
316
+
317
+ if (depth >= COLLECTED_REQUEST_BODY_MAX_DEPTH) {
318
+ return { truncated: true }
319
+ }
320
+
321
+ if (typeof target.toJSON === 'function') {
322
+ try {
323
+ return truncateRequestBody(target.toJSON(), depth + 1)
324
+ } catch {
325
+ return { truncated: false }
326
+ }
327
+ }
328
+
329
+ if (Array.isArray(target)) {
330
+ const maxArrayLength = Math.min(target.length, COLLECTED_REQUEST_BODY_MAX_ELEMENTS_PER_NODE)
331
+ wasTruncated = target.length > COLLECTED_REQUEST_BODY_MAX_ELEMENTS_PER_NODE
332
+ const truncatedArray = new Array(maxArrayLength)
333
+ for (let i = 0; i < maxArrayLength; i++) {
334
+ const { value, truncated } = truncateRequestBody(target[i], depth + 1)
335
+ if (truncated) wasTruncated = true
336
+ truncatedArray[i] = value
337
+ }
338
+
339
+ return { value: truncatedArray, truncated: wasTruncated }
340
+ }
341
+
342
+ const keys = Object.keys(target)
343
+ const maxKeysLength = Math.min(keys.length, COLLECTED_REQUEST_BODY_MAX_ELEMENTS_PER_NODE)
344
+ wasTruncated = keys.length > COLLECTED_REQUEST_BODY_MAX_ELEMENTS_PER_NODE
345
+
346
+ const truncatedObject = {}
347
+ for (let i = 0; i < maxKeysLength; i++) {
348
+ const key = keys[i]
349
+ const { value, truncated } = truncateRequestBody(target[key], depth + 1)
350
+ if (truncated) wasTruncated = true
351
+ truncatedObject[key] = value
352
+ }
353
+ return { value: truncatedObject, truncated: wasTruncated }
354
+ }
355
+ default:
356
+ return { value: target, truncated: false }
357
+ }
358
+ }
359
+
360
+ function reportRequestBody (rootSpan, requestBody) {
361
+ if (!requestBody) return
362
+
363
+ if (!rootSpan.meta_struct) {
364
+ rootSpan.meta_struct = {}
365
+ }
366
+
367
+ if (!rootSpan.meta_struct['http.request.body']) {
368
+ const { truncated, value } = truncateRequestBody(requestBody)
369
+ rootSpan.meta_struct['http.request.body'] = value
370
+ if (truncated) {
371
+ rootSpan.setTag('_dd.appsec.rasp.request_body_size.exceeded', 'true')
372
+ }
373
+ }
374
+ }
375
+
376
+ function isRaspAttack (events) {
377
+ return events.some(e => e.rule?.tags?.module === 'rasp')
177
378
  }
178
379
 
179
380
  function isFingerprintDerivative (derivative) {
@@ -252,15 +453,9 @@ function finishRequest (req, res) {
252
453
 
253
454
  incrementWafRequestsMetric(req)
254
455
 
255
- // collect some headers even when no attack is detected
256
- const mandatoryTags = filterHeaders(req.headers, REQUEST_HEADERS_MAP)
257
- rootSpan.addTags(mandatoryTags)
258
-
259
456
  const tags = rootSpan.context()._tags
260
- if (!shouldCollectEventHeaders(tags)) return
261
457
 
262
- const newTags = filterHeaders(res.getHeaders(), RESPONSE_HEADERS_MAP)
263
- Object.assign(newTags, filterHeaders(req.headers, EVENT_HEADERS_MAP))
458
+ const newTags = getCollectedHeaders(req, res, shouldCollectEventHeaders(tags))
264
459
 
265
460
  if (tags['appsec.event'] === 'true' && typeof req.route?.path === 'string') {
266
461
  newTags['http.endpoint'] = req.route.path
@@ -283,13 +478,11 @@ function shouldCollectEventHeaders (tags = {}) {
283
478
  return false
284
479
  }
285
480
 
286
- function setRateLimit (rateLimit) {
287
- limiter = new Limiter(rateLimit)
288
- }
289
-
290
481
  module.exports = {
291
482
  metricsQueue,
483
+ init,
292
484
  filterHeaders,
485
+ filterExtendedHeaders,
293
486
  formatHeaderName,
294
487
  reportWafInit,
295
488
  reportMetrics,
@@ -298,6 +491,6 @@ module.exports = {
298
491
  reportRaspRuleSkipped: updateRaspRuleSkippedMetricTags,
299
492
  reportDerivatives,
300
493
  finishRequest,
301
- setRateLimit,
302
- mapHeaderAndTags
494
+ mapHeaderAndTags,
495
+ truncateRequestBody
303
496
  }
@@ -185,7 +185,7 @@ class SpyMap extends Map {
185
185
  }
186
186
 
187
187
  function concatArrays (files) {
188
- return Array.from(files.values()).flat()
188
+ return [...files.values()].flat()
189
189
  }
190
190
 
191
191
  /*
@@ -209,7 +209,7 @@ function mergeRulesData (files) {
209
209
  }
210
210
  }
211
211
  }
212
- return Array.from(mergedRulesData.values())
212
+ return [...mergedRulesData.values()]
213
213
  }
214
214
 
215
215
  function rulesReducer (existingEntries, rulesDataEntry) {
@@ -9,8 +9,8 @@ const { setUserTags } = require('./set_user')
9
9
  const log = require('../../log')
10
10
 
11
11
  function isUserBlocked (user) {
12
- const actions = waf.run({ persistent: { [USER_ID]: user.id } })
13
- return !!getBlockingAction(actions)
12
+ const results = waf.run({ persistent: { [USER_ID]: user.id } })
13
+ return !!getBlockingAction(results?.actions)
14
14
  }
15
15
 
16
16
  function checkUserAndSetUser (tracer, user) {
@@ -1,8 +1,6 @@
1
1
  'use strict'
2
2
 
3
- const { calculateDDBasePath } = require('../util')
4
-
5
- const ddBasePath = calculateDDBasePath(__dirname)
3
+ const { ddBasePath } = require('../util')
6
4
 
7
5
  const LIBRARY_FRAMES_BUFFER = 20
8
6
 
@@ -23,7 +21,7 @@ function getCallSiteList (maxDepth = 100) {
23
21
  Error.prepareStackTrace = function (_, callsites) {
24
22
  callsiteList = callsites
25
23
  }
26
- const e = new Error()
24
+ const e = new Error('message')
27
25
  e.stack
28
26
  } finally {
29
27
  Error.prepareStackTrace = previousPrepareStackTrace
@@ -41,8 +41,7 @@ function newStore () {
41
41
  wafErrorCode: null,
42
42
  raspErrorCode: null,
43
43
  wafVersion: null,
44
- rulesVersion: null,
45
- ruleTriggered: null
44
+ rulesVersion: null
46
45
  }
47
46
  }
48
47
  }
@@ -21,14 +21,12 @@ function addRaspRequestMetrics (store, { duration, durationExt, wafTimeout, erro
21
21
  }
22
22
 
23
23
  if (errorCode) {
24
- if (store[DD_TELEMETRY_REQUEST_METRICS].raspErrorCode) {
25
- store[DD_TELEMETRY_REQUEST_METRICS].raspErrorCode = Math.max(
24
+ store[DD_TELEMETRY_REQUEST_METRICS].raspErrorCode = store[DD_TELEMETRY_REQUEST_METRICS].raspErrorCode
25
+ ? Math.max(
26
26
  errorCode,
27
27
  store[DD_TELEMETRY_REQUEST_METRICS].raspErrorCode
28
28
  )
29
- } else {
30
- store[DD_TELEMETRY_REQUEST_METRICS].raspErrorCode = errorCode
31
- }
29
+ : errorCode
32
30
  }
33
31
  }
34
32
 
@@ -49,10 +47,6 @@ function trackRaspMetrics (store, metrics, raspRule) {
49
47
  telemetryMetrics.rulesVersion = metrics.rulesVersion
50
48
  }
51
49
 
52
- if (metrics.ruleTriggered) {
53
- telemetryMetrics.ruleTriggered = true
54
- }
55
-
56
50
  appsecMetrics.count('rasp.rule.eval', tags).inc(1)
57
51
 
58
52
  if (metrics.errorCode) {
@@ -68,7 +62,6 @@ function trackRaspMetrics (store, metrics, raspRule) {
68
62
 
69
63
  function trackRaspRuleMatch (store, raspRule, blockTriggered, blocked) {
70
64
  const telemetryMetrics = store[DD_TELEMETRY_REQUEST_METRICS]
71
- if (!telemetryMetrics.ruleTriggered) return
72
65
 
73
66
  const tags = {
74
67
  waf_version: telemetryMetrics.wafVersion,
@@ -82,10 +75,6 @@ function trackRaspRuleMatch (store, raspRule, blockTriggered, blocked) {
82
75
  }
83
76
 
84
77
  appsecMetrics.count('rasp.rule.match', tags).inc(1)
85
-
86
- // this is needed to not count it twice for the same match
87
- // but it also means it can only be called once per waf call even if there are multiple rasp match
88
- telemetryMetrics.ruleTriggered = null
89
78
  }
90
79
 
91
80
  function trackRaspRuleSkipped (raspRule, reason) {
@@ -22,14 +22,12 @@ function addWafRequestMetrics (store, { duration, durationExt, wafTimeout, error
22
22
  }
23
23
 
24
24
  if (errorCode) {
25
- if (store[DD_TELEMETRY_REQUEST_METRICS].wafErrorCode) {
26
- store[DD_TELEMETRY_REQUEST_METRICS].wafErrorCode = Math.max(
25
+ store[DD_TELEMETRY_REQUEST_METRICS].wafErrorCode = store[DD_TELEMETRY_REQUEST_METRICS].wafErrorCode
26
+ ? Math.max(
27
27
  errorCode,
28
28
  store[DD_TELEMETRY_REQUEST_METRICS].wafErrorCode
29
29
  )
30
- } else {
31
- store[DD_TELEMETRY_REQUEST_METRICS].wafErrorCode = errorCode
32
- }
30
+ : errorCode
33
31
  }
34
32
  }
35
33
 
@@ -40,12 +40,10 @@ function setCollectionMode (mode, overwrite = true) {
40
40
  }
41
41
 
42
42
  function obfuscateIfNeeded (str) {
43
- if (collectionMode === 'anonymization') {
43
+ return collectionMode === 'anonymization'
44
44
  // get first 16 bytes of sha256 hash in lowercase hex
45
- return 'anon_' + crypto.createHash('sha256').update(str).digest().toString('hex', 0, 16).toLowerCase()
46
- } else {
47
- return str
48
- }
45
+ ? 'anon_' + crypto.createHash('sha256').update(str).digest().toString('hex', 0, 16).toLowerCase()
46
+ : str
49
47
  }
50
48
 
51
49
  // TODO: should we find other ways to get the user ID ?
@@ -19,7 +19,7 @@ class WAFContextWrapper {
19
19
  this.rulesVersion = rulesVersion
20
20
  this.knownAddresses = knownAddresses
21
21
  this.addressesToSkip = new Set()
22
- this.cachedUserIdActions = new Map()
22
+ this.cachedUserIdResults = new Map()
23
23
  }
24
24
 
25
25
  run ({ persistent, ephemeral }, raspRule) {
@@ -36,9 +36,9 @@ class WAFContextWrapper {
36
36
  // TODO: make this universal
37
37
  const userId = persistent?.[addresses.USER_ID] || ephemeral?.[addresses.USER_ID]
38
38
  if (userId) {
39
- const cachedAction = this.cachedUserIdActions.get(userId)
40
- if (cachedAction) {
41
- return cachedAction
39
+ const cachedResults = this.cachedUserIdResults.get(userId)
40
+ if (cachedResults) {
41
+ return cachedResults
42
42
  }
43
43
  }
44
44
 
@@ -102,7 +102,7 @@ class WAFContextWrapper {
102
102
 
103
103
  const end = process.hrtime.bigint()
104
104
 
105
- metrics.durationExt = parseInt(end - start) / 1e3
105
+ metrics.durationExt = Number.parseInt(end - start) / 1e3
106
106
 
107
107
  if (typeof result.errorCode === 'number' && result.errorCode < 0) {
108
108
  const error = new Error('WAF code error')
@@ -137,12 +137,12 @@ class WAFContextWrapper {
137
137
  metrics.wafTimeout = result.timeout
138
138
 
139
139
  if (ruleTriggered) {
140
- Reporter.reportAttack(JSON.stringify(result.events))
140
+ Reporter.reportAttack(result.events)
141
141
  }
142
142
 
143
143
  Reporter.reportDerivatives(result.derivatives)
144
144
 
145
- return result.actions
145
+ return result
146
146
  } catch (err) {
147
147
  log.error('[ASM] Error while running the AppSec WAF', err)
148
148
 
@@ -168,7 +168,7 @@ class WAFContextWrapper {
168
168
  const parameter = match.parameters[k]
169
169
 
170
170
  if (parameter?.address === addresses.USER_ID) {
171
- this.cachedUserIdActions.set(userId, result.actions)
171
+ this.cachedUserIdResults.set(userId, result)
172
172
  return
173
173
  }
174
174
  }
@@ -1,6 +1,5 @@
1
1
  'use strict'
2
2
 
3
- // eslint-disable-next-line @stylistic/js/max-len
4
3
  // Modeled after https://github.com/DataDog/libdatadog/blob/f3994857a59bb5679a65967138c5a3aec418a65f/ddcommon/src/azure_app_services.rs
5
4
 
6
5
  const os = require('os')
@@ -13,7 +12,6 @@ function extractSubscriptionID (ownerName) {
13
12
  return subId
14
13
  }
15
14
  }
16
- return undefined
17
15
  }
18
16
 
19
17
  function extractResourceGroup (ownerName) {
@@ -22,7 +20,7 @@ function extractResourceGroup (ownerName) {
22
20
 
23
21
  function buildResourceID (subscriptionID, siteName, resourceGroup) {
24
22
  if (subscriptionID === undefined || siteName === undefined || resourceGroup === undefined) {
25
- return undefined
23
+ return
26
24
  }
27
25
  return `/subscriptions/${subscriptionID}/resourcegroups/${resourceGroup}/providers/microsoft.web/sites/${siteName}`
28
26
  .toLowerCase()
@@ -79,18 +77,15 @@ function buildMetadata () {
79
77
  function getAzureAppMetadata () {
80
78
  // DD_AZURE_APP_SERVICES is an environment variable introduced by the .NET APM team and is set automatically for
81
79
  // anyone using the Datadog APM Extensions (.NET, Java, or Node) for Windows Azure App Services
82
- // eslint-disable-next-line @stylistic/js/max-len
83
80
  // See: https://github.com/DataDog/datadog-aas-extension/blob/01f94b5c28b7fa7a9ab264ca28bd4e03be603900/node/src/applicationHost.xdt#L20-L21
84
- return process.env.DD_AZURE_APP_SERVICES !== undefined ? buildMetadata() : undefined
81
+ return process.env.DD_AZURE_APP_SERVICES === undefined ? undefined : buildMetadata()
85
82
  }
86
83
 
87
84
  function getAzureFunctionMetadata () {
88
85
  return getIsAzureFunction() ? buildMetadata() : undefined
89
86
  }
90
87
 
91
- // eslint-disable-next-line @stylistic/js/max-len
92
88
  // Modeled after https://github.com/DataDog/libdatadog/blob/92272e90a7919f07178f3246ef8f82295513cfed/profiling/src/exporter/mod.rs#L187
93
- // eslint-disable-next-line @stylistic/js/max-len
94
89
  // and https://github.com/DataDog/libdatadog/blob/f3994857a59bb5679a65967138c5a3aec418a65f/trace-utils/src/trace_utils.rs#L533
95
90
  function getAzureTagsFromMetadata (metadata) {
96
91
  if (metadata === undefined) {
@@ -144,7 +144,7 @@ class TestVisDynamicInstrumentation {
144
144
 
145
145
  let dynamicInstrumentation
146
146
 
147
- module.exports = (config) => {
147
+ module.exports = function createAndGetTestVisDynamicInstrumentation (config) {
148
148
  if (dynamicInstrumentation) {
149
149
  return dynamicInstrumentation
150
150
  }
@@ -75,12 +75,12 @@ breakpointSetChannel.on('message', async (probe) => {
75
75
  async function removeBreakpoint (probeId) {
76
76
  if (!sessionStarted) {
77
77
  // We should not get in this state, but abort if we do, so the code doesn't fail unexpected
78
- throw Error(`Cannot remove probe ${probeId}: Debugger not started`)
78
+ throw new Error(`Cannot remove probe ${probeId}: Debugger not started`)
79
79
  }
80
80
 
81
81
  const breakpointId = probeIdToBreakpointId.get(probeId)
82
82
  if (!breakpointId) {
83
- throw Error(`Unknown probe id: ${probeId}`)
83
+ throw new Error(`Unknown probe id: ${probeId}`)
84
84
  }
85
85
  await session.post('Debugger.removeBreakpoint', { breakpointId })
86
86
  probeIdToBreakpointId.delete(probeId)
@@ -36,7 +36,7 @@ function getKnownTests ({
36
36
  headers: {
37
37
  'Content-Type': 'application/json'
38
38
  },
39
- timeout: 20000,
39
+ timeout: 20_000,
40
40
  url
41
41
  }
42
42
 
@@ -16,17 +16,17 @@ function getLatestEvpProxyVersion (err, agentInfo) {
16
16
  return agentInfo.endpoints.reduce((acc, endpoint) => {
17
17
  if (endpoint.includes(AGENT_EVP_PROXY_PATH_PREFIX)) {
18
18
  const version = Number(endpoint.replace(AGENT_EVP_PROXY_PATH_REGEX, '$1'))
19
- if (isNaN(version)) {
19
+ if (Number.isNaN(version)) {
20
20
  return acc
21
21
  }
22
- return version > acc ? version : acc
22
+ return Math.max(version, acc)
23
23
  }
24
24
  return acc
25
25
  }, 0)
26
26
  }
27
27
 
28
28
  function getCanForwardDebuggerLogs (err, agentInfo) {
29
- return !err && agentInfo.endpoints.some(endpoint => endpoint === AGENT_DEBUGGER_INPUT)
29
+ return !err && agentInfo.endpoints.includes(AGENT_DEBUGGER_INPUT)
30
30
  }
31
31
 
32
32
  class AgentProxyCiVisibilityExporter extends CiVisibilityExporter {
@@ -31,7 +31,7 @@ class Writer extends BaseWriter {
31
31
  'dd-api-key': process.env.DATADOG_API_KEY || process.env.DD_API_KEY,
32
32
  ...form.getHeaders()
33
33
  },
34
- timeout: 15000,
34
+ timeout: 15_000,
35
35
  url: this._url
36
36
  }
37
37
 
@@ -27,7 +27,7 @@ class DynamicInstrumentationLogsWriter extends BaseWriter {
27
27
  'Content-Type': 'application/json'
28
28
  },
29
29
  // TODO: what's a good value for timeout for the logs intake?
30
- timeout: this.timeout || 15000,
30
+ timeout: this.timeout || 15_000,
31
31
  url: this._url
32
32
  }
33
33
 
@@ -32,7 +32,7 @@ class Writer extends BaseWriter {
32
32
  'dd-api-key': process.env.DATADOG_API_KEY || process.env.DD_API_KEY,
33
33
  'Content-Type': 'application/msgpack'
34
34
  },
35
- timeout: 15000,
35
+ timeout: 15_000,
36
36
  url: this._url
37
37
  }
38
38