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
@@ -1,4 +1,5 @@
1
1
  'use strict'
2
+ /* eslint-disable unicorn/prefer-string-slice */
2
3
 
3
4
  const log = require('../../../../log')
4
5
  const vulnerabilities = require('../../vulnerabilities')
@@ -82,7 +83,7 @@ class SensitiveHandler {
82
83
 
83
84
  for (let i = 0; i < value.length; i++) {
84
85
  if (nextTainted != null && nextTainted.start === i) {
85
- this.writeValuePart(valueParts, value.substring(start, i), sourceIndex)
86
+ this.writeValuePart(valueParts, value.slice(start, i), sourceIndex)
86
87
 
87
88
  sourceIndex = sourcesIndexes[nextTaintedIndex]
88
89
 
@@ -113,16 +114,14 @@ class SensitiveHandler {
113
114
  nextSensitive = entries.length > 0 ? entries[0] : null
114
115
  }
115
116
 
116
- if (this.isSensibleSource(sources[sourceIndex])) {
117
- if (!sources[sourceIndex].redacted) {
118
- redactedSources.push(sourceIndex)
119
- sources[sourceIndex].pattern = ''.padEnd(sources[sourceIndex].value.length, REDACTED_SOURCE_BUFFER)
120
- sources[sourceIndex].redacted = true
121
- }
117
+ if (this.isSensibleSource(sources[sourceIndex]) && !sources[sourceIndex].redacted) {
118
+ redactedSources.push(sourceIndex)
119
+ sources[sourceIndex].pattern = ''.padEnd(sources[sourceIndex].value.length, REDACTED_SOURCE_BUFFER)
120
+ sources[sourceIndex].redacted = true
122
121
  }
123
122
 
124
- if (redactedSources.indexOf(sourceIndex) > -1) {
125
- const partValue = value.substring(i, i + (nextTainted.end - nextTainted.start))
123
+ if (redactedSources.includes(sourceIndex)) {
124
+ const partValue = value.slice(i, i + (nextTainted.end - nextTainted.start))
126
125
  this.writeRedactedValuePart(
127
126
  valueParts,
128
127
  partValue.length,
@@ -135,7 +134,7 @@ class SensitiveHandler {
135
134
  redactedSourcesContext[sourceIndex] = []
136
135
  } else {
137
136
  const substringEnd = Math.min(nextTainted.end, value.length)
138
- this.writeValuePart(valueParts, value.substring(nextTainted.start, substringEnd), sourceIndex)
137
+ this.writeValuePart(valueParts, value.slice(nextTainted.start, substringEnd), sourceIndex)
139
138
  }
140
139
 
141
140
  start = i + (nextTainted.end - nextTainted.start)
@@ -144,7 +143,7 @@ class SensitiveHandler {
144
143
  nextTaintedIndex++
145
144
  sourceIndex = null
146
145
  } else if (nextSensitive != null && nextSensitive.start === i) {
147
- this.writeValuePart(valueParts, value.substring(start, i), sourceIndex)
146
+ this.writeValuePart(valueParts, value.slice(start, i), sourceIndex)
148
147
  if (nextTainted != null && intersects(nextSensitive, nextTainted)) {
149
148
  sourceIndex = sourcesIndexes[nextTaintedIndex]
150
149
 
@@ -171,7 +170,7 @@ class SensitiveHandler {
171
170
  }
172
171
 
173
172
  if (start < value.length) {
174
- this.writeValuePart(valueParts, value.substring(start))
173
+ this.writeValuePart(valueParts, value.slice(start))
175
174
  }
176
175
 
177
176
  return { redactedValueParts: valueParts, redactedSources }
@@ -197,10 +196,10 @@ class SensitiveHandler {
197
196
 
198
197
  writeValuePart (valueParts, value, source) {
199
198
  if (value.length > 0) {
200
- if (source != null) {
201
- valueParts.push({ value, source })
202
- } else {
199
+ if (source == null) {
203
200
  valueParts.push({ value })
201
+ } else {
202
+ valueParts.push({ value, source })
204
203
  }
205
204
  }
206
205
  }
@@ -214,7 +213,9 @@ class SensitiveHandler {
214
213
  sourceRedactionContext,
215
214
  isSensibleSource
216
215
  ) {
217
- if (sourceIndex != null) {
216
+ if (sourceIndex == null) {
217
+ valueParts.push({ redacted: true })
218
+ } else {
218
219
  const placeholder = source.value.includes(partValue)
219
220
  ? source.pattern
220
221
  : '*'.repeat(length)
@@ -252,9 +253,9 @@ class SensitiveHandler {
252
253
  _value.substring(_sourceRedactionContext.start - offset, _sourceRedactionContext.end - offset)
253
254
  const indexOfPartValueInPattern = source.value.indexOf(sensitive)
254
255
 
255
- const pattern = indexOfPartValueInPattern > -1
256
- ? placeholder.substring(indexOfPartValueInPattern, indexOfPartValueInPattern + sensitive.length)
257
- : placeholder.substring(_sourceRedactionContext.start, _sourceRedactionContext.end)
256
+ const pattern = indexOfPartValueInPattern === -1
257
+ ? placeholder.substring(_sourceRedactionContext.start, _sourceRedactionContext.end)
258
+ : placeholder.substring(indexOfPartValueInPattern, indexOfPartValueInPattern + sensitive.length)
258
259
 
259
260
  valueParts.push({
260
261
  redacted: true,
@@ -262,7 +263,7 @@ class SensitiveHandler {
262
263
  pattern
263
264
  })
264
265
 
265
- _value = _value.substring(pattern.length)
266
+ _value = _value.slice(pattern.length)
266
267
  offset += pattern.length
267
268
  })
268
269
 
@@ -273,8 +274,6 @@ class SensitiveHandler {
273
274
  })
274
275
  }
275
276
  }
276
- } else {
277
- valueParts.push({ redacted: true })
278
277
  }
279
278
  }
280
279
 
@@ -282,7 +281,7 @@ class SensitiveHandler {
282
281
  if (redactionNamePattern) {
283
282
  try {
284
283
  this._namePattern = new RegExp(redactionNamePattern, 'gmi')
285
- } catch (e) {
284
+ } catch {
286
285
  log.warn('[ASM] Redaction name pattern is not valid')
287
286
  }
288
287
  }
@@ -290,7 +289,7 @@ class SensitiveHandler {
290
289
  if (redactionValuePattern) {
291
290
  try {
292
291
  this._valuePattern = new RegExp(redactionValuePattern, 'gmi')
293
- } catch (e) {
292
+ } catch {
294
293
  log.warn('[ASM] Redaction value pattern is not valid')
295
294
  }
296
295
  }
@@ -1,7 +1,7 @@
1
- // eslint-disable-next-line @stylistic/js/max-len
1
+ // eslint-disable-next-line @stylistic/max-len
2
2
  const DEFAULT_IAST_REDACTION_NAME_PATTERN = '(?:p(?:ass)?w(?:or)?d|pass(?:_?phrase)?|secret|(?:api_?|private_?|public_?|access_?|secret_?)key(?:_?id)?|token|consumer_?(?:id|key|secret)|sign(?:ed|ature)?|auth(?:entication|orization)?|(?:sur|last)name|user(?:name)?|address|e?mail)'
3
- // eslint-disable-next-line @stylistic/js/max-len
4
- const DEFAULT_IAST_REDACTION_VALUE_PATTERN = '(?:bearer\\s+[a-z0-9\\._\\-]+|glpat-[\\w\\-]{20}|gh[opsu]_[0-9a-zA-Z]{36}|ey[I-L][\\w=\\-]+\\.ey[I-L][\\w=\\-]+(?:\\.[\\w.+/=\\-]+)?|(?:[\\-]{5}BEGIN[a-z\\s]+PRIVATE\\sKEY[\\-]{5}[^\\-]+[\\-]{5}END[a-z\\s]+PRIVATE\\sKEY[\\-]{5}|ssh-rsa\\s*[a-z0-9/\\.+]{100,})|[\\w\\.-]+@[a-zA-Z\\d\\.-]+\\.[a-zA-Z]{2,})'
3
+ // eslint-disable-next-line @stylistic/max-len
4
+ const DEFAULT_IAST_REDACTION_VALUE_PATTERN = String.raw`(?:bearer\s+[a-z0-9\._\-]+|glpat-[\w\-]{20}|gh[opsu]_[0-9a-zA-Z]{36}|ey[I-L][\w=\-]+\.ey[I-L][\w=\-]+(?:\.[\w.+/=\-]+)?|(?:[\-]{5}BEGIN[a-z\s]+PRIVATE\sKEY[\-]{5}[^\-]+[\-]{5}END[a-z\s]+PRIVATE\sKEY[\-]{5}|ssh-rsa\s*[a-z0-9/\.+]{100,})|[\w\.-]+@[a-zA-Z\d\.-]+\.[a-zA-Z]{2,})`
5
5
 
6
6
  module.exports = {
7
7
  DEFAULT_IAST_REDACTION_NAME_PATTERN,
@@ -57,14 +57,14 @@ class VulnerabilityFormatter {
57
57
 
58
58
  evidence.ranges.forEach((range, rangeIndex) => {
59
59
  if (fromIndex < range.start) {
60
- valueParts.push({ value: evidence.value.substring(fromIndex, range.start) })
60
+ valueParts.push({ value: evidence.value.slice(fromIndex, range.start) })
61
61
  }
62
- valueParts.push({ value: evidence.value.substring(range.start, range.end), source: sourcesIndexes[rangeIndex] })
62
+ valueParts.push({ value: evidence.value.slice(range.start, range.end), source: sourcesIndexes[rangeIndex] })
63
63
  fromIndex = range.end
64
64
  })
65
65
 
66
66
  if (fromIndex < evidence.value.length) {
67
- valueParts.push({ value: evidence.value.substring(fromIndex) })
67
+ valueParts.push({ value: evidence.value.slice(fromIndex) })
68
68
  }
69
69
 
70
70
  return { valueParts }
@@ -72,7 +72,7 @@ class VulnerabilityFormatter {
72
72
 
73
73
  formatEvidence (type, evidence, sourcesIndexes, sources) {
74
74
  if (evidence.value === undefined) {
75
- return undefined
75
+ return
76
76
  }
77
77
 
78
78
  return this._redactVulnearbilities
@@ -7,7 +7,7 @@ const STRINGIFY_RANGE_KEY = 'DD_' + crypto.randomBytes(20).toString('hex')
7
7
  const STRINGIFY_SENSITIVE_KEY = STRINGIFY_RANGE_KEY + 'SENSITIVE'
8
8
  const STRINGIFY_SENSITIVE_NOT_STRING_KEY = STRINGIFY_SENSITIVE_KEY + 'NOTSTRING'
9
9
 
10
- // eslint-disable-next-line @stylistic/js/max-len
10
+ // eslint-disable-next-line @stylistic/max-len
11
11
  const KEYS_REGEX_WITH_SENSITIVE_RANGES = new RegExp(`(?:"(${STRINGIFY_RANGE_KEY}_\\d+_))|(?:"(${STRINGIFY_SENSITIVE_KEY}_\\d+_(\\d+)_))|("${STRINGIFY_SENSITIVE_NOT_STRING_KEY}_\\d+_([\\s0-9.a-zA-Z]*)")`, 'gm')
12
12
  const KEYS_REGEX_WITHOUT_SENSITIVE_RANGES = new RegExp(`"(${STRINGIFY_RANGE_KEY}_\\d+_)`, 'gm')
13
13
 
@@ -99,22 +99,17 @@ function stringifyWithRanges (obj, objRanges, loadSensitiveRanges = false) {
99
99
  } else {
100
100
  currentLevelClone[key] = val
101
101
  }
102
- } else if (Array.isArray(val)) {
103
- currentLevelClone[key] = []
104
102
  } else {
105
- currentLevelClone[key] = {}
103
+ currentLevelClone[key] = Array.isArray(val) ? [] : {}
106
104
  }
107
105
  })
108
106
 
109
107
  value = JSON.stringify(cloneObj, null, 2)
110
108
 
111
109
  if (counter > 0) {
112
- let keysRegex
113
- if (loadSensitiveRanges) {
114
- keysRegex = KEYS_REGEX_WITH_SENSITIVE_RANGES
115
- } else {
116
- keysRegex = KEYS_REGEX_WITHOUT_SENSITIVE_RANGES
117
- }
110
+ const keysRegex = loadSensitiveRanges
111
+ ? KEYS_REGEX_WITH_SENSITIVE_RANGES
112
+ : KEYS_REGEX_WITHOUT_SENSITIVE_RANGES
118
113
  keysRegex.lastIndex = 0
119
114
 
120
115
  let regexRes = keysRegex.exec(value)
@@ -141,7 +136,7 @@ function stringifyWithRanges (obj, objRanges, loadSensitiveRanges = false) {
141
136
 
142
137
  sensitiveRanges.push({
143
138
  start: offset,
144
- end: offset + parseInt(regexRes[3])
139
+ end: offset + Number.parseInt(regexRes[3])
145
140
  })
146
141
 
147
142
  value = value.replace(sensitiveId, '')
@@ -79,17 +79,15 @@ function isValidVulnerability (vulnerability) {
79
79
  }
80
80
 
81
81
  function sendVulnerabilities (vulnerabilities, span) {
82
- if (vulnerabilities && vulnerabilities.length) {
83
- if (span && span.addTags) {
84
- const validatedVulnerabilities = vulnerabilities.filter(isValidVulnerability)
85
- const jsonToSend = vulnerabilitiesFormatter.toJson(validatedVulnerabilities)
86
-
87
- if (jsonToSend.vulnerabilities.length > 0) {
88
- const tags = {}
89
- // TODO: Store this outside of the span and set the tag in the exporter.
90
- tags[IAST_JSON_TAG_KEY] = JSON.stringify(jsonToSend)
91
- span.addTags(tags)
92
- }
82
+ if (vulnerabilities?.length && span?.addTags) {
83
+ const validatedVulnerabilities = vulnerabilities.filter(isValidVulnerability)
84
+ const jsonToSend = vulnerabilitiesFormatter.toJson(validatedVulnerabilities)
85
+
86
+ if (jsonToSend.vulnerabilities.length > 0) {
87
+ const tags = {}
88
+ // TODO: Store this outside of the span and set the tag in the exporter.
89
+ tags[IAST_JSON_TAG_KEY] = JSON.stringify(jsonToSend)
90
+ span.addTags(tags)
93
91
  }
94
92
  }
95
93
  return IAST_JSON_TAG_KEY
@@ -34,6 +34,7 @@ const UserTracking = require('./user_tracking')
34
34
  const { storage } = require('../../../datadog-core')
35
35
  const graphql = require('./graphql')
36
36
  const rasp = require('./rasp')
37
+ const { isInServerlessEnvironment } = require('../serverless')
37
38
 
38
39
  const responseAnalyzedSet = new WeakSet()
39
40
 
@@ -57,7 +58,7 @@ function enable (_config) {
57
58
 
58
59
  remoteConfig.enableWafUpdate(_config.appsec)
59
60
 
60
- Reporter.setRateLimit(_config.appsec.rateLimit)
61
+ Reporter.init(_config.appsec)
61
62
 
62
63
  apiSecuritySampler.configure(_config)
63
64
 
@@ -83,7 +84,9 @@ function enable (_config) {
83
84
  isEnabled = true
84
85
  config = _config
85
86
  } catch (err) {
86
- log.error('[ASM] Unable to start AppSec', err)
87
+ if (!isInServerlessEnvironment()) {
88
+ log.error('[ASM] Unable to start AppSec', err)
89
+ }
87
90
 
88
91
  disable()
89
92
  }
@@ -106,7 +109,7 @@ function onRequestBodyParsed ({ req, res, body, abortController }) {
106
109
  }
107
110
  }, req)
108
111
 
109
- handleResults(results, req, res, rootSpan, abortController)
112
+ handleResults(results?.actions, req, res, rootSpan, abortController)
110
113
  }
111
114
 
112
115
  function onRequestCookieParser ({ req, res, abortController, cookies }) {
@@ -121,7 +124,7 @@ function onRequestCookieParser ({ req, res, abortController, cookies }) {
121
124
  }
122
125
  }, req)
123
126
 
124
- handleResults(results, req, res, rootSpan, abortController)
127
+ handleResults(results?.actions, req, res, rootSpan, abortController)
125
128
  }
126
129
 
127
130
  function incomingHttpStartTranslator ({ req, res, abortController }) {
@@ -149,9 +152,9 @@ function incomingHttpStartTranslator ({ req, res, abortController }) {
149
152
  persistent[addresses.HTTP_CLIENT_IP] = clientIp
150
153
  }
151
154
 
152
- const actions = waf.run({ persistent }, req)
155
+ const results = waf.run({ persistent }, req)
153
156
 
154
- handleResults(actions, req, res, rootSpan, abortController)
157
+ handleResults(results?.actions, req, res, rootSpan, abortController)
155
158
  }
156
159
 
157
160
  function incomingHttpEndTranslator ({ req, res }) {
@@ -198,7 +201,7 @@ function onPassportVerify ({ framework, login, user, success, abortController })
198
201
 
199
202
  const results = UserTracking.trackLogin(framework, login, user, success, rootSpan)
200
203
 
201
- handleResults(results, store.req, store.req.res, rootSpan, abortController)
204
+ handleResults(results?.actions, store.req, store.req.res, rootSpan, abortController)
202
205
  }
203
206
 
204
207
  function onPassportDeserializeUser ({ user, abortController }) {
@@ -212,7 +215,7 @@ function onPassportDeserializeUser ({ user, abortController }) {
212
215
 
213
216
  const results = UserTracking.trackUser(user, rootSpan)
214
217
 
215
- handleResults(results, store.req, store.req.res, rootSpan, abortController)
218
+ handleResults(results?.actions, store.req, store.req.res, rootSpan, abortController)
216
219
  }
217
220
 
218
221
  function onExpressSession ({ req, res, sessionId, abortController }) {
@@ -231,7 +234,7 @@ function onExpressSession ({ req, res, sessionId, abortController }) {
231
234
  }
232
235
  }, req)
233
236
 
234
- handleResults(results, req, res, rootSpan, abortController)
237
+ handleResults(results?.actions, req, res, rootSpan, abortController)
235
238
  }
236
239
 
237
240
  function onRequestQueryParsed ({ req, res, query, abortController }) {
@@ -251,7 +254,7 @@ function onRequestQueryParsed ({ req, res, query, abortController }) {
251
254
  }
252
255
  }, req)
253
256
 
254
- handleResults(results, req, res, rootSpan, abortController)
257
+ handleResults(results?.actions, req, res, rootSpan, abortController)
255
258
  }
256
259
 
257
260
  function onRequestProcessParams ({ req, res, abortController, params }) {
@@ -266,7 +269,7 @@ function onRequestProcessParams ({ req, res, abortController, params }) {
266
269
  }
267
270
  }, req)
268
271
 
269
- handleResults(results, req, res, rootSpan, abortController)
272
+ handleResults(results?.actions, req, res, rootSpan, abortController)
270
273
  }
271
274
 
272
275
  function onResponseBody ({ req, res, body }) {
@@ -308,7 +311,7 @@ function onResponseWriteHead ({ req, res, abortController, statusCode, responseH
308
311
 
309
312
  responseAnalyzedSet.add(res)
310
313
 
311
- handleResults(results, req, res, rootSpan, abortController)
314
+ handleResults(results?.actions, req, res, rootSpan, abortController)
312
315
  }
313
316
 
314
317
  function onResponseSetHeader ({ res, abortController }) {
@@ -22,8 +22,8 @@ function removeAllListeners (emitter, event) {
22
22
  }
23
23
  cleaned = true
24
24
 
25
- for (let i = 0; i < listeners.length; ++i) {
26
- emitter.on(event, listeners[i])
25
+ for (const listener of listeners) {
26
+ emitter.on(event, listener)
27
27
  }
28
28
  }
29
29
  }
@@ -41,19 +41,7 @@ function findDatadogRaspAbortError (err, deep = 10) {
41
41
  function handleUncaughtExceptionMonitor (error) {
42
42
  if (!blockOnDatadogRaspAbortError({ error })) return
43
43
 
44
- if (!process.hasUncaughtExceptionCaptureCallback()) {
45
- const cleanUp = removeAllListeners(process, 'uncaughtException')
46
- const handler = () => {
47
- process.removeListener('uncaughtException', handler)
48
- }
49
-
50
- setTimeout(() => {
51
- process.removeListener('uncaughtException', handler)
52
- cleanUp()
53
- })
54
-
55
- process.on('uncaughtException', handler)
56
- } else {
44
+ if (process.hasUncaughtExceptionCaptureCallback()) {
57
45
  // uncaughtException event is not executed when hasUncaughtExceptionCaptureCallback is true
58
46
  let previousCb
59
47
  const cb = ({ currentCallback, abortController }) => {
@@ -78,6 +66,18 @@ function handleUncaughtExceptionMonitor (error) {
78
66
  process.setUncaughtExceptionCaptureCallback(previousCb)
79
67
  })
80
68
  }
69
+ } else {
70
+ const cleanUp = removeAllListeners(process, 'uncaughtException')
71
+ const handler = () => {
72
+ process.removeListener('uncaughtException', handler)
73
+ }
74
+
75
+ setTimeout(() => {
76
+ process.removeListener('uncaughtException', handler)
77
+ cleanUp()
78
+ })
79
+
80
+ process.on('uncaughtException', handler)
81
81
  }
82
82
  }
83
83
 
@@ -85,10 +85,12 @@ function blockOnDatadogRaspAbortError ({ error }) {
85
85
  const abortError = findDatadogRaspAbortError(error)
86
86
  if (!abortError) return false
87
87
 
88
- const { req, res, blockingAction, raspRule } = abortError
88
+ const { req, res, blockingAction, raspRule, ruleTriggered } = abortError
89
89
  if (!isBlocked(res)) {
90
90
  const blocked = block(req, res, web.root(req), null, blockingAction)
91
- updateRaspRuleMatchMetricTags(req, raspRule, true, blocked)
91
+ if (ruleTriggered) {
92
+ updateRaspRuleMatchMetricTags(req, raspRule, true, blocked)
93
+ }
92
94
  }
93
95
 
94
96
  return true
@@ -88,6 +88,7 @@ function pathToStr (path) {
88
88
  if (!path) return
89
89
 
90
90
  if (typeof path === 'string' ||
91
+ // eslint-disable-next-line unicorn/no-instanceof-builtins
91
92
  path instanceof String ||
92
93
  path instanceof Buffer ||
93
94
  path instanceof URL) {
@@ -104,7 +105,7 @@ function shouldAnalyze (path, fs) {
104
105
 
105
106
  function shouldAnalyzeURLFile (path, fs) {
106
107
  if (path.startsWith('file://')) {
107
- return shouldAnalyze(path.substring(7), fs)
108
+ return shouldAnalyze(path.slice(7), fs)
108
109
  }
109
110
  }
110
111
 
@@ -20,23 +20,26 @@ const RULE_TYPES = {
20
20
  }
21
21
 
22
22
  class DatadogRaspAbortError extends Error {
23
- constructor (req, res, blockingAction, raspRule) {
23
+ constructor (req, res, blockingAction, raspRule, ruleTriggered) {
24
24
  super('DatadogRaspAbortError')
25
25
  this.name = 'DatadogRaspAbortError'
26
26
  this.req = req
27
27
  this.res = res
28
28
  this.blockingAction = blockingAction
29
29
  this.raspRule = raspRule
30
+ this.ruleTriggered = ruleTriggered
30
31
  }
31
32
  }
32
33
 
33
- function handleResult (actions, req, res, abortController, config, raspRule) {
34
- const generateStackTraceAction = actions?.generate_stack
34
+ function handleResult (result, req, res, abortController, config, raspRule) {
35
+ const generateStackTraceAction = result?.actions?.generate_stack
35
36
 
36
37
  const { enabled, maxDepth, maxStackTraces } = config.appsec.stackTrace
37
38
 
38
39
  const rootSpan = web.root(req)
39
40
 
41
+ const ruleTriggered = !!result?.events?.length
42
+
40
43
  if (generateStackTraceAction && enabled && canReportStackTrace(rootSpan, maxStackTraces)) {
41
44
  const frames = getCallsiteFrames(maxDepth)
42
45
 
@@ -48,11 +51,11 @@ function handleResult (actions, req, res, abortController, config, raspRule) {
48
51
  }
49
52
 
50
53
  if (abortController && !abortOnUncaughtException) {
51
- const blockingAction = getBlockingAction(actions)
54
+ const blockingAction = getBlockingAction(result?.actions)
52
55
 
53
56
  // Should block only in express
54
57
  if (blockingAction && rootSpan?.context()._name === 'express.request') {
55
- const abortError = new DatadogRaspAbortError(req, res, blockingAction, raspRule)
58
+ const abortError = new DatadogRaspAbortError(req, res, blockingAction, raspRule, ruleTriggered)
56
59
  abortController.abort(abortError)
57
60
 
58
61
  // TODO Delete this when support for node 16 is removed
@@ -64,7 +67,9 @@ function handleResult (actions, req, res, abortController, config, raspRule) {
64
67
  }
65
68
  }
66
69
 
67
- updateRaspRuleMatchMetricTags(req, raspRule, false, false)
70
+ if (ruleTriggered) {
71
+ updateRaspRuleMatchMetricTags(req, raspRule, false, false)
72
+ }
68
73
  }
69
74
 
70
75
  module.exports = {