diff --git a/cmds/statsd/src/metrics/CountMetricProducer.cpp b/cmds/statsd/src/metrics/CountMetricProducer.cpp index 573961276e5b4..3dbb6ed47ff8a 100644 --- a/cmds/statsd/src/metrics/CountMetricProducer.cpp +++ b/cmds/statsd/src/metrics/CountMetricProducer.cpp @@ -69,13 +69,14 @@ const int FIELD_ID_END_BUCKET_ELAPSED_MILLIS = 6; CountMetricProducer::CountMetricProducer( const ConfigKey& key, const CountMetric& metric, const int conditionIndex, const vector& initialConditionCache, const sp& wizard, - const int64_t timeBaseNs, const int64_t startTimeNs, + const uint64_t protoHash, const int64_t timeBaseNs, const int64_t startTimeNs, const unordered_map>& eventActivationMap, const unordered_map>>& eventDeactivationMap, const vector& slicedStateAtoms, const unordered_map>& stateGroupMap) : MetricProducer(metric.id(), key, timeBaseNs, conditionIndex, initialConditionCache, wizard, - eventActivationMap, eventDeactivationMap, slicedStateAtoms, stateGroupMap) { + protoHash, eventActivationMap, eventDeactivationMap, slicedStateAtoms, + stateGroupMap) { if (metric.has_bucket()) { mBucketSizeNs = TimeUnitToBucketSizeInMillisGuardrailed(key.GetUid(), metric.bucket()) * 1000000; diff --git a/cmds/statsd/src/metrics/CountMetricProducer.h b/cmds/statsd/src/metrics/CountMetricProducer.h index f05fb061ccc19..6b2f2ca61ecc5 100644 --- a/cmds/statsd/src/metrics/CountMetricProducer.h +++ b/cmds/statsd/src/metrics/CountMetricProducer.h @@ -44,7 +44,7 @@ public: CountMetricProducer( const ConfigKey& key, const CountMetric& countMetric, const int conditionIndex, const vector& initialConditionCache, const sp& wizard, - const int64_t timeBaseNs, const int64_t startTimeNs, + const uint64_t protoHash, const int64_t timeBaseNs, const int64_t startTimeNs, const std::unordered_map>& eventActivationMap = {}, const std::unordered_map>>& eventDeactivationMap = {}, @@ -57,6 +57,10 @@ public: const HashableDimensionKey& primaryKey, const FieldValue& oldState, const FieldValue& newState) override; + MetricType getMetricType() const override { + return METRIC_TYPE_COUNT; + } + protected: void onMatchedLogEventInternalLocked( const size_t matcherIndex, const MetricDimensionKey& eventKey, diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.cpp b/cmds/statsd/src/metrics/DurationMetricProducer.cpp index e9b043876d3d5..3acafaa3560e7 100644 --- a/cmds/statsd/src/metrics/DurationMetricProducer.cpp +++ b/cmds/statsd/src/metrics/DurationMetricProducer.cpp @@ -66,14 +66,15 @@ DurationMetricProducer::DurationMetricProducer( const ConfigKey& key, const DurationMetric& metric, const int conditionIndex, const vector& initialConditionCache, const size_t startIndex, const size_t stopIndex, const size_t stopAllIndex, const bool nesting, - const sp& wizard, const FieldMatcher& internalDimensions, - const int64_t timeBaseNs, const int64_t startTimeNs, + const sp& wizard, const uint64_t protoHash, + const FieldMatcher& internalDimensions, const int64_t timeBaseNs, const int64_t startTimeNs, const unordered_map>& eventActivationMap, const unordered_map>>& eventDeactivationMap, const vector& slicedStateAtoms, const unordered_map>& stateGroupMap) : MetricProducer(metric.id(), key, timeBaseNs, conditionIndex, initialConditionCache, wizard, - eventActivationMap, eventDeactivationMap, slicedStateAtoms, stateGroupMap), + protoHash, eventActivationMap, eventDeactivationMap, slicedStateAtoms, + stateGroupMap), mAggregationType(metric.aggregation_type()), mStartIndex(startIndex), mStopIndex(stopIndex), diff --git a/cmds/statsd/src/metrics/DurationMetricProducer.h b/cmds/statsd/src/metrics/DurationMetricProducer.h index bfe1010c89def..3a94d9c775aa2 100644 --- a/cmds/statsd/src/metrics/DurationMetricProducer.h +++ b/cmds/statsd/src/metrics/DurationMetricProducer.h @@ -42,8 +42,9 @@ public: const ConfigKey& key, const DurationMetric& durationMetric, const int conditionIndex, const vector& initialConditionCache, const size_t startIndex, const size_t stopIndex, const size_t stopAllIndex, const bool nesting, - const sp& wizard, const FieldMatcher& internalDimensions, - const int64_t timeBaseNs, const int64_t startTimeNs, + const sp& wizard, const uint64_t protoHash, + const FieldMatcher& internalDimensions, const int64_t timeBaseNs, + const int64_t startTimeNs, const unordered_map>& eventActivationMap = {}, const unordered_map>>& eventDeactivationMap = {}, const vector& slicedStateAtoms = {}, @@ -58,6 +59,10 @@ public: const HashableDimensionKey& primaryKey, const FieldValue& oldState, const FieldValue& newState) override; + MetricType getMetricType() const override { + return METRIC_TYPE_DURATION; + } + protected: void onMatchedLogEventLocked(const size_t matcherIndex, const LogEvent& event) override; diff --git a/cmds/statsd/src/metrics/EventMetricProducer.cpp b/cmds/statsd/src/metrics/EventMetricProducer.cpp index dc0036a687f31..dfe4559b05fb9 100644 --- a/cmds/statsd/src/metrics/EventMetricProducer.cpp +++ b/cmds/statsd/src/metrics/EventMetricProducer.cpp @@ -55,13 +55,14 @@ const int FIELD_ID_ATOMS = 2; EventMetricProducer::EventMetricProducer( const ConfigKey& key, const EventMetric& metric, const int conditionIndex, const vector& initialConditionCache, const sp& wizard, - const int64_t startTimeNs, + const uint64_t protoHash, const int64_t startTimeNs, const unordered_map>& eventActivationMap, const unordered_map>>& eventDeactivationMap, const vector& slicedStateAtoms, const unordered_map>& stateGroupMap) : MetricProducer(metric.id(), key, startTimeNs, conditionIndex, initialConditionCache, wizard, - eventActivationMap, eventDeactivationMap, slicedStateAtoms, stateGroupMap) { + protoHash, eventActivationMap, eventDeactivationMap, slicedStateAtoms, + stateGroupMap) { if (metric.links().size() > 0) { for (const auto& link : metric.links()) { Metric2Condition mc; diff --git a/cmds/statsd/src/metrics/EventMetricProducer.h b/cmds/statsd/src/metrics/EventMetricProducer.h index bfb2de36fad41..e828dddcbb185 100644 --- a/cmds/statsd/src/metrics/EventMetricProducer.h +++ b/cmds/statsd/src/metrics/EventMetricProducer.h @@ -36,7 +36,7 @@ public: EventMetricProducer( const ConfigKey& key, const EventMetric& eventMetric, const int conditionIndex, const vector& initialConditionCache, const sp& wizard, - const int64_t startTimeNs, + const uint64_t protoHash, const int64_t startTimeNs, const std::unordered_map>& eventActivationMap = {}, const std::unordered_map>>& eventDeactivationMap = {}, @@ -45,6 +45,10 @@ public: virtual ~EventMetricProducer(); + MetricType getMetricType() const override { + return METRIC_TYPE_EVENT; + } + private: void onMatchedLogEventInternalLocked( const size_t matcherIndex, const MetricDimensionKey& eventKey, diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp index 020f4b638f4df..9dda248a6d1f1 100644 --- a/cmds/statsd/src/metrics/GaugeMetricProducer.cpp +++ b/cmds/statsd/src/metrics/GaugeMetricProducer.cpp @@ -71,13 +71,14 @@ const int FIELD_ID_END_BUCKET_ELAPSED_MILLIS = 8; GaugeMetricProducer::GaugeMetricProducer( const ConfigKey& key, const GaugeMetric& metric, const int conditionIndex, const vector& initialConditionCache, const sp& wizard, - const int whatMatcherIndex, const sp& matcherWizard, - const int pullTagId, const int triggerAtomId, const int atomId, const int64_t timeBaseNs, - const int64_t startTimeNs, const sp& pullerManager, + const uint64_t protoHash, const int whatMatcherIndex, + const sp& matcherWizard, const int pullTagId, const int triggerAtomId, + const int atomId, const int64_t timeBaseNs, const int64_t startTimeNs, + const sp& pullerManager, const unordered_map>& eventActivationMap, const unordered_map>>& eventDeactivationMap) : MetricProducer(metric.id(), key, timeBaseNs, conditionIndex, initialConditionCache, wizard, - eventActivationMap, eventDeactivationMap, /*slicedStateAtoms=*/{}, + protoHash, eventActivationMap, eventDeactivationMap, /*slicedStateAtoms=*/{}, /*stateGroupMap=*/{}), mWhatMatcherIndex(whatMatcherIndex), mEventMatcherWizard(matcherWizard), diff --git a/cmds/statsd/src/metrics/GaugeMetricProducer.h b/cmds/statsd/src/metrics/GaugeMetricProducer.h index ef3a24a43dcc2..e933d4b197165 100644 --- a/cmds/statsd/src/metrics/GaugeMetricProducer.h +++ b/cmds/statsd/src/metrics/GaugeMetricProducer.h @@ -59,10 +59,11 @@ public: GaugeMetricProducer( const ConfigKey& key, const GaugeMetric& gaugeMetric, const int conditionIndex, const vector& initialConditionCache, - const sp& conditionWizard, const int whatMatcherIndex, - const sp& matcherWizard, const int pullTagId, - const int triggerAtomId, const int atomId, const int64_t timeBaseNs, - const int64_t startTimeNs, const sp& pullerManager, + const sp& conditionWizard, const uint64_t protoHash, + const int whatMatcherIndex, const sp& matcherWizard, + const int pullTagId, const int triggerAtomId, const int atomId, + const int64_t timeBaseNs, const int64_t startTimeNs, + const sp& pullerManager, const std::unordered_map>& eventActivationMap = {}, const std::unordered_map>>& eventDeactivationMap = {}); @@ -96,6 +97,10 @@ public: } }; + MetricType getMetricType() const override { + return METRIC_TYPE_GAUGE; + } + protected: void onMatchedLogEventInternalLocked( const size_t matcherIndex, const MetricDimensionKey& eventKey, diff --git a/cmds/statsd/src/metrics/MetricProducer.cpp b/cmds/statsd/src/metrics/MetricProducer.cpp index fe143e4963732..c1c1d20f00e21 100644 --- a/cmds/statsd/src/metrics/MetricProducer.cpp +++ b/cmds/statsd/src/metrics/MetricProducer.cpp @@ -46,13 +46,14 @@ const int FIELD_ID_ACTIVE_EVENT_ACTIVATION_STATE = 3; MetricProducer::MetricProducer( const int64_t& metricId, const ConfigKey& key, const int64_t timeBaseNs, const int conditionIndex, const vector& initialConditionCache, - const sp& wizard, + const sp& wizard, const uint64_t protoHash, const std::unordered_map>& eventActivationMap, const std::unordered_map>>& eventDeactivationMap, const vector& slicedStateAtoms, const unordered_map>& stateGroupMap) : mMetricId(metricId), + mProtoHash(protoHash), mConfigKey(key), mTimeBaseNs(timeBaseNs), mCurrentBucketStartTimeNs(timeBaseNs), diff --git a/cmds/statsd/src/metrics/MetricProducer.h b/cmds/statsd/src/metrics/MetricProducer.h index be4cd6724bb19..bb590aac54d64 100644 --- a/cmds/statsd/src/metrics/MetricProducer.h +++ b/cmds/statsd/src/metrics/MetricProducer.h @@ -87,6 +87,13 @@ enum BucketDropReason { NO_DATA = 9 }; +enum MetricType { + METRIC_TYPE_EVENT = 1, + METRIC_TYPE_COUNT = 2, + METRIC_TYPE_DURATION = 3, + METRIC_TYPE_GAUGE = 4, + METRIC_TYPE_VALUE = 5, +}; struct Activation { Activation(const ActivationType& activationType, const int64_t ttlNs) : ttl_ns(ttlNs), @@ -130,7 +137,7 @@ class MetricProducer : public virtual android::RefBase, public virtual StateList public: MetricProducer(const int64_t& metricId, const ConfigKey& key, const int64_t timeBaseNs, const int conditionIndex, const vector& initialConditionCache, - const sp& wizard, + const sp& wizard, const uint64_t protoHash, const std::unordered_map>& eventActivationMap, const std::unordered_map>>& eventDeactivationMap, @@ -259,10 +266,16 @@ public: int64_t currentTimeNs, const DumpReportReason reason, ProtoOutputStream* proto); // Start: getters/setters - inline const int64_t& getMetricId() const { + inline int64_t getMetricId() const { return mMetricId; } + inline uint64_t getProtoHash() const { + return mProtoHash; + } + + virtual MetricType getMetricType() const = 0; + // For test only. inline int64_t getCurrentBucketNum() const { return mCurrentBucketNum; @@ -400,6 +413,10 @@ protected: const int64_t mMetricId; + // Hash of the Metric's proto bytes from StatsdConfig, including any activations. + // Used to determine if the definition of this metric has changed across a config update. + const uint64_t mProtoHash; + const ConfigKey mConfigKey; // The time when this metric producer was first created. The end time for the current bucket diff --git a/cmds/statsd/src/metrics/MetricsManager.cpp b/cmds/statsd/src/metrics/MetricsManager.cpp index a0c701ea42298..39806890c42dd 100644 --- a/cmds/statsd/src/metrics/MetricsManager.cpp +++ b/cmds/statsd/src/metrics/MetricsManager.cpp @@ -80,11 +80,11 @@ MetricsManager::MetricsManager(const ConfigKey& key, const StatsdConfig& config, mConfigValid = initStatsdConfig( key, config, uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseNs, currentTimeNs, mTagIds, mAllAtomMatchingTrackers, mAtomMatchingTrackerMap, - mAllConditionTrackers, mConditionTrackerMap, mAllMetricProducers, mAllAnomalyTrackers, - mAllPeriodicAlarmTrackers, mConditionToMetricMap, mTrackerToMetricMap, - mTrackerToConditionMap, mActivationAtomTrackerToMetricMap, + mAllConditionTrackers, mConditionTrackerMap, mAllMetricProducers, mMetricProducerMap, + mAllAnomalyTrackers, mAllPeriodicAlarmTrackers, mConditionToMetricMap, + mTrackerToMetricMap, mTrackerToConditionMap, mActivationAtomTrackerToMetricMap, mDeactivationAtomTrackerToMetricMap, mAlertTrackerMap, mMetricIndexesWithActivation, - mNoReportMetricIds); + mStateProtoHashes, mNoReportMetricIds); mHashStringsInReport = config.hash_strings_in_metric_report(); mVersionStringsInReport = config.version_strings_in_metric_report(); diff --git a/cmds/statsd/src/metrics/MetricsManager.h b/cmds/statsd/src/metrics/MetricsManager.h index bd0c8161a884d..27f3d51b07ced 100644 --- a/cmds/statsd/src/metrics/MetricsManager.h +++ b/cmds/statsd/src/metrics/MetricsManager.h @@ -248,6 +248,9 @@ private: // Maps the id of a condition tracker to its index in mAllConditionTrackers. std::unordered_map mConditionTrackerMap; + // Maps the id of a metric producer to its index in mAllMetricProducers. + std::unordered_map mMetricProducerMap; + // To make the log processing more efficient, we want to do as much filtering as possible // before we go into individual trackers and conditions to match. @@ -295,6 +298,9 @@ private: // The config is always active if any metric in the config does not have an activation signal. bool mIsAlwaysActive; + // Hashes of the States used in this config, keyed by the state id, used in config updates. + std::map mStateProtoHashes; + FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensions); FRIEND_TEST(MetricConditionLinkE2eTest, TestMultiplePredicatesAndLinks); FRIEND_TEST(AttributionE2eTest, TestAttributionMatchAndSliceByFirstUid); diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.cpp b/cmds/statsd/src/metrics/ValueMetricProducer.cpp index dcfbd5ea239bb..39ae9a47f2bf7 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.cpp +++ b/cmds/statsd/src/metrics/ValueMetricProducer.cpp @@ -79,16 +79,17 @@ const Value ZERO_DOUBLE((int64_t)0); ValueMetricProducer::ValueMetricProducer( const ConfigKey& key, const ValueMetric& metric, const int conditionIndex, const vector& initialConditionCache, - const sp& conditionWizard, const int whatMatcherIndex, - const sp& matcherWizard, const int pullTagId, const int64_t timeBaseNs, - const int64_t startTimeNs, const sp& pullerManager, + const sp& conditionWizard, const uint64_t protoHash, + const int whatMatcherIndex, const sp& matcherWizard, + const int pullTagId, const int64_t timeBaseNs, const int64_t startTimeNs, + const sp& pullerManager, const unordered_map>& eventActivationMap, const unordered_map>>& eventDeactivationMap, const vector& slicedStateAtoms, const unordered_map>& stateGroupMap) : MetricProducer(metric.id(), key, timeBaseNs, conditionIndex, initialConditionCache, - conditionWizard, eventActivationMap, eventDeactivationMap, slicedStateAtoms, - stateGroupMap), + conditionWizard, protoHash, eventActivationMap, eventDeactivationMap, + slicedStateAtoms, stateGroupMap), mWhatMatcherIndex(whatMatcherIndex), mEventMatcherWizard(matcherWizard), mPullerManager(pullerManager), diff --git a/cmds/statsd/src/metrics/ValueMetricProducer.h b/cmds/statsd/src/metrics/ValueMetricProducer.h index 472cc33b97fa5..4b2599bdb517c 100644 --- a/cmds/statsd/src/metrics/ValueMetricProducer.h +++ b/cmds/statsd/src/metrics/ValueMetricProducer.h @@ -52,9 +52,9 @@ public: ValueMetricProducer( const ConfigKey& key, const ValueMetric& valueMetric, const int conditionIndex, const vector& initialConditionCache, - const sp& conditionWizard, const int whatMatcherIndex, - const sp& matcherWizard, const int pullTagId, - const int64_t timeBaseNs, const int64_t startTimeNs, + const sp& conditionWizard, const uint64_t protoHash, + const int whatMatcherIndex, const sp& matcherWizard, + const int pullTagId, const int64_t timeBaseNs, const int64_t startTimeNs, const sp& pullerManager, const std::unordered_map>& eventActivationMap = {}, const std::unordered_map>>& @@ -92,6 +92,10 @@ public: void onStateChanged(int64_t eventTimeNs, int32_t atomId, const HashableDimensionKey& primaryKey, const FieldValue& oldState, const FieldValue& newState) override; + MetricType getMetricType() const override { + return METRIC_TYPE_VALUE; + } + protected: void onMatchedLogEventInternalLocked( const size_t matcherIndex, const MetricDimensionKey& eventKey, diff --git a/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.cpp b/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.cpp index 2e3e43413d543..3f40c90d515aa 100644 --- a/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.cpp +++ b/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.cpp @@ -38,6 +38,7 @@ #include "state/StateManager.h" #include "stats_util.h" +using google::protobuf::MessageLite; using std::set; using std::unordered_map; using std::vector; @@ -60,6 +61,20 @@ bool hasLeafNode(const FieldMatcher& matcher) { return true; } +bool getMetricProtoHash(const MessageLite& metric, const int64_t id, const bool hasActivation, + const uint64_t activationHash, uint64_t& metricHash) { + string serializedMetric; + if (!metric.SerializeToString(&serializedMetric)) { + ALOGE("Unable to serialize metric %lld", (long long)id); + return false; + } + metricHash = Hash64(serializedMetric); + if (hasActivation) { + metricHash = Hash64(to_string(metricHash).append(to_string(activationHash))); + } + return true; +} + } // namespace sp createAtomMatchingTracker(const AtomMatcher& logMatcher, const int index, @@ -228,19 +243,31 @@ bool handleMetricWithStateLink(const FieldMatcher& stateMatcher, bool handleMetricActivation( const StatsdConfig& config, const int64_t metricId, const int metricIndex, const unordered_map& metricToActivationMap, - const unordered_map& atomMatchingTrackerMap, + const unordered_map& atomMatchingTrackerMap, bool& hasActivation, unordered_map>& activationAtomTrackerToMetricMap, unordered_map>& deactivationAtomTrackerToMetricMap, vector& metricsWithActivation, unordered_map>& eventActivationMap, - unordered_map>>& eventDeactivationMap) { + unordered_map>>& eventDeactivationMap, + uint64_t& activationHash) { // Check if metric has an associated activation auto itr = metricToActivationMap.find(metricId); - if (itr == metricToActivationMap.end()) return true; + if (itr == metricToActivationMap.end()) { + hasActivation = false; + return true; + } + hasActivation = true; int activationIndex = itr->second; const MetricActivation& metricActivation = config.metric_activation(activationIndex); + string serializedActivation; + if (!metricActivation.SerializeToString(&serializedActivation)) { + ALOGE("Unable to serialize metric activation for metric %lld", (long long)metricId); + return false; + } + activationHash = Hash64(serializedActivation); + for (int i = 0; i < metricActivation.event_activation_size(); i++) { const EventActivation& activation = metricActivation.event_activation(i); @@ -357,12 +384,20 @@ bool initConditions(const ConfigKey& key, const StatsdConfig& config, } bool initStates(const StatsdConfig& config, unordered_map& stateAtomIdMap, - unordered_map>& allStateGroupMaps) { + unordered_map>& allStateGroupMaps, + map& stateProtoHashes) { for (int i = 0; i < config.state_size(); i++) { const State& state = config.state(i); const int64_t stateId = state.id(); stateAtomIdMap[stateId] = state.atom_id(); + string serializedState; + if (!state.SerializeToString(&serializedState)) { + ALOGE("Unable to serialize state %lld", (long long)stateId); + return false; + } + stateProtoHashes[stateId] = Hash64(serializedState); + const StateMap& stateMap = state.map(); for (auto group : stateMap.group()) { for (auto value : group.value()) { @@ -457,18 +492,25 @@ bool initMetrics(const ConfigKey& key, const StatsdConfig& config, const int64_t } } + bool hasActivation = false; unordered_map> eventActivationMap; unordered_map>> eventDeactivationMap; + uint64_t activationHash; bool success = handleMetricActivation( config, metric.id(), metricIndex, metricToActivationMap, atomMatchingTrackerMap, - activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, - metricsWithActivation, eventActivationMap, eventDeactivationMap); + hasActivation, activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, + metricsWithActivation, eventActivationMap, eventDeactivationMap, activationHash); if (!success) return false; - sp countProducer = - new CountMetricProducer(key, metric, conditionIndex, initialConditionCache, wizard, - timeBaseTimeNs, currentTimeNs, eventActivationMap, - eventDeactivationMap, slicedStateAtoms, stateGroupMap); + uint64_t metricHash; + if (!getMetricProtoHash(metric, metric.id(), hasActivation, activationHash, metricHash)) { + return false; + } + + sp countProducer = new CountMetricProducer( + key, metric, conditionIndex, initialConditionCache, wizard, metricHash, + timeBaseTimeNs, currentTimeNs, eventActivationMap, eventDeactivationMap, + slicedStateAtoms, stateGroupMap); allMetricProducers.push_back(countProducer); } @@ -566,19 +608,26 @@ bool initMetrics(const ConfigKey& key, const StatsdConfig& config, const int64_t } } + bool hasActivation = false; unordered_map> eventActivationMap; unordered_map>> eventDeactivationMap; + uint64_t activationHash; bool success = handleMetricActivation( config, metric.id(), metricIndex, metricToActivationMap, atomMatchingTrackerMap, - activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, - metricsWithActivation, eventActivationMap, eventDeactivationMap); + hasActivation, activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, + metricsWithActivation, eventActivationMap, eventDeactivationMap, activationHash); if (!success) return false; + uint64_t metricHash; + if (!getMetricProtoHash(metric, metric.id(), hasActivation, activationHash, metricHash)) { + return false; + } + sp durationMetric = new DurationMetricProducer( key, metric, conditionIndex, initialConditionCache, trackerIndices[0], - trackerIndices[1], trackerIndices[2], nesting, wizard, internalDimensions, - timeBaseTimeNs, currentTimeNs, eventActivationMap, eventDeactivationMap, - slicedStateAtoms, stateGroupMap); + trackerIndices[1], trackerIndices[2], nesting, wizard, metricHash, + internalDimensions, timeBaseTimeNs, currentTimeNs, eventActivationMap, + eventDeactivationMap, slicedStateAtoms, stateGroupMap); allMetricProducers.push_back(durationMetric); } @@ -614,17 +663,24 @@ bool initMetrics(const ConfigKey& key, const StatsdConfig& config, const int64_t } } + bool hasActivation = false; unordered_map> eventActivationMap; unordered_map>> eventDeactivationMap; + uint64_t activationHash; bool success = handleMetricActivation( config, metric.id(), metricIndex, metricToActivationMap, atomMatchingTrackerMap, - activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, - metricsWithActivation, eventActivationMap, eventDeactivationMap); + hasActivation, activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, + metricsWithActivation, eventActivationMap, eventDeactivationMap, activationHash); if (!success) return false; - sp eventMetric = - new EventMetricProducer(key, metric, conditionIndex, initialConditionCache, wizard, - timeBaseTimeNs, eventActivationMap, eventDeactivationMap); + uint64_t metricHash; + if (!getMetricProtoHash(metric, metric.id(), hasActivation, activationHash, metricHash)) { + return false; + } + + sp eventMetric = new EventMetricProducer( + key, metric, conditionIndex, initialConditionCache, wizard, metricHash, + timeBaseTimeNs, eventActivationMap, eventDeactivationMap); allMetricProducers.push_back(eventMetric); } @@ -703,18 +759,26 @@ bool initMetrics(const ConfigKey& key, const StatsdConfig& config, const int64_t } } + bool hasActivation = false; unordered_map> eventActivationMap; unordered_map>> eventDeactivationMap; + uint64_t activationHash; bool success = handleMetricActivation( config, metric.id(), metricIndex, metricToActivationMap, atomMatchingTrackerMap, - activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, - metricsWithActivation, eventActivationMap, eventDeactivationMap); + hasActivation, activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, + metricsWithActivation, eventActivationMap, eventDeactivationMap, activationHash); if (!success) return false; + uint64_t metricHash; + if (!getMetricProtoHash(metric, metric.id(), hasActivation, activationHash, metricHash)) { + return false; + } + sp valueProducer = new ValueMetricProducer( - key, metric, conditionIndex, initialConditionCache, wizard, trackerIndex, - matcherWizard, pullTagId, timeBaseTimeNs, currentTimeNs, pullerManager, - eventActivationMap, eventDeactivationMap, slicedStateAtoms, stateGroupMap); + key, metric, conditionIndex, initialConditionCache, wizard, metricHash, + trackerIndex, matcherWizard, pullTagId, timeBaseTimeNs, currentTimeNs, + pullerManager, eventActivationMap, eventDeactivationMap, slicedStateAtoms, + stateGroupMap); allMetricProducers.push_back(valueProducer); } @@ -799,18 +863,25 @@ bool initMetrics(const ConfigKey& key, const StatsdConfig& config, const int64_t } } + bool hasActivation = false; unordered_map> eventActivationMap; unordered_map>> eventDeactivationMap; + uint64_t activationHash; bool success = handleMetricActivation( config, metric.id(), metricIndex, metricToActivationMap, atomMatchingTrackerMap, - activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, - metricsWithActivation, eventActivationMap, eventDeactivationMap); + hasActivation, activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, + metricsWithActivation, eventActivationMap, eventDeactivationMap, activationHash); if (!success) return false; + uint64_t metricHash; + if (!getMetricProtoHash(metric, metric.id(), hasActivation, activationHash, metricHash)) { + return false; + } + sp gaugeProducer = new GaugeMetricProducer( - key, metric, conditionIndex, initialConditionCache, wizard, trackerIndex, - matcherWizard, pullTagId, triggerAtomId, atomTagId, timeBaseTimeNs, currentTimeNs, - pullerManager, eventActivationMap, eventDeactivationMap); + key, metric, conditionIndex, initialConditionCache, wizard, metricHash, + trackerIndex, matcherWizard, pullTagId, triggerAtomId, atomTagId, timeBaseTimeNs, + currentTimeNs, pullerManager, eventActivationMap, eventDeactivationMap); allMetricProducers.push_back(gaugeProducer); } for (int i = 0; i < config.no_report_metric_size(); ++i) { @@ -945,6 +1016,7 @@ bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, const sp vector>& allConditionTrackers, unordered_map& conditionTrackerMap, vector>& allMetricProducers, + unordered_map& metricProducerMap, vector>& allAnomalyTrackers, vector>& allPeriodicAlarmTrackers, unordered_map>& conditionToMetricMap, @@ -953,9 +1025,9 @@ bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, const sp unordered_map>& activationAtomTrackerToMetricMap, unordered_map>& deactivationAtomTrackerToMetricMap, unordered_map& alertTrackerMap, - vector& metricsWithActivation, std::set& noReportMetricIds) { + vector& metricsWithActivation, map& stateProtoHashes, + set& noReportMetricIds) { vector initialConditionCache; - unordered_map metricProducerMap; unordered_map stateAtomIdMap; unordered_map> allStateGroupMaps; @@ -972,7 +1044,7 @@ bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, const sp return false; } - if (!initStates(config, stateAtomIdMap, allStateGroupMaps)) { + if (!initStates(config, stateAtomIdMap, allStateGroupMaps, stateProtoHashes)) { ALOGE("initStates failed"); return false; } diff --git a/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.h b/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.h index 6eabcf4971d30..4979c30511331 100644 --- a/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.h +++ b/cmds/statsd/src/metrics/parsing_utils/metrics_manager_util.h @@ -98,8 +98,10 @@ bool initConditions(const ConfigKey& key, const StatsdConfig& config, // [stateAtomIdMap]: this map should contain the mapping from state ids to atom ids // [allStateGroupMaps]: this map should contain the mapping from states ids and state // values to state group ids for all states +// [stateProtoHashes]: contains a map of state id to the hash of the State proto from the config bool initStates(const StatsdConfig& config, unordered_map& stateAtomIdMap, - unordered_map>& allStateGroupMaps); + unordered_map>& allStateGroupMaps, + std::map& stateProtoHashes); // Initialize MetricProducers. // input: @@ -146,6 +148,7 @@ bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, const sp std::vector>& allConditionTrackers, std::unordered_map& conditionTrackerMap, std::vector>& allMetricProducers, + std::unordered_map& metricProducerMap, vector>& allAnomalyTrackers, vector>& allPeriodicAlarmTrackers, std::unordered_map>& conditionToMetricMap, @@ -154,7 +157,9 @@ bool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, const sp unordered_map>& activationAtomTrackerToMetricMap, unordered_map>& deactivationAtomTrackerToMetricMap, std::unordered_map& alertTrackerMap, - vector& metricsWithActivation, std::set& noReportMetricIds); + vector& metricsWithActivation, + std::map& stateProtoHashes, + std::set& noReportMetricIds); } // namespace statsd } // namespace os diff --git a/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp b/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp index bb8e7bfd90f42..8e2864c6fba80 100644 --- a/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp +++ b/cmds/statsd/tests/metrics/CountMetricProducer_test.cpp @@ -41,6 +41,7 @@ namespace statsd { namespace { const ConfigKey kConfigKey(0, 12345); +const uint64_t protoHash = 0x1234567890; void makeLogEvent(LogEvent* logEvent, int64_t timestampNs, int atomId) { AStatsEvent* statsEvent = AStatsEvent_obtain(); @@ -75,7 +76,7 @@ TEST(CountMetricProducerTest, TestFirstBucket) { sp wizard = new NaggyMock(); CountMetricProducer countProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, 5, 600 * NS_PER_SEC + NS_PER_SEC / 2); + wizard, protoHash, 5, 600 * NS_PER_SEC + NS_PER_SEC / 2); EXPECT_EQ(600500000000, countProducer.mCurrentBucketStartTimeNs); EXPECT_EQ(10, countProducer.mCurrentBucketNum); EXPECT_EQ(660000000005, countProducer.getCurrentBucketEndTimeNs()); @@ -95,7 +96,7 @@ TEST(CountMetricProducerTest, TestNonDimensionalEvents) { sp wizard = new NaggyMock(); CountMetricProducer countProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, bucketStartTimeNs, bucketStartTimeNs); + wizard, protoHash, bucketStartTimeNs, bucketStartTimeNs); // 2 events in bucket 1. LogEvent event1(/*uid=*/0, /*pid=*/0); @@ -158,7 +159,7 @@ TEST(CountMetricProducerTest, TestEventsWithNonSlicedCondition) { sp wizard = new NaggyMock(); CountMetricProducer countProducer(kConfigKey, metric, 0, {ConditionState::kUnknown}, wizard, - bucketStartTimeNs, bucketStartTimeNs); + protoHash, bucketStartTimeNs, bucketStartTimeNs); countProducer.onConditionChanged(true, bucketStartTimeNs); @@ -226,8 +227,8 @@ TEST(CountMetricProducerTest, TestEventsWithSlicedCondition) { EXPECT_CALL(*wizard, query(_, key2, _)).WillOnce(Return(ConditionState::kTrue)); CountMetricProducer countProducer(kConfigKey, metric, 0 /*condition tracker index*/, - {ConditionState::kUnknown}, wizard, bucketStartTimeNs, - bucketStartTimeNs); + {ConditionState::kUnknown}, wizard, protoHash, + bucketStartTimeNs, bucketStartTimeNs); countProducer.onMatchedLogEvent(1 /*log matcher index*/, event1); countProducer.flushIfNeededLocked(bucketStartTimeNs + 1); @@ -265,7 +266,7 @@ TEST_P(CountMetricProducerTest_PartialBucket, TestSplitInCurrentBucket) { sp wizard = new NaggyMock(); CountMetricProducer countProducer(kConfigKey, metric, -1 /* no condition */, {}, wizard, - bucketStartTimeNs, bucketStartTimeNs); + protoHash, bucketStartTimeNs, bucketStartTimeNs); sp anomalyTracker = countProducer.addAnomalyTracker(alert, alarmMonitor); EXPECT_TRUE(anomalyTracker != nullptr); @@ -332,7 +333,7 @@ TEST_P(CountMetricProducerTest_PartialBucket, TestSplitInNextBucket) { sp wizard = new NaggyMock(); CountMetricProducer countProducer(kConfigKey, metric, -1 /* no condition */, {}, wizard, - bucketStartTimeNs, bucketStartTimeNs); + protoHash, bucketStartTimeNs, bucketStartTimeNs); // Bucket is flushed yet. LogEvent event1(/*uid=*/0, /*pid=*/0); @@ -397,7 +398,7 @@ TEST(CountMetricProducerTest, TestAnomalyDetectionUnSliced) { sp wizard = new NaggyMock(); CountMetricProducer countProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, bucketStartTimeNs, bucketStartTimeNs); + wizard, protoHash, bucketStartTimeNs, bucketStartTimeNs); sp anomalyTracker = countProducer.addAnomalyTracker(alert, alarmMonitor); @@ -459,7 +460,7 @@ TEST(CountMetricProducerTest, TestOneWeekTimeUnit) { int64_t fiveWeeksNs = 5 * 7 * oneDayNs; CountMetricProducer countProducer(kConfigKey, metric, -1 /* meaning no condition */, {}, wizard, - oneDayNs, fiveWeeksNs); + protoHash, oneDayNs, fiveWeeksNs); int64_t fiveWeeksOneDayNs = fiveWeeksNs + oneDayNs; diff --git a/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp b/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp index 05cfa37b0ee10..d1f89775ed6a1 100644 --- a/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp +++ b/cmds/statsd/tests/metrics/DurationMetricProducer_test.cpp @@ -45,6 +45,7 @@ namespace statsd { namespace { const ConfigKey kConfigKey(0, 12345); +const uint64_t protoHash = 0x1234567890; void makeLogEvent(LogEvent* logEvent, int64_t timestampNs, int atomId) { AStatsEvent* statsEvent = AStatsEvent_obtain(); AStatsEvent_setAtomId(statsEvent, atomId); @@ -71,10 +72,10 @@ TEST(DurationMetricTrackerTest, TestFirstBucket) { FieldMatcher dimensions; - DurationMetricProducer durationProducer(kConfigKey, metric, -1 /*no condition*/, {}, - 1 /* start index */, 2 /* stop index */, - 3 /* stop_all index */, false /*nesting*/, wizard, - dimensions, 5, 600 * NS_PER_SEC + NS_PER_SEC / 2); + DurationMetricProducer durationProducer( + kConfigKey, metric, -1 /*no condition*/, {}, 1 /* start index */, 2 /* stop index */, + 3 /* stop_all index */, false /*nesting*/, wizard, protoHash, dimensions, 5, + 600 * NS_PER_SEC + NS_PER_SEC / 2); EXPECT_EQ(600500000000, durationProducer.mCurrentBucketStartTimeNs); EXPECT_EQ(10, durationProducer.mCurrentBucketNum); @@ -99,10 +100,10 @@ TEST(DurationMetricTrackerTest, TestNoCondition) { FieldMatcher dimensions; - DurationMetricProducer durationProducer(kConfigKey, metric, -1 /*no condition*/, {}, - 1 /* start index */, 2 /* stop index */, - 3 /* stop_all index */, false /*nesting*/, wizard, - dimensions, bucketStartTimeNs, bucketStartTimeNs); + DurationMetricProducer durationProducer( + kConfigKey, metric, -1 /*no condition*/, {}, 1 /* start index */, 2 /* stop index */, + 3 /* stop_all index */, false /*nesting*/, wizard, protoHash, dimensions, + bucketStartTimeNs, bucketStartTimeNs); durationProducer.onMatchedLogEvent(1 /* start index*/, event1); durationProducer.onMatchedLogEvent(2 /* stop index*/, event2); @@ -145,7 +146,7 @@ TEST(DurationMetricTrackerTest, TestNonSlicedCondition) { DurationMetricProducer durationProducer( kConfigKey, metric, 0 /* condition index */, {ConditionState::kUnknown}, 1 /* start index */, 2 /* stop index */, 3 /* stop_all index */, false /*nesting*/, - wizard, dimensions, bucketStartTimeNs, bucketStartTimeNs); + wizard, protoHash, dimensions, bucketStartTimeNs, bucketStartTimeNs); durationProducer.mCondition = ConditionState::kFalse; EXPECT_FALSE(durationProducer.mCondition); @@ -195,7 +196,7 @@ TEST(DurationMetricTrackerTest, TestNonSlicedConditionUnknownState) { DurationMetricProducer durationProducer( kConfigKey, metric, 0 /* condition index */, {ConditionState::kUnknown}, 1 /* start index */, 2 /* stop index */, 3 /* stop_all index */, false /*nesting*/, - wizard, dimensions, bucketStartTimeNs, bucketStartTimeNs); + wizard, protoHash, dimensions, bucketStartTimeNs, bucketStartTimeNs); EXPECT_EQ(ConditionState::kUnknown, durationProducer.mCondition); EXPECT_FALSE(durationProducer.isConditionSliced()); @@ -238,10 +239,10 @@ TEST_P(DurationMetricProducerTest_PartialBucket, TestSumDuration) { sp wizard = new NaggyMock(); FieldMatcher dimensions; - DurationMetricProducer durationProducer(kConfigKey, metric, -1 /* no condition */, {}, - 1 /* start index */, 2 /* stop index */, - 3 /* stop_all index */, false /*nesting*/, wizard, - dimensions, bucketStartTimeNs, bucketStartTimeNs); + DurationMetricProducer durationProducer( + kConfigKey, metric, -1 /* no condition */, {}, 1 /* start index */, 2 /* stop index */, + 3 /* stop_all index */, false /*nesting*/, wizard, protoHash, dimensions, + bucketStartTimeNs, bucketStartTimeNs); int64_t startTimeNs = bucketStartTimeNs + 1 * NS_PER_SEC; LogEvent event1(/*uid=*/0, /*pid=*/0); @@ -301,10 +302,10 @@ TEST_P(DurationMetricProducerTest_PartialBucket, TestSumDurationWithSplitInFollo sp wizard = new NaggyMock(); FieldMatcher dimensions; - DurationMetricProducer durationProducer(kConfigKey, metric, -1 /* no condition */, {}, - 1 /* start index */, 2 /* stop index */, - 3 /* stop_all index */, false /*nesting*/, wizard, - dimensions, bucketStartTimeNs, bucketStartTimeNs); + DurationMetricProducer durationProducer( + kConfigKey, metric, -1 /* no condition */, {}, 1 /* start index */, 2 /* stop index */, + 3 /* stop_all index */, false /*nesting*/, wizard, protoHash, dimensions, + bucketStartTimeNs, bucketStartTimeNs); int64_t startTimeNs = bucketStartTimeNs + 1 * NS_PER_SEC; LogEvent event1(/*uid=*/0, /*pid=*/0); @@ -365,10 +366,10 @@ TEST_P(DurationMetricProducerTest_PartialBucket, TestSumDurationAnomaly) { sp wizard = new NaggyMock(); FieldMatcher dimensions; - DurationMetricProducer durationProducer(kConfigKey, metric, -1 /* no condition */, {}, - 1 /* start index */, 2 /* stop index */, - 3 /* stop_all index */, false /*nesting*/, wizard, - dimensions, bucketStartTimeNs, bucketStartTimeNs); + DurationMetricProducer durationProducer( + kConfigKey, metric, -1 /* no condition */, {}, 1 /* start index */, 2 /* stop index */, + 3 /* stop_all index */, false /*nesting*/, wizard, protoHash, dimensions, + bucketStartTimeNs, bucketStartTimeNs); sp anomalyTracker = durationProducer.addAnomalyTracker(alert, alarmMonitor); EXPECT_TRUE(anomalyTracker != nullptr); @@ -411,10 +412,10 @@ TEST_P(DurationMetricProducerTest_PartialBucket, TestMaxDuration) { sp wizard = new NaggyMock(); FieldMatcher dimensions; - DurationMetricProducer durationProducer(kConfigKey, metric, -1 /* no condition */, {}, - 1 /* start index */, 2 /* stop index */, - 3 /* stop_all index */, false /*nesting*/, wizard, - dimensions, bucketStartTimeNs, bucketStartTimeNs); + DurationMetricProducer durationProducer( + kConfigKey, metric, -1 /* no condition */, {}, 1 /* start index */, 2 /* stop index */, + 3 /* stop_all index */, false /*nesting*/, wizard, protoHash, dimensions, + bucketStartTimeNs, bucketStartTimeNs); int64_t startTimeNs = bucketStartTimeNs + 1; LogEvent event1(/*uid=*/0, /*pid=*/0); @@ -465,10 +466,10 @@ TEST_P(DurationMetricProducerTest_PartialBucket, TestMaxDurationWithSplitInNextB sp wizard = new NaggyMock(); FieldMatcher dimensions; - DurationMetricProducer durationProducer(kConfigKey, metric, -1 /* no condition */, {}, - 1 /* start index */, 2 /* stop index */, - 3 /* stop_all index */, false /*nesting*/, wizard, - dimensions, bucketStartTimeNs, bucketStartTimeNs); + DurationMetricProducer durationProducer( + kConfigKey, metric, -1 /* no condition */, {}, 1 /* start index */, 2 /* stop index */, + 3 /* stop_all index */, false /*nesting*/, wizard, protoHash, dimensions, + bucketStartTimeNs, bucketStartTimeNs); int64_t startTimeNs = bucketStartTimeNs + 1; LogEvent event1(/*uid=*/0, /*pid=*/0); diff --git a/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp b/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp index dfbb9da568b0d..4bbbd2cb36ad7 100644 --- a/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp +++ b/cmds/statsd/tests/metrics/EventMetricProducer_test.cpp @@ -36,9 +36,11 @@ namespace android { namespace os { namespace statsd { -const ConfigKey kConfigKey(0, 12345); namespace { +const ConfigKey kConfigKey(0, 12345); +const uint64_t protoHash = 0x1234567890; + void makeLogEvent(LogEvent* logEvent, int32_t atomId, int64_t timestampNs, string str) { AStatsEvent* statsEvent = AStatsEvent_obtain(); AStatsEvent_setAtomId(statsEvent, atomId); @@ -66,7 +68,7 @@ TEST(EventMetricProducerTest, TestNoCondition) { sp wizard = new NaggyMock(); EventMetricProducer eventProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, bucketStartTimeNs); + wizard, protoHash, bucketStartTimeNs); eventProducer.onMatchedLogEvent(1 /*matcher index*/, event1); eventProducer.onMatchedLogEvent(1 /*matcher index*/, event2); @@ -102,7 +104,8 @@ TEST(EventMetricProducerTest, TestEventsWithNonSlicedCondition) { sp wizard = new NaggyMock(); EventMetricProducer eventProducer(kConfigKey, metric, 0 /*condition index*/, - {ConditionState::kUnknown}, wizard, bucketStartTimeNs); + {ConditionState::kUnknown}, wizard, protoHash, + bucketStartTimeNs); eventProducer.onConditionChanged(true /*condition*/, bucketStartTimeNs); eventProducer.onMatchedLogEvent(1 /*matcher index*/, event1); @@ -157,7 +160,8 @@ TEST(EventMetricProducerTest, TestEventsWithSlicedCondition) { EXPECT_CALL(*wizard, query(_, key2, _)).WillOnce(Return(ConditionState::kTrue)); EventMetricProducer eventProducer(kConfigKey, metric, 0 /*condition index*/, - {ConditionState::kUnknown}, wizard, bucketStartTimeNs); + {ConditionState::kUnknown}, wizard, protoHash, + bucketStartTimeNs); eventProducer.onMatchedLogEvent(1 /*matcher index*/, event1); eventProducer.onMatchedLogEvent(1 /*matcher index*/, event2); diff --git a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp index ba919f1e0ad8b..10606810d806d 100644 --- a/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp +++ b/cmds/statsd/tests/metrics/GaugeMetricProducer_test.cpp @@ -47,6 +47,7 @@ namespace { const ConfigKey kConfigKey(0, 12345); const int tagId = 1; const int64_t metricId = 123; +const uint64_t protoHash = 0x123456789; const int logEventMatcherIndex = 0; const int64_t bucketStartTimeNs = 10 * NS_PER_SEC; const int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL; @@ -101,8 +102,9 @@ TEST(GaugeMetricProducerTest, TestFirstBucket) { // statsd started long ago. // The metric starts in the middle of the bucket GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, logEventMatcherIndex, eventMatcherWizard, -1, -1, - tagId, 5, 600 * NS_PER_SEC + NS_PER_SEC / 2, pullerManager); + wizard, protoHash, logEventMatcherIndex, eventMatcherWizard, + -1, -1, tagId, 5, 600 * NS_PER_SEC + NS_PER_SEC / 2, + pullerManager); gaugeProducer.prepareFirstBucket(); EXPECT_EQ(600500000000, gaugeProducer.mCurrentBucketStartTimeNs); @@ -139,8 +141,9 @@ TEST(GaugeMetricProducerTest, TestPulledEventsNoCondition) { })); GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, logEventMatcherIndex, eventMatcherWizard, tagId, -1, - tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager); + wizard, protoHash, logEventMatcherIndex, eventMatcherWizard, + tagId, -1, tagId, bucketStartTimeNs, bucketStartTimeNs, + pullerManager); gaugeProducer.prepareFirstBucket(); vector> allData; @@ -213,7 +216,7 @@ TEST_P(GaugeMetricProducerTest_PartialBucket, TestPushedEvents) { createEventMatcherWizard(tagId, logEventMatcherIndex); GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, logEventMatcherIndex, eventMatcherWizard, + wizard, protoHash, logEventMatcherIndex, eventMatcherWizard, -1 /* -1 means no pulling */, -1, tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager); gaugeProducer.prepareFirstBucket(); @@ -306,8 +309,9 @@ TEST_P(GaugeMetricProducerTest_PartialBucket, TestPulled) { })); GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, logEventMatcherIndex, eventMatcherWizard, tagId, -1, - tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager); + wizard, protoHash, logEventMatcherIndex, eventMatcherWizard, + tagId, -1, tagId, bucketStartTimeNs, bucketStartTimeNs, + pullerManager); gaugeProducer.prepareFirstBucket(); vector> allData; @@ -373,8 +377,9 @@ TEST(GaugeMetricProducerTest, TestPulledWithAppUpgradeDisabled) { .WillOnce(Return(false)); GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, logEventMatcherIndex, eventMatcherWizard, tagId, -1, - tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager); + wizard, protoHash, logEventMatcherIndex, eventMatcherWizard, + tagId, -1, tagId, bucketStartTimeNs, bucketStartTimeNs, + pullerManager); gaugeProducer.prepareFirstBucket(); vector> allData; @@ -426,9 +431,9 @@ TEST(GaugeMetricProducerTest, TestPulledEventsWithCondition) { })); GaugeMetricProducer gaugeProducer(kConfigKey, metric, 0 /*condition index*/, - {ConditionState::kUnknown}, wizard, logEventMatcherIndex, - eventMatcherWizard, tagId, -1, tagId, bucketStartTimeNs, - bucketStartTimeNs, pullerManager); + {ConditionState::kUnknown}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, tagId, -1, tagId, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); gaugeProducer.prepareFirstBucket(); gaugeProducer.onConditionChanged(true, conditionChangeNs); @@ -509,9 +514,9 @@ TEST(GaugeMetricProducerTest, TestPulledEventsWithSlicedCondition) { })); GaugeMetricProducer gaugeProducer(kConfigKey, metric, 0 /*condition index*/, - {ConditionState::kUnknown}, wizard, logEventMatcherIndex, - eventMatcherWizard, tagId, -1, tagId, bucketStartTimeNs, - bucketStartTimeNs, pullerManager); + {ConditionState::kUnknown}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, tagId, -1, tagId, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); gaugeProducer.prepareFirstBucket(); gaugeProducer.onSlicedConditionMayChange(true, sliceConditionChangeNs); @@ -554,8 +559,9 @@ TEST(GaugeMetricProducerTest, TestPulledEventsAnomalyDetection) { createEventMatcherWizard(tagId, logEventMatcherIndex); GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, logEventMatcherIndex, eventMatcherWizard, tagId, -1, - tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager); + wizard, protoHash, logEventMatcherIndex, eventMatcherWizard, + tagId, -1, tagId, bucketStartTimeNs, bucketStartTimeNs, + pullerManager); gaugeProducer.prepareFirstBucket(); Alert alert; @@ -649,8 +655,8 @@ TEST(GaugeMetricProducerTest, TestPullOnTrigger) { int triggerId = 5; GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, logEventMatcherIndex, eventMatcherWizard, tagId, - triggerId, tagId, bucketStartTimeNs, bucketStartTimeNs, + wizard, protoHash, logEventMatcherIndex, eventMatcherWizard, + tagId, triggerId, tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager); gaugeProducer.prepareFirstBucket(); @@ -724,8 +730,8 @@ TEST(GaugeMetricProducerTest, TestRemoveDimensionInOutput) { int triggerId = 5; GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, logEventMatcherIndex, eventMatcherWizard, tagId, - triggerId, tagId, bucketStartTimeNs, bucketStartTimeNs, + wizard, protoHash, logEventMatcherIndex, eventMatcherWizard, + tagId, triggerId, tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager); gaugeProducer.prepareFirstBucket(); @@ -783,8 +789,8 @@ TEST(GaugeMetricProducerTest_BucketDrop, TestBucketDropWhenBucketTooSmall) { int triggerId = 5; GaugeMetricProducer gaugeProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, logEventMatcherIndex, eventMatcherWizard, tagId, - triggerId, tagId, bucketStartTimeNs, bucketStartTimeNs, + wizard, protoHash, logEventMatcherIndex, eventMatcherWizard, + tagId, triggerId, tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager); gaugeProducer.prepareFirstBucket(); diff --git a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp index 8790fe428d198..b166cc1fe04e0 100644 --- a/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp +++ b/cmds/statsd/tests/metrics/ValueMetricProducer_test.cpp @@ -46,6 +46,7 @@ namespace { const ConfigKey kConfigKey(0, 12345); const int tagId = 1; const int64_t metricId = 123; +const uint64_t protoHash = 0x1234567890; const int logEventMatcherIndex = 0; const int64_t bucketStartTimeNs = 10000000000; const int64_t bucketSizeNs = TimeUnitToBucketSizeInMillis(ONE_MINUTE) * 1000000LL; @@ -108,8 +109,8 @@ public: sp valueProducer = new ValueMetricProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, logEventMatcherIndex, eventMatcherWizard, tagId, - bucketStartTimeNs, bucketStartTimeNs, pullerManager); + wizard, protoHash, logEventMatcherIndex, eventMatcherWizard, + tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer->prepareFirstBucket(); return valueProducer; } @@ -127,7 +128,7 @@ public: sp valueProducer = new ValueMetricProducer( kConfigKey, metric, 0 /*condition index*/, {ConditionState::kUnknown}, wizard, - logEventMatcherIndex, eventMatcherWizard, tagId, bucketStartTimeNs, + protoHash, logEventMatcherIndex, eventMatcherWizard, tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer->prepareFirstBucket(); valueProducer->mCondition = conditionAfterFirstBucketPrepared; @@ -147,9 +148,9 @@ public: .WillRepeatedly(Return()); sp valueProducer = new ValueMetricProducer( - kConfigKey, metric, -1 /* no condition */, {}, wizard, logEventMatcherIndex, - eventMatcherWizard, tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager, {}, - {}, slicedStateAtoms, stateGroupMap); + kConfigKey, metric, -1 /* no condition */, {}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, tagId, bucketStartTimeNs, + bucketStartTimeNs, pullerManager, {}, {}, slicedStateAtoms, stateGroupMap); valueProducer->prepareFirstBucket(); return valueProducer; } @@ -169,8 +170,9 @@ public: sp valueProducer = new ValueMetricProducer( kConfigKey, metric, 0 /* condition tracker index */, {ConditionState::kUnknown}, - wizard, logEventMatcherIndex, eventMatcherWizard, tagId, bucketStartTimeNs, - bucketStartTimeNs, pullerManager, {}, {}, slicedStateAtoms, stateGroupMap); + wizard, protoHash, logEventMatcherIndex, eventMatcherWizard, tagId, + bucketStartTimeNs, bucketStartTimeNs, pullerManager, {}, {}, slicedStateAtoms, + stateGroupMap); valueProducer->prepareFirstBucket(); valueProducer->mCondition = conditionAfterFirstBucketPrepared; return valueProducer; @@ -228,8 +230,8 @@ TEST(ValueMetricProducerTest, TestCalcPreviousBucketEndTime) { // statsd started long ago. // The metric starts in the middle of the bucket ValueMetricProducer valueProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, logEventMatcherIndex, eventMatcherWizard, -1, - startTimeBase, 22, pullerManager); + wizard, protoHash, logEventMatcherIndex, eventMatcherWizard, + -1, startTimeBase, 22, pullerManager); valueProducer.prepareFirstBucket(); EXPECT_EQ(startTimeBase, valueProducer.calcPreviousBucketEndTime(60 * NS_PER_SEC + 10)); @@ -254,8 +256,8 @@ TEST(ValueMetricProducerTest, TestFirstBucket) { // statsd started long ago. // The metric starts in the middle of the bucket ValueMetricProducer valueProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, logEventMatcherIndex, eventMatcherWizard, -1, 5, - 600 * NS_PER_SEC + NS_PER_SEC / 2, pullerManager); + wizard, protoHash, logEventMatcherIndex, eventMatcherWizard, + -1, 5, 600 * NS_PER_SEC + NS_PER_SEC / 2, pullerManager); valueProducer.prepareFirstBucket(); EXPECT_EQ(600500000000, valueProducer.mCurrentBucketStartTimeNs); @@ -414,9 +416,10 @@ TEST(ValueMetricProducerTest, TestPulledEventsWithFiltering) { return true; })); - sp valueProducer = new ValueMetricProducer( - kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, wizard, logEventMatcherIndex, - eventMatcherWizard, tagId, bucketStartTimeNs, bucketStartTimeNs, pullerManager); + sp valueProducer = + new ValueMetricProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, wizard, + protoHash, logEventMatcherIndex, eventMatcherWizard, tagId, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer->prepareFirstBucket(); vector> allData; @@ -679,9 +682,9 @@ TEST_P(ValueMetricProducerTest_PartialBucket, TestPushedEvents) { sp wizard = new NaggyMock(); sp pullerManager = new StrictMock(); - ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, logEventMatcherIndex, - eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs, - pullerManager); + ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, -1, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); LogEvent event1(/*uid=*/0, /*pid=*/0); @@ -749,9 +752,9 @@ TEST_P(ValueMetricProducerTest_PartialBucket, TestPulledValue) { return true; })); - ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, logEventMatcherIndex, - eventMatcherWizard, tagId, bucketStartTimeNs, - bucketStartTimeNs, pullerManager); + ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, tagId, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); vector> allData; @@ -797,9 +800,9 @@ TEST(ValueMetricProducerTest, TestPulledWithAppUpgradeDisabled) { EXPECT_CALL(*pullerManager, Pull(tagId, kConfigKey, bucketStartTimeNs, _)) .WillOnce(Return(true)); - ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, logEventMatcherIndex, - eventMatcherWizard, tagId, bucketStartTimeNs, - bucketStartTimeNs, pullerManager); + ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, tagId, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); vector> allData; @@ -869,9 +872,9 @@ TEST(ValueMetricProducerTest, TestPushedEventsWithoutCondition) { sp wizard = new NaggyMock(); sp pullerManager = new StrictMock(); - ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, logEventMatcherIndex, - eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs, - pullerManager); + ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, -1, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); LogEvent event1(/*uid=*/0, /*pid=*/0); @@ -911,7 +914,7 @@ TEST(ValueMetricProducerTest, TestPushedEventsWithCondition) { sp pullerManager = new StrictMock(); ValueMetricProducer valueProducer(kConfigKey, metric, 0, {ConditionState::kUnknown}, wizard, - logEventMatcherIndex, eventMatcherWizard, -1, + protoHash, logEventMatcherIndex, eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); valueProducer.mCondition = ConditionState::kFalse; @@ -978,7 +981,7 @@ TEST(ValueMetricProducerTest, TestAnomalyDetection) { sp pullerManager = new StrictMock(); ValueMetricProducer valueProducer(kConfigKey, metric, -1 /*-1 meaning no condition*/, {}, - wizard, logEventMatcherIndex, eventMatcherWizard, + wizard, protoHash, logEventMatcherIndex, eventMatcherWizard, -1 /*not pulled*/, bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); @@ -1321,9 +1324,9 @@ TEST(ValueMetricProducerTest, TestPushedAggregateMin) { sp wizard = new NaggyMock(); sp pullerManager = new StrictMock(); - ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, logEventMatcherIndex, - eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs, - pullerManager); + ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, -1, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); LogEvent event1(/*uid=*/0, /*pid=*/0); @@ -1361,9 +1364,9 @@ TEST(ValueMetricProducerTest, TestPushedAggregateMax) { sp wizard = new NaggyMock(); sp pullerManager = new StrictMock(); - ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, logEventMatcherIndex, - eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs, - pullerManager); + ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, -1, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); LogEvent event1(/*uid=*/0, /*pid=*/0); @@ -1400,9 +1403,9 @@ TEST(ValueMetricProducerTest, TestPushedAggregateAvg) { sp wizard = new NaggyMock(); sp pullerManager = new StrictMock(); - ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, logEventMatcherIndex, - eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs, - pullerManager); + ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, -1, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); LogEvent event1(/*uid=*/0, /*pid=*/0); @@ -1444,9 +1447,9 @@ TEST(ValueMetricProducerTest, TestPushedAggregateSum) { sp wizard = new NaggyMock(); sp pullerManager = new StrictMock(); - ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, logEventMatcherIndex, - eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs, - pullerManager); + ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, -1, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); LogEvent event1(/*uid=*/0, /*pid=*/0); @@ -1484,9 +1487,9 @@ TEST(ValueMetricProducerTest, TestSkipZeroDiffOutput) { sp wizard = new NaggyMock(); sp pullerManager = new StrictMock(); - ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, logEventMatcherIndex, - eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs, - pullerManager); + ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, -1, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); LogEvent event1(/*uid=*/0, /*pid=*/0); @@ -1553,9 +1556,9 @@ TEST(ValueMetricProducerTest, TestSkipZeroDiffOutputMultiValue) { sp wizard = new NaggyMock(); sp pullerManager = new StrictMock(); - ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, logEventMatcherIndex, - eventMatcherWizard, -1, bucketStartTimeNs, bucketStartTimeNs, - pullerManager); + ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, -1, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); LogEvent event1(/*uid=*/0, /*pid=*/0); @@ -2089,7 +2092,7 @@ TEST(ValueMetricProducerTest, TestResetBaseOnPullTooLate) { EXPECT_CALL(*pullerManager, UnRegisterReceiver(tagId, kConfigKey, _)).WillRepeatedly(Return()); ValueMetricProducer valueProducer(kConfigKey, metric, 0, {ConditionState::kUnknown}, wizard, - logEventMatcherIndex, eventMatcherWizard, tagId, + protoHash, logEventMatcherIndex, eventMatcherWizard, tagId, bucket2StartTimeNs, bucket2StartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); valueProducer.mCondition = ConditionState::kFalse; @@ -2922,9 +2925,9 @@ TEST(ValueMetricProducerTest, TestPullNeededFastDump) { return true; })); - ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, logEventMatcherIndex, - eventMatcherWizard, tagId, bucketStartTimeNs, - bucketStartTimeNs, pullerManager); + ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, tagId, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); ProtoOutputStream output; @@ -2956,9 +2959,9 @@ TEST(ValueMetricProducerTest, TestFastDumpWithoutCurrentBucket) { return true; })); - ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, logEventMatcherIndex, - eventMatcherWizard, tagId, bucketStartTimeNs, - bucketStartTimeNs, pullerManager); + ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, tagId, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); vector> allData; @@ -3005,9 +3008,9 @@ TEST(ValueMetricProducerTest, TestPullNeededNoTimeConstraints) { return true; })); - ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, logEventMatcherIndex, - eventMatcherWizard, tagId, bucketStartTimeNs, - bucketStartTimeNs, pullerManager); + ValueMetricProducer valueProducer(kConfigKey, metric, -1, {}, wizard, protoHash, + logEventMatcherIndex, eventMatcherWizard, tagId, + bucketStartTimeNs, bucketStartTimeNs, pullerManager); valueProducer.prepareFirstBucket(); ProtoOutputStream output; diff --git a/cmds/statsd/tests/metrics/parsing_utils/config_update_utils_test.cpp b/cmds/statsd/tests/metrics/parsing_utils/config_update_utils_test.cpp index 890884bc5d83f..843d836a2c0b6 100644 --- a/cmds/statsd/tests/metrics/parsing_utils/config_update_utils_test.cpp +++ b/cmds/statsd/tests/metrics/parsing_utils/config_update_utils_test.cpp @@ -58,6 +58,7 @@ unordered_map oldAtomMatchingTrackerMap; vector> oldConditionTrackers; unordered_map oldConditionTrackerMap; vector> oldMetricProducers; +unordered_map oldMetricProducerMap; std::vector> oldAnomalyTrackers; std::vector> oldAlarmTrackers; unordered_map> conditionToMetricMap; @@ -67,6 +68,7 @@ unordered_map> activationAtomTrackerToMetricMap; unordered_map> deactivationAtomTrackerToMetricMap; unordered_map alertTrackerMap; vector metricsWithActivation; +map oldStateHashes; std::set noReportMetricIds; class ConfigUpdateTest : public ::testing::Test { @@ -81,6 +83,7 @@ public: oldConditionTrackers.clear(); oldConditionTrackerMap.clear(); oldMetricProducers.clear(); + oldMetricProducerMap.clear(); oldAnomalyTrackers.clear(); oldAlarmTrackers.clear(); conditionToMetricMap.clear(); @@ -90,6 +93,7 @@ public: deactivationAtomTrackerToMetricMap.clear(); alertTrackerMap.clear(); metricsWithActivation.clear(); + oldStateHashes.clear(); noReportMetricIds.clear(); } }; @@ -98,10 +102,11 @@ bool initConfig(const StatsdConfig& config) { return initStatsdConfig( key, config, uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseNs, timeBaseNs, allTagIds, oldAtomMatchingTrackers, oldAtomMatchingTrackerMap, - oldConditionTrackers, oldConditionTrackerMap, oldMetricProducers, oldAnomalyTrackers, - oldAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, - activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, alertTrackerMap, - metricsWithActivation, noReportMetricIds); + oldConditionTrackers, oldConditionTrackerMap, oldMetricProducers, oldMetricProducerMap, + oldAnomalyTrackers, oldAlarmTrackers, conditionToMetricMap, trackerToMetricMap, + trackerToConditionMap, activationAtomTrackerToMetricMap, + deactivationAtomTrackerToMetricMap, alertTrackerMap, metricsWithActivation, + oldStateHashes, noReportMetricIds); } } // anonymous namespace diff --git a/cmds/statsd/tests/metrics/parsing_utils/metrics_manager_util_test.cpp b/cmds/statsd/tests/metrics/parsing_utils/metrics_manager_util_test.cpp index e6583c9686ec6..0d0a8960043e8 100644 --- a/cmds/statsd/tests/metrics/parsing_utils/metrics_manager_util_test.cpp +++ b/cmds/statsd/tests/metrics/parsing_utils/metrics_manager_util_test.cpp @@ -14,6 +14,7 @@ #include "src/metrics/parsing_utils/metrics_manager_util.h" +#include #include #include #include @@ -388,6 +389,7 @@ TEST(MetricsManagerTest, TestInitialConditions) { vector> allConditionTrackers; unordered_map conditionTrackerMap; vector> allMetricProducers; + unordered_map metricProducerMap; std::vector> allAnomalyTrackers; std::vector> allAlarmTrackers; unordered_map> conditionToMetricMap; @@ -397,15 +399,17 @@ TEST(MetricsManagerTest, TestInitialConditions) { unordered_map> deactivationAtomTrackerToMetricMap; unordered_map alertTrackerMap; vector metricsWithActivation; + map stateProtoHashes; std::set noReportMetricIds; EXPECT_TRUE(initStatsdConfig( kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds, allAtomMatchingTrackers, atomMatchingTrackerMap, - allConditionTrackers, conditionTrackerMap, allMetricProducers, allAnomalyTrackers, - allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, - activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, alertTrackerMap, - metricsWithActivation, noReportMetricIds)); + allConditionTrackers, conditionTrackerMap, allMetricProducers, metricProducerMap, + allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, + trackerToConditionMap, activationAtomTrackerToMetricMap, + deactivationAtomTrackerToMetricMap, alertTrackerMap, metricsWithActivation, + stateProtoHashes, noReportMetricIds)); ASSERT_EQ(4u, allMetricProducers.size()); ASSERT_EQ(5u, allConditionTrackers.size()); @@ -438,6 +442,7 @@ TEST(MetricsManagerTest, TestGoodConfig) { vector> allConditionTrackers; unordered_map conditionTrackerMap; vector> allMetricProducers; + unordered_map metricProducerMap; std::vector> allAnomalyTrackers; std::vector> allAlarmTrackers; unordered_map> conditionToMetricMap; @@ -447,16 +452,19 @@ TEST(MetricsManagerTest, TestGoodConfig) { unordered_map> deactivationAtomTrackerToMetricMap; unordered_map alertTrackerMap; vector metricsWithActivation; + map stateProtoHashes; std::set noReportMetricIds; EXPECT_TRUE(initStatsdConfig( kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds, allAtomMatchingTrackers, atomMatchingTrackerMap, - allConditionTrackers, conditionTrackerMap, allMetricProducers, allAnomalyTrackers, - allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, - activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, alertTrackerMap, - metricsWithActivation, noReportMetricIds)); + allConditionTrackers, conditionTrackerMap, allMetricProducers, metricProducerMap, + allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, + trackerToConditionMap, activationAtomTrackerToMetricMap, + deactivationAtomTrackerToMetricMap, alertTrackerMap, metricsWithActivation, + stateProtoHashes, noReportMetricIds)); ASSERT_EQ(1u, allMetricProducers.size()); + EXPECT_THAT(metricProducerMap, UnorderedElementsAre(Pair(config.count_metric(0).id(), 0))); ASSERT_EQ(1u, allAnomalyTrackers.size()); ASSERT_EQ(1u, noReportMetricIds.size()); ASSERT_EQ(1u, alertTrackerMap.size()); @@ -476,6 +484,7 @@ TEST(MetricsManagerTest, TestDimensionMetricsWithMultiTags) { vector> allConditionTrackers; unordered_map conditionTrackerMap; vector> allMetricProducers; + unordered_map metricProducerMap; std::vector> allAnomalyTrackers; std::vector> allAlarmTrackers; unordered_map> conditionToMetricMap; @@ -485,15 +494,17 @@ TEST(MetricsManagerTest, TestDimensionMetricsWithMultiTags) { unordered_map> deactivationAtomTrackerToMetricMap; unordered_map alertTrackerMap; vector metricsWithActivation; + map stateProtoHashes; std::set noReportMetricIds; EXPECT_FALSE(initStatsdConfig( kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds, allAtomMatchingTrackers, atomMatchingTrackerMap, - allConditionTrackers, conditionTrackerMap, allMetricProducers, allAnomalyTrackers, - allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, - activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, alertTrackerMap, - metricsWithActivation, noReportMetricIds)); + allConditionTrackers, conditionTrackerMap, allMetricProducers, metricProducerMap, + allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, + trackerToConditionMap, activationAtomTrackerToMetricMap, + deactivationAtomTrackerToMetricMap, alertTrackerMap, metricsWithActivation, + stateProtoHashes, noReportMetricIds)); } TEST(MetricsManagerTest, TestCircleLogMatcherDependency) { @@ -508,6 +519,7 @@ TEST(MetricsManagerTest, TestCircleLogMatcherDependency) { vector> allConditionTrackers; unordered_map conditionTrackerMap; vector> allMetricProducers; + unordered_map metricProducerMap; std::vector> allAnomalyTrackers; std::vector> allAlarmTrackers; unordered_map> conditionToMetricMap; @@ -517,15 +529,17 @@ TEST(MetricsManagerTest, TestCircleLogMatcherDependency) { unordered_map> deactivationAtomTrackerToMetricMap; unordered_map alertTrackerMap; vector metricsWithActivation; + map stateProtoHashes; std::set noReportMetricIds; EXPECT_FALSE(initStatsdConfig( kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds, allAtomMatchingTrackers, atomMatchingTrackerMap, - allConditionTrackers, conditionTrackerMap, allMetricProducers, allAnomalyTrackers, - allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, - activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, alertTrackerMap, - metricsWithActivation, noReportMetricIds)); + allConditionTrackers, conditionTrackerMap, allMetricProducers, metricProducerMap, + allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, + trackerToConditionMap, activationAtomTrackerToMetricMap, + deactivationAtomTrackerToMetricMap, alertTrackerMap, metricsWithActivation, + stateProtoHashes, noReportMetricIds)); } TEST(MetricsManagerTest, TestMissingMatchers) { @@ -540,6 +554,7 @@ TEST(MetricsManagerTest, TestMissingMatchers) { vector> allConditionTrackers; unordered_map conditionTrackerMap; vector> allMetricProducers; + unordered_map metricProducerMap; std::vector> allAnomalyTrackers; std::vector> allAlarmTrackers; unordered_map> conditionToMetricMap; @@ -549,14 +564,16 @@ TEST(MetricsManagerTest, TestMissingMatchers) { unordered_map> deactivationAtomTrackerToMetricMap; unordered_map alertTrackerMap; vector metricsWithActivation; + map stateProtoHashes; std::set noReportMetricIds; EXPECT_FALSE(initStatsdConfig( kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds, allAtomMatchingTrackers, atomMatchingTrackerMap, - allConditionTrackers, conditionTrackerMap, allMetricProducers, allAnomalyTrackers, - allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, - activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, alertTrackerMap, - metricsWithActivation, noReportMetricIds)); + allConditionTrackers, conditionTrackerMap, allMetricProducers, metricProducerMap, + allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, + trackerToConditionMap, activationAtomTrackerToMetricMap, + deactivationAtomTrackerToMetricMap, alertTrackerMap, metricsWithActivation, + stateProtoHashes, noReportMetricIds)); } TEST(MetricsManagerTest, TestMissingPredicate) { @@ -571,6 +588,7 @@ TEST(MetricsManagerTest, TestMissingPredicate) { vector> allConditionTrackers; unordered_map conditionTrackerMap; vector> allMetricProducers; + unordered_map metricProducerMap; std::vector> allAnomalyTrackers; std::vector> allAlarmTrackers; unordered_map> conditionToMetricMap; @@ -580,14 +598,16 @@ TEST(MetricsManagerTest, TestMissingPredicate) { unordered_map> deactivationAtomTrackerToMetricMap; unordered_map alertTrackerMap; vector metricsWithActivation; + map stateProtoHashes; std::set noReportMetricIds; EXPECT_FALSE(initStatsdConfig( kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds, allAtomMatchingTrackers, atomMatchingTrackerMap, - allConditionTrackers, conditionTrackerMap, allMetricProducers, allAnomalyTrackers, - allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, - activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, alertTrackerMap, - metricsWithActivation, noReportMetricIds)); + allConditionTrackers, conditionTrackerMap, allMetricProducers, metricProducerMap, + allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, + trackerToConditionMap, activationAtomTrackerToMetricMap, + deactivationAtomTrackerToMetricMap, alertTrackerMap, metricsWithActivation, + stateProtoHashes, noReportMetricIds)); } TEST(MetricsManagerTest, TestCirclePredicateDependency) { @@ -602,6 +622,7 @@ TEST(MetricsManagerTest, TestCirclePredicateDependency) { vector> allConditionTrackers; unordered_map conditionTrackerMap; vector> allMetricProducers; + unordered_map metricProducerMap; std::vector> allAnomalyTrackers; std::vector> allAlarmTrackers; unordered_map> conditionToMetricMap; @@ -611,15 +632,17 @@ TEST(MetricsManagerTest, TestCirclePredicateDependency) { unordered_map> deactivationAtomTrackerToMetricMap; unordered_map alertTrackerMap; vector metricsWithActivation; + map stateProtoHashes; std::set noReportMetricIds; EXPECT_FALSE(initStatsdConfig( kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds, allAtomMatchingTrackers, atomMatchingTrackerMap, - allConditionTrackers, conditionTrackerMap, allMetricProducers, allAnomalyTrackers, - allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, - activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, alertTrackerMap, - metricsWithActivation, noReportMetricIds)); + allConditionTrackers, conditionTrackerMap, allMetricProducers, metricProducerMap, + allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, + trackerToConditionMap, activationAtomTrackerToMetricMap, + deactivationAtomTrackerToMetricMap, alertTrackerMap, metricsWithActivation, + stateProtoHashes, noReportMetricIds)); } TEST(MetricsManagerTest, testAlertWithUnknownMetric) { @@ -634,6 +657,7 @@ TEST(MetricsManagerTest, testAlertWithUnknownMetric) { vector> allConditionTrackers; unordered_map conditionTrackerMap; vector> allMetricProducers; + unordered_map metricProducerMap; std::vector> allAnomalyTrackers; std::vector> allAlarmTrackers; unordered_map> conditionToMetricMap; @@ -643,15 +667,17 @@ TEST(MetricsManagerTest, testAlertWithUnknownMetric) { unordered_map> deactivationAtomTrackerToMetricMap; unordered_map alertTrackerMap; vector metricsWithActivation; + map stateProtoHashes; std::set noReportMetricIds; EXPECT_FALSE(initStatsdConfig( kConfigKey, config, uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor, timeBaseSec, timeBaseSec, allTagIds, allAtomMatchingTrackers, atomMatchingTrackerMap, - allConditionTrackers, conditionTrackerMap, allMetricProducers, allAnomalyTrackers, - allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, trackerToConditionMap, - activationAtomTrackerToMetricMap, deactivationAtomTrackerToMetricMap, alertTrackerMap, - metricsWithActivation, noReportMetricIds)); + allConditionTrackers, conditionTrackerMap, allMetricProducers, metricProducerMap, + allAnomalyTrackers, allAlarmTrackers, conditionToMetricMap, trackerToMetricMap, + trackerToConditionMap, activationAtomTrackerToMetricMap, + deactivationAtomTrackerToMetricMap, alertTrackerMap, metricsWithActivation, + stateProtoHashes, noReportMetricIds)); } TEST(MetricsManagerTest, TestCreateAtomMatchingTrackerInvalidMatcher) {