From 320952bf7d09a05bc196917bf045b08b9bbfe701 Mon Sep 17 00:00:00 2001 From: Olivier Gaillard Date: Wed, 6 Feb 2019 13:57:24 +0000 Subject: [PATCH] Track the number of buckets dropped. Test: atest statsd_test Change-Id: I56973d2c87aaed0f1c4a6908682cc54cda39eceb --- cmds/statsd/src/guardrail/StatsdStats.cpp | 5 +++++ cmds/statsd/src/guardrail/StatsdStats.h | 6 ++++++ cmds/statsd/src/metrics/CountMetricProducer.cpp | 1 + cmds/statsd/src/metrics/DurationMetricProducer.cpp | 1 + cmds/statsd/src/metrics/EventMetricProducer.cpp | 1 + cmds/statsd/src/metrics/GaugeMetricProducer.cpp | 1 + cmds/statsd/src/metrics/ValueMetricProducer.cpp | 1 + cmds/statsd/src/stats_log.proto | 1 + cmds/statsd/src/stats_log_util.cpp | 3 +++ 9 files changed, 20 insertions(+) diff --git a/cmds/statsd/src/guardrail/StatsdStats.cpp b/cmds/statsd/src/guardrail/StatsdStats.cpp index a5bd5c6b63643..37d5ba0e6801f 100644 --- a/cmds/statsd/src/guardrail/StatsdStats.cpp +++ b/cmds/statsd/src/guardrail/StatsdStats.cpp @@ -443,6 +443,11 @@ void StatsdStats::noteBadValueType(int metricId) { getAtomMetricStats(metricId).badValueType++; } +void StatsdStats::noteBucketDropped(int metricId) { + lock_guard lock(mLock); + getAtomMetricStats(metricId).bucketDropped++; +} + void StatsdStats::noteConditionChangeInNextBucket(int metricId) { lock_guard lock(mLock); getAtomMetricStats(metricId).conditionChangeInNextBucket++; diff --git a/cmds/statsd/src/guardrail/StatsdStats.h b/cmds/statsd/src/guardrail/StatsdStats.h index cb17061c1ed1a..20ea7e5df1fae 100644 --- a/cmds/statsd/src/guardrail/StatsdStats.h +++ b/cmds/statsd/src/guardrail/StatsdStats.h @@ -359,6 +359,11 @@ public: */ void noteBadValueType(int atomId); + /** + * Buckets were dropped due to reclaim memory. + */ + void noteBucketDropped(int metricId); + /** * A condition change was too late, arrived in the wrong bucket and was skipped */ @@ -414,6 +419,7 @@ public: long badValueType = 0; long conditionChangeInNextBucket = 0; long invalidatedBucket = 0; + long bucketDropped = 0; } AtomMetricStats; private: diff --git a/cmds/statsd/src/metrics/CountMetricProducer.cpp b/cmds/statsd/src/metrics/CountMetricProducer.cpp index 7cc57c12063c9..350745b2c326e 100644 --- a/cmds/statsd/src/metrics/CountMetricProducer.cpp +++ b/cmds/statsd/src/metrics/CountMetricProducer.cpp @@ -243,6 +243,7 @@ void CountMetricProducer::onDumpReportLocked(const int64_t dumpTimeNs, void CountMetricProducer::dropDataLocked(const int64_t dropTimeNs) { flushIfNeededLocked(dropTimeNs); + StatsdStats::getInstance().noteBucketDropped(mMetricId); mPastBuckets.clear(); } diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.cpp b/cmds/statsd/src/metrics/DurationMetricProducer.cpp index 69bafc354643b..6c1c47bbc0939 100644 --- a/cmds/statsd/src/metrics/DurationMetricProducer.cpp +++ b/cmds/statsd/src/metrics/DurationMetricProducer.cpp @@ -444,6 +444,7 @@ void DurationMetricProducer::onConditionChangedLocked(const bool conditionMet, void DurationMetricProducer::dropDataLocked(const int64_t dropTimeNs) { flushIfNeededLocked(dropTimeNs); + StatsdStats::getInstance().noteBucketDropped(mMetricId); mPastBuckets.clear(); } diff --git a/cmds/statsd/src/metrics/EventMetricProducer.cpp b/cmds/statsd/src/metrics/EventMetricProducer.cpp index c53c4ce5e0d6d..7e695a69988f9 100644 --- a/cmds/statsd/src/metrics/EventMetricProducer.cpp +++ b/cmds/statsd/src/metrics/EventMetricProducer.cpp @@ -77,6 +77,7 @@ EventMetricProducer::~EventMetricProducer() { void EventMetricProducer::dropDataLocked(const int64_t dropTimeNs) { mProto->clear(); + StatsdStats::getInstance().noteBucketDropped(mMetricId); } void EventMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition, diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp index c9b71659aa583..2609937924ac9 100644 --- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp +++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp @@ -510,6 +510,7 @@ void GaugeMetricProducer::updateCurrentSlicedBucketForAnomaly() { void GaugeMetricProducer::dropDataLocked(const int64_t dropTimeNs) { flushIfNeededLocked(dropTimeNs); + StatsdStats::getInstance().noteBucketDropped(mMetricId); mPastBuckets.clear(); } diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp index 9fb78e780870c..d52c9ef281324 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp +++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp @@ -175,6 +175,7 @@ void ValueMetricProducer::onSlicedConditionMayChangeLocked(bool overallCondition void ValueMetricProducer::dropDataLocked(const int64_t dropTimeNs) { flushIfNeededLocked(dropTimeNs); + StatsdStats::getInstance().noteBucketDropped(mMetricId); mPastBuckets.clear(); } diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto index 5b9148283bdc9..73aab4847e11e 100644 --- a/cmds/statsd/src/stats_log.proto +++ b/cmds/statsd/src/stats_log.proto @@ -418,6 +418,7 @@ message StatsdStatsReport { optional int64 bad_value_type = 5; optional int64 condition_change_in_next_bucket = 6; optional int64 invalidated_bucket = 7; + optional int64 bucket_dropped = 8; } repeated AtomMetricStats atom_metric_stats = 17; diff --git a/cmds/statsd/src/stats_log_util.cpp b/cmds/statsd/src/stats_log_util.cpp index 3cb7563b206bf..f76a9ad78396c 100644 --- a/cmds/statsd/src/stats_log_util.cpp +++ b/cmds/statsd/src/stats_log_util.cpp @@ -79,6 +79,7 @@ const int FIELD_ID_SKIPPED_FORWARD_BUCKETS = 4; const int FIELD_ID_BAD_VALUE_TYPE = 5; const int FIELD_ID_CONDITION_CHANGE_IN_NEXT_BUCKET = 6; const int FIELD_ID_INVALIDATED_BUCKET = 7; +const int FIELD_ID_BUCKET_DROPPED = 8; namespace { @@ -497,6 +498,8 @@ void writeAtomMetricStatsToStream(const std::pairwrite(FIELD_TYPE_INT64 | FIELD_ID_INVALIDATED_BUCKET, (long long)pair.second.invalidatedBucket); + protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_BUCKET_DROPPED, + (long long)pair.second.bucketDropped); protoOutput->end(token); }