Statsd value metric anomaly detection

Add anomly detection to Value metric in statsd.

Test: make statsd_test && adb sync data && adb shell data/nativetest64/statsd_test/statsd_test
Test: run cts-dev -m CtsStatsdHostTestCases -t android.cts.statsd.HostAtomTests#testValueAnomalyDetection
Fixes: 70240042
Change-Id: I05cf36495cdfd0ac7aa1a922f0e253a60fda1787
diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
index 9400a1c..1eabf11 100644
--- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp
+++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp
@@ -294,6 +294,10 @@
     } else {    // for pushed events
         interval.sum += value;
     }
+
+    for (auto& tracker : mAnomalyTrackers) {
+        tracker->detectAndDeclareAnomaly(eventTimeNs, mCurrentBucketNum, eventKey, interval.sum);
+    }
 }
 
 long ValueMetricProducer::get_value(const LogEvent& event) {
@@ -327,6 +331,12 @@
         // it will auto create new vector of ValuebucketInfo if the key is not found.
         auto& bucketList = mPastBuckets[slice.first];
         bucketList.push_back(info);
+
+        for (auto& tracker : mAnomalyTrackers) {
+            if (tracker != nullptr) {
+                tracker->addPastBucket(slice.first, info.mValue, info.mBucketNum);
+            }
+        }
     }
     VLOG("%d tainted pairs in the bucket", tainted);