diff options
author | Chenjie Yu <cjyu@google.com> | 2019-02-04 17:25:45 -0800 |
---|---|---|
committer | Chenjie Yu <cjyu@google.com> | 2019-02-06 09:54:38 -0800 |
commit | c7939cba3d857b8688d79d5f4a6ba58920cedb1b (patch) | |
tree | 6c9b0f13726e5d551378445e61762a057ed82eb4 /cmds/statsd/src/metrics/MetricsManager.cpp | |
parent | d8a309221cb002ce1c87cedea274b34e38a90207 (diff) |
Persist active metrics to disk and read back
For metric activation that spans across boots, we need to persist active
metrics onto disk upon shutdown and load them on boot.
Bug: 123904359
Test: unit test
Change-Id: I5a4142a42595c8c132175fb574c3aa2ad30dcac0
Diffstat (limited to 'cmds/statsd/src/metrics/MetricsManager.cpp')
-rw-r--r-- | cmds/statsd/src/metrics/MetricsManager.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp index dd969c0e9c20..ca681176c54a 100644 --- a/cmds/statsd/src/metrics/MetricsManager.cpp +++ b/cmds/statsd/src/metrics/MetricsManager.cpp @@ -122,6 +122,13 @@ MetricsManager::MetricsManager(const ConfigKey& key, const StatsdConfig& config, StatsdStats::getInstance().noteConfigReceived( key, mAllMetricProducers.size(), mAllConditionTrackers.size(), mAllAtomMatchers.size(), mAllAnomalyTrackers.size(), mAnnotations, mConfigValid); + // Check active + for (const auto& metric : mAllMetricProducers) { + if (metric->isActive()) { + mIsActive = true; + break; + } + } } MetricsManager::~MetricsManager() { @@ -304,8 +311,10 @@ void MetricsManager::onLogEvent(const LogEvent& event) { int tagId = event.GetTagId(); int64_t eventTimeNs = event.GetElapsedTimestampNs(); + bool isActive = false; for (int metric : mMetricIndexesWithActivation) { mAllMetricProducers[metric]->flushIfExpire(eventTimeNs); + isActive |= mAllMetricProducers[metric]->isActive(); } if (mTagIds.find(tagId) == mTagIds.end()) { @@ -323,10 +332,13 @@ void MetricsManager::onLogEvent(const LogEvent& event) { if (matcherCache[it.first] == MatchingState::kMatched) { for (int metricIndex : it.second) { mAllMetricProducers[metricIndex]->activate(it.first, eventTimeNs); + isActive |= mAllMetricProducers[metricIndex]->isActive(); } } } + mIsActive = isActive; + // A bitmap to see which ConditionTracker needs to be re-evaluated. vector<bool> conditionToBeEvaluated(mAllConditionTrackers.size(), false); @@ -418,6 +430,25 @@ size_t MetricsManager::byteSize() { return totalSize; } +void MetricsManager::setActiveMetrics(ActiveConfig config, int64_t currentTimeNs) { + if (config.active_metric_size() == 0) { + ALOGW("No active metric for config %s", mConfigKey.ToString().c_str()); + return; + } + + for (int i = 0; i < config.active_metric_size(); i++) { + for (int metric : mMetricIndexesWithActivation) { + if (mAllMetricProducers[metric]->getMetricId() == config.active_metric(i).metric_id()) { + VLOG("Setting active metric: %lld", + (long long)mAllMetricProducers[metric]->getMetricId()); + mAllMetricProducers[metric]->setActive( + currentTimeNs, config.active_metric(i).time_to_live_nanos()); + mIsActive = true; + } + } + } +} + } // namespace statsd } // namespace os } // namespace android |