diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp index ae1ef21e553cb..6eff639aca920 100644 --- a/cmds/statsd/src/StatsLogProcessor.cpp +++ b/cmds/statsd/src/StatsLogProcessor.cpp @@ -549,9 +549,7 @@ void StatsLogProcessor::OnConfigUpdatedLocked(const int64_t timestampNs, const C configValid = it->second->updateConfig(config, mTimeBaseNs, timestampNs, mAnomalyAlarmMonitor, mPeriodicAlarmMonitor); if (configValid) { - // TODO(b/162323476): refresh TTL, ensure init() is handled properly. mUidMap->OnConfigUpdated(key); - } } if (!configValid) { diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp index 3b6e10b030fb9..f9b0a1030eeee 100644 --- a/cmds/statsd/src/metrics/MetricsManager.cpp +++ b/cmds/statsd/src/metrics/MetricsManager.cpp @@ -97,40 +97,8 @@ MetricsManager::MetricsManager(const ConfigKey& key, const StatsdConfig& config, for (const auto& annotation : config.annotation()) { mAnnotations.emplace_back(annotation.field_int64(), annotation.field_int32()); } - - // Guardrail. Reject the config if it's too big. - if (mAllMetricProducers.size() > StatsdStats::kMaxMetricCountPerConfig || - mAllConditionTrackers.size() > StatsdStats::kMaxConditionCountPerConfig || - mAllAtomMatchingTrackers.size() > StatsdStats::kMaxMatcherCountPerConfig) { - ALOGE("This config is too big! Reject!"); - mConfigValid = false; - } - if (mAllAnomalyTrackers.size() > StatsdStats::kMaxAlertCountPerConfig) { - ALOGE("This config has too many alerts! Reject!"); - mConfigValid = false; - } - - mIsAlwaysActive = (mMetricIndexesWithActivation.size() != mAllMetricProducers.size()) || - (mAllMetricProducers.size() == 0); - bool isActive = mIsAlwaysActive; - for (int metric : mMetricIndexesWithActivation) { - isActive |= mAllMetricProducers[metric]->isActive(); - } - mIsActive = isActive; - VLOG("mIsActive is initialized to %d", mIsActive) - - // no matter whether this config is valid, log it in the stats. - StatsdStats::getInstance().noteConfigReceived( - key, mAllMetricProducers.size(), mAllConditionTrackers.size(), - mAllAtomMatchingTrackers.size(), mAllAnomalyTrackers.size(), mAnnotations, - mConfigValid); - // Check active - for (const auto& metric : mAllMetricProducers) { - if (metric->isActive()) { - mIsActive = true; - break; - } - } + verifyGuardrailsAndUpdateStatsdStats(); + initializeConfigActiveStatus(); } MetricsManager::~MetricsManager() { @@ -211,6 +179,9 @@ bool MetricsManager::updateConfig(const StatsdConfig& config, const int64_t time mPullAtomUids.clear(); mPullAtomPackages.clear(); createAllLogSourcesFromConfig(config); + + verifyGuardrailsAndUpdateStatsdStats(); + initializeConfigActiveStatus(); return mConfigValid; } @@ -272,6 +243,35 @@ void MetricsManager::createAllLogSourcesFromConfig(const StatsdConfig& config) { } } +void MetricsManager::verifyGuardrailsAndUpdateStatsdStats() { + // Guardrail. Reject the config if it's too big. + if (mAllMetricProducers.size() > StatsdStats::kMaxMetricCountPerConfig || + mAllConditionTrackers.size() > StatsdStats::kMaxConditionCountPerConfig || + mAllAtomMatchingTrackers.size() > StatsdStats::kMaxMatcherCountPerConfig) { + ALOGE("This config is too big! Reject!"); + mConfigValid = false; + } + if (mAllAnomalyTrackers.size() > StatsdStats::kMaxAlertCountPerConfig) { + ALOGE("This config has too many alerts! Reject!"); + mConfigValid = false; + } + // no matter whether this config is valid, log it in the stats. + StatsdStats::getInstance().noteConfigReceived( + mConfigKey, mAllMetricProducers.size(), mAllConditionTrackers.size(), + mAllAtomMatchingTrackers.size(), mAllAnomalyTrackers.size(), mAnnotations, + mConfigValid); +} + +void MetricsManager::initializeConfigActiveStatus() { + mIsAlwaysActive = (mMetricIndexesWithActivation.size() != mAllMetricProducers.size()) || + (mAllMetricProducers.size() == 0); + mIsActive = mIsAlwaysActive; + for (int metric : mMetricIndexesWithActivation) { + mIsActive |= mAllMetricProducers[metric]->isActive(); + } + VLOG("mIsActive is initialized to %d", mIsActive); +} + void MetricsManager::initAllowedLogSources() { std::lock_guard lock(mAllowedLogSourcesMutex); mAllowedLogSources.clear(); diff --git a/cmds/statsd/src/metrics/MetricsManager.h b/cmds/statsd/src/metrics/MetricsManager.h index 98d4bff1cd76a..3c9ecdb46fd2c 100644 --- a/cmds/statsd/src/metrics/MetricsManager.h +++ b/cmds/statsd/src/metrics/MetricsManager.h @@ -292,6 +292,14 @@ private: // Calls initAllowedLogSources and initPullAtomSources. Sets mConfigValid to false on error. void createAllLogSourcesFromConfig(const StatsdConfig& config); + // Verifies the config meets guardrails and updates statsdStats. + // Sets mConfigValid to false on error. Should be called on config creation/update + void verifyGuardrailsAndUpdateStatsdStats(); + + // Initializes mIsAlwaysActive and mIsActive. + // Should be called on config creation/update. + void initializeConfigActiveStatus(); + // The metrics that don't need to be uploaded or even reported. std::set mNoReportMetricIds; diff --git a/cmds/statsd/src/metrics/parsing_utils/config_update_utils.cpp b/cmds/statsd/src/metrics/parsing_utils/config_update_utils.cpp index af9606bc15f93..0699ec01d66e6 100644 --- a/cmds/statsd/src/metrics/parsing_utils/config_update_utils.cpp +++ b/cmds/statsd/src/metrics/parsing_utils/config_update_utils.cpp @@ -895,6 +895,12 @@ bool updateMetrics(const ConfigKey& key, const StatsdConfig& config, const int64 } } + // Init new/replaced metrics. + for (size_t i = 0; i < newMetricProducers.size(); i++) { + if (metricsToUpdate[i] == UPDATE_REPLACE || metricsToUpdate[i] == UPDATE_NEW) { + newMetricProducers[i]->prepareFirstBucket(); + } + } return true; }