From 0f6c1bcbc9a3310dbd8bce02951a7c38a1c3633e Mon Sep 17 00:00:00 2001 From: tsaichristine Date: Tue, 28 Apr 2020 10:42:25 -0700 Subject: [PATCH] StateTracker handles active state changes When a state change occurs, metrics should only make certain updates if the metric is active. This is already handled in CountMetricProducer and DurationMetricProducer. In ValueMetricProducer, we will return immediately if the metric is not active during a state change. Test: m statsd_test && adb sync data && adb shell data/nativetest/statsd_test/statsd_test Bug: b/153101724 Change-Id: Ib2a96600a0f1acec054638515d606716cf0ca6b6 --- cmds/statsd/src/metrics/ValueMetricProducer.cpp | 5 +++-- .../src/metrics/duration_helper/OringDurationTracker.cpp | 5 ++++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp index f03ce4550bc45..58a9a38b83d4f 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp +++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp @@ -187,8 +187,9 @@ void ValueMetricProducer::onStateChanged(int64_t eventTimeNs, int32_t atomId, VLOG("ValueMetric %lld onStateChanged time %lld, State %d, key %s, %d -> %d", (long long)mMetricId, (long long)eventTimeNs, atomId, primaryKey.toString().c_str(), oldState.mValue.int_value, newState.mValue.int_value); - // If condition is not true, we do not need to pull for this state change. - if (mCondition != ConditionState::kTrue) { + // If condition is not true or metric is not active, we do not need to pull + // for this state change. + if (mCondition != ConditionState::kTrue || !mIsActive) { return; } diff --git a/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp b/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp index 19b2fe89989d9..0d49bbc269a35 100644 --- a/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp +++ b/cmds/statsd/src/metrics/duration_helper/OringDurationTracker.cpp @@ -329,7 +329,10 @@ void OringDurationTracker::onConditionChanged(bool condition, const int64_t time void OringDurationTracker::onStateChanged(const int64_t timestamp, const int32_t atomId, const FieldValue& newState) { - // If no keys are being tracked, update the current state key and return. + // Nothing needs to be done on a state change if we have not seen a start + // event, the metric is currently not active, or condition is false. + // For these cases, no keys are being tracked in mStarted, so update + // the current state key and return. if (mStarted.empty()) { updateCurrentStateKey(atomId, newState); return;