• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2017 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #pragma once
18 
19 #include <set>
20 #include <unordered_map>
21 #include <vector>
22 
23 #include "anomaly/AlarmTracker.h"
24 #include "condition/ConditionTracker.h"
25 #include "external/StatsPullerManager.h"
26 #include "matchers/AtomMatchingTracker.h"
27 #include "metrics/MetricProducer.h"
28 
29 namespace android {
30 namespace os {
31 namespace statsd {
32 
33 // Helper functions for creating, validating, and updating config components from StatsdConfig.
34 // Should only be called from metrics_manager_util and config_update_utils.
35 
36 // Create a AtomMatchingTracker.
37 // input:
38 // [logMatcher]: the input AtomMatcher from the StatsdConfig
39 // [index]: the index of the matcher
40 // [invalidConfigReason]: logging ids if config is invalid
41 // output:
42 // new AtomMatchingTracker, or null if the tracker is unable to be created
43 sp<AtomMatchingTracker> createAtomMatchingTracker(
44         const AtomMatcher& logMatcher, const int index, const sp<UidMap>& uidMap,
45         optional<InvalidConfigReason>& invalidConfigReason);
46 
47 // Create a ConditionTracker.
48 // input:
49 // [predicate]: the input Predicate from the StatsdConfig
50 // [index]: the index of the condition tracker
51 // [atomMatchingTrackerMap]: map of atom matcher id to its index in allAtomMatchingTrackers
52 // [invalidConfigReason]: logging ids if config is invalid
53 // output:
54 // new ConditionTracker, or null if the tracker is unable to be created
55 sp<ConditionTracker> createConditionTracker(
56         const ConfigKey& key, const Predicate& predicate, const int index,
57         const unordered_map<int64_t, int>& atomMatchingTrackerMap,
58         optional<InvalidConfigReason>& invalidConfigReason);
59 
60 // Get the hash of a metric, combining the activation if the metric has one.
61 optional<InvalidConfigReason> getMetricProtoHash(
62         const StatsdConfig& config, const google::protobuf::MessageLite& metric, const int64_t id,
63         const std::unordered_map<int64_t, int>& metricToActivationMap, uint64_t& metricHash);
64 
65 // 1. Validates matcher existence
66 // 2. Enforces matchers with dimensions and those used for trigger_event are about one atom
67 // 3. Gets matcher index and updates tracker to metric map
68 optional<InvalidConfigReason> handleMetricWithAtomMatchingTrackers(
69         const int64_t matcherId, const int64_t metricId, const int metricIndex,
70         const bool enforceOneAtom,
71         const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
72         const std::unordered_map<int64_t, int>& atomMatchingTrackerMap,
73         std::unordered_map<int, std::vector<int>>& trackerToMetricMap, int& logTrackerIndex);
74 
75 // 1. Validates condition existence, including those in links
76 // 2. Gets condition index and updates condition to metric map
77 optional<InvalidConfigReason> handleMetricWithConditions(
78         const int64_t condition, const int64_t metricId, const int metricIndex,
79         const std::unordered_map<int64_t, int>& conditionTrackerMap,
80         const ::google::protobuf::RepeatedPtrField<MetricConditionLink>& links,
81         const std::vector<sp<ConditionTracker>>& allConditionTrackers, int& conditionIndex,
82         std::unordered_map<int, std::vector<int>>& conditionToMetricMap);
83 
84 // Validates a metricActivation and populates state.
85 // Fills the new event activation/deactivation maps, preserving the existing activations.
86 // Returns nullopt if successful and InvalidConfigReason if not.
87 optional<InvalidConfigReason> handleMetricActivationOnConfigUpdate(
88         const StatsdConfig& config, const int64_t metricId, const int metricIndex,
89         const std::unordered_map<int64_t, int>& metricToActivationMap,
90         const std::unordered_map<int64_t, int>& oldAtomMatchingTrackerMap,
91         const std::unordered_map<int64_t, int>& newAtomMatchingTrackerMap,
92         const std::unordered_map<int, shared_ptr<Activation>>& oldEventActivationMap,
93         std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap,
94         std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap,
95         std::vector<int>& metricsWithActivation,
96         std::unordered_map<int, shared_ptr<Activation>>& newEventActivationMap,
97         std::unordered_map<int, std::vector<shared_ptr<Activation>>>& newEventDeactivationMap);
98 
99 // Creates a CountMetricProducer and updates the vectors/maps used by MetricsManager with
100 // the appropriate indices. Returns an sp to the producer, or nullopt if there was an error.
101 optional<sp<MetricProducer>> createCountMetricProducerAndUpdateMetadata(
102         const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs,
103         const int64_t currentTimeNs, const CountMetric& metric, const int metricIndex,
104         const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
105         const std::unordered_map<int64_t, int>& atomMatchingTrackerMap,
106         std::vector<sp<ConditionTracker>>& allConditionTrackers,
107         const std::unordered_map<int64_t, int>& conditionTrackerMap,
108         const std::vector<ConditionState>& initialConditionCache, const sp<ConditionWizard>& wizard,
109         const std::unordered_map<int64_t, int>& stateAtomIdMap,
110         const std::unordered_map<int64_t, std::unordered_map<int, int64_t>>& allStateGroupMaps,
111         const std::unordered_map<int64_t, int>& metricToActivationMap,
112         std::unordered_map<int, std::vector<int>>& trackerToMetricMap,
113         std::unordered_map<int, std::vector<int>>& conditionToMetricMap,
114         std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap,
115         std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap,
116         std::vector<int>& metricsWithActivation,
117         optional<InvalidConfigReason>& invalidConfigReason);
118 
119 // Creates a DurationMetricProducer and updates the vectors/maps used by MetricsManager with
120 // the appropriate indices. Returns an sp to the producer, or nullopt if there was an error.
121 optional<sp<MetricProducer>> createDurationMetricProducerAndUpdateMetadata(
122         const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs,
123         const int64_t currentTimeNs, const DurationMetric& metric, const int metricIndex,
124         const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
125         const std::unordered_map<int64_t, int>& atomMatchingTrackerMap,
126         std::vector<sp<ConditionTracker>>& allConditionTrackers,
127         const std::unordered_map<int64_t, int>& conditionTrackerMap,
128         const std::vector<ConditionState>& initialConditionCache, const sp<ConditionWizard>& wizard,
129         const std::unordered_map<int64_t, int>& stateAtomIdMap,
130         const std::unordered_map<int64_t, std::unordered_map<int, int64_t>>& allStateGroupMaps,
131         const std::unordered_map<int64_t, int>& metricToActivationMap,
132         std::unordered_map<int, std::vector<int>>& trackerToMetricMap,
133         std::unordered_map<int, std::vector<int>>& conditionToMetricMap,
134         std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap,
135         std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap,
136         std::vector<int>& metricsWithActivation,
137         optional<InvalidConfigReason>& invalidConfigReason);
138 
139 // Creates an EventMetricProducer and updates the vectors/maps used by MetricsManager with
140 // the appropriate indices. Returns an sp to the producer, or nullopt if there was an error.
141 optional<sp<MetricProducer>> createEventMetricProducerAndUpdateMetadata(
142         const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs,
143         const EventMetric& metric, const int metricIndex,
144         const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
145         const std::unordered_map<int64_t, int>& atomMatchingTrackerMap,
146         std::vector<sp<ConditionTracker>>& allConditionTrackers,
147         const std::unordered_map<int64_t, int>& conditionTrackerMap,
148         const std::vector<ConditionState>& initialConditionCache, const sp<ConditionWizard>& wizard,
149         const std::unordered_map<int64_t, int>& metricToActivationMap,
150         std::unordered_map<int, std::vector<int>>& trackerToMetricMap,
151         std::unordered_map<int, std::vector<int>>& conditionToMetricMap,
152         std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap,
153         std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap,
154         std::vector<int>& metricsWithActivation,
155         optional<InvalidConfigReason>& invalidConfigReason);
156 
157 // Creates a NumericValueMetricProducer and updates the vectors/maps used by MetricsManager with
158 // the appropriate indices. Returns an sp to the producer, or nullopt if there was an error.
159 optional<sp<MetricProducer>> createNumericValueMetricProducerAndUpdateMetadata(
160         const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs,
161         const int64_t currentTimeNs, const sp<StatsPullerManager>& pullerManager,
162         const ValueMetric& metric, const int metricIndex,
163         const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
164         const std::unordered_map<int64_t, int>& atomMatchingTrackerMap,
165         std::vector<sp<ConditionTracker>>& allConditionTrackers,
166         const std::unordered_map<int64_t, int>& conditionTrackerMap,
167         const std::vector<ConditionState>& initialConditionCache, const sp<ConditionWizard>& wizard,
168         const sp<EventMatcherWizard>& matcherWizard,
169         const std::unordered_map<int64_t, int>& stateAtomIdMap,
170         const std::unordered_map<int64_t, std::unordered_map<int, int64_t>>& allStateGroupMaps,
171         const std::unordered_map<int64_t, int>& metricToActivationMap,
172         std::unordered_map<int, std::vector<int>>& trackerToMetricMap,
173         std::unordered_map<int, std::vector<int>>& conditionToMetricMap,
174         std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap,
175         std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap,
176         std::vector<int>& metricsWithActivation,
177         optional<InvalidConfigReason>& invalidConfigReason);
178 
179 // Creates a GaugeMetricProducer and updates the vectors/maps used by MetricsManager with
180 // the appropriate indices. Returns an sp to the producer, or nullopt if there was an error.
181 optional<sp<MetricProducer>> createGaugeMetricProducerAndUpdateMetadata(
182         const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs,
183         const int64_t currentTimeNs, const sp<StatsPullerManager>& pullerManager,
184         const GaugeMetric& metric, const int metricIndex,
185         const std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
186         const std::unordered_map<int64_t, int>& atomMatchingTrackerMap,
187         std::vector<sp<ConditionTracker>>& allConditionTrackers,
188         const std::unordered_map<int64_t, int>& conditionTrackerMap,
189         const std::vector<ConditionState>& initialConditionCache, const sp<ConditionWizard>& wizard,
190         const sp<EventMatcherWizard>& matcherWizard,
191         const std::unordered_map<int64_t, int>& metricToActivationMap,
192         std::unordered_map<int, std::vector<int>>& trackerToMetricMap,
193         std::unordered_map<int, std::vector<int>>& conditionToMetricMap,
194         std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap,
195         std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap,
196         std::vector<int>& metricsWithActivation,
197         optional<InvalidConfigReason>& invalidConfigReason);
198 
199 // Creates a KllMetricProducer and updates the vectors/maps used by MetricsManager with
200 // the appropriate indices. Returns an sp to the producer, or nullopt if there was an error.
201 optional<sp<MetricProducer>> createKllMetricProducerAndUpdateMetadata(
202         const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseNs,
203         const int64_t currentTimeNs, const sp<StatsPullerManager>& pullerManager,
204         const KllMetric& metric, const int metricIndex,
205         const vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
206         const unordered_map<int64_t, int>& atomMatchingTrackerMap,
207         vector<sp<ConditionTracker>>& allConditionTrackers,
208         const unordered_map<int64_t, int>& conditionTrackerMap,
209         const vector<ConditionState>& initialConditionCache, const sp<ConditionWizard>& wizard,
210         const sp<EventMatcherWizard>& matcherWizard,
211         const unordered_map<int64_t, int>& stateAtomIdMap,
212         const unordered_map<int64_t, unordered_map<int, int64_t>>& allStateGroupMaps,
213         const unordered_map<int64_t, int>& metricToActivationMap,
214         unordered_map<int, vector<int>>& trackerToMetricMap,
215         unordered_map<int, vector<int>>& conditionToMetricMap,
216         unordered_map<int, vector<int>>& activationAtomTrackerToMetricMap,
217         unordered_map<int, vector<int>>& deactivationAtomTrackerToMetricMap,
218         vector<int>& metricsWithActivation, optional<InvalidConfigReason>& invalidConfigReason);
219 
220 // Creates an AnomalyTracker and adds it to the appropriate metric.
221 // Returns an sp to the AnomalyTracker, or nullopt if there was an error.
222 optional<sp<AnomalyTracker>> createAnomalyTracker(
223         const Alert& alert, const sp<AlarmMonitor>& anomalyAlarmMonitor,
224         const UpdateStatus& updateStatus, const int64_t currentTimeNs,
225         const std::unordered_map<int64_t, int>& metricProducerMap,
226         std::vector<sp<MetricProducer>>& allMetricProducers,
227         optional<InvalidConfigReason>& invalidConfigReason);
228 
229 // Templated function for adding subscriptions to alarms or alerts. Returns nullopt if successful
230 // and InvalidConfigReason if not.
231 template <typename T>
initSubscribersForSubscriptionType(const StatsdConfig & config,const Subscription_RuleType ruleType,const std::unordered_map<int64_t,int> & ruleMap,std::vector<T> & allRules)232 optional<InvalidConfigReason> initSubscribersForSubscriptionType(
233         const StatsdConfig& config, const Subscription_RuleType ruleType,
234         const std::unordered_map<int64_t, int>& ruleMap, std::vector<T>& allRules) {
235     for (int i = 0; i < config.subscription_size(); ++i) {
236         const Subscription& subscription = config.subscription(i);
237         if (subscription.rule_type() != ruleType) {
238             continue;
239         }
240         if (subscription.subscriber_information_case() ==
241             Subscription::SubscriberInformationCase::SUBSCRIBER_INFORMATION_NOT_SET) {
242             ALOGW("subscription \"%lld\" has no subscriber info.\"", (long long)subscription.id());
243             return createInvalidConfigReasonWithSubscription(
244                     INVALID_CONFIG_REASON_SUBSCRIPTION_SUBSCRIBER_INFO_MISSING, subscription.id());
245         }
246         const auto& itr = ruleMap.find(subscription.rule_id());
247         if (itr == ruleMap.end()) {
248             ALOGW("subscription \"%lld\" has unknown rule id: \"%lld\"",
249                   (long long)subscription.id(), (long long)subscription.rule_id());
250             switch (subscription.rule_type()) {
251                 case Subscription::ALARM:
252                     return createInvalidConfigReasonWithSubscriptionAndAlarm(
253                             INVALID_CONFIG_REASON_SUBSCRIPTION_RULE_NOT_FOUND, subscription.id(),
254                             subscription.rule_id());
255                 case Subscription::ALERT:
256                     return createInvalidConfigReasonWithSubscriptionAndAlert(
257                             INVALID_CONFIG_REASON_SUBSCRIPTION_RULE_NOT_FOUND, subscription.id(),
258                             subscription.rule_id());
259                 case Subscription::RULE_TYPE_UNSPECIFIED:
260                     return createInvalidConfigReasonWithSubscription(
261                             INVALID_CONFIG_REASON_SUBSCRIPTION_RULE_NOT_FOUND, subscription.id());
262             }
263         }
264         const int ruleIndex = itr->second;
265         allRules[ruleIndex]->addSubscription(subscription);
266     }
267     return nullopt;
268 }
269 
270 // Helper functions for MetricsManager to initialize from StatsdConfig.
271 // *Note*: only initStatsdConfig() should be called from outside.
272 // All other functions are intermediate
273 // steps, created to make unit tests easier. And most of the parameters in these
274 // functions are temporary objects in the initialization phase.
275 
276 // Initialize the AtomMatchingTrackers.
277 // input:
278 // [key]: the config key that this config belongs to
279 // [config]: the input StatsdConfig
280 // output:
281 // [atomMatchingTrackerMap]: this map should contain matcher name to index mapping
282 // [allAtomMatchingTrackers]: should store the sp to all the AtomMatchingTracker
283 // [allTagIdsToMatchersMap]: maps of tag ids to atom matchers
284 // Returns nullopt if successful and InvalidConfigReason if not.
285 optional<InvalidConfigReason> initAtomMatchingTrackers(
286         const StatsdConfig& config, const sp<UidMap>& uidMap,
287         std::unordered_map<int64_t, int>& atomMatchingTrackerMap,
288         std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
289         std::unordered_map<int, std::vector<int>>& allTagIdsToMatchersMap);
290 
291 // Initialize ConditionTrackers
292 // input:
293 // [key]: the config key that this config belongs to
294 // [config]: the input config
295 // [atomMatchingTrackerMap]: AtomMatchingTracker name to index mapping from previous step.
296 // output:
297 // [conditionTrackerMap]: this map should contain condition name to index mapping
298 // [allConditionTrackers]: stores the sp to all the ConditionTrackers
299 // [trackerToConditionMap]: contain the mapping from index of
300 //                        log tracker to condition trackers that use the log tracker
301 // [initialConditionCache]: stores the initial conditions for each ConditionTracker
302 // Returns nullopt if successful and InvalidConfigReason if not.
303 optional<InvalidConfigReason> initConditions(
304         const ConfigKey& key, const StatsdConfig& config,
305         const std::unordered_map<int64_t, int>& atomMatchingTrackerMap,
306         std::unordered_map<int64_t, int>& conditionTrackerMap,
307         std::vector<sp<ConditionTracker>>& allConditionTrackers,
308         std::unordered_map<int, std::vector<int>>& trackerToConditionMap,
309         std::vector<ConditionState>& initialConditionCache);
310 
311 // Initialize State maps using State protos in the config. These maps will
312 // eventually be passed to MetricProducers to initialize their state info.
313 // input:
314 // [config]: the input config
315 // output:
316 // [stateAtomIdMap]: this map should contain the mapping from state ids to atom ids
317 // [allStateGroupMaps]: this map should contain the mapping from states ids and state
318 //                      values to state group ids for all states
319 // [stateProtoHashes]: contains a map of state id to the hash of the State proto from the config
320 // Returns nullopt if successful and InvalidConfigReason if not.
321 optional<InvalidConfigReason> initStates(
322         const StatsdConfig& config, unordered_map<int64_t, int>& stateAtomIdMap,
323         unordered_map<int64_t, unordered_map<int, int64_t>>& allStateGroupMaps,
324         std::map<int64_t, uint64_t>& stateProtoHashes);
325 
326 // Initialize MetricProducers.
327 // input:
328 // [key]: the config key that this config belongs to
329 // [config]: the input config
330 // [timeBaseSec]: start time base for all metrics
331 // [atomMatchingTrackerMap]: AtomMatchingTracker name to index mapping from previous step.
332 // [conditionTrackerMap]: condition name to index mapping
333 // [stateAtomIdMap]: contains the mapping from state ids to atom ids
334 // [allStateGroupMaps]: contains the mapping from atom ids and state values to
335 //                      state group ids for all states
336 // output:
337 // [allMetricProducers]: contains the list of sp to the MetricProducers created.
338 // [conditionToMetricMap]: contains the mapping from condition tracker index to
339 //                          the list of MetricProducer index
340 // [trackerToMetricMap]: contains the mapping from log tracker to MetricProducer index.
341 // Returns nullopt if successful and InvalidConfigReason if not.
342 optional<InvalidConfigReason> initMetrics(
343         const ConfigKey& key, const StatsdConfig& config, const int64_t timeBaseTimeNs,
344         const int64_t currentTimeNs, const sp<StatsPullerManager>& pullerManager,
345         const std::unordered_map<int64_t, int>& atomMatchingTrackerMap,
346         const std::unordered_map<int64_t, int>& conditionTrackerMap,
347         const vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
348         const unordered_map<int64_t, int>& stateAtomIdMap,
349         const unordered_map<int64_t, unordered_map<int, int64_t>>& allStateGroupMaps,
350         vector<sp<ConditionTracker>>& allConditionTrackers,
351         const std::vector<ConditionState>& initialConditionCache,
352         std::vector<sp<MetricProducer>>& allMetricProducers,
353         std::unordered_map<int, std::vector<int>>& conditionToMetricMap,
354         std::unordered_map<int, std::vector<int>>& trackerToMetricMap,
355         std::set<int64_t>& noReportMetricIds,
356         std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap,
357         std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap,
358         std::vector<int>& metricsWithActivation);
359 
360 // Initialize alarms
361 // Is called both on initialize new configs and config updates since alarms do not have any state.
362 optional<InvalidConfigReason> initAlarms(const StatsdConfig& config, const ConfigKey& key,
363                                          const sp<AlarmMonitor>& periodicAlarmMonitor,
364                                          const int64_t timeBaseNs, const int64_t currentTimeNs,
365                                          std::vector<sp<AlarmTracker>>& allAlarmTrackers);
366 
367 // Initialize MetricsManager from StatsdConfig.
368 // Parameters are the members of MetricsManager. See MetricsManager for declaration.
369 optional<InvalidConfigReason> initStatsdConfig(
370         const ConfigKey& key, const StatsdConfig& config, const sp<UidMap>& uidMap,
371         const sp<StatsPullerManager>& pullerManager, const sp<AlarmMonitor>& anomalyAlarmMonitor,
372         const sp<AlarmMonitor>& periodicAlarmMonitor, const int64_t timeBaseNs,
373         const int64_t currentTimeNs,
374         std::unordered_map<int, std::vector<int>>& allTagIdsToMatchersMap,
375         std::vector<sp<AtomMatchingTracker>>& allAtomMatchingTrackers,
376         std::unordered_map<int64_t, int>& atomMatchingTrackerMap,
377         std::vector<sp<ConditionTracker>>& allConditionTrackers,
378         std::unordered_map<int64_t, int>& conditionTrackerMap,
379         std::vector<sp<MetricProducer>>& allMetricProducers,
380         std::unordered_map<int64_t, int>& metricProducerMap,
381         vector<sp<AnomalyTracker>>& allAnomalyTrackers,
382         vector<sp<AlarmTracker>>& allPeriodicAlarmTrackers,
383         std::unordered_map<int, std::vector<int>>& conditionToMetricMap,
384         std::unordered_map<int, std::vector<int>>& trackerToMetricMap,
385         std::unordered_map<int, std::vector<int>>& trackerToConditionMap,
386         std::unordered_map<int, std::vector<int>>& activationAtomTrackerToMetricMap,
387         std::unordered_map<int, std::vector<int>>& deactivationAtomTrackerToMetricMap,
388         std::unordered_map<int64_t, int>& alertTrackerMap, std::vector<int>& metricsWithActivation,
389         std::map<int64_t, uint64_t>& stateProtoHashes, std::set<int64_t>& noReportMetricIds);
390 
391 }  // namespace statsd
392 }  // namespace os
393 }  // namespace android
394