1
1
'use strict'
2
2
3
+ const dc = require ( 'dc-polyfill' )
4
+ const zlib = require ( 'zlib' )
5
+
3
6
const Limiter = require ( '../rate_limiter' )
4
7
const { storage } = require ( '../../../datadog-core' )
5
8
const web = require ( '../plugins/util/web' )
6
9
const { ipHeaderList } = require ( '../plugins/util/ip_extractor' )
7
10
const {
8
11
incrementWafInitMetric,
9
12
incrementWafUpdatesMetric,
13
+ incrementWafConfigErrorsMetric,
10
14
incrementWafRequestsMetric,
11
15
updateWafRequestsMetricTags,
12
16
updateRaspRequestsMetricTags,
13
17
updateRaspRuleSkippedMetricTags,
14
18
updateRateLimitedMetric,
15
19
getRequestMetrics
16
20
} = require ( './telemetry' )
17
- const zlib = require ( 'zlib' )
18
21
const { keepTrace } = require ( '../priority_sampler' )
19
22
const { ASM } = require ( '../standalone/product' )
23
+ const { DIAGNOSTIC_KEYS } = require ( './waf/diagnostics' )
20
24
21
25
const REQUEST_HEADER_TAG_PREFIX = 'http.request.headers.'
22
26
const RESPONSE_HEADER_TAG_PREFIX = 'http.response.headers.'
@@ -25,6 +29,8 @@ const COLLECTED_REQUEST_BODY_MAX_STRING_LENGTH = 4096
25
29
const COLLECTED_REQUEST_BODY_MAX_DEPTH = 20
26
30
const COLLECTED_REQUEST_BODY_MAX_ELEMENTS_PER_NODE = 256
27
31
32
+ const telemetryLogCh = dc . channel ( 'datadog:telemetry:log' )
33
+
28
34
// default limiter, configurable with setRateLimit()
29
35
let limiter = new Limiter ( 100 )
30
36
@@ -216,17 +222,64 @@ function getCollectedHeaders (req, res, shouldCollectEventHeaders, storedRespons
216
222
function reportWafInit ( wafVersion , rulesVersion , diagnosticsRules = { } , success = false ) {
217
223
if ( success ) {
218
224
metricsQueue . set ( '_dd.appsec.waf.version' , wafVersion )
219
-
220
- metricsQueue . set ( '_dd.appsec.event_rules.loaded' , diagnosticsRules . loaded ?. length || 0 )
221
- metricsQueue . set ( '_dd.appsec.event_rules.error_count' , diagnosticsRules . failed ?. length || 0 )
222
- if ( diagnosticsRules . failed ?. length ) {
223
- metricsQueue . set ( '_dd.appsec.event_rules.errors' , JSON . stringify ( diagnosticsRules . errors ) )
224
- }
225
225
}
226
226
227
227
incrementWafInitMetric ( wafVersion , rulesVersion , success )
228
228
}
229
229
230
+ function logWafDiagnosticMessage ( product , rcConfigId , configKey , message , level ) {
231
+ const tags =
232
+ `log_type:rc::${ product . toLowerCase ( ) } ::diagnostic,appsec_config_key:${ configKey } ,rc_config_id:${ rcConfigId } `
233
+ telemetryLogCh . publish ( {
234
+ message,
235
+ level,
236
+ tags
237
+ } )
238
+ }
239
+
240
+ function reportWafConfigUpdate ( product , rcConfigId , diagnostics , wafVersion ) {
241
+ if ( diagnostics . error ) {
242
+ logWafDiagnosticMessage ( product , rcConfigId , '' , diagnostics . error , 'ERROR' )
243
+ incrementWafConfigErrorsMetric ( wafVersion , diagnostics . ruleset_version )
244
+ }
245
+
246
+ for ( const configKey of DIAGNOSTIC_KEYS ) {
247
+ const configDiagnostics = diagnostics [ configKey ]
248
+ if ( ! configDiagnostics ) continue
249
+
250
+ if ( configDiagnostics . error ) {
251
+ logWafDiagnosticMessage ( product , rcConfigId , configKey , configDiagnostics . error , 'ERROR' )
252
+ incrementWafConfigErrorsMetric ( wafVersion , diagnostics . ruleset_version )
253
+ continue
254
+ }
255
+
256
+ if ( configDiagnostics . errors ) {
257
+ for ( const [ errorMessage , errorIds ] of Object . entries ( configDiagnostics . errors ) ) {
258
+ logWafDiagnosticMessage (
259
+ product ,
260
+ rcConfigId ,
261
+ configKey ,
262
+ `"${ errorMessage } ": ${ JSON . stringify ( errorIds ) } ` ,
263
+ 'ERROR'
264
+ )
265
+ incrementWafConfigErrorsMetric ( wafVersion , diagnostics . ruleset_version )
266
+ }
267
+ }
268
+
269
+ if ( configDiagnostics . warnings ) {
270
+ for ( const [ warningMessage , warningIds ] of Object . entries ( configDiagnostics . warnings ) ) {
271
+ logWafDiagnosticMessage (
272
+ product ,
273
+ rcConfigId ,
274
+ configKey ,
275
+ `"${ warningMessage } ": ${ JSON . stringify ( warningIds ) } ` ,
276
+ 'WARN'
277
+ )
278
+ }
279
+ }
280
+ }
281
+ }
282
+
230
283
function reportMetrics ( metrics , raspRule ) {
231
284
const store = storage ( 'legacy' ) . getStore ( )
232
285
const rootSpan = store ?. req && web . root ( store . req )
@@ -485,6 +538,7 @@ module.exports = {
485
538
filterExtendedHeaders,
486
539
formatHeaderName,
487
540
reportWafInit,
541
+ reportWafConfigUpdate,
488
542
reportMetrics,
489
543
reportAttack,
490
544
reportWafUpdate : incrementWafUpdatesMetric ,
0 commit comments