diff options
| -rw-r--r-- | cmds/statsd/src/StatsLogProcessor.cpp | 4 | ||||
| -rw-r--r-- | cmds/statsd/src/StatsLogProcessor.h | 1 | ||||
| -rw-r--r-- | cmds/statsd/src/metrics/CountMetricProducer.cpp | 5 | ||||
| -rw-r--r-- | cmds/statsd/src/metrics/CountMetricProducer.h | 2 | ||||
| -rw-r--r-- | cmds/statsd/src/metrics/DurationMetricProducer.cpp | 5 | ||||
| -rw-r--r-- | cmds/statsd/src/metrics/DurationMetricProducer.h | 2 | ||||
| -rw-r--r-- | cmds/statsd/src/metrics/EventMetricProducer.cpp | 4 | ||||
| -rw-r--r-- | cmds/statsd/src/metrics/EventMetricProducer.h | 2 | ||||
| -rw-r--r-- | cmds/statsd/src/metrics/GaugeMetricProducer.cpp | 5 | ||||
| -rw-r--r-- | cmds/statsd/src/metrics/GaugeMetricProducer.h | 2 | ||||
| -rw-r--r-- | cmds/statsd/src/metrics/MetricProducer.h | 11 | ||||
| -rw-r--r-- | cmds/statsd/src/metrics/MetricsManager.cpp | 6 | ||||
| -rw-r--r-- | cmds/statsd/src/metrics/MetricsManager.h | 2 | ||||
| -rw-r--r-- | cmds/statsd/src/metrics/ValueMetricProducer.cpp | 5 | ||||
| -rw-r--r-- | cmds/statsd/src/metrics/ValueMetricProducer.h | 2 | ||||
| -rw-r--r-- | cmds/statsd/tests/StatsLogProcessor_test.cpp | 5 |
16 files changed, 56 insertions, 7 deletions
diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp index 9b58a14de0be..e98b54da5098 100644 --- a/cmds/statsd/src/StatsLogProcessor.cpp +++ b/cmds/statsd/src/StatsLogProcessor.cpp @@ -330,9 +330,7 @@ void StatsLogProcessor::flushIfNecessaryLocked( mLastByteSizeTimes[key] = timestampNs; if (totalBytes > StatsdStats::kMaxMetricsBytesPerConfig) { // Too late. We need to start clearing data. - // TODO(b/70571383): By 12/15/2017 add API to drop data directly - ProtoOutputStream proto; - metricsManager.onDumpReport(timestampNs, &proto); + metricsManager.dropData(timestampNs); StatsdStats::getInstance().noteDataDropped(key); VLOG("StatsD had to toss out metrics for %s", key.ToString().c_str()); } else if (totalBytes > .9 * StatsdStats::kMaxMetricsBytesPerConfig) { diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h index 7a6aa1e26dc3..a672ab4fb314 100644 --- a/cmds/statsd/src/StatsLogProcessor.h +++ b/cmds/statsd/src/StatsLogProcessor.h @@ -113,7 +113,6 @@ private: FRIEND_TEST(StatsLogProcessorTest, TestRateLimitByteSize); FRIEND_TEST(StatsLogProcessorTest, TestRateLimitBroadcast); FRIEND_TEST(StatsLogProcessorTest, TestDropWhenByteSizeTooLarge); - FRIEND_TEST(StatsLogProcessorTest, TestDropWhenByteSizeTooLarge); FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration1); FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration2); FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration3); diff --git a/cmds/statsd/src/metrics/CountMetricProducer.cpp b/cmds/statsd/src/metrics/CountMetricProducer.cpp index af2e362368c3..671c57f13e8a 100644 --- a/cmds/statsd/src/metrics/CountMetricProducer.cpp +++ b/cmds/statsd/src/metrics/CountMetricProducer.cpp @@ -151,8 +151,11 @@ void CountMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs, protoOutput->end(protoToken); mPastBuckets.clear(); +} - // TODO: Clear mDimensionKeyMap once the report is dumped. +void CountMetricProducer::dropDataLocked(const uint64_t dropTimeNs) { + flushIfNeededLocked(dropTimeNs); + mPastBuckets.clear(); } void CountMetricProducer::onConditionChangedLocked(const bool conditionMet, diff --git a/cmds/statsd/src/metrics/CountMetricProducer.h b/cmds/statsd/src/metrics/CountMetricProducer.h index 0c4291d5dfc2..1d8e42be635c 100644 --- a/cmds/statsd/src/metrics/CountMetricProducer.h +++ b/cmds/statsd/src/metrics/CountMetricProducer.h @@ -69,6 +69,8 @@ private: void dumpStatesLocked(FILE* out, bool verbose) const override{}; + void dropDataLocked(const uint64_t dropTimeNs) override; + // Util function to flush the old packet. void flushIfNeededLocked(const uint64_t& newEventTime) override; diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.cpp b/cmds/statsd/src/metrics/DurationMetricProducer.cpp index 80329c3a8a42..ac39662070d9 100644 --- a/cmds/statsd/src/metrics/DurationMetricProducer.cpp +++ b/cmds/statsd/src/metrics/DurationMetricProducer.cpp @@ -221,6 +221,11 @@ void DurationMetricProducer::onConditionChangedLocked(const bool conditionMet, } } +void DurationMetricProducer::dropDataLocked(const uint64_t dropTimeNs) { + flushIfNeededLocked(dropTimeNs); + mPastBuckets.clear(); +} + void DurationMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs, ProtoOutputStream* protoOutput) { flushIfNeededLocked(dumpTimeNs); diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.h b/cmds/statsd/src/metrics/DurationMetricProducer.h index 73d074f1a2ce..23408a76998e 100644 --- a/cmds/statsd/src/metrics/DurationMetricProducer.h +++ b/cmds/statsd/src/metrics/DurationMetricProducer.h @@ -74,6 +74,8 @@ private: void dumpStatesLocked(FILE* out, bool verbose) const override; + void dropDataLocked(const uint64_t dropTimeNs) override; + // Util function to flush the old packet. void flushIfNeededLocked(const uint64_t& eventTime); diff --git a/cmds/statsd/src/metrics/EventMetricProducer.cpp b/cmds/statsd/src/metrics/EventMetricProducer.cpp index 96d0cfcc5897..fff91f67241c 100644 --- a/cmds/statsd/src/metrics/EventMetricProducer.cpp +++ b/cmds/statsd/src/metrics/EventMetricProducer.cpp @@ -75,6 +75,10 @@ EventMetricProducer::~EventMetricProducer() { VLOG("~EventMetricProducer() called"); } +void EventMetricProducer::dropDataLocked(const uint64_t dropTimeNs) { + mProto->clear(); +} + void EventMetricProducer::onSlicedConditionMayChangeLocked(const uint64_t eventTime) { } diff --git a/cmds/statsd/src/metrics/EventMetricProducer.h b/cmds/statsd/src/metrics/EventMetricProducer.h index 3f2c5a54e022..d6f81fda6ff6 100644 --- a/cmds/statsd/src/metrics/EventMetricProducer.h +++ b/cmds/statsd/src/metrics/EventMetricProducer.h @@ -55,6 +55,8 @@ private: // Internal interface to handle sliced condition change. void onSlicedConditionMayChangeLocked(const uint64_t eventTime) override; + void dropDataLocked(const uint64_t dropTimeNs) override; + // Internal function to calculate the current used bytes. size_t byteSizeLocked() const override; diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp index 7d09ff9ffc8e..000c7a77d2a3 100644 --- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp +++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp @@ -353,6 +353,11 @@ void GaugeMetricProducer::updateCurrentSlicedBucketForAnomaly() { } } +void GaugeMetricProducer::dropDataLocked(const uint64_t dropTimeNs) { + flushIfNeededLocked(dropTimeNs); + mPastBuckets.clear(); +} + // When a new matched event comes in, we check if event falls into the current // bucket. If not, flush the old counter to past buckets and initialize the new // bucket. diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.h b/cmds/statsd/src/metrics/GaugeMetricProducer.h index c3ae6ce921d2..ca8dc7582680 100644 --- a/cmds/statsd/src/metrics/GaugeMetricProducer.h +++ b/cmds/statsd/src/metrics/GaugeMetricProducer.h @@ -108,6 +108,8 @@ private: void dumpStatesLocked(FILE* out, bool verbose) const override{}; + void dropDataLocked(const uint64_t dropTimeNs) override; + // Util function to flush the old packet. void flushIfNeededLocked(const uint64_t& eventTime) override; diff --git a/cmds/statsd/src/metrics/MetricProducer.h b/cmds/statsd/src/metrics/MetricProducer.h index 2bf624160475..05b7f8766983 100644 --- a/cmds/statsd/src/metrics/MetricProducer.h +++ b/cmds/statsd/src/metrics/MetricProducer.h @@ -148,6 +148,15 @@ public: return mMetricId; } + // Let MetricProducer drop in-memory data to save memory. + // We still need to keep future data valid and anomaly tracking work, which means we will + // have to flush old data, informing anomaly trackers then safely drop old data. + // We still keep current bucket data for future metrics' validity. + void dropData(const uint64_t dropTimeNs) { + std::lock_guard<std::mutex> lock(mMutex); + dropDataLocked(dropTimeNs); + } + protected: virtual void onConditionChangedLocked(const bool condition, const uint64_t eventTime) = 0; virtual void onSlicedConditionMayChangeLocked(const uint64_t eventTime) = 0; @@ -179,6 +188,8 @@ protected: return mStartTimeNs + (mCurrentBucketNum + 1) * mBucketSizeNs; } + virtual void dropDataLocked(const uint64_t dropTimeNs) = 0; + const int64_t mMetricId; const ConfigKey mConfigKey; diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp index 4c8a7d8a92d5..06930310bc3f 100644 --- a/cmds/statsd/src/metrics/MetricsManager.cpp +++ b/cmds/statsd/src/metrics/MetricsManager.cpp @@ -173,6 +173,12 @@ void MetricsManager::dumpStates(FILE* out, bool verbose) { } } +void MetricsManager::dropData(const uint64_t dropTimeNs) { + for (const auto& producer : mAllMetricProducers) { + producer->dropData(dropTimeNs); + } +} + void MetricsManager::onDumpReport(const uint64_t dumpTimeStampNs, ProtoOutputStream* protoOutput) { VLOG("=========================Metric Reports Start=========================="); // one StatsLogReport per MetricProduer diff --git a/cmds/statsd/src/metrics/MetricsManager.h b/cmds/statsd/src/metrics/MetricsManager.h index b50ef4a0c5a2..a32e037b5acd 100644 --- a/cmds/statsd/src/metrics/MetricsManager.h +++ b/cmds/statsd/src/metrics/MetricsManager.h @@ -73,6 +73,8 @@ public: return mLastReportTimeNs; }; + virtual void dropData(const uint64_t dropTimeNs); + // Config source owner can call onDumpReport() to get all the metrics collected. virtual void onDumpReport(const uint64_t dumpTimeNs, android::util::ProtoOutputStream* protoOutput); diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp index 35fcdc48a08a..f6bba3d9bb0d 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp +++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp @@ -129,6 +129,11 @@ void ValueMetricProducer::onSlicedConditionMayChangeLocked(const uint64_t eventT VLOG("Metric %lld onSlicedConditionMayChange", (long long)mMetricId); } +void ValueMetricProducer::dropDataLocked(const uint64_t dropTimeNs) { + flushIfNeededLocked(dropTimeNs); + mPastBuckets.clear(); +} + void ValueMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs, ProtoOutputStream* protoOutput) { VLOG("metric %lld dump report now...", (long long)mMetricId); diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.h b/cmds/statsd/src/metrics/ValueMetricProducer.h index b518f2f841cf..5e42bd255df4 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.h +++ b/cmds/statsd/src/metrics/ValueMetricProducer.h @@ -106,6 +106,8 @@ private: void flushCurrentBucketLocked(const uint64_t& eventTimeNs) override; + void dropDataLocked(const uint64_t dropTimeNs) override; + const FieldMatcher mValueField; std::shared_ptr<StatsPullerManager> mStatsPullerManager; diff --git a/cmds/statsd/tests/StatsLogProcessor_test.cpp b/cmds/statsd/tests/StatsLogProcessor_test.cpp index 3238b74fb635..efed42e2613c 100644 --- a/cmds/statsd/tests/StatsLogProcessor_test.cpp +++ b/cmds/statsd/tests/StatsLogProcessor_test.cpp @@ -51,7 +51,8 @@ public: } MOCK_METHOD0(byteSize, size_t()); - MOCK_METHOD2(onDumpReport, void(const uint64_t timeNs, ProtoOutputStream* output)); + + MOCK_METHOD1(dropData, void(const uint64_t dropTimeNs)); }; TEST(StatsLogProcessorTest, TestRateLimitByteSize) { @@ -114,7 +115,7 @@ TEST(StatsLogProcessorTest, TestDropWhenByteSizeTooLarge) { .Times(1) .WillRepeatedly(Return(int(StatsdStats::kMaxMetricsBytesPerConfig * 1.2))); - EXPECT_CALL(mockMetricsManager, onDumpReport(_, _)).Times(1); + EXPECT_CALL(mockMetricsManager, dropData(_)).Times(1); // Expect to call the onDumpReport and skip the broadcast. p.flushIfNecessaryLocked(1, key, mockMetricsManager); |