dd-trace 4.18.0 → 5.6.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 (209) hide show
  1. package/CONTRIBUTING.md +98 -0
  2. package/LICENSE-3rdparty.csv +4 -5
  3. package/MIGRATING.md +15 -0
  4. package/README.md +20 -140
  5. package/ci/cypress/after-run.js +1 -0
  6. package/ci/cypress/after-spec.js +1 -0
  7. package/ci/init.js +1 -4
  8. package/ext/kinds.d.ts +1 -0
  9. package/ext/kinds.js +2 -1
  10. package/ext/tags.d.ts +2 -1
  11. package/ext/tags.js +6 -1
  12. package/index.d.ts +1523 -1460
  13. package/package.json +19 -19
  14. package/packages/datadog-core/src/storage/async_resource.js +1 -1
  15. package/packages/datadog-core/src/utils/src/get.js +11 -0
  16. package/packages/datadog-core/src/utils/src/has.js +14 -0
  17. package/packages/datadog-core/src/utils/src/kebabcase.js +16 -0
  18. package/packages/datadog-core/src/utils/src/pick.js +11 -0
  19. package/packages/datadog-core/src/utils/src/set.js +16 -0
  20. package/packages/datadog-core/src/utils/src/uniq.js +5 -0
  21. package/packages/datadog-esbuild/index.js +1 -20
  22. package/packages/datadog-instrumentations/src/aerospike.js +47 -0
  23. package/packages/datadog-instrumentations/src/amqplib.js +2 -2
  24. package/packages/datadog-instrumentations/src/apollo-server-core.js +41 -0
  25. package/packages/datadog-instrumentations/src/apollo-server.js +83 -0
  26. package/packages/datadog-instrumentations/src/child_process.js +150 -0
  27. package/packages/datadog-instrumentations/src/couchbase.js +5 -4
  28. package/packages/datadog-instrumentations/src/crypto.js +2 -1
  29. package/packages/datadog-instrumentations/src/cucumber.js +163 -46
  30. package/packages/datadog-instrumentations/src/dns.js +2 -1
  31. package/packages/datadog-instrumentations/src/express.js +20 -0
  32. package/packages/datadog-instrumentations/src/graphql.js +18 -4
  33. package/packages/datadog-instrumentations/src/grpc/client.js +56 -36
  34. package/packages/datadog-instrumentations/src/grpc/server.js +3 -1
  35. package/packages/datadog-instrumentations/src/helpers/bundler-register.js +1 -2
  36. package/packages/datadog-instrumentations/src/helpers/hooks.js +12 -3
  37. package/packages/datadog-instrumentations/src/helpers/instrument.js +9 -4
  38. package/packages/datadog-instrumentations/src/helpers/register.js +19 -3
  39. package/packages/datadog-instrumentations/src/http/client.js +12 -2
  40. package/packages/datadog-instrumentations/src/http/server.js +7 -4
  41. package/packages/datadog-instrumentations/src/http2/client.js +3 -1
  42. package/packages/datadog-instrumentations/src/http2/server.js +3 -1
  43. package/packages/datadog-instrumentations/src/jest.js +239 -52
  44. package/packages/datadog-instrumentations/src/kafkajs.js +27 -0
  45. package/packages/datadog-instrumentations/src/mocha.js +154 -18
  46. package/packages/datadog-instrumentations/src/mongodb-core.js +34 -3
  47. package/packages/datadog-instrumentations/src/mongoose.js +23 -10
  48. package/packages/datadog-instrumentations/src/mquery.js +65 -0
  49. package/packages/datadog-instrumentations/src/net.js +10 -2
  50. package/packages/datadog-instrumentations/src/next.js +35 -9
  51. package/packages/datadog-instrumentations/src/playwright.js +110 -16
  52. package/packages/datadog-instrumentations/src/restify.js +14 -1
  53. package/packages/datadog-instrumentations/src/rhea.js +15 -9
  54. package/packages/datadog-plugin-aerospike/src/index.js +113 -0
  55. package/packages/datadog-plugin-amqplib/src/consumer.js +14 -1
  56. package/packages/datadog-plugin-amqplib/src/producer.js +13 -1
  57. package/packages/datadog-plugin-aws-sdk/src/base.js +3 -2
  58. package/packages/datadog-plugin-aws-sdk/src/services/kinesis.js +163 -27
  59. package/packages/datadog-plugin-aws-sdk/src/services/sns.js +46 -8
  60. package/packages/datadog-plugin-aws-sdk/src/services/sqs.js +129 -22
  61. package/packages/datadog-plugin-child_process/src/index.js +91 -0
  62. package/packages/datadog-plugin-child_process/src/scrub-cmd-params.js +125 -0
  63. package/packages/datadog-plugin-cucumber/src/index.js +70 -13
  64. package/packages/datadog-plugin-cypress/src/after-run.js +3 -0
  65. package/packages/datadog-plugin-cypress/src/after-spec.js +3 -0
  66. package/packages/datadog-plugin-cypress/src/cypress-plugin.js +625 -0
  67. package/packages/datadog-plugin-cypress/src/plugin.js +6 -454
  68. package/packages/datadog-plugin-cypress/src/support.js +50 -3
  69. package/packages/datadog-plugin-google-cloud-pubsub/src/consumer.js +2 -0
  70. package/packages/datadog-plugin-graphql/src/index.js +1 -6
  71. package/packages/datadog-plugin-graphql/src/resolve.js +28 -18
  72. package/packages/datadog-plugin-grpc/src/client.js +16 -2
  73. package/packages/datadog-plugin-grpc/src/util.js +1 -1
  74. package/packages/datadog-plugin-http/src/client.js +19 -2
  75. package/packages/datadog-plugin-jest/src/index.js +118 -12
  76. package/packages/datadog-plugin-jest/src/util.js +38 -16
  77. package/packages/datadog-plugin-kafkajs/src/consumer.js +76 -6
  78. package/packages/datadog-plugin-kafkajs/src/producer.js +64 -8
  79. package/packages/datadog-plugin-mocha/src/index.js +87 -17
  80. package/packages/datadog-plugin-next/src/index.js +40 -14
  81. package/packages/datadog-plugin-playwright/src/index.js +71 -8
  82. package/packages/datadog-plugin-rhea/src/consumer.js +16 -1
  83. package/packages/datadog-plugin-rhea/src/producer.js +10 -0
  84. package/packages/dd-trace/src/appsec/activation.js +29 -0
  85. package/packages/dd-trace/src/appsec/addresses.js +5 -1
  86. package/packages/dd-trace/src/appsec/api_security_sampler.js +61 -0
  87. package/packages/dd-trace/src/appsec/blocked_templates.js +4 -1
  88. package/packages/dd-trace/src/appsec/blocking.js +95 -43
  89. package/packages/dd-trace/src/appsec/channels.js +7 -3
  90. package/packages/dd-trace/src/appsec/graphql.js +146 -0
  91. package/packages/dd-trace/src/appsec/iast/analyzers/analyzers.js +2 -0
  92. package/packages/dd-trace/src/appsec/iast/analyzers/command-injection-analyzer.js +1 -1
  93. package/packages/dd-trace/src/appsec/iast/analyzers/header-injection-analyzer.js +105 -0
  94. package/packages/dd-trace/src/appsec/iast/analyzers/nosql-injection-mongodb-analyzer.js +22 -17
  95. package/packages/dd-trace/src/appsec/iast/analyzers/sql-injection-analyzer.js +7 -28
  96. package/packages/dd-trace/src/appsec/iast/analyzers/vulnerability-analyzer.js +10 -6
  97. package/packages/dd-trace/src/appsec/iast/analyzers/weak-randomness-analyzer.js +19 -0
  98. package/packages/dd-trace/src/appsec/iast/context/context-plugin.js +90 -0
  99. package/packages/dd-trace/src/appsec/iast/context/kafka-ctx-plugin.js +14 -0
  100. package/packages/dd-trace/src/appsec/iast/iast-log.js +1 -1
  101. package/packages/dd-trace/src/appsec/iast/iast-plugin.js +13 -2
  102. package/packages/dd-trace/src/appsec/iast/index.js +15 -5
  103. package/packages/dd-trace/src/appsec/iast/overhead-controller.js +1 -1
  104. package/packages/dd-trace/src/appsec/iast/path-line.js +1 -1
  105. package/packages/dd-trace/src/appsec/iast/taint-tracking/csi-methods.js +2 -0
  106. package/packages/dd-trace/src/appsec/iast/taint-tracking/index.js +10 -0
  107. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations-taint-object.js +53 -0
  108. package/packages/dd-trace/src/appsec/iast/taint-tracking/operations.js +10 -46
  109. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugin.js +13 -9
  110. package/packages/dd-trace/src/appsec/iast/taint-tracking/plugins/kafka.js +47 -0
  111. package/packages/dd-trace/src/appsec/iast/taint-tracking/rewriter.js +19 -6
  112. package/packages/dd-trace/src/appsec/iast/taint-tracking/source-types.js +3 -1
  113. package/packages/dd-trace/src/appsec/iast/taint-tracking/taint-tracking-impl.js +41 -3
  114. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/constants.js +7 -0
  115. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/command-sensitive-analyzer.js +12 -19
  116. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/header-sensitive-analyzer.js +20 -0
  117. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/json-sensitive-analyzer.js +6 -10
  118. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/ldap-sensitive-analyzer.js +18 -25
  119. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/sql-sensitive-analyzer.js +79 -85
  120. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-analyzers/url-sensitive-analyzer.js +27 -36
  121. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/evidence-redaction/sensitive-handler.js +14 -11
  122. package/packages/dd-trace/src/appsec/iast/vulnerabilities-formatter/utils.js +1 -1
  123. package/packages/dd-trace/src/appsec/iast/vulnerabilities.js +2 -0
  124. package/packages/dd-trace/src/appsec/index.js +49 -33
  125. package/packages/dd-trace/src/appsec/recommended.json +1763 -106
  126. package/packages/dd-trace/src/appsec/remote_config/capabilities.js +7 -1
  127. package/packages/dd-trace/src/appsec/remote_config/index.js +42 -16
  128. package/packages/dd-trace/src/appsec/remote_config/manager.js +9 -8
  129. package/packages/dd-trace/src/appsec/reporter.js +51 -34
  130. package/packages/dd-trace/src/appsec/rule_manager.js +11 -8
  131. package/packages/dd-trace/src/appsec/sdk/user_blocking.js +1 -1
  132. package/packages/dd-trace/src/appsec/waf/waf_context_wrapper.js +28 -13
  133. package/packages/dd-trace/src/appsec/waf/waf_manager.js +0 -1
  134. package/packages/dd-trace/src/ci-visibility/{intelligent-test-runner/get-itr-configuration.js → early-flake-detection/get-known-tests.js} +17 -22
  135. package/packages/dd-trace/src/ci-visibility/exporters/agent-proxy/index.js +25 -6
  136. package/packages/dd-trace/src/ci-visibility/exporters/agentless/coverage-writer.js +30 -1
  137. package/packages/dd-trace/src/ci-visibility/exporters/agentless/index.js +2 -0
  138. package/packages/dd-trace/src/ci-visibility/exporters/agentless/writer.js +30 -1
  139. package/packages/dd-trace/src/ci-visibility/exporters/ci-visibility-exporter.js +95 -37
  140. package/packages/dd-trace/src/ci-visibility/exporters/git/git_metadata.js +134 -61
  141. package/packages/dd-trace/src/ci-visibility/intelligent-test-runner/get-skippable-suites.js +37 -4
  142. package/packages/dd-trace/src/ci-visibility/requests/get-library-configuration.js +131 -0
  143. package/packages/dd-trace/src/ci-visibility/telemetry.js +130 -0
  144. package/packages/dd-trace/src/config.js +561 -470
  145. package/packages/dd-trace/src/data_streams_context.js +1 -1
  146. package/packages/dd-trace/src/datastreams/pathway.js +58 -1
  147. package/packages/dd-trace/src/datastreams/processor.js +196 -27
  148. package/packages/dd-trace/src/datastreams/writer.js +11 -5
  149. package/packages/dd-trace/src/dogstatsd.js +3 -5
  150. package/packages/dd-trace/src/encode/agentless-ci-visibility.js +44 -6
  151. package/packages/dd-trace/src/encode/coverage-ci-visibility.js +14 -0
  152. package/packages/dd-trace/src/exporters/common/agent-info-exporter.js +4 -0
  153. package/packages/dd-trace/src/exporters/common/form-data.js +4 -0
  154. package/packages/dd-trace/src/exporters/common/request.js +21 -3
  155. package/packages/dd-trace/src/format.js +30 -2
  156. package/packages/dd-trace/src/id.js +12 -0
  157. package/packages/dd-trace/src/iitm.js +1 -1
  158. package/packages/dd-trace/src/log/channels.js +1 -1
  159. package/packages/dd-trace/src/noop/proxy.js +4 -0
  160. package/packages/dd-trace/src/noop/span.js +1 -0
  161. package/packages/dd-trace/src/opentelemetry/span.js +104 -4
  162. package/packages/dd-trace/src/opentelemetry/tracer.js +9 -10
  163. package/packages/dd-trace/src/opentracing/propagation/text_map.js +16 -7
  164. package/packages/dd-trace/src/opentracing/span.js +48 -4
  165. package/packages/dd-trace/src/opentracing/span_context.js +15 -6
  166. package/packages/dd-trace/src/opentracing/tracer.js +4 -3
  167. package/packages/dd-trace/src/plugin_manager.js +1 -1
  168. package/packages/dd-trace/src/plugins/ci_plugin.js +78 -19
  169. package/packages/dd-trace/src/plugins/database.js +1 -1
  170. package/packages/dd-trace/src/plugins/index.js +7 -0
  171. package/packages/dd-trace/src/plugins/plugin.js +1 -1
  172. package/packages/dd-trace/src/plugins/util/ci.js +6 -19
  173. package/packages/dd-trace/src/plugins/util/git.js +104 -22
  174. package/packages/dd-trace/src/plugins/util/ip_extractor.js +7 -6
  175. package/packages/dd-trace/src/plugins/util/test.js +60 -10
  176. package/packages/dd-trace/src/plugins/util/url.js +26 -0
  177. package/packages/dd-trace/src/plugins/util/user-provided-git.js +4 -16
  178. package/packages/dd-trace/src/plugins/util/web.js +1 -1
  179. package/packages/dd-trace/src/priority_sampler.js +30 -38
  180. package/packages/dd-trace/src/profiler.js +5 -3
  181. package/packages/dd-trace/src/profiling/config.js +77 -24
  182. package/packages/dd-trace/src/profiling/exporters/agent.js +77 -31
  183. package/packages/dd-trace/src/profiling/exporters/file.js +2 -1
  184. package/packages/dd-trace/src/profiling/profiler.js +33 -22
  185. package/packages/dd-trace/src/profiling/profilers/events.js +270 -0
  186. package/packages/dd-trace/src/profiling/profilers/shared.js +45 -0
  187. package/packages/dd-trace/src/profiling/profilers/space.js +18 -2
  188. package/packages/dd-trace/src/profiling/profilers/wall.js +146 -70
  189. package/packages/dd-trace/src/proxy.js +56 -24
  190. package/packages/dd-trace/src/ritm.js +1 -1
  191. package/packages/dd-trace/src/sampling_rule.js +130 -0
  192. package/packages/dd-trace/src/service-naming/schemas/v0/storage.js +5 -0
  193. package/packages/dd-trace/src/service-naming/schemas/v1/storage.js +4 -0
  194. package/packages/dd-trace/src/span_processor.js +9 -1
  195. package/packages/dd-trace/src/span_sampler.js +6 -64
  196. package/packages/dd-trace/src/spanleak.js +98 -0
  197. package/packages/dd-trace/src/startup-log.js +7 -1
  198. package/packages/dd-trace/src/telemetry/dependencies.js +56 -10
  199. package/packages/dd-trace/src/telemetry/index.js +182 -53
  200. package/packages/dd-trace/src/telemetry/logs/index.js +2 -2
  201. package/packages/dd-trace/src/telemetry/send-data.js +65 -7
  202. package/packages/dd-trace/src/tracer.js +12 -5
  203. package/register.js +4 -0
  204. package/scripts/install_plugin_modules.js +11 -3
  205. package/scripts/st.js +105 -0
  206. package/packages/datadog-instrumentations/src/child-process.js +0 -30
  207. package/packages/dd-trace/src/plugins/util/exec.js +0 -13
  208. package/packages/diagnostics_channel/index.js +0 -3
  209. package/packages/diagnostics_channel/src/index.js +0 -121
@@ -6,24 +6,26 @@ const remoteConfig = require('./remote_config')
6
6
  const {
7
7
  bodyParser,
8
8
  cookieParser,
9
- graphqlFinishExecute,
10
9
  incomingHttpRequestStart,
11
10
  incomingHttpRequestEnd,
12
11
  passportVerify,
13
12
  queryParser,
14
13
  nextBodyParsed,
15
- nextQueryParsed
14
+ nextQueryParsed,
15
+ responseBody
16
16
  } = require('./channels')
17
17
  const waf = require('./waf')
18
18
  const addresses = require('./addresses')
19
19
  const Reporter = require('./reporter')
20
20
  const appsecTelemetry = require('./telemetry')
21
+ const apiSecuritySampler = require('./api_security_sampler')
21
22
  const web = require('../plugins/util/web')
22
23
  const { extractIp } = require('../plugins/util/ip_extractor')
23
24
  const { HTTP_CLIENT_IP } = require('../../../../ext/tags')
24
25
  const { block, setTemplates } = require('./blocking')
25
26
  const { passportTrackEvent } = require('./passport')
26
27
  const { storage } = require('../../../datadog-core')
28
+ const graphql = require('./graphql')
27
29
 
28
30
  let isEnabled = false
29
31
  let config
@@ -33,15 +35,18 @@ function enable (_config) {
33
35
 
34
36
  try {
35
37
  appsecTelemetry.enable(_config.telemetry)
38
+ graphql.enable()
36
39
 
37
40
  setTemplates(_config)
38
41
 
39
- RuleManager.applyRules(_config.appsec.rules, _config.appsec)
42
+ RuleManager.loadRules(_config.appsec)
40
43
 
41
44
  remoteConfig.enableWafUpdate(_config.appsec)
42
45
 
43
46
  Reporter.setRateLimit(_config.appsec.rateLimit)
44
47
 
48
+ apiSecuritySampler.configure(_config.appsec)
49
+
45
50
  incomingHttpRequestStart.subscribe(incomingHttpStartTranslator)
46
51
  incomingHttpRequestEnd.subscribe(incomingHttpEndTranslator)
47
52
  bodyParser.subscribe(onRequestBodyParsed)
@@ -49,7 +54,7 @@ function enable (_config) {
49
54
  nextQueryParsed.subscribe(onRequestQueryParsed)
50
55
  queryParser.subscribe(onRequestQueryParsed)
51
56
  cookieParser.subscribe(onRequestCookieParser)
52
- graphqlFinishExecute.subscribe(onGraphqlFinishExecute)
57
+ responseBody.subscribe(onResponseBody)
53
58
 
54
59
  if (_config.appsec.eventTracking.enabled) {
55
60
  passportVerify.subscribe(onPassportVerify)
@@ -80,17 +85,21 @@ function incomingHttpStartTranslator ({ req, res, abortController }) {
80
85
  const requestHeaders = Object.assign({}, req.headers)
81
86
  delete requestHeaders.cookie
82
87
 
83
- const payload = {
88
+ const persistent = {
84
89
  [addresses.HTTP_INCOMING_URL]: req.url,
85
90
  [addresses.HTTP_INCOMING_HEADERS]: requestHeaders,
86
91
  [addresses.HTTP_INCOMING_METHOD]: req.method
87
92
  }
88
93
 
89
94
  if (clientIp) {
90
- payload[addresses.HTTP_CLIENT_IP] = clientIp
95
+ persistent[addresses.HTTP_CLIENT_IP] = clientIp
96
+ }
97
+
98
+ if (apiSecuritySampler.sampleRequest(req)) {
99
+ persistent[addresses.WAF_CONTEXT_PROCESSOR] = { 'extract-schema': true }
91
100
  }
92
101
 
93
- const actions = waf.run(payload, req)
102
+ const actions = waf.run({ persistent }, req)
94
103
 
95
104
  handleResults(actions, req, res, rootSpan, abortController)
96
105
  }
@@ -100,32 +109,32 @@ function incomingHttpEndTranslator ({ req, res }) {
100
109
  const responseHeaders = Object.assign({}, res.getHeaders())
101
110
  delete responseHeaders['set-cookie']
102
111
 
103
- const payload = {
104
- [addresses.HTTP_INCOMING_RESPONSE_CODE]: res.statusCode,
112
+ const persistent = {
113
+ [addresses.HTTP_INCOMING_RESPONSE_CODE]: '' + res.statusCode,
105
114
  [addresses.HTTP_INCOMING_RESPONSE_HEADERS]: responseHeaders
106
115
  }
107
116
 
108
117
  // we need to keep this to support other body parsers
109
118
  // TODO: no need to analyze it if it was already done by the body-parser hook
110
119
  if (req.body !== undefined && req.body !== null) {
111
- payload[addresses.HTTP_INCOMING_BODY] = req.body
120
+ persistent[addresses.HTTP_INCOMING_BODY] = req.body
112
121
  }
113
122
 
114
123
  // TODO: temporary express instrumentation, will use express plugin later
115
124
  if (req.params && typeof req.params === 'object') {
116
- payload[addresses.HTTP_INCOMING_PARAMS] = req.params
125
+ persistent[addresses.HTTP_INCOMING_PARAMS] = req.params
117
126
  }
118
127
 
119
128
  // we need to keep this to support other cookie parsers
120
129
  if (req.cookies && typeof req.cookies === 'object') {
121
- payload[addresses.HTTP_INCOMING_COOKIES] = req.cookies
130
+ persistent[addresses.HTTP_INCOMING_COOKIES] = req.cookies
122
131
  }
123
132
 
124
133
  if (req.query && typeof req.query === 'object') {
125
- payload[addresses.HTTP_INCOMING_QUERY] = req.query
134
+ persistent[addresses.HTTP_INCOMING_QUERY] = req.query
126
135
  }
127
136
 
128
- waf.run(payload, req)
137
+ waf.run({ persistent }, req)
129
138
 
130
139
  waf.disposeContext(req)
131
140
 
@@ -144,7 +153,9 @@ function onRequestBodyParsed ({ req, res, body, abortController }) {
144
153
  if (!rootSpan) return
145
154
 
146
155
  const results = waf.run({
147
- [addresses.HTTP_INCOMING_BODY]: body
156
+ persistent: {
157
+ [addresses.HTTP_INCOMING_BODY]: body
158
+ }
148
159
  }, req)
149
160
 
150
161
  handleResults(results, req, res, rootSpan, abortController)
@@ -162,7 +173,9 @@ function onRequestQueryParsed ({ req, res, query, abortController }) {
162
173
  if (!rootSpan) return
163
174
 
164
175
  const results = waf.run({
165
- [addresses.HTTP_INCOMING_QUERY]: query
176
+ persistent: {
177
+ [addresses.HTTP_INCOMING_QUERY]: query
178
+ }
166
179
  }, req)
167
180
 
168
181
  handleResults(results, req, res, rootSpan, abortController)
@@ -175,15 +188,29 @@ function onRequestCookieParser ({ req, res, abortController, cookies }) {
175
188
  if (!rootSpan) return
176
189
 
177
190
  const results = waf.run({
178
- [addresses.HTTP_INCOMING_COOKIES]: cookies
191
+ persistent: {
192
+ [addresses.HTTP_INCOMING_COOKIES]: cookies
193
+ }
179
194
  }, req)
180
195
 
181
196
  handleResults(results, req, res, rootSpan, abortController)
182
197
  }
183
198
 
199
+ function onResponseBody ({ req, body }) {
200
+ if (!body || typeof body !== 'object') return
201
+ if (!apiSecuritySampler.isSampled(req)) return
202
+
203
+ // we don't support blocking at this point, so no results needed
204
+ waf.run({
205
+ persistent: {
206
+ [addresses.HTTP_OUTGOING_BODY]: body
207
+ }
208
+ }, req)
209
+ }
210
+
184
211
  function onPassportVerify ({ credentials, user }) {
185
212
  const store = storage.getStore()
186
- const rootSpan = store && store.req && web.root(store.req)
213
+ const rootSpan = store?.req && web.root(store.req)
187
214
 
188
215
  if (!rootSpan) {
189
216
  log.warn('No rootSpan found in onPassportVerify')
@@ -193,20 +220,6 @@ function onPassportVerify ({ credentials, user }) {
193
220
  passportTrackEvent(credentials, user, rootSpan, config.appsec.eventTracking.mode)
194
221
  }
195
222
 
196
- function onGraphqlFinishExecute ({ context }) {
197
- const store = storage.getStore()
198
- const req = store?.req
199
-
200
- if (!req) return
201
-
202
- const resolvers = context?.resolvers
203
-
204
- if (!resolvers || typeof resolvers !== 'object') return
205
-
206
- // Don't collect blocking result because it only works in monitor mode.
207
- waf.run({ [addresses.HTTP_INCOMING_GRAPHQL_RESOLVERS]: resolvers }, req)
208
- }
209
-
210
223
  function handleResults (actions, req, res, rootSpan, abortController) {
211
224
  if (!actions || !req || !res || !rootSpan || !abortController) return
212
225
 
@@ -222,16 +235,19 @@ function disable () {
222
235
  RuleManager.clearAllRules()
223
236
 
224
237
  appsecTelemetry.disable()
238
+ graphql.disable()
225
239
 
226
240
  remoteConfig.disableWafUpdate()
227
241
 
242
+ apiSecuritySampler.disable()
243
+
228
244
  // Channel#unsubscribe() is undefined for non active channels
229
245
  if (bodyParser.hasSubscribers) bodyParser.unsubscribe(onRequestBodyParsed)
230
- if (graphqlFinishExecute.hasSubscribers) graphqlFinishExecute.unsubscribe(onGraphqlFinishExecute)
231
246
  if (incomingHttpRequestStart.hasSubscribers) incomingHttpRequestStart.unsubscribe(incomingHttpStartTranslator)
232
247
  if (incomingHttpRequestEnd.hasSubscribers) incomingHttpRequestEnd.unsubscribe(incomingHttpEndTranslator)
233
248
  if (queryParser.hasSubscribers) queryParser.unsubscribe(onRequestQueryParsed)
234
249
  if (cookieParser.hasSubscribers) cookieParser.unsubscribe(onRequestCookieParser)
250
+ if (responseBody.hasSubscribers) responseBody.unsubscribe(onResponseBody)
235
251
  if (passportVerify.hasSubscribers) passportVerify.unsubscribe(onPassportVerify)
236
252
  }
237
253