|
6 | 6 | import java.util.List;
|
7 | 7 | import java.util.concurrent.ArrayBlockingQueue;
|
8 | 8 | import java.util.concurrent.BlockingQueue;
|
| 9 | +import java.util.concurrent.ConcurrentMap; |
| 10 | +import java.util.concurrent.ConcurrentSkipListMap; |
9 | 11 | import java.util.concurrent.atomic.AtomicInteger;
|
10 | 12 | import java.util.concurrent.atomic.AtomicLong;
|
11 | 13 | import java.util.concurrent.atomic.AtomicLongArray;
|
12 | 14 |
|
13 | 15 | public class WafMetricCollector implements MetricCollector<WafMetricCollector.WafMetric> {
|
14 | 16 |
|
15 | 17 | public static WafMetricCollector INSTANCE = new WafMetricCollector();
|
| 18 | + private static final int ABSTRACT_POWERWAF_EXCEPTION_NUMBER = |
| 19 | + 3; // only 3 error codes are possible for now in AbstractPowerwafException |
16 | 20 |
|
17 | 21 | public static WafMetricCollector get() {
|
18 | 22 | return WafMetricCollector.INSTANCE;
|
@@ -40,6 +44,15 @@ private WafMetricCollector() {
|
40 | 44 | new AtomicLongArray(RuleType.getNumValues());
|
41 | 45 | private static final AtomicLongArray raspTimeoutCounter =
|
42 | 46 | new AtomicLongArray(RuleType.getNumValues());
|
| 47 | + private static final ConcurrentMap<Integer, AtomicLongArray> raspErrorCodeCounter = |
| 48 | + new ConcurrentSkipListMap<>(); |
| 49 | + |
| 50 | + static { |
| 51 | + for (int i = -1 * ABSTRACT_POWERWAF_EXCEPTION_NUMBER; i < 0; i++) { |
| 52 | + raspErrorCodeCounter.put(i, new AtomicLongArray(RuleType.getNumValues())); |
| 53 | + } |
| 54 | + } |
| 55 | + |
43 | 56 | private static final AtomicLongArray missingUserLoginQueue =
|
44 | 57 | new AtomicLongArray(LoginFramework.getNumValues() * LoginEvent.getNumValues());
|
45 | 58 | private static final AtomicLongArray missingUserIdQueue =
|
@@ -104,6 +117,10 @@ public void raspTimeout(final RuleType ruleType) {
|
104 | 117 | raspTimeoutCounter.incrementAndGet(ruleType.ordinal());
|
105 | 118 | }
|
106 | 119 |
|
| 120 | + public void raspErrorCode(final RuleType ruleType, final int ddwafRunErrorCode) { |
| 121 | + raspErrorCodeCounter.get(ddwafRunErrorCode).incrementAndGet(ruleType.ordinal()); |
| 122 | + } |
| 123 | + |
107 | 124 | public void missingUserLogin(final LoginFramework framework, final LoginEvent eventType) {
|
108 | 125 | missingUserLoginQueue.incrementAndGet(
|
109 | 126 | framework.ordinal() * LoginEvent.getNumValues() + eventType.ordinal());
|
@@ -216,6 +233,19 @@ public void prepareMetrics() {
|
216 | 233 | }
|
217 | 234 | }
|
218 | 235 |
|
| 236 | + // RASP rule type for each possible error code |
| 237 | + for (int i = -1 * ABSTRACT_POWERWAF_EXCEPTION_NUMBER; i < 0; i++) { |
| 238 | + for (RuleType ruleType : RuleType.values()) { |
| 239 | + long counter = raspErrorCodeCounter.get(i).getAndSet(ruleType.ordinal(), 0); |
| 240 | + if (counter > 0) { |
| 241 | + if (!rawMetricsQueue.offer( |
| 242 | + new RaspError(counter, ruleType, WafMetricCollector.wafVersion, i))) { |
| 243 | + return; |
| 244 | + } |
| 245 | + } |
| 246 | + } |
| 247 | + } |
| 248 | + |
219 | 249 | // Missing user login
|
220 | 250 | for (LoginFramework framework : LoginFramework.values()) {
|
221 | 251 | for (LoginEvent event : LoginEvent.values()) {
|
@@ -367,6 +397,31 @@ public RaspTimeout(final long counter, final RuleType ruleType, final String waf
|
367 | 397 | }
|
368 | 398 | }
|
369 | 399 |
|
| 400 | + public static class RaspError extends WafMetric { |
| 401 | + public RaspError( |
| 402 | + final long counter, |
| 403 | + final RuleType ruleType, |
| 404 | + final String wafVersion, |
| 405 | + final Integer ddwafRunError) { |
| 406 | + super( |
| 407 | + "rasp.error", |
| 408 | + counter, |
| 409 | + ruleType.variant != null |
| 410 | + ? new String[] { |
| 411 | + "rule_type:" + ruleType.type, |
| 412 | + "rule_variant:" + ruleType.variant, |
| 413 | + "waf_version:" + wafVersion, |
| 414 | + "event_rules_version:" + rulesVersion, |
| 415 | + "waf_error:" + ddwafRunError |
| 416 | + } |
| 417 | + : new String[] { |
| 418 | + "rule_type:" + ruleType.type, |
| 419 | + "waf_version:" + wafVersion, |
| 420 | + "waf_error:" + ddwafRunError |
| 421 | + }); |
| 422 | + } |
| 423 | + } |
| 424 | + |
370 | 425 | public static class AtomicRequestCounter {
|
371 | 426 |
|
372 | 427 | private final AtomicLong atomicLong = new AtomicLong();
|
|
0 commit comments