Loading cmds/statsd/src/condition/ConditionTracker.h +3 −3 Original line number Diff line number Diff line Loading @@ -68,9 +68,9 @@ public: // index: the new index of this tracker in allConditionProtos and allConditionTrackers. // allConditionTrackers: the list of all ConditionTrackers (this is needed because we may also // need to call onConfigUpdated() on child conditions) // [atomMatchingTrackerMap]: map of atom matcher id to index after the config update // [conditionTrackerMap]: map of condition tracker id to index after the config update. // returns whether or not the update is successful // atomMatchingTrackerMap: map of atom matcher id to index after the config update. // conditionTrackerMap: map of condition tracker id to index after the config update. // returns whether or not the update is successful. virtual bool onConfigUpdated(const std::vector<Predicate>& allConditionProtos, const int index, const std::vector<sp<ConditionTracker>>& allConditionTrackers, const std::unordered_map<int64_t, int>& atomMatchingTrackerMap, Loading cmds/statsd/src/metrics/EventMetricProducer.cpp +45 −2 Original line number Diff line number Diff line Loading @@ -18,12 +18,14 @@ #include "Log.h" #include "EventMetricProducer.h" #include "stats_util.h" #include "stats_log_util.h" #include <limits.h> #include <stdlib.h> #include "metrics/parsing_utils/metrics_manager_util.h" #include "stats_log_util.h" #include "stats_util.h" using android::util::FIELD_COUNT_REPEATED; using android::util::FIELD_TYPE_BOOL; using android::util::FIELD_TYPE_FLOAT; Loading Loading @@ -82,6 +84,47 @@ EventMetricProducer::~EventMetricProducer() { VLOG("~EventMetricProducer() called"); } bool EventMetricProducer::onConfigUpdatedLocked( const StatsdConfig& config, const int configIndex, const int metricIndex, const vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers, const unordered_map<int64_t, int>& oldAtomMatchingTrackerMap, const unordered_map<int64_t, int>& newAtomMatchingTrackerMap, const sp<EventMatcherWizard>& matcherWizard, const vector<sp<ConditionTracker>>& allConditionTrackers, const unordered_map<int64_t, int>& conditionTrackerMap, const sp<ConditionWizard>& wizard, const unordered_map<int64_t, int>& metricToActivationMap, unordered_map<int, vector<int>>& trackerToMetricMap, unordered_map<int, vector<int>>& conditionToMetricMap, unordered_map<int, vector<int>>& activationAtomTrackerToMetricMap, unordered_map<int, vector<int>>& deactivationAtomTrackerToMetricMap, vector<int>& metricsWithActivation) { if (!MetricProducer::onConfigUpdatedLocked( config, configIndex, metricIndex, allAtomMatchingTrackers, oldAtomMatchingTrackerMap, newAtomMatchingTrackerMap, matcherWizard, allConditionTrackers, conditionTrackerMap, wizard, metricToActivationMap, trackerToMetricMap, conditionToMetricMap, activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, metricsWithActivation)) { return false; } const EventMetric& metric = config.event_metric(configIndex); int trackerIndex; // Update appropriate indices, specifically mConditionIndex and MetricsManager maps. if (!handleMetricWithAtomMatchingTrackers(metric.what(), metricIndex, false, allAtomMatchingTrackers, newAtomMatchingTrackerMap, trackerToMetricMap, trackerIndex)) { return false; } if (metric.has_condition() && !handleMetricWithConditions(metric.condition(), metricIndex, conditionTrackerMap, metric.links(), allConditionTrackers, mConditionTrackerIndex, conditionToMetricMap)) { return false; } return true; } void EventMetricProducer::dropDataLocked(const int64_t dropTimeNs) { mProto->clear(); StatsdStats::getInstance().noteBucketDropped(mMetricId); Loading cmds/statsd/src/metrics/EventMetricProducer.h +16 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,22 @@ private: // Internal interface to handle sliced condition change. void onSlicedConditionMayChangeLocked(bool overallCondition, const int64_t eventTime) override; bool onConfigUpdatedLocked( const StatsdConfig& config, const int configIndex, const int metricIndex, const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers, const std::unordered_map<int64_t, int>& oldAtomMatchingTrackerMap, const std::unordered_map<int64_t, int>& newAtomMatchingTrackerMap, const sp<EventMatcherWizard>& matcherWizard, const std::vector<sp<ConditionTracker>>& allConditionTrackers, const std::unordered_map<int64_t, int>& conditionTrackerMap, const sp<ConditionWizard>& wizard, const std::unordered_map<int64_t, int>& metricToActivationMap, std::unordered_map<int, std::vector<int>>& trackerToMetricMap, std::unordered_map<int, std::vector<int>>& conditionToMetricMap, std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap, std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap, std::vector<int>& metricsWithActivation) override; void dropDataLocked(const int64_t dropTimeNs) override; // Internal function to calculate the current used bytes. Loading cmds/statsd/src/metrics/MetricProducer.cpp +32 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include "MetricProducer.h" #include "../guardrail/StatsdStats.h" #include "metrics/parsing_utils/metrics_manager_util.h" #include "state/StateTracker.h" using android::util::FIELD_COUNT_REPEATED; Loading Loading @@ -72,6 +73,37 @@ MetricProducer::MetricProducer( mStateGroupMap(stateGroupMap) { } bool MetricProducer::onConfigUpdatedLocked( const StatsdConfig& config, const int configIndex, const int metricIndex, const vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers, const unordered_map<int64_t, int>& oldAtomMatchingTrackerMap, const unordered_map<int64_t, int>& newAtomMatchingTrackerMap, const sp<EventMatcherWizard>& matcherWizard, const vector<sp<ConditionTracker>>& allConditionTrackers, const unordered_map<int64_t, int>& conditionTrackerMap, const sp<ConditionWizard>& wizard, const unordered_map<int64_t, int>& metricToActivationMap, unordered_map<int, vector<int>>& trackerToMetricMap, unordered_map<int, vector<int>>& conditionToMetricMap, unordered_map<int, vector<int>>& activationAtomTrackerToMetricMap, unordered_map<int, vector<int>>& deactivationAtomTrackerToMetricMap, vector<int>& metricsWithActivation) { sp<ConditionWizard> tmpWizard = mWizard; mWizard = wizard; unordered_map<int, shared_ptr<Activation>> newEventActivationMap; unordered_map<int, vector<shared_ptr<Activation>>> newEventDeactivationMap; if (!handleMetricActivationOnConfigUpdate( config, mMetricId, metricIndex, metricToActivationMap, oldAtomMatchingTrackerMap, newAtomMatchingTrackerMap, mEventActivationMap, activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, metricsWithActivation, newEventActivationMap, newEventDeactivationMap)) { return false; } mEventActivationMap = newEventActivationMap; mEventDeactivationMap = newEventDeactivationMap; return true; } void MetricProducer::onMatchedLogEventLocked(const size_t matcherIndex, const LogEvent& event) { if (!mIsActive) { return; Loading cmds/statsd/src/metrics/MetricProducer.h +50 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include "anomaly/AnomalyTracker.h" #include "condition/ConditionWizard.h" #include "config/ConfigKey.h" #include "matchers/EventMatcherWizard.h" #include "matchers/matcher_util.h" #include "packages/PackageInfoListener.h" #include "state/StateListener.h" Loading Loading @@ -151,6 +152,33 @@ public: return conditionIndex >= 0 ? initialConditionCache[conditionIndex] : ConditionState::kTrue; } // Update appropriate state on config updates. Primarily, all indices need to be updated. // This metric and all of its dependencies are guaranteed to be preserved across the update. // This function also updates several maps used by metricsManager. bool onConfigUpdated( const StatsdConfig& config, const int configIndex, const int metricIndex, const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers, const std::unordered_map<int64_t, int>& oldAtomMatchingTrackerMap, const std::unordered_map<int64_t, int>& newAtomMatchingTrackerMap, const sp<EventMatcherWizard>& matcherWizard, const std::vector<sp<ConditionTracker>>& allConditionTrackers, const std::unordered_map<int64_t, int>& conditionTrackerMap, const sp<ConditionWizard>& wizard, const std::unordered_map<int64_t, int>& metricToActivationMap, std::unordered_map<int, std::vector<int>>& trackerToMetricMap, std::unordered_map<int, std::vector<int>>& conditionToMetricMap, std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap, std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap, std::vector<int>& metricsWithActivation) { std::lock_guard<std::mutex> lock(mMutex); return onConfigUpdatedLocked(config, configIndex, metricIndex, allAtomMatchingTrackers, oldAtomMatchingTrackerMap, newAtomMatchingTrackerMap, matcherWizard, allConditionTrackers, conditionTrackerMap, wizard, metricToActivationMap, trackerToMetricMap, conditionToMetricMap, activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, metricsWithActivation); }; /** * Force a partial bucket split on app upgrade */ Loading Loading @@ -209,6 +237,25 @@ public: dumpLatency, str_set, protoOutput); } // Update appropriate state on config updates. Primarily, all indices need to be updated. // This metric and all of its dependencies are guaranteed to be preserved across the update. // This function also updates several maps used by metricsManager. virtual bool onConfigUpdatedLocked( const StatsdConfig& config, const int configIndex, const int metricIndex, const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers, const std::unordered_map<int64_t, int>& oldAtomMatchingTrackerMap, const std::unordered_map<int64_t, int>& newAtomMatchingTrackerMap, const sp<EventMatcherWizard>& matcherWizard, const std::vector<sp<ConditionTracker>>& allConditionTrackers, const std::unordered_map<int64_t, int>& conditionTrackerMap, const sp<ConditionWizard>& wizard, const std::unordered_map<int64_t, int>& metricToActivationMap, std::unordered_map<int, std::vector<int>>& trackerToMetricMap, std::unordered_map<int, std::vector<int>>& conditionToMetricMap, std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap, std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap, std::vector<int>& metricsWithActivation); void clearPastBuckets(const int64_t dumpTimeNs) { std::lock_guard<std::mutex> lock(mMutex); return clearPastBucketsLocked(dumpTimeNs); Loading Loading @@ -517,6 +564,9 @@ protected: FRIEND_TEST(ValueMetricE2eTest, TestInitialConditionChanges); FRIEND_TEST(MetricsManagerTest, TestInitialConditions); FRIEND_TEST(ConfigUpdateTest, TestUpdateMetricActivations); FRIEND_TEST(ConfigUpdateTest, TestUpdateEventMetrics); }; } // namespace statsd Loading Loading
cmds/statsd/src/condition/ConditionTracker.h +3 −3 Original line number Diff line number Diff line Loading @@ -68,9 +68,9 @@ public: // index: the new index of this tracker in allConditionProtos and allConditionTrackers. // allConditionTrackers: the list of all ConditionTrackers (this is needed because we may also // need to call onConfigUpdated() on child conditions) // [atomMatchingTrackerMap]: map of atom matcher id to index after the config update // [conditionTrackerMap]: map of condition tracker id to index after the config update. // returns whether or not the update is successful // atomMatchingTrackerMap: map of atom matcher id to index after the config update. // conditionTrackerMap: map of condition tracker id to index after the config update. // returns whether or not the update is successful. virtual bool onConfigUpdated(const std::vector<Predicate>& allConditionProtos, const int index, const std::vector<sp<ConditionTracker>>& allConditionTrackers, const std::unordered_map<int64_t, int>& atomMatchingTrackerMap, Loading
cmds/statsd/src/metrics/EventMetricProducer.cpp +45 −2 Original line number Diff line number Diff line Loading @@ -18,12 +18,14 @@ #include "Log.h" #include "EventMetricProducer.h" #include "stats_util.h" #include "stats_log_util.h" #include <limits.h> #include <stdlib.h> #include "metrics/parsing_utils/metrics_manager_util.h" #include "stats_log_util.h" #include "stats_util.h" using android::util::FIELD_COUNT_REPEATED; using android::util::FIELD_TYPE_BOOL; using android::util::FIELD_TYPE_FLOAT; Loading Loading @@ -82,6 +84,47 @@ EventMetricProducer::~EventMetricProducer() { VLOG("~EventMetricProducer() called"); } bool EventMetricProducer::onConfigUpdatedLocked( const StatsdConfig& config, const int configIndex, const int metricIndex, const vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers, const unordered_map<int64_t, int>& oldAtomMatchingTrackerMap, const unordered_map<int64_t, int>& newAtomMatchingTrackerMap, const sp<EventMatcherWizard>& matcherWizard, const vector<sp<ConditionTracker>>& allConditionTrackers, const unordered_map<int64_t, int>& conditionTrackerMap, const sp<ConditionWizard>& wizard, const unordered_map<int64_t, int>& metricToActivationMap, unordered_map<int, vector<int>>& trackerToMetricMap, unordered_map<int, vector<int>>& conditionToMetricMap, unordered_map<int, vector<int>>& activationAtomTrackerToMetricMap, unordered_map<int, vector<int>>& deactivationAtomTrackerToMetricMap, vector<int>& metricsWithActivation) { if (!MetricProducer::onConfigUpdatedLocked( config, configIndex, metricIndex, allAtomMatchingTrackers, oldAtomMatchingTrackerMap, newAtomMatchingTrackerMap, matcherWizard, allConditionTrackers, conditionTrackerMap, wizard, metricToActivationMap, trackerToMetricMap, conditionToMetricMap, activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, metricsWithActivation)) { return false; } const EventMetric& metric = config.event_metric(configIndex); int trackerIndex; // Update appropriate indices, specifically mConditionIndex and MetricsManager maps. if (!handleMetricWithAtomMatchingTrackers(metric.what(), metricIndex, false, allAtomMatchingTrackers, newAtomMatchingTrackerMap, trackerToMetricMap, trackerIndex)) { return false; } if (metric.has_condition() && !handleMetricWithConditions(metric.condition(), metricIndex, conditionTrackerMap, metric.links(), allConditionTrackers, mConditionTrackerIndex, conditionToMetricMap)) { return false; } return true; } void EventMetricProducer::dropDataLocked(const int64_t dropTimeNs) { mProto->clear(); StatsdStats::getInstance().noteBucketDropped(mMetricId); Loading
cmds/statsd/src/metrics/EventMetricProducer.h +16 −0 Original line number Diff line number Diff line Loading @@ -69,6 +69,22 @@ private: // Internal interface to handle sliced condition change. void onSlicedConditionMayChangeLocked(bool overallCondition, const int64_t eventTime) override; bool onConfigUpdatedLocked( const StatsdConfig& config, const int configIndex, const int metricIndex, const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers, const std::unordered_map<int64_t, int>& oldAtomMatchingTrackerMap, const std::unordered_map<int64_t, int>& newAtomMatchingTrackerMap, const sp<EventMatcherWizard>& matcherWizard, const std::vector<sp<ConditionTracker>>& allConditionTrackers, const std::unordered_map<int64_t, int>& conditionTrackerMap, const sp<ConditionWizard>& wizard, const std::unordered_map<int64_t, int>& metricToActivationMap, std::unordered_map<int, std::vector<int>>& trackerToMetricMap, std::unordered_map<int, std::vector<int>>& conditionToMetricMap, std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap, std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap, std::vector<int>& metricsWithActivation) override; void dropDataLocked(const int64_t dropTimeNs) override; // Internal function to calculate the current used bytes. Loading
cmds/statsd/src/metrics/MetricProducer.cpp +32 −0 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ #include "MetricProducer.h" #include "../guardrail/StatsdStats.h" #include "metrics/parsing_utils/metrics_manager_util.h" #include "state/StateTracker.h" using android::util::FIELD_COUNT_REPEATED; Loading Loading @@ -72,6 +73,37 @@ MetricProducer::MetricProducer( mStateGroupMap(stateGroupMap) { } bool MetricProducer::onConfigUpdatedLocked( const StatsdConfig& config, const int configIndex, const int metricIndex, const vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers, const unordered_map<int64_t, int>& oldAtomMatchingTrackerMap, const unordered_map<int64_t, int>& newAtomMatchingTrackerMap, const sp<EventMatcherWizard>& matcherWizard, const vector<sp<ConditionTracker>>& allConditionTrackers, const unordered_map<int64_t, int>& conditionTrackerMap, const sp<ConditionWizard>& wizard, const unordered_map<int64_t, int>& metricToActivationMap, unordered_map<int, vector<int>>& trackerToMetricMap, unordered_map<int, vector<int>>& conditionToMetricMap, unordered_map<int, vector<int>>& activationAtomTrackerToMetricMap, unordered_map<int, vector<int>>& deactivationAtomTrackerToMetricMap, vector<int>& metricsWithActivation) { sp<ConditionWizard> tmpWizard = mWizard; mWizard = wizard; unordered_map<int, shared_ptr<Activation>> newEventActivationMap; unordered_map<int, vector<shared_ptr<Activation>>> newEventDeactivationMap; if (!handleMetricActivationOnConfigUpdate( config, mMetricId, metricIndex, metricToActivationMap, oldAtomMatchingTrackerMap, newAtomMatchingTrackerMap, mEventActivationMap, activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, metricsWithActivation, newEventActivationMap, newEventDeactivationMap)) { return false; } mEventActivationMap = newEventActivationMap; mEventDeactivationMap = newEventDeactivationMap; return true; } void MetricProducer::onMatchedLogEventLocked(const size_t matcherIndex, const LogEvent& event) { if (!mIsActive) { return; Loading
cmds/statsd/src/metrics/MetricProducer.h +50 −0 Original line number Diff line number Diff line Loading @@ -26,6 +26,7 @@ #include "anomaly/AnomalyTracker.h" #include "condition/ConditionWizard.h" #include "config/ConfigKey.h" #include "matchers/EventMatcherWizard.h" #include "matchers/matcher_util.h" #include "packages/PackageInfoListener.h" #include "state/StateListener.h" Loading Loading @@ -151,6 +152,33 @@ public: return conditionIndex >= 0 ? initialConditionCache[conditionIndex] : ConditionState::kTrue; } // Update appropriate state on config updates. Primarily, all indices need to be updated. // This metric and all of its dependencies are guaranteed to be preserved across the update. // This function also updates several maps used by metricsManager. bool onConfigUpdated( const StatsdConfig& config, const int configIndex, const int metricIndex, const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers, const std::unordered_map<int64_t, int>& oldAtomMatchingTrackerMap, const std::unordered_map<int64_t, int>& newAtomMatchingTrackerMap, const sp<EventMatcherWizard>& matcherWizard, const std::vector<sp<ConditionTracker>>& allConditionTrackers, const std::unordered_map<int64_t, int>& conditionTrackerMap, const sp<ConditionWizard>& wizard, const std::unordered_map<int64_t, int>& metricToActivationMap, std::unordered_map<int, std::vector<int>>& trackerToMetricMap, std::unordered_map<int, std::vector<int>>& conditionToMetricMap, std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap, std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap, std::vector<int>& metricsWithActivation) { std::lock_guard<std::mutex> lock(mMutex); return onConfigUpdatedLocked(config, configIndex, metricIndex, allAtomMatchingTrackers, oldAtomMatchingTrackerMap, newAtomMatchingTrackerMap, matcherWizard, allConditionTrackers, conditionTrackerMap, wizard, metricToActivationMap, trackerToMetricMap, conditionToMetricMap, activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, metricsWithActivation); }; /** * Force a partial bucket split on app upgrade */ Loading Loading @@ -209,6 +237,25 @@ public: dumpLatency, str_set, protoOutput); } // Update appropriate state on config updates. Primarily, all indices need to be updated. // This metric and all of its dependencies are guaranteed to be preserved across the update. // This function also updates several maps used by metricsManager. virtual bool onConfigUpdatedLocked( const StatsdConfig& config, const int configIndex, const int metricIndex, const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers, const std::unordered_map<int64_t, int>& oldAtomMatchingTrackerMap, const std::unordered_map<int64_t, int>& newAtomMatchingTrackerMap, const sp<EventMatcherWizard>& matcherWizard, const std::vector<sp<ConditionTracker>>& allConditionTrackers, const std::unordered_map<int64_t, int>& conditionTrackerMap, const sp<ConditionWizard>& wizard, const std::unordered_map<int64_t, int>& metricToActivationMap, std::unordered_map<int, std::vector<int>>& trackerToMetricMap, std::unordered_map<int, std::vector<int>>& conditionToMetricMap, std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap, std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap, std::vector<int>& metricsWithActivation); void clearPastBuckets(const int64_t dumpTimeNs) { std::lock_guard<std::mutex> lock(mMutex); return clearPastBucketsLocked(dumpTimeNs); Loading Loading @@ -517,6 +564,9 @@ protected: FRIEND_TEST(ValueMetricE2eTest, TestInitialConditionChanges); FRIEND_TEST(MetricsManagerTest, TestInitialConditions); FRIEND_TEST(ConfigUpdateTest, TestUpdateMetricActivations); FRIEND_TEST(ConfigUpdateTest, TestUpdateEventMetrics); }; } // namespace statsd Loading