Loading cmds/statsd/src/metrics/parsing_utils/config_update_utils.cpp +73 −33 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,8 @@ #include "matchers/EventMatcherWizard.h" #include "matchers/EventMatcherWizard.h" #include "metrics_manager_util.h" #include "metrics_manager_util.h" using google::protobuf::MessageLite; namespace android { namespace android { namespace os { namespace os { namespace statsd { namespace statsd { Loading Loading @@ -419,16 +421,19 @@ bool metricActivationDepsChange(const StatsdConfig& config, return false; return false; } } bool determineEventMetricUpdateStatus(const StatsdConfig& config, const EventMetric& metric, bool determineMetricUpdateStatus( const StatsdConfig& config, const MessageLite& metric, const int64_t metricId, const MetricType metricType, const set<int64_t>& matcherDependencies, const set<int64_t>& conditionDependencies, const ::google::protobuf::RepeatedField<int64_t>& stateDependencies, const ::google::protobuf::RepeatedPtrField<MetricConditionLink>& conditionLinks, const unordered_map<int64_t, int>& oldMetricProducerMap, const unordered_map<int64_t, int>& oldMetricProducerMap, const vector<sp<MetricProducer>>& oldMetricProducers, const vector<sp<MetricProducer>>& oldMetricProducers, const unordered_map<int64_t, int>& metricToActivationMap, const unordered_map<int64_t, int>& metricToActivationMap, const set<int64_t>& replacedMatchers, const set<int64_t>& replacedMatchers, const set<int64_t>& replacedConditions, const set<int64_t>& replacedConditions, const set<int64_t>& replacedStates, UpdateStatus& updateStatus) { UpdateStatus& updateStatus) { int64_t id = metric.id(); // Check if new metric // Check if new metric const auto& oldMetricProducerIt = oldMetricProducerMap.find(id); const auto& oldMetricProducerIt = oldMetricProducerMap.find(metricId); if (oldMetricProducerIt == oldMetricProducerMap.end()) { if (oldMetricProducerIt == oldMetricProducerMap.end()) { updateStatus = UPDATE_NEW; updateStatus = UPDATE_NEW; return true; return true; Loading @@ -436,44 +441,85 @@ bool determineEventMetricUpdateStatus(const StatsdConfig& config, const EventMet // This is an existing metric, check if it has changed. // This is an existing metric, check if it has changed. uint64_t metricHash; uint64_t metricHash; if (!getMetricProtoHash(config, metric, id, metricToActivationMap, metricHash)) { if (!getMetricProtoHash(config, metric, metricId, metricToActivationMap, metricHash)) { return false; return false; } } const sp<MetricProducer> oldMetricProducer = oldMetricProducers[oldMetricProducerIt->second]; const sp<MetricProducer> oldMetricProducer = oldMetricProducers[oldMetricProducerIt->second]; if (oldMetricProducer->getMetricType() != METRIC_TYPE_EVENT || if (oldMetricProducer->getMetricType() != metricType || oldMetricProducer->getProtoHash() != metricHash) { oldMetricProducer->getProtoHash() != metricHash) { updateStatus = UPDATE_REPLACE; updateStatus = UPDATE_REPLACE; return true; return true; } } // Metric type and definition are the same. Need to check dependencies to see if they changed. // Take intersections of the matchers/predicates/states that the metric if (replacedMatchers.find(metric.what()) != replacedMatchers.end()) { // depends on with those that have been replaced. If a metric depends on any // replaced component, it too must be replaced. set<int64_t> intersection; set_intersection(matcherDependencies.begin(), matcherDependencies.end(), replacedMatchers.begin(), replacedMatchers.end(), inserter(intersection, intersection.begin())); if (intersection.size() > 0) { updateStatus = UPDATE_REPLACE; updateStatus = UPDATE_REPLACE; return true; return true; } } set_intersection(conditionDependencies.begin(), conditionDependencies.end(), if (metric.has_condition()) { replacedConditions.begin(), replacedConditions.end(), if (replacedConditions.find(metric.condition()) != replacedConditions.end()) { inserter(intersection, intersection.begin())); if (intersection.size() > 0) { updateStatus = UPDATE_REPLACE; updateStatus = UPDATE_REPLACE; return true; return true; } } } set_intersection(stateDependencies.begin(), stateDependencies.end(), replacedStates.begin(), replacedStates.end(), inserter(intersection, intersection.begin())); if (metricActivationDepsChange(config, metricToActivationMap, id, replacedMatchers)) { if (intersection.size() > 0) { updateStatus = UPDATE_REPLACE; updateStatus = UPDATE_REPLACE; return true; return true; } } for (const auto& metricConditionLink : metric.links()) { for (const auto& metricConditionLink : conditionLinks) { if (replacedConditions.find(metricConditionLink.condition()) != replacedConditions.end()) { if (replacedConditions.find(metricConditionLink.condition()) != replacedConditions.end()) { updateStatus = UPDATE_REPLACE; updateStatus = UPDATE_REPLACE; return true; return true; } } } } if (metricActivationDepsChange(config, metricToActivationMap, metricId, replacedMatchers)) { updateStatus = UPDATE_REPLACE; return true; } updateStatus = UPDATE_PRESERVE; updateStatus = UPDATE_PRESERVE; return true; return true; } } bool determineAllMetricUpdateStatuses(const StatsdConfig& config, const unordered_map<int64_t, int>& oldMetricProducerMap, const vector<sp<MetricProducer>>& oldMetricProducers, const unordered_map<int64_t, int>& metricToActivationMap, const set<int64_t>& replacedMatchers, const set<int64_t>& replacedConditions, const set<int64_t>& replacedStates, vector<UpdateStatus>& metricsToUpdate) { int metricIndex = 0; for (int i = 0; i < config.event_metric_size(); i++, metricIndex++) { const EventMetric& metric = config.event_metric(i); set<int64_t> conditionDependencies; if (metric.has_condition()) { conditionDependencies.insert(metric.condition()); } if (!determineMetricUpdateStatus( config, metric, metric.id(), METRIC_TYPE_EVENT, {metric.what()}, conditionDependencies, ::google::protobuf::RepeatedField<int64_t>(), metric.links(), oldMetricProducerMap, oldMetricProducers, metricToActivationMap, replacedMatchers, replacedConditions, replacedStates, metricsToUpdate[metricIndex])) { return false; } } // TODO: determine update status for count, gauge, value, duration metrics. return true; } bool updateMetrics(const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs, bool updateMetrics(const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs, const int64_t currentTimeNs, const sp<StatsPullerManager>& pullerManager, const int64_t currentTimeNs, const sp<StatsPullerManager>& pullerManager, const unordered_map<int64_t, int>& oldAtomMatchingTrackerMap, const unordered_map<int64_t, int>& oldAtomMatchingTrackerMap, Loading Loading @@ -518,22 +564,16 @@ bool updateMetrics(const ConfigKey& key, const StatsdConfig& config, const int64 } } vector<UpdateStatus> metricsToUpdate(allMetricsCount, UPDATE_UNKNOWN); vector<UpdateStatus> metricsToUpdate(allMetricsCount, UPDATE_UNKNOWN); int metricIndex = 0; if (!determineAllMetricUpdateStatuses(config, oldMetricProducerMap, oldMetricProducers, for (int i = 0; i < config.event_metric_size(); i++, metricIndex++) { metricToActivationMap, replacedMatchers, newMetricProducerMap[config.event_metric(i).id()] = metricIndex; replacedConditions, replacedStates, metricsToUpdate)) { if (!determineEventMetricUpdateStatus(config, config.event_metric(i), oldMetricProducerMap, oldMetricProducers, metricToActivationMap, replacedMatchers, replacedConditions, metricsToUpdate[metricIndex])) { return false; return false; } } } // TODO: determine update status for count, gauge, value, duration metrics. // Now, perform the update. Must iterate the metric types in the same order // Now, perform the update. Must iterate the metric types in the same order metricIndex = 0; int metricIndex = 0; for (int i = 0; i < config.event_metric_size(); i++, metricIndex++) { for (int i = 0; i < config.event_metric_size(); i++, metricIndex++) { newMetricProducerMap[config.event_metric(i).id()] = metricIndex; const EventMetric& metric = config.event_metric(i); const EventMetric& metric = config.event_metric(i); switch (metricsToUpdate[metricIndex]) { switch (metricsToUpdate[metricIndex]) { case UPDATE_PRESERVE: { case UPDATE_PRESERVE: { Loading cmds/statsd/src/metrics/parsing_utils/config_update_utils.h +9 −7 Original line number Original line Diff line number Diff line Loading @@ -125,23 +125,25 @@ bool updateConditions(const ConfigKey& key, const StatsdConfig& config, std::vector<ConditionState>& conditionCache, std::vector<ConditionState>& conditionCache, std::set<int64_t>& replacedConditions); std::set<int64_t>& replacedConditions); // Function to determine if an event metric needs to be updated. Populates updateStatus. // Function to determine the update status (preserve/replace/new) of all metrics in the config. // [config]: the input StatsdConfig // [config]: the input StatsdConfig // [metric]: the current metric to be updated // [oldMetricProducerMap]: metric id to index mapping in the existing MetricsManager // [oldMetricProducerMap]: metric id to index mapping in the existing MetricsManager // [oldMetricProducers]: stores the existing MetricProducers // [oldMetricProducers]: stores the existing MetricProducers // [metricToActivationMap]: map from metric id to metric activation index. // [metricToActivationMap]: map from metric id to metric activation index // [replacedMatchers]: set of replaced matcher ids. conditions using these matchers must be replaced // [replacedMatchers]: set of replaced matcher ids. metrics using these matchers must be replaced // [replacedConditions]: set of replaced conditions. metrics using these conditions must be replaced // [replacedStates]: set of replaced state ids. metrics using these states must be replaced // output: // output: // [updateStatus]: update status for the metric. Will be changed from UPDATE_UNKNOWN after this call // [metricsToUpdate]: update status of each metric. Will be changed from UPDATE_UNKNOWN // Returns whether the function was successful or not. // Returns whether the function was successful or not. bool determineEventMetricUpdateStatus(const StatsdConfig& config, const EventMetric& metric, bool determineAllMetricUpdateStatuses(const StatsdConfig& config, const unordered_map<int64_t, int>& oldMetricProducerMap, const unordered_map<int64_t, int>& oldMetricProducerMap, const vector<sp<MetricProducer>>& oldMetricProducers, const vector<sp<MetricProducer>>& oldMetricProducers, const unordered_map<int64_t, int>& metricToActivationMap, const unordered_map<int64_t, int>& metricToActivationMap, const set<int64_t>& replacedMatchers, const set<int64_t>& replacedMatchers, const set<int64_t>& replacedConditions, const set<int64_t>& replacedConditions, UpdateStatus& updateStatus); const set<int64_t>& replacedStates, vector<UpdateStatus>& metricsToUpdate); // Update MetricProducers. // Update MetricProducers. // input: // input: Loading cmds/statsd/tests/metrics/parsing_utils/config_update_utils_test.cpp +36 −42 Original line number Original line Diff line number Diff line Loading @@ -920,14 +920,13 @@ TEST_F(ConfigUpdateTest, TestEventMetricPreserve) { // Create an initial config. // Create an initial config. EXPECT_TRUE(initConfig(config)); EXPECT_TRUE(initConfig(config)); set<int64_t> replacedMatchers; set<int64_t> replacedConditions; unordered_map<int64_t, int> metricToActivationMap; unordered_map<int64_t, int> metricToActivationMap; UpdateStatus status = UPDATE_UNKNOWN; vector<UpdateStatus> metricsToUpdate(1, UPDATE_UNKNOWN); EXPECT_TRUE(determineEventMetricUpdateStatus(config, *metric, oldMetricProducerMap, EXPECT_TRUE(determineAllMetricUpdateStatuses(config, oldMetricProducerMap, oldMetricProducers, oldMetricProducers, metricToActivationMap, metricToActivationMap, replacedMatchers, replacedConditions, status)); /*replacedMatchers*/ {}, /*replacedConditions=*/{}, EXPECT_EQ(status, UPDATE_PRESERVE); /*replacedStates=*/{}, metricsToUpdate)); EXPECT_EQ(metricsToUpdate[0], UPDATE_PRESERVE); } } TEST_F(ConfigUpdateTest, TestEventMetricActivationAdded) { TEST_F(ConfigUpdateTest, TestEventMetricActivationAdded) { Loading Loading @@ -957,14 +956,13 @@ TEST_F(ConfigUpdateTest, TestEventMetricActivationAdded) { eventActivation->set_atom_matcher_id(startMatcher.id()); eventActivation->set_atom_matcher_id(startMatcher.id()); eventActivation->set_ttl_seconds(5); eventActivation->set_ttl_seconds(5); set<int64_t> replacedMatchers; set<int64_t> replacedConditions; unordered_map<int64_t, int> metricToActivationMap = {{12345, 0}}; unordered_map<int64_t, int> metricToActivationMap = {{12345, 0}}; UpdateStatus status = UPDATE_UNKNOWN; vector<UpdateStatus> metricsToUpdate(1, UPDATE_UNKNOWN); EXPECT_TRUE(determineEventMetricUpdateStatus(config, *metric, oldMetricProducerMap, EXPECT_TRUE(determineAllMetricUpdateStatuses(config, oldMetricProducerMap, oldMetricProducers, oldMetricProducers, metricToActivationMap, metricToActivationMap, replacedMatchers, replacedConditions, status)); /*replacedMatchers*/ {}, /*replacedConditions=*/{}, EXPECT_EQ(status, UPDATE_REPLACE); /*replacedStates=*/{}, metricsToUpdate)); EXPECT_EQ(metricsToUpdate[0], UPDATE_REPLACE); } } TEST_F(ConfigUpdateTest, TestEventMetricWhatChanged) { TEST_F(ConfigUpdateTest, TestEventMetricWhatChanged) { Loading @@ -987,14 +985,13 @@ TEST_F(ConfigUpdateTest, TestEventMetricWhatChanged) { // Create an initial config. // Create an initial config. EXPECT_TRUE(initConfig(config)); EXPECT_TRUE(initConfig(config)); set<int64_t> replacedMatchers = {whatMatcher.id()}; set<int64_t> replacedConditions; unordered_map<int64_t, int> metricToActivationMap; unordered_map<int64_t, int> metricToActivationMap; UpdateStatus status = UPDATE_UNKNOWN; vector<UpdateStatus> metricsToUpdate(1, UPDATE_UNKNOWN); EXPECT_TRUE(determineEventMetricUpdateStatus(config, *metric, oldMetricProducerMap, EXPECT_TRUE(determineAllMetricUpdateStatuses( oldMetricProducers, metricToActivationMap, config, oldMetricProducerMap, oldMetricProducers, metricToActivationMap, replacedMatchers, replacedConditions, status)); /*replacedMatchers*/ {whatMatcher.id()}, /*replacedConditions=*/{}, EXPECT_EQ(status, UPDATE_REPLACE); /*replacedStates=*/{}, metricsToUpdate)); EXPECT_EQ(metricsToUpdate[0], UPDATE_REPLACE); } } TEST_F(ConfigUpdateTest, TestEventMetricConditionChanged) { TEST_F(ConfigUpdateTest, TestEventMetricConditionChanged) { Loading @@ -1017,14 +1014,13 @@ TEST_F(ConfigUpdateTest, TestEventMetricConditionChanged) { // Create an initial config. // Create an initial config. EXPECT_TRUE(initConfig(config)); EXPECT_TRUE(initConfig(config)); set<int64_t> replacedMatchers; set<int64_t> replacedConditions = {predicate.id()}; unordered_map<int64_t, int> metricToActivationMap; unordered_map<int64_t, int> metricToActivationMap; UpdateStatus status = UPDATE_UNKNOWN; vector<UpdateStatus> metricsToUpdate(1, UPDATE_UNKNOWN); EXPECT_TRUE(determineEventMetricUpdateStatus(config, *metric, oldMetricProducerMap, EXPECT_TRUE(determineAllMetricUpdateStatuses( oldMetricProducers, metricToActivationMap, config, oldMetricProducerMap, oldMetricProducers, metricToActivationMap, replacedMatchers, replacedConditions, status)); /*replacedMatchers*/ {}, /*replacedConditions=*/{predicate.id()}, EXPECT_EQ(status, UPDATE_REPLACE); /*replacedStates=*/{}, metricsToUpdate)); EXPECT_EQ(metricsToUpdate[0], UPDATE_REPLACE); } } TEST_F(ConfigUpdateTest, TestMetricConditionLinkDepsChanged) { TEST_F(ConfigUpdateTest, TestMetricConditionLinkDepsChanged) { Loading Loading @@ -1054,14 +1050,13 @@ TEST_F(ConfigUpdateTest, TestMetricConditionLinkDepsChanged) { // Create an initial config. // Create an initial config. EXPECT_TRUE(initConfig(config)); EXPECT_TRUE(initConfig(config)); set<int64_t> replacedMatchers; set<int64_t> replacedConditions = {linkPredicate.id()}; unordered_map<int64_t, int> metricToActivationMap; unordered_map<int64_t, int> metricToActivationMap; UpdateStatus status = UPDATE_UNKNOWN; vector<UpdateStatus> metricsToUpdate(1, UPDATE_UNKNOWN); EXPECT_TRUE(determineEventMetricUpdateStatus(config, *metric, oldMetricProducerMap, EXPECT_TRUE(determineAllMetricUpdateStatuses( oldMetricProducers, metricToActivationMap, config, oldMetricProducerMap, oldMetricProducers, metricToActivationMap, replacedMatchers, replacedConditions, status)); /*replacedMatchers*/ {}, /*replacedConditions=*/{linkPredicate.id()}, EXPECT_EQ(status, UPDATE_REPLACE); /*replacedStates=*/{}, metricsToUpdate)); EXPECT_EQ(metricsToUpdate[0], UPDATE_REPLACE); } } TEST_F(ConfigUpdateTest, TestEventMetricActivationDepsChange) { TEST_F(ConfigUpdateTest, TestEventMetricActivationDepsChange) { Loading Loading @@ -1090,14 +1085,13 @@ TEST_F(ConfigUpdateTest, TestEventMetricActivationDepsChange) { // Create an initial config. // Create an initial config. EXPECT_TRUE(initConfig(config)); EXPECT_TRUE(initConfig(config)); set<int64_t> replacedMatchers = {startMatcher.id()}; // The activation matcher is replaced. set<int64_t> replacedConditions; unordered_map<int64_t, int> metricToActivationMap = {{12345, 0}}; unordered_map<int64_t, int> metricToActivationMap = {{12345, 0}}; UpdateStatus status = UPDATE_UNKNOWN; vector<UpdateStatus> metricsToUpdate(1, UPDATE_UNKNOWN); EXPECT_TRUE(determineEventMetricUpdateStatus(config, *metric, oldMetricProducerMap, EXPECT_TRUE(determineAllMetricUpdateStatuses( oldMetricProducers, metricToActivationMap, config, oldMetricProducerMap, oldMetricProducers, metricToActivationMap, replacedMatchers, replacedConditions, status)); /*replacedMatchers*/ {startMatcher.id()}, /*replacedConditions=*/{}, EXPECT_EQ(status, UPDATE_REPLACE); /*replacedStates=*/{}, metricsToUpdate)); EXPECT_EQ(metricsToUpdate[0], UPDATE_REPLACE); } } TEST_F(ConfigUpdateTest, TestUpdateEventMetrics) { TEST_F(ConfigUpdateTest, TestUpdateEventMetrics) { Loading Loading
cmds/statsd/src/metrics/parsing_utils/config_update_utils.cpp +73 −33 Original line number Original line Diff line number Diff line Loading @@ -24,6 +24,8 @@ #include "matchers/EventMatcherWizard.h" #include "matchers/EventMatcherWizard.h" #include "metrics_manager_util.h" #include "metrics_manager_util.h" using google::protobuf::MessageLite; namespace android { namespace android { namespace os { namespace os { namespace statsd { namespace statsd { Loading Loading @@ -419,16 +421,19 @@ bool metricActivationDepsChange(const StatsdConfig& config, return false; return false; } } bool determineEventMetricUpdateStatus(const StatsdConfig& config, const EventMetric& metric, bool determineMetricUpdateStatus( const StatsdConfig& config, const MessageLite& metric, const int64_t metricId, const MetricType metricType, const set<int64_t>& matcherDependencies, const set<int64_t>& conditionDependencies, const ::google::protobuf::RepeatedField<int64_t>& stateDependencies, const ::google::protobuf::RepeatedPtrField<MetricConditionLink>& conditionLinks, const unordered_map<int64_t, int>& oldMetricProducerMap, const unordered_map<int64_t, int>& oldMetricProducerMap, const vector<sp<MetricProducer>>& oldMetricProducers, const vector<sp<MetricProducer>>& oldMetricProducers, const unordered_map<int64_t, int>& metricToActivationMap, const unordered_map<int64_t, int>& metricToActivationMap, const set<int64_t>& replacedMatchers, const set<int64_t>& replacedMatchers, const set<int64_t>& replacedConditions, const set<int64_t>& replacedConditions, const set<int64_t>& replacedStates, UpdateStatus& updateStatus) { UpdateStatus& updateStatus) { int64_t id = metric.id(); // Check if new metric // Check if new metric const auto& oldMetricProducerIt = oldMetricProducerMap.find(id); const auto& oldMetricProducerIt = oldMetricProducerMap.find(metricId); if (oldMetricProducerIt == oldMetricProducerMap.end()) { if (oldMetricProducerIt == oldMetricProducerMap.end()) { updateStatus = UPDATE_NEW; updateStatus = UPDATE_NEW; return true; return true; Loading @@ -436,44 +441,85 @@ bool determineEventMetricUpdateStatus(const StatsdConfig& config, const EventMet // This is an existing metric, check if it has changed. // This is an existing metric, check if it has changed. uint64_t metricHash; uint64_t metricHash; if (!getMetricProtoHash(config, metric, id, metricToActivationMap, metricHash)) { if (!getMetricProtoHash(config, metric, metricId, metricToActivationMap, metricHash)) { return false; return false; } } const sp<MetricProducer> oldMetricProducer = oldMetricProducers[oldMetricProducerIt->second]; const sp<MetricProducer> oldMetricProducer = oldMetricProducers[oldMetricProducerIt->second]; if (oldMetricProducer->getMetricType() != METRIC_TYPE_EVENT || if (oldMetricProducer->getMetricType() != metricType || oldMetricProducer->getProtoHash() != metricHash) { oldMetricProducer->getProtoHash() != metricHash) { updateStatus = UPDATE_REPLACE; updateStatus = UPDATE_REPLACE; return true; return true; } } // Metric type and definition are the same. Need to check dependencies to see if they changed. // Take intersections of the matchers/predicates/states that the metric if (replacedMatchers.find(metric.what()) != replacedMatchers.end()) { // depends on with those that have been replaced. If a metric depends on any // replaced component, it too must be replaced. set<int64_t> intersection; set_intersection(matcherDependencies.begin(), matcherDependencies.end(), replacedMatchers.begin(), replacedMatchers.end(), inserter(intersection, intersection.begin())); if (intersection.size() > 0) { updateStatus = UPDATE_REPLACE; updateStatus = UPDATE_REPLACE; return true; return true; } } set_intersection(conditionDependencies.begin(), conditionDependencies.end(), if (metric.has_condition()) { replacedConditions.begin(), replacedConditions.end(), if (replacedConditions.find(metric.condition()) != replacedConditions.end()) { inserter(intersection, intersection.begin())); if (intersection.size() > 0) { updateStatus = UPDATE_REPLACE; updateStatus = UPDATE_REPLACE; return true; return true; } } } set_intersection(stateDependencies.begin(), stateDependencies.end(), replacedStates.begin(), replacedStates.end(), inserter(intersection, intersection.begin())); if (metricActivationDepsChange(config, metricToActivationMap, id, replacedMatchers)) { if (intersection.size() > 0) { updateStatus = UPDATE_REPLACE; updateStatus = UPDATE_REPLACE; return true; return true; } } for (const auto& metricConditionLink : metric.links()) { for (const auto& metricConditionLink : conditionLinks) { if (replacedConditions.find(metricConditionLink.condition()) != replacedConditions.end()) { if (replacedConditions.find(metricConditionLink.condition()) != replacedConditions.end()) { updateStatus = UPDATE_REPLACE; updateStatus = UPDATE_REPLACE; return true; return true; } } } } if (metricActivationDepsChange(config, metricToActivationMap, metricId, replacedMatchers)) { updateStatus = UPDATE_REPLACE; return true; } updateStatus = UPDATE_PRESERVE; updateStatus = UPDATE_PRESERVE; return true; return true; } } bool determineAllMetricUpdateStatuses(const StatsdConfig& config, const unordered_map<int64_t, int>& oldMetricProducerMap, const vector<sp<MetricProducer>>& oldMetricProducers, const unordered_map<int64_t, int>& metricToActivationMap, const set<int64_t>& replacedMatchers, const set<int64_t>& replacedConditions, const set<int64_t>& replacedStates, vector<UpdateStatus>& metricsToUpdate) { int metricIndex = 0; for (int i = 0; i < config.event_metric_size(); i++, metricIndex++) { const EventMetric& metric = config.event_metric(i); set<int64_t> conditionDependencies; if (metric.has_condition()) { conditionDependencies.insert(metric.condition()); } if (!determineMetricUpdateStatus( config, metric, metric.id(), METRIC_TYPE_EVENT, {metric.what()}, conditionDependencies, ::google::protobuf::RepeatedField<int64_t>(), metric.links(), oldMetricProducerMap, oldMetricProducers, metricToActivationMap, replacedMatchers, replacedConditions, replacedStates, metricsToUpdate[metricIndex])) { return false; } } // TODO: determine update status for count, gauge, value, duration metrics. return true; } bool updateMetrics(const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs, bool updateMetrics(const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs, const int64_t currentTimeNs, const sp<StatsPullerManager>& pullerManager, const int64_t currentTimeNs, const sp<StatsPullerManager>& pullerManager, const unordered_map<int64_t, int>& oldAtomMatchingTrackerMap, const unordered_map<int64_t, int>& oldAtomMatchingTrackerMap, Loading Loading @@ -518,22 +564,16 @@ bool updateMetrics(const ConfigKey& key, const StatsdConfig& config, const int64 } } vector<UpdateStatus> metricsToUpdate(allMetricsCount, UPDATE_UNKNOWN); vector<UpdateStatus> metricsToUpdate(allMetricsCount, UPDATE_UNKNOWN); int metricIndex = 0; if (!determineAllMetricUpdateStatuses(config, oldMetricProducerMap, oldMetricProducers, for (int i = 0; i < config.event_metric_size(); i++, metricIndex++) { metricToActivationMap, replacedMatchers, newMetricProducerMap[config.event_metric(i).id()] = metricIndex; replacedConditions, replacedStates, metricsToUpdate)) { if (!determineEventMetricUpdateStatus(config, config.event_metric(i), oldMetricProducerMap, oldMetricProducers, metricToActivationMap, replacedMatchers, replacedConditions, metricsToUpdate[metricIndex])) { return false; return false; } } } // TODO: determine update status for count, gauge, value, duration metrics. // Now, perform the update. Must iterate the metric types in the same order // Now, perform the update. Must iterate the metric types in the same order metricIndex = 0; int metricIndex = 0; for (int i = 0; i < config.event_metric_size(); i++, metricIndex++) { for (int i = 0; i < config.event_metric_size(); i++, metricIndex++) { newMetricProducerMap[config.event_metric(i).id()] = metricIndex; const EventMetric& metric = config.event_metric(i); const EventMetric& metric = config.event_metric(i); switch (metricsToUpdate[metricIndex]) { switch (metricsToUpdate[metricIndex]) { case UPDATE_PRESERVE: { case UPDATE_PRESERVE: { Loading
cmds/statsd/src/metrics/parsing_utils/config_update_utils.h +9 −7 Original line number Original line Diff line number Diff line Loading @@ -125,23 +125,25 @@ bool updateConditions(const ConfigKey& key, const StatsdConfig& config, std::vector<ConditionState>& conditionCache, std::vector<ConditionState>& conditionCache, std::set<int64_t>& replacedConditions); std::set<int64_t>& replacedConditions); // Function to determine if an event metric needs to be updated. Populates updateStatus. // Function to determine the update status (preserve/replace/new) of all metrics in the config. // [config]: the input StatsdConfig // [config]: the input StatsdConfig // [metric]: the current metric to be updated // [oldMetricProducerMap]: metric id to index mapping in the existing MetricsManager // [oldMetricProducerMap]: metric id to index mapping in the existing MetricsManager // [oldMetricProducers]: stores the existing MetricProducers // [oldMetricProducers]: stores the existing MetricProducers // [metricToActivationMap]: map from metric id to metric activation index. // [metricToActivationMap]: map from metric id to metric activation index // [replacedMatchers]: set of replaced matcher ids. conditions using these matchers must be replaced // [replacedMatchers]: set of replaced matcher ids. metrics using these matchers must be replaced // [replacedConditions]: set of replaced conditions. metrics using these conditions must be replaced // [replacedStates]: set of replaced state ids. metrics using these states must be replaced // output: // output: // [updateStatus]: update status for the metric. Will be changed from UPDATE_UNKNOWN after this call // [metricsToUpdate]: update status of each metric. Will be changed from UPDATE_UNKNOWN // Returns whether the function was successful or not. // Returns whether the function was successful or not. bool determineEventMetricUpdateStatus(const StatsdConfig& config, const EventMetric& metric, bool determineAllMetricUpdateStatuses(const StatsdConfig& config, const unordered_map<int64_t, int>& oldMetricProducerMap, const unordered_map<int64_t, int>& oldMetricProducerMap, const vector<sp<MetricProducer>>& oldMetricProducers, const vector<sp<MetricProducer>>& oldMetricProducers, const unordered_map<int64_t, int>& metricToActivationMap, const unordered_map<int64_t, int>& metricToActivationMap, const set<int64_t>& replacedMatchers, const set<int64_t>& replacedMatchers, const set<int64_t>& replacedConditions, const set<int64_t>& replacedConditions, UpdateStatus& updateStatus); const set<int64_t>& replacedStates, vector<UpdateStatus>& metricsToUpdate); // Update MetricProducers. // Update MetricProducers. // input: // input: Loading
cmds/statsd/tests/metrics/parsing_utils/config_update_utils_test.cpp +36 −42 Original line number Original line Diff line number Diff line Loading @@ -920,14 +920,13 @@ TEST_F(ConfigUpdateTest, TestEventMetricPreserve) { // Create an initial config. // Create an initial config. EXPECT_TRUE(initConfig(config)); EXPECT_TRUE(initConfig(config)); set<int64_t> replacedMatchers; set<int64_t> replacedConditions; unordered_map<int64_t, int> metricToActivationMap; unordered_map<int64_t, int> metricToActivationMap; UpdateStatus status = UPDATE_UNKNOWN; vector<UpdateStatus> metricsToUpdate(1, UPDATE_UNKNOWN); EXPECT_TRUE(determineEventMetricUpdateStatus(config, *metric, oldMetricProducerMap, EXPECT_TRUE(determineAllMetricUpdateStatuses(config, oldMetricProducerMap, oldMetricProducers, oldMetricProducers, metricToActivationMap, metricToActivationMap, replacedMatchers, replacedConditions, status)); /*replacedMatchers*/ {}, /*replacedConditions=*/{}, EXPECT_EQ(status, UPDATE_PRESERVE); /*replacedStates=*/{}, metricsToUpdate)); EXPECT_EQ(metricsToUpdate[0], UPDATE_PRESERVE); } } TEST_F(ConfigUpdateTest, TestEventMetricActivationAdded) { TEST_F(ConfigUpdateTest, TestEventMetricActivationAdded) { Loading Loading @@ -957,14 +956,13 @@ TEST_F(ConfigUpdateTest, TestEventMetricActivationAdded) { eventActivation->set_atom_matcher_id(startMatcher.id()); eventActivation->set_atom_matcher_id(startMatcher.id()); eventActivation->set_ttl_seconds(5); eventActivation->set_ttl_seconds(5); set<int64_t> replacedMatchers; set<int64_t> replacedConditions; unordered_map<int64_t, int> metricToActivationMap = {{12345, 0}}; unordered_map<int64_t, int> metricToActivationMap = {{12345, 0}}; UpdateStatus status = UPDATE_UNKNOWN; vector<UpdateStatus> metricsToUpdate(1, UPDATE_UNKNOWN); EXPECT_TRUE(determineEventMetricUpdateStatus(config, *metric, oldMetricProducerMap, EXPECT_TRUE(determineAllMetricUpdateStatuses(config, oldMetricProducerMap, oldMetricProducers, oldMetricProducers, metricToActivationMap, metricToActivationMap, replacedMatchers, replacedConditions, status)); /*replacedMatchers*/ {}, /*replacedConditions=*/{}, EXPECT_EQ(status, UPDATE_REPLACE); /*replacedStates=*/{}, metricsToUpdate)); EXPECT_EQ(metricsToUpdate[0], UPDATE_REPLACE); } } TEST_F(ConfigUpdateTest, TestEventMetricWhatChanged) { TEST_F(ConfigUpdateTest, TestEventMetricWhatChanged) { Loading @@ -987,14 +985,13 @@ TEST_F(ConfigUpdateTest, TestEventMetricWhatChanged) { // Create an initial config. // Create an initial config. EXPECT_TRUE(initConfig(config)); EXPECT_TRUE(initConfig(config)); set<int64_t> replacedMatchers = {whatMatcher.id()}; set<int64_t> replacedConditions; unordered_map<int64_t, int> metricToActivationMap; unordered_map<int64_t, int> metricToActivationMap; UpdateStatus status = UPDATE_UNKNOWN; vector<UpdateStatus> metricsToUpdate(1, UPDATE_UNKNOWN); EXPECT_TRUE(determineEventMetricUpdateStatus(config, *metric, oldMetricProducerMap, EXPECT_TRUE(determineAllMetricUpdateStatuses( oldMetricProducers, metricToActivationMap, config, oldMetricProducerMap, oldMetricProducers, metricToActivationMap, replacedMatchers, replacedConditions, status)); /*replacedMatchers*/ {whatMatcher.id()}, /*replacedConditions=*/{}, EXPECT_EQ(status, UPDATE_REPLACE); /*replacedStates=*/{}, metricsToUpdate)); EXPECT_EQ(metricsToUpdate[0], UPDATE_REPLACE); } } TEST_F(ConfigUpdateTest, TestEventMetricConditionChanged) { TEST_F(ConfigUpdateTest, TestEventMetricConditionChanged) { Loading @@ -1017,14 +1014,13 @@ TEST_F(ConfigUpdateTest, TestEventMetricConditionChanged) { // Create an initial config. // Create an initial config. EXPECT_TRUE(initConfig(config)); EXPECT_TRUE(initConfig(config)); set<int64_t> replacedMatchers; set<int64_t> replacedConditions = {predicate.id()}; unordered_map<int64_t, int> metricToActivationMap; unordered_map<int64_t, int> metricToActivationMap; UpdateStatus status = UPDATE_UNKNOWN; vector<UpdateStatus> metricsToUpdate(1, UPDATE_UNKNOWN); EXPECT_TRUE(determineEventMetricUpdateStatus(config, *metric, oldMetricProducerMap, EXPECT_TRUE(determineAllMetricUpdateStatuses( oldMetricProducers, metricToActivationMap, config, oldMetricProducerMap, oldMetricProducers, metricToActivationMap, replacedMatchers, replacedConditions, status)); /*replacedMatchers*/ {}, /*replacedConditions=*/{predicate.id()}, EXPECT_EQ(status, UPDATE_REPLACE); /*replacedStates=*/{}, metricsToUpdate)); EXPECT_EQ(metricsToUpdate[0], UPDATE_REPLACE); } } TEST_F(ConfigUpdateTest, TestMetricConditionLinkDepsChanged) { TEST_F(ConfigUpdateTest, TestMetricConditionLinkDepsChanged) { Loading Loading @@ -1054,14 +1050,13 @@ TEST_F(ConfigUpdateTest, TestMetricConditionLinkDepsChanged) { // Create an initial config. // Create an initial config. EXPECT_TRUE(initConfig(config)); EXPECT_TRUE(initConfig(config)); set<int64_t> replacedMatchers; set<int64_t> replacedConditions = {linkPredicate.id()}; unordered_map<int64_t, int> metricToActivationMap; unordered_map<int64_t, int> metricToActivationMap; UpdateStatus status = UPDATE_UNKNOWN; vector<UpdateStatus> metricsToUpdate(1, UPDATE_UNKNOWN); EXPECT_TRUE(determineEventMetricUpdateStatus(config, *metric, oldMetricProducerMap, EXPECT_TRUE(determineAllMetricUpdateStatuses( oldMetricProducers, metricToActivationMap, config, oldMetricProducerMap, oldMetricProducers, metricToActivationMap, replacedMatchers, replacedConditions, status)); /*replacedMatchers*/ {}, /*replacedConditions=*/{linkPredicate.id()}, EXPECT_EQ(status, UPDATE_REPLACE); /*replacedStates=*/{}, metricsToUpdate)); EXPECT_EQ(metricsToUpdate[0], UPDATE_REPLACE); } } TEST_F(ConfigUpdateTest, TestEventMetricActivationDepsChange) { TEST_F(ConfigUpdateTest, TestEventMetricActivationDepsChange) { Loading Loading @@ -1090,14 +1085,13 @@ TEST_F(ConfigUpdateTest, TestEventMetricActivationDepsChange) { // Create an initial config. // Create an initial config. EXPECT_TRUE(initConfig(config)); EXPECT_TRUE(initConfig(config)); set<int64_t> replacedMatchers = {startMatcher.id()}; // The activation matcher is replaced. set<int64_t> replacedConditions; unordered_map<int64_t, int> metricToActivationMap = {{12345, 0}}; unordered_map<int64_t, int> metricToActivationMap = {{12345, 0}}; UpdateStatus status = UPDATE_UNKNOWN; vector<UpdateStatus> metricsToUpdate(1, UPDATE_UNKNOWN); EXPECT_TRUE(determineEventMetricUpdateStatus(config, *metric, oldMetricProducerMap, EXPECT_TRUE(determineAllMetricUpdateStatuses( oldMetricProducers, metricToActivationMap, config, oldMetricProducerMap, oldMetricProducers, metricToActivationMap, replacedMatchers, replacedConditions, status)); /*replacedMatchers*/ {startMatcher.id()}, /*replacedConditions=*/{}, EXPECT_EQ(status, UPDATE_REPLACE); /*replacedStates=*/{}, metricsToUpdate)); EXPECT_EQ(metricsToUpdate[0], UPDATE_REPLACE); } } TEST_F(ConfigUpdateTest, TestUpdateEventMetrics) { TEST_F(ConfigUpdateTest, TestUpdateEventMetrics) { Loading