Merge "Drop value if the bucket is totally tainted" into pi-dev
am: 5bc03014c0
Change-Id: I92b47ad538eeec38fbf4b4d7211dc75ebf903880
This commit is contained in:
@@ -334,6 +334,7 @@ void ValueMetricProducer::onMatchedLogEventInternalLocked(
|
||||
} else {
|
||||
interval.sum += value;
|
||||
}
|
||||
interval.hasValue = true;
|
||||
interval.startUpdated = false;
|
||||
} else {
|
||||
VLOG("No start for matching end %ld", value);
|
||||
@@ -342,6 +343,7 @@ void ValueMetricProducer::onMatchedLogEventInternalLocked(
|
||||
}
|
||||
} else { // for pushed events
|
||||
interval.sum += value;
|
||||
interval.hasValue = true;
|
||||
}
|
||||
|
||||
long wholeBucketVal = interval.sum;
|
||||
@@ -393,10 +395,12 @@ void ValueMetricProducer::flushCurrentBucketLocked(const int64_t& eventTimeNs) {
|
||||
for (const auto& slice : mCurrentSlicedBucket) {
|
||||
tainted += slice.second.tainted;
|
||||
tainted += slice.second.startUpdated;
|
||||
info.mValue = slice.second.sum;
|
||||
// it will auto create new vector of ValuebucketInfo if the key is not found.
|
||||
auto& bucketList = mPastBuckets[slice.first];
|
||||
bucketList.push_back(info);
|
||||
if (slice.second.hasValue) {
|
||||
info.mValue = slice.second.sum;
|
||||
// it will auto create new vector of ValuebucketInfo if the key is not found.
|
||||
auto& bucketList = mPastBuckets[slice.first];
|
||||
bucketList.push_back(info);
|
||||
}
|
||||
}
|
||||
VLOG("%d tainted pairs in the bucket", tainted);
|
||||
|
||||
|
||||
@@ -135,6 +135,9 @@ private:
|
||||
int tainted;
|
||||
// Running sum of known pairs in this bucket
|
||||
long sum;
|
||||
// If this dimension has any non-tainted value. If not, don't report the
|
||||
// dimension.
|
||||
bool hasValue;
|
||||
} Interval;
|
||||
|
||||
std::unordered_map<MetricDimensionKey, Interval> mCurrentSlicedBucket;
|
||||
|
||||
@@ -90,8 +90,7 @@ TEST(ValueMetricProducerTest, TestNonDimensionalEvents) {
|
||||
EXPECT_EQ(0, curInterval.tainted);
|
||||
EXPECT_EQ(0, curInterval.sum);
|
||||
EXPECT_EQ(11, curInterval.start);
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
|
||||
EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second.back().mValue);
|
||||
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
|
||||
|
||||
allData.clear();
|
||||
event = make_shared<LogEvent>(tagId, bucket3StartTimeNs + 1);
|
||||
@@ -108,7 +107,7 @@ TEST(ValueMetricProducerTest, TestNonDimensionalEvents) {
|
||||
EXPECT_EQ(0, curInterval.tainted);
|
||||
EXPECT_EQ(0, curInterval.sum);
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
|
||||
EXPECT_EQ(2UL, valueProducer.mPastBuckets.begin()->second.size());
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
|
||||
EXPECT_EQ(12, valueProducer.mPastBuckets.begin()->second.back().mValue);
|
||||
|
||||
allData.clear();
|
||||
@@ -125,7 +124,7 @@ TEST(ValueMetricProducerTest, TestNonDimensionalEvents) {
|
||||
EXPECT_EQ(0, curInterval.tainted);
|
||||
EXPECT_EQ(0, curInterval.sum);
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
|
||||
EXPECT_EQ(3UL, valueProducer.mPastBuckets.begin()->second.size());
|
||||
EXPECT_EQ(2UL, valueProducer.mPastBuckets.begin()->second.size());
|
||||
EXPECT_EQ(13, valueProducer.mPastBuckets.begin()->second.back().mValue);
|
||||
}
|
||||
|
||||
@@ -464,15 +463,13 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryNoCondition) {
|
||||
// has one slice
|
||||
EXPECT_EQ(1UL, valueProducer.mCurrentSlicedBucket.size());
|
||||
ValueMetricProducer::Interval curInterval = valueProducer.mCurrentSlicedBucket.begin()->second;
|
||||
valueProducer.setBucketSize(60 * NS_PER_SEC);
|
||||
|
||||
// startUpdated:true tainted:0 sum:0 start:11
|
||||
EXPECT_EQ(true, curInterval.startUpdated);
|
||||
EXPECT_EQ(0, curInterval.tainted);
|
||||
EXPECT_EQ(0, curInterval.sum);
|
||||
EXPECT_EQ(11, curInterval.start);
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
|
||||
EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second.back().mValue);
|
||||
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
|
||||
|
||||
// pull 2 at correct time
|
||||
allData.clear();
|
||||
@@ -490,7 +487,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryNoCondition) {
|
||||
EXPECT_EQ(0, curInterval.tainted);
|
||||
EXPECT_EQ(0, curInterval.sum);
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
|
||||
EXPECT_EQ(2UL, valueProducer.mPastBuckets.begin()->second.size());
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
|
||||
EXPECT_EQ(12, valueProducer.mPastBuckets.begin()->second.back().mValue);
|
||||
|
||||
// pull 3 come late.
|
||||
@@ -512,11 +509,8 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryNoCondition) {
|
||||
EXPECT_EQ(36, curInterval.start);
|
||||
EXPECT_EQ(0, curInterval.sum);
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
|
||||
EXPECT_EQ(4UL, valueProducer.mPastBuckets.begin()->second.size());
|
||||
EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
|
||||
EXPECT_EQ(12, valueProducer.mPastBuckets.begin()->second[1].mValue);
|
||||
EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[2].mValue);
|
||||
EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[3].mValue);
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
|
||||
EXPECT_EQ(12, valueProducer.mPastBuckets.begin()->second.back().mValue);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -582,9 +576,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition) {
|
||||
EXPECT_EQ(false, curInterval.startUpdated);
|
||||
EXPECT_EQ(1, curInterval.tainted);
|
||||
EXPECT_EQ(0, curInterval.sum);
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
|
||||
EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
|
||||
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
|
||||
|
||||
// Now the alarm is delivered.
|
||||
// since the condition turned to off before this pull finish, it has no effect
|
||||
@@ -601,9 +593,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition) {
|
||||
EXPECT_EQ(false, curInterval.startUpdated);
|
||||
EXPECT_EQ(1, curInterval.tainted);
|
||||
EXPECT_EQ(0, curInterval.sum);
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
|
||||
EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
|
||||
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -680,9 +670,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition2) {
|
||||
EXPECT_EQ(false, curInterval.startUpdated);
|
||||
EXPECT_EQ(1, curInterval.tainted);
|
||||
EXPECT_EQ(0, curInterval.sum);
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
|
||||
EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
|
||||
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
|
||||
|
||||
// condition changed to true again, before the pull alarm is delivered
|
||||
valueProducer.onConditionChanged(true, bucket2StartTimeNs + 25);
|
||||
@@ -691,9 +679,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition2) {
|
||||
EXPECT_EQ(130, curInterval.start);
|
||||
EXPECT_EQ(1, curInterval.tainted);
|
||||
EXPECT_EQ(0, curInterval.sum);
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
|
||||
EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
|
||||
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
|
||||
|
||||
// Now the alarm is delivered, but it is considered late, it has no effect
|
||||
vector<shared_ptr<LogEvent>> allData;
|
||||
@@ -710,9 +696,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition2) {
|
||||
EXPECT_EQ(130, curInterval.start);
|
||||
EXPECT_EQ(1, curInterval.tainted);
|
||||
EXPECT_EQ(0, curInterval.sum);
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
|
||||
EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
|
||||
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -779,9 +763,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition3) {
|
||||
EXPECT_EQ(false, curInterval.startUpdated);
|
||||
EXPECT_EQ(1, curInterval.tainted);
|
||||
EXPECT_EQ(0, curInterval.sum);
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
|
||||
EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
|
||||
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
|
||||
|
||||
// Alarm is delivered in time, but the pull is very slow, and pullers are called in order,
|
||||
// so this one comes even later
|
||||
@@ -798,9 +780,7 @@ TEST(ValueMetricProducerTest, TestBucketBoundaryWithCondition3) {
|
||||
EXPECT_EQ(false, curInterval.startUpdated);
|
||||
EXPECT_EQ(1, curInterval.tainted);
|
||||
EXPECT_EQ(0, curInterval.sum);
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.size());
|
||||
EXPECT_EQ(1UL, valueProducer.mPastBuckets.begin()->second.size());
|
||||
EXPECT_EQ(0, valueProducer.mPastBuckets.begin()->second[0].mValue);
|
||||
EXPECT_EQ(0UL, valueProducer.mPastBuckets.size());
|
||||
}
|
||||
|
||||
} // namespace statsd
|
||||
|
||||
Reference in New Issue
Block a user