1caf339d004fad667748b68912c254df4e75cdc5aYao Chen/*
2caf339d004fad667748b68912c254df4e75cdc5aYao Chen * Copyright (C) 2017 The Android Open Source Project
3caf339d004fad667748b68912c254df4e75cdc5aYao Chen *
4caf339d004fad667748b68912c254df4e75cdc5aYao Chen * Licensed under the Apache License, Version 2.0 (the "License");
5caf339d004fad667748b68912c254df4e75cdc5aYao Chen * you may not use this file except in compliance with the License.
6caf339d004fad667748b68912c254df4e75cdc5aYao Chen * You may obtain a copy of the License at
7caf339d004fad667748b68912c254df4e75cdc5aYao Chen *
8caf339d004fad667748b68912c254df4e75cdc5aYao Chen *      http://www.apache.org/licenses/LICENSE-2.0
9caf339d004fad667748b68912c254df4e75cdc5aYao Chen *
10caf339d004fad667748b68912c254df4e75cdc5aYao Chen * Unless required by applicable law or agreed to in writing, software
11caf339d004fad667748b68912c254df4e75cdc5aYao Chen * distributed under the License is distributed on an "AS IS" BASIS,
12caf339d004fad667748b68912c254df4e75cdc5aYao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13caf339d004fad667748b68912c254df4e75cdc5aYao Chen * See the License for the specific language governing permissions and
14caf339d004fad667748b68912c254df4e75cdc5aYao Chen * limitations under the License.
15caf339d004fad667748b68912c254df4e75cdc5aYao Chen */
16caf339d004fad667748b68912c254df4e75cdc5aYao Chen
17484524a246ffe453f8cd89b698a279c23b0bde1fTej Singh#define DEBUG false  // STOPSHIP if true
1810535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen#include "Log.h"
1910535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen
20932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "metrics_manager_util.h"
21932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac
22caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include "../condition/CombinationConditionTracker.h"
23caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include "../condition/SimpleConditionTracker.h"
24580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen#include "../condition/StateTracker.h"
25b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu#include "../external/StatsPullerManager.h"
26caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include "../matchers/CombinationLogMatchingTracker.h"
27caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include "../matchers/SimpleLogMatchingTracker.h"
28932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "../metrics/CountMetricProducer.h"
29932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "../metrics/DurationMetricProducer.h"
30932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "../metrics/EventMetricProducer.h"
31932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "../metrics/GaugeMetricProducer.h"
32932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac#include "../metrics/ValueMetricProducer.h"
33932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac
34caf339d004fad667748b68912c254df4e75cdc5aYao Chen#include "stats_util.h"
35580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen#include "statslog.h"
36caf339d004fad667748b68912c254df4e75cdc5aYao Chen
37caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::set;
38caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::string;
39caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::unordered_map;
40caf339d004fad667748b68912c254df4e75cdc5aYao Chenusing std::vector;
41caf339d004fad667748b68912c254df4e75cdc5aYao Chen
42caf339d004fad667748b68912c254df4e75cdc5aYao Chennamespace android {
43caf339d004fad667748b68912c254df4e75cdc5aYao Chennamespace os {
44caf339d004fad667748b68912c254df4e75cdc5aYao Chennamespace statsd {
45caf339d004fad667748b68912c254df4e75cdc5aYao Chen
468a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chennamespace {
478a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
488a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chenbool hasLeafNode(const FieldMatcher& matcher) {
498a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    if (!matcher.has_field()) {
508a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        return false;
518a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    for (int i = 0; i < matcher.child_size(); ++i) {
538a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        if (hasLeafNode(matcher.child(i))) {
548a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen            return true;
558a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen        }
568a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    }
578a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen    return true;
588a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}
598a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
608a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen}  // namespace
618a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen
6294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-macbool handleMetricWithLogTrackers(const int64_t what, const int metricIndex,
635154a379303ab90a2b2914676a4441917a329b5dYao Chen                                 const bool usedForDimension,
64b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon                                 const vector<sp<LogMatchingTracker>>& allAtomMatchers,
6594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                                 const unordered_map<int64_t, int>& logTrackerMap,
665110bedd787835d4dbc809b7977285cac364bdefYao Chen                                 unordered_map<int, std::vector<int>>& trackerToMetricMap,
675110bedd787835d4dbc809b7977285cac364bdefYao Chen                                 int& logTrackerIndex) {
685110bedd787835d4dbc809b7977285cac364bdefYao Chen    auto logTrackerIt = logTrackerMap.find(what);
69729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    if (logTrackerIt == logTrackerMap.end()) {
7094e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        ALOGW("cannot find the AtomMatcher \"%lld\" in config", (long long)what);
715110bedd787835d4dbc809b7977285cac364bdefYao Chen        return false;
72729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    }
732087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    if (usedForDimension && allAtomMatchers[logTrackerIt->second]->getAtomIds().size() > 1) {
7494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        ALOGE("AtomMatcher \"%lld\" has more than one tag ids. When a metric has dimension, "
757c8f0a521e9b466bb6b8cef74bcd677a9aed4014Stefan Lafon              "the \"what\" can only about one atom type.",
7694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac              (long long)what);
775154a379303ab90a2b2914676a4441917a329b5dYao Chen        return false;
785154a379303ab90a2b2914676a4441917a329b5dYao Chen    }
795110bedd787835d4dbc809b7977285cac364bdefYao Chen    logTrackerIndex = logTrackerIt->second;
805110bedd787835d4dbc809b7977285cac364bdefYao Chen    auto& metric_list = trackerToMetricMap[logTrackerIndex];
815110bedd787835d4dbc809b7977285cac364bdefYao Chen    metric_list.push_back(metricIndex);
825110bedd787835d4dbc809b7977285cac364bdefYao Chen    return true;
835110bedd787835d4dbc809b7977285cac364bdefYao Chen}
845110bedd787835d4dbc809b7977285cac364bdefYao Chen
855110bedd787835d4dbc809b7977285cac364bdefYao Chenbool handleMetricWithConditions(
8694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        const int64_t condition, const int metricIndex,
8794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        const unordered_map<int64_t, int>& conditionTrackerMap,
88a5b5191351a85ea33641dc42ee4223189b3612f3Stefan Lafon        const ::google::protobuf::RepeatedPtrField<::android::os::statsd::MetricConditionLink>&
895110bedd787835d4dbc809b7977285cac364bdefYao Chen                links,
905110bedd787835d4dbc809b7977285cac364bdefYao Chen        vector<sp<ConditionTracker>>& allConditionTrackers, int& conditionIndex,
915110bedd787835d4dbc809b7977285cac364bdefYao Chen        unordered_map<int, std::vector<int>>& conditionToMetricMap) {
925110bedd787835d4dbc809b7977285cac364bdefYao Chen    auto condition_it = conditionTrackerMap.find(condition);
935110bedd787835d4dbc809b7977285cac364bdefYao Chen    if (condition_it == conditionTrackerMap.end()) {
9494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        ALOGW("cannot find Predicate \"%lld\" in the config", (long long)condition);
955110bedd787835d4dbc809b7977285cac364bdefYao Chen        return false;
965110bedd787835d4dbc809b7977285cac364bdefYao Chen    }
975110bedd787835d4dbc809b7977285cac364bdefYao Chen
985110bedd787835d4dbc809b7977285cac364bdefYao Chen    for (const auto& link : links) {
995110bedd787835d4dbc809b7977285cac364bdefYao Chen        auto it = conditionTrackerMap.find(link.condition());
1005110bedd787835d4dbc809b7977285cac364bdefYao Chen        if (it == conditionTrackerMap.end()) {
10194e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            ALOGW("cannot find Predicate \"%lld\" in the config", (long long)link.condition());
1025110bedd787835d4dbc809b7977285cac364bdefYao Chen            return false;
1035110bedd787835d4dbc809b7977285cac364bdefYao Chen        }
1045110bedd787835d4dbc809b7977285cac364bdefYao Chen        allConditionTrackers[condition_it->second]->setSliced(true);
1055110bedd787835d4dbc809b7977285cac364bdefYao Chen        allConditionTrackers[it->second]->setSliced(true);
1065154a379303ab90a2b2914676a4441917a329b5dYao Chen        // TODO: We need to verify the link is valid.
1075110bedd787835d4dbc809b7977285cac364bdefYao Chen    }
1085110bedd787835d4dbc809b7977285cac364bdefYao Chen    conditionIndex = condition_it->second;
1095110bedd787835d4dbc809b7977285cac364bdefYao Chen
1105110bedd787835d4dbc809b7977285cac364bdefYao Chen    // will create new vector if not exist before.
1115110bedd787835d4dbc809b7977285cac364bdefYao Chen    auto& metricList = conditionToMetricMap[condition_it->second];
1125110bedd787835d4dbc809b7977285cac364bdefYao Chen    metricList.push_back(metricIndex);
1135110bedd787835d4dbc809b7977285cac364bdefYao Chen    return true;
114729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen}
115729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
1162087716f2bdca90c7c3034d556ac12911bd8018eYangster-macbool initLogTrackers(const StatsdConfig& config, const UidMap& uidMap,
11794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                     unordered_map<int64_t, int>& logTrackerMap,
118b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon                     vector<sp<LogMatchingTracker>>& allAtomMatchers, set<int>& allTagIds) {
119b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon    vector<AtomMatcher> matcherConfigs;
120b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon    const int atomMatcherCount = config.atom_matcher_size();
121b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon    matcherConfigs.reserve(atomMatcherCount);
122b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon    allAtomMatchers.reserve(atomMatcherCount);
123caf339d004fad667748b68912c254df4e75cdc5aYao Chen
124b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon    for (int i = 0; i < atomMatcherCount; i++) {
125b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon        const AtomMatcher& logMatcher = config.atom_matcher(i);
126caf339d004fad667748b68912c254df4e75cdc5aYao Chen
127b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon        int index = allAtomMatchers.size();
128caf339d004fad667748b68912c254df4e75cdc5aYao Chen        switch (logMatcher.contents_case()) {
129b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon            case AtomMatcher::ContentsCase::kSimpleAtomMatcher:
130b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon                allAtomMatchers.push_back(new SimpleLogMatchingTracker(
13194e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                        logMatcher.id(), index, logMatcher.simple_atom_matcher(), uidMap));
132caf339d004fad667748b68912c254df4e75cdc5aYao Chen                break;
133b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon            case AtomMatcher::ContentsCase::kCombination:
134b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon                allAtomMatchers.push_back(
13594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                        new CombinationLogMatchingTracker(logMatcher.id(), index));
136caf339d004fad667748b68912c254df4e75cdc5aYao Chen                break;
137caf339d004fad667748b68912c254df4e75cdc5aYao Chen            default:
13894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                ALOGE("Matcher \"%lld\" malformed", (long long)logMatcher.id());
139caf339d004fad667748b68912c254df4e75cdc5aYao Chen                return false;
140caf339d004fad667748b68912c254df4e75cdc5aYao Chen                // continue;
141caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
14294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        if (logTrackerMap.find(logMatcher.id()) != logTrackerMap.end()) {
143b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon            ALOGE("Duplicate AtomMatcher found!");
144caf339d004fad667748b68912c254df4e75cdc5aYao Chen            return false;
145caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
14694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        logTrackerMap[logMatcher.id()] = index;
147caf339d004fad667748b68912c254df4e75cdc5aYao Chen        matcherConfigs.push_back(logMatcher);
148caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
149caf339d004fad667748b68912c254df4e75cdc5aYao Chen
150b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon    vector<bool> stackTracker2(allAtomMatchers.size(), false);
151b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon    for (auto& matcher : allAtomMatchers) {
152b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon        if (!matcher->init(matcherConfigs, allAtomMatchers, logTrackerMap, stackTracker2)) {
153caf339d004fad667748b68912c254df4e75cdc5aYao Chen            return false;
154caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
155caf339d004fad667748b68912c254df4e75cdc5aYao Chen        // Collect all the tag ids that are interesting. TagIds exist in leaf nodes only.
1562087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        const set<int>& tagIds = matcher->getAtomIds();
157caf339d004fad667748b68912c254df4e75cdc5aYao Chen        allTagIds.insert(tagIds.begin(), tagIds.end());
158caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
159caf339d004fad667748b68912c254df4e75cdc5aYao Chen    return true;
160caf339d004fad667748b68912c254df4e75cdc5aYao Chen}
161caf339d004fad667748b68912c254df4e75cdc5aYao Chen
162580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen/**
163580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen * A StateTracker is built from a SimplePredicate which has only "start", and no "stop"
164580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen * or "stop_all". The start must be an atom matcher that matches a state atom. It must
165580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen * have dimension, the dimension must be the state atom's primary fields plus exclusive state
166580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen * field. For example, the StateTracker is used in tracking UidProcessState and ScreenState.
167580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen *
168580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen */
169580ea321b16c71ddec515553761d6f37359bd3a0Yao Chenbool isStateTracker(const SimplePredicate& simplePredicate, vector<Matcher>* primaryKeys) {
170580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    // 1. must not have "stop". must have "dimension"
171580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    if (!simplePredicate.has_stop() && simplePredicate.has_dimensions()) {
172580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen        // TODO: need to check the start atom matcher too.
173c40a19d2e43d5de3e036e926bf070220c2c865e6Yao Chen        auto it = android::util::AtomsInfo::kStateAtomsFieldOptions.find(
174c40a19d2e43d5de3e036e926bf070220c2c865e6Yao Chen                simplePredicate.dimensions().field());
175580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen        // 2. must be based on a state atom.
176c40a19d2e43d5de3e036e926bf070220c2c865e6Yao Chen        if (it != android::util::AtomsInfo::kStateAtomsFieldOptions.end()) {
177580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            // 3. dimension must be primary fields + state field IN ORDER
178580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            size_t expectedDimensionCount = it->second.primaryFields.size() + 1;
179580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            vector<Matcher> dimensions;
180580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            translateFieldMatcher(simplePredicate.dimensions(), &dimensions);
181580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            if (dimensions.size() != expectedDimensionCount) {
182580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                return false;
183580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            }
184580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            // 3.1 check the primary fields first.
185580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            size_t index = 0;
186580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            for (const auto& field : it->second.primaryFields) {
187580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                Matcher matcher = getSimpleMatcher(it->first, field);
188580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                if (!(matcher == dimensions[index])) {
189580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                    return false;
190580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                }
191580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                primaryKeys->push_back(matcher);
192580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                index++;
193580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            }
194580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            Matcher stateFieldMatcher =
195580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                    getSimpleMatcher(it->first, it->second.exclusiveField);
196580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            // 3.2 last dimension should be the exclusive field.
197580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            if (!(dimensions.back() == stateFieldMatcher)) {
198580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                return false;
199580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            }
200580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen            return true;
201580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen        }
202580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    }
203580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen    return false;
204580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen}  // namespace statsd
205580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen
206b356151e63140085cb96fa16804ee18b3862a4fcYao Chenbool initConditions(const ConfigKey& key, const StatsdConfig& config,
20794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                    const unordered_map<int64_t, int>& logTrackerMap,
20894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                    unordered_map<int64_t, int>& conditionTrackerMap,
209caf339d004fad667748b68912c254df4e75cdc5aYao Chen                    vector<sp<ConditionTracker>>& allConditionTrackers,
210caf339d004fad667748b68912c254df4e75cdc5aYao Chen                    unordered_map<int, std::vector<int>>& trackerToConditionMap) {
21112d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon    vector<Predicate> conditionConfigs;
21212d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon    const int conditionTrackerCount = config.predicate_size();
213729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    conditionConfigs.reserve(conditionTrackerCount);
214729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    allConditionTrackers.reserve(conditionTrackerCount);
215caf339d004fad667748b68912c254df4e75cdc5aYao Chen
216729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    for (int i = 0; i < conditionTrackerCount; i++) {
21712d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon        const Predicate& condition = config.predicate(i);
218caf339d004fad667748b68912c254df4e75cdc5aYao Chen        int index = allConditionTrackers.size();
219caf339d004fad667748b68912c254df4e75cdc5aYao Chen        switch (condition.contents_case()) {
22012d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon            case Predicate::ContentsCase::kSimplePredicate: {
221580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                vector<Matcher> primaryKeys;
222580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                if (isStateTracker(condition.simple_predicate(), &primaryKeys)) {
223580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                    allConditionTrackers.push_back(new StateTracker(key, condition.id(), index,
224580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                                                                    condition.simple_predicate(),
225580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                                                                    logTrackerMap, primaryKeys));
226580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                } else {
227580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                    allConditionTrackers.push_back(new SimpleConditionTracker(
228580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                            key, condition.id(), index, condition.simple_predicate(),
229580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                            logTrackerMap));
230580ea321b16c71ddec515553761d6f37359bd3a0Yao Chen                }
231caf339d004fad667748b68912c254df4e75cdc5aYao Chen                break;
232caf339d004fad667748b68912c254df4e75cdc5aYao Chen            }
23312d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon            case Predicate::ContentsCase::kCombination: {
234caf339d004fad667748b68912c254df4e75cdc5aYao Chen                allConditionTrackers.push_back(
23594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                        new CombinationConditionTracker(condition.id(), index));
236caf339d004fad667748b68912c254df4e75cdc5aYao Chen                break;
237caf339d004fad667748b68912c254df4e75cdc5aYao Chen            }
238caf339d004fad667748b68912c254df4e75cdc5aYao Chen            default:
23994e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                ALOGE("Predicate \"%lld\" malformed", (long long)condition.id());
240caf339d004fad667748b68912c254df4e75cdc5aYao Chen                return false;
241caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
24294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        if (conditionTrackerMap.find(condition.id()) != conditionTrackerMap.end()) {
24312d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon            ALOGE("Duplicate Predicate found!");
244caf339d004fad667748b68912c254df4e75cdc5aYao Chen            return false;
245caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
24694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        conditionTrackerMap[condition.id()] = index;
247caf339d004fad667748b68912c254df4e75cdc5aYao Chen        conditionConfigs.push_back(condition);
248caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
249caf339d004fad667748b68912c254df4e75cdc5aYao Chen
250caf339d004fad667748b68912c254df4e75cdc5aYao Chen    vector<bool> stackTracker(allConditionTrackers.size(), false);
251caf339d004fad667748b68912c254df4e75cdc5aYao Chen    for (size_t i = 0; i < allConditionTrackers.size(); i++) {
252caf339d004fad667748b68912c254df4e75cdc5aYao Chen        auto& conditionTracker = allConditionTrackers[i];
253caf339d004fad667748b68912c254df4e75cdc5aYao Chen        if (!conditionTracker->init(conditionConfigs, allConditionTrackers, conditionTrackerMap,
254caf339d004fad667748b68912c254df4e75cdc5aYao Chen                                    stackTracker)) {
255caf339d004fad667748b68912c254df4e75cdc5aYao Chen            return false;
256caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
257caf339d004fad667748b68912c254df4e75cdc5aYao Chen        for (const int trackerIndex : conditionTracker->getLogTrackerIndex()) {
258caf339d004fad667748b68912c254df4e75cdc5aYao Chen            auto& conditionList = trackerToConditionMap[trackerIndex];
259caf339d004fad667748b68912c254df4e75cdc5aYao Chen            conditionList.push_back(i);
260caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
261caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
262caf339d004fad667748b68912c254df4e75cdc5aYao Chen    return true;
263caf339d004fad667748b68912c254df4e75cdc5aYao Chen}
264caf339d004fad667748b68912c254df4e75cdc5aYao Chen
26515f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-macbool initMetrics(const ConfigKey& key, const StatsdConfig& config,
26615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                 const int64_t timeBaseTimeNs, const int64_t currentTimeNs,
267bd12527c90d55eefa657e6a71cfdd287ecdb4ab3David Chen                 UidMap& uidMap, const unordered_map<int64_t, int>& logTrackerMap,
26894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                 const unordered_map<int64_t, int>& conditionTrackerMap,
269b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon                 const vector<sp<LogMatchingTracker>>& allAtomMatchers,
270729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen                 vector<sp<ConditionTracker>>& allConditionTrackers,
271caf339d004fad667748b68912c254df4e75cdc5aYao Chen                 vector<sp<MetricProducer>>& allMetricProducers,
272caf339d004fad667748b68912c254df4e75cdc5aYao Chen                 unordered_map<int, std::vector<int>>& conditionToMetricMap,
273e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac                 unordered_map<int, std::vector<int>>& trackerToMetricMap,
274bd12527c90d55eefa657e6a71cfdd287ecdb4ab3David Chen                 unordered_map<int64_t, int>& metricMap, std::set<int64_t>& noReportMetricIds) {
275729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    sp<ConditionWizard> wizard = new ConditionWizard(allConditionTrackers);
27693fe3a34a02c673eaee4a2d18565ba8df20685cbYao Chen    const int allMetricsCount = config.count_metric_size() + config.duration_metric_size() +
27793fe3a34a02c673eaee4a2d18565ba8df20685cbYao Chen                                config.event_metric_size() + config.value_metric_size();
278729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    allMetricProducers.reserve(allMetricsCount);
2796736c893a73c567d3794d88ae0d17abab34b7a6fChenjie Yu    StatsPullerManager statsPullerManager;
2802087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac
281caf339d004fad667748b68912c254df4e75cdc5aYao Chen    // Build MetricProducers for each metric defined in config.
2825305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu    // build CountMetricProducer
283caf339d004fad667748b68912c254df4e75cdc5aYao Chen    for (int i = 0; i < config.count_metric_size(); i++) {
284caf339d004fad667748b68912c254df4e75cdc5aYao Chen        const CountMetric& metric = config.count_metric(i);
285caf339d004fad667748b68912c254df4e75cdc5aYao Chen        if (!metric.has_what()) {
28694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            ALOGW("cannot find \"what\" in CountMetric \"%lld\"", (long long)metric.id());
287caf339d004fad667748b68912c254df4e75cdc5aYao Chen            return false;
288caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
289caf339d004fad667748b68912c254df4e75cdc5aYao Chen
290729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen        int metricIndex = allMetricProducers.size();
29194e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        metricMap.insert({metric.id(), metricIndex});
2925110bedd787835d4dbc809b7977285cac364bdefYao Chen        int trackerIndex;
293468ff04fd4cb43a384a3d4948cccd4438be7202aYangster-mac        if (!handleMetricWithLogTrackers(metric.what(), metricIndex,
294468ff04fd4cb43a384a3d4948cccd4438be7202aYangster-mac                                         metric.has_dimensions_in_what(),
295b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon                                         allAtomMatchers, logTrackerMap, trackerToMetricMap,
2965154a379303ab90a2b2914676a4441917a329b5dYao Chen                                         trackerIndex)) {
297caf339d004fad667748b68912c254df4e75cdc5aYao Chen            return false;
298caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
299729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
3005110bedd787835d4dbc809b7977285cac364bdefYao Chen        int conditionIndex = -1;
301caf339d004fad667748b68912c254df4e75cdc5aYao Chen        if (metric.has_condition()) {
30210535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen            bool good = handleMetricWithConditions(
30310535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen                    metric.condition(), metricIndex, conditionTrackerMap, metric.links(),
30410535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen                    allConditionTrackers, conditionIndex, conditionToMetricMap);
30510535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen            if (!good) {
30610535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen                return false;
30710535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen            }
3085c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen        } else {
3095c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen            if (metric.links_size() > 0) {
310a5b5191351a85ea33641dc42ee4223189b3612f3Stefan Lafon                ALOGW("metrics has a MetricConditionLink but doesn't have a condition");
3115c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen                return false;
3125c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen            }
313caf339d004fad667748b68912c254df4e75cdc5aYao Chen        }
3145110bedd787835d4dbc809b7977285cac364bdefYao Chen
31593fe3a34a02c673eaee4a2d18565ba8df20685cbYao Chen        sp<MetricProducer> countProducer =
31615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                new CountMetricProducer(key, metric, conditionIndex, wizard, timeBaseTimeNs);
317caf339d004fad667748b68912c254df4e75cdc5aYao Chen        allMetricProducers.push_back(countProducer);
318caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
319caf339d004fad667748b68912c254df4e75cdc5aYao Chen
3205305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu    // build DurationMetricProducer
321729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    for (int i = 0; i < config.duration_metric_size(); i++) {
322729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen        int metricIndex = allMetricProducers.size();
3235110bedd787835d4dbc809b7977285cac364bdefYao Chen        const DurationMetric& metric = config.duration_metric(i);
32494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        metricMap.insert({metric.id(), metricIndex});
3255154a379303ab90a2b2914676a4441917a329b5dYao Chen
3265154a379303ab90a2b2914676a4441917a329b5dYao Chen        auto what_it = conditionTrackerMap.find(metric.what());
3275154a379303ab90a2b2914676a4441917a329b5dYao Chen        if (what_it == conditionTrackerMap.end()) {
3285154a379303ab90a2b2914676a4441917a329b5dYao Chen            ALOGE("DurationMetric's \"what\" is invalid");
3295154a379303ab90a2b2914676a4441917a329b5dYao Chen            return false;
3305154a379303ab90a2b2914676a4441917a329b5dYao Chen        }
3315154a379303ab90a2b2914676a4441917a329b5dYao Chen
33212d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon        const Predicate& durationWhat = config.predicate(what_it->second);
3335154a379303ab90a2b2914676a4441917a329b5dYao Chen
33412d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon        if (durationWhat.contents_case() != Predicate::ContentsCase::kSimplePredicate) {
3355154a379303ab90a2b2914676a4441917a329b5dYao Chen            ALOGE("DurationMetric's \"what\" must be a simple condition");
3365154a379303ab90a2b2914676a4441917a329b5dYao Chen            return false;
3375154a379303ab90a2b2914676a4441917a329b5dYao Chen        }
3385154a379303ab90a2b2914676a4441917a329b5dYao Chen
33912d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon        const auto& simplePredicate = durationWhat.simple_predicate();
3405154a379303ab90a2b2914676a4441917a329b5dYao Chen
34112d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon        bool nesting = simplePredicate.count_nesting();
3420ea19901ef78de19437c08bbcbb7af6663ad6f4bYao Chen
3435110bedd787835d4dbc809b7977285cac364bdefYao Chen        int trackerIndices[3] = {-1, -1, -1};
34412d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon        if (!simplePredicate.has_start() ||
34512d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon            !handleMetricWithLogTrackers(simplePredicate.start(), metricIndex,
346468ff04fd4cb43a384a3d4948cccd4438be7202aYangster-mac                                         metric.has_dimensions_in_what(), allAtomMatchers,
3475154a379303ab90a2b2914676a4441917a329b5dYao Chen                                         logTrackerMap, trackerToMetricMap, trackerIndices[0])) {
3485110bedd787835d4dbc809b7977285cac364bdefYao Chen            ALOGE("Duration metrics must specify a valid the start event matcher");
349729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen            return false;
350729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen        }
351729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
35212d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon        if (simplePredicate.has_stop() &&
35312d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon            !handleMetricWithLogTrackers(simplePredicate.stop(), metricIndex,
354468ff04fd4cb43a384a3d4948cccd4438be7202aYangster-mac                                         metric.has_dimensions_in_what(), allAtomMatchers,
3555154a379303ab90a2b2914676a4441917a329b5dYao Chen                                         logTrackerMap, trackerToMetricMap, trackerIndices[1])) {
3565110bedd787835d4dbc809b7977285cac364bdefYao Chen            return false;
357729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen        }
358729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
35912d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon        if (simplePredicate.has_stop_all() &&
36012d01fa7c165a1f79091d4d742a48bffd7552650Stefan Lafon            !handleMetricWithLogTrackers(simplePredicate.stop_all(), metricIndex,
361468ff04fd4cb43a384a3d4948cccd4438be7202aYangster-mac                                         metric.has_dimensions_in_what(), allAtomMatchers,
3625154a379303ab90a2b2914676a4441917a329b5dYao Chen                                         logTrackerMap, trackerToMetricMap, trackerIndices[2])) {
3635110bedd787835d4dbc809b7977285cac364bdefYao Chen            return false;
364729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen        }
365729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
3662087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        FieldMatcher internalDimensions = simplePredicate.dimensions();
3675154a379303ab90a2b2914676a4441917a329b5dYao Chen
368729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen        int conditionIndex = -1;
369729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
3705c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen        if (metric.has_condition()) {
37110535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen            bool good = handleMetricWithConditions(
37210535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen                    metric.condition(), metricIndex, conditionTrackerMap, metric.links(),
37310535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen                    allConditionTrackers, conditionIndex, conditionToMetricMap);
37410535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen            if (!good) {
37510535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen                return false;
37610535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen            }
3775c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen        } else {
3785c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen            if (metric.links_size() > 0) {
379a5b5191351a85ea33641dc42ee4223189b3612f3Stefan Lafon                ALOGW("metrics has a MetricConditionLink but doesn't have a condition");
3805c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen                return false;
3815c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen            }
382729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen        }
383729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
3845154a379303ab90a2b2914676a4441917a329b5dYao Chen        sp<MetricProducer> durationMetric = new DurationMetricProducer(
385b356151e63140085cb96fa16804ee18b3862a4fcYao Chen                key, metric, conditionIndex, trackerIndices[0], trackerIndices[1],
38615f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                trackerIndices[2], nesting, wizard, internalDimensions, timeBaseTimeNs);
387729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen
388729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen        allMetricProducers.push_back(durationMetric);
389729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen    }
3905110bedd787835d4dbc809b7977285cac364bdefYao Chen
3915305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu    // build EventMetricProducer
3925110bedd787835d4dbc809b7977285cac364bdefYao Chen    for (int i = 0; i < config.event_metric_size(); i++) {
3935110bedd787835d4dbc809b7977285cac364bdefYao Chen        int metricIndex = allMetricProducers.size();
3945110bedd787835d4dbc809b7977285cac364bdefYao Chen        const EventMetric& metric = config.event_metric(i);
39594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        metricMap.insert({metric.id(), metricIndex});
39694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        if (!metric.has_id() || !metric.has_what()) {
397d1815dc7b82f99259f6c41cfacc44972b867ef2dYangster-mac            ALOGW("cannot find the metric name or what in config");
3985110bedd787835d4dbc809b7977285cac364bdefYao Chen            return false;
3995110bedd787835d4dbc809b7977285cac364bdefYao Chen        }
4005110bedd787835d4dbc809b7977285cac364bdefYao Chen        int trackerIndex;
401b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon        if (!handleMetricWithLogTrackers(metric.what(), metricIndex, false, allAtomMatchers,
4025154a379303ab90a2b2914676a4441917a329b5dYao Chen                                         logTrackerMap, trackerToMetricMap, trackerIndex)) {
4035110bedd787835d4dbc809b7977285cac364bdefYao Chen            return false;
4045110bedd787835d4dbc809b7977285cac364bdefYao Chen        }
4055110bedd787835d4dbc809b7977285cac364bdefYao Chen
4065110bedd787835d4dbc809b7977285cac364bdefYao Chen        int conditionIndex = -1;
4075110bedd787835d4dbc809b7977285cac364bdefYao Chen        if (metric.has_condition()) {
40810535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen            bool good = handleMetricWithConditions(
40910535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen                    metric.condition(), metricIndex, conditionTrackerMap, metric.links(),
41010535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen                    allConditionTrackers, conditionIndex, conditionToMetricMap);
41110535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen            if (!good) {
41210535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen                return false;
41310535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen            }
4145c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen        } else {
4155c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen            if (metric.links_size() > 0) {
416a5b5191351a85ea33641dc42ee4223189b3612f3Stefan Lafon                ALOGW("metrics has a MetricConditionLink but doesn't have a condition");
4175c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen                return false;
4185c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen            }
4195110bedd787835d4dbc809b7977285cac364bdefYao Chen        }
4205110bedd787835d4dbc809b7977285cac364bdefYao Chen
42193fe3a34a02c673eaee4a2d18565ba8df20685cbYao Chen        sp<MetricProducer> eventMetric =
42215f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                new EventMetricProducer(key, metric, conditionIndex, wizard, timeBaseTimeNs);
42393fe3a34a02c673eaee4a2d18565ba8df20685cbYao Chen
4245110bedd787835d4dbc809b7977285cac364bdefYao Chen        allMetricProducers.push_back(eventMetric);
4255110bedd787835d4dbc809b7977285cac364bdefYao Chen    }
4265110bedd787835d4dbc809b7977285cac364bdefYao Chen
4275305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu    // build ValueMetricProducer
428b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    for (int i = 0; i < config.value_metric_size(); i++) {
429b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu        const ValueMetric& metric = config.value_metric(i);
430b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu        if (!metric.has_what()) {
43194e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            ALOGW("cannot find \"what\" in ValueMetric \"%lld\"", (long long)metric.id());
432b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu            return false;
433b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu        }
434b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu
4355305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu        int metricIndex = allMetricProducers.size();
43694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        metricMap.insert({metric.id(), metricIndex});
4375305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu        int trackerIndex;
438468ff04fd4cb43a384a3d4948cccd4438be7202aYangster-mac        if (!handleMetricWithLogTrackers(metric.what(), metricIndex,
439468ff04fd4cb43a384a3d4948cccd4438be7202aYangster-mac                                         metric.has_dimensions_in_what(),
440b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon                                         allAtomMatchers, logTrackerMap, trackerToMetricMap,
4415305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu                                         trackerIndex)) {
442b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu            return false;
443b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu        }
444b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu
445b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon        sp<LogMatchingTracker> atomMatcher = allAtomMatchers.at(trackerIndex);
4465305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu        // If it is pulled atom, it should be simple matcher with one tagId.
4472087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        if (atomMatcher->getAtomIds().size() != 1) {
448d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu            return false;
4495305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu        }
4502087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        int atomTagId = *(atomMatcher->getAtomIds().begin());
451d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu        int pullTagId = statsPullerManager.PullerForMatcherExists(atomTagId) ? atomTagId : -1;
4525305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu
4535305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu        int conditionIndex = -1;
4545305e1ddc22bfe9ad941cb2550987aaba8de234cChenjie Yu        if (metric.has_condition()) {
45510535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen            bool good = handleMetricWithConditions(
45610535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen                    metric.condition(), metricIndex, conditionTrackerMap, metric.links(),
45710535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen                    allConditionTrackers, conditionIndex, conditionToMetricMap);
45810535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen            if (!good) {
45910535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen                return false;
46010535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen            }
4615c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen        } else {
4625c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen            if (metric.links_size() > 0) {
463a5b5191351a85ea33641dc42ee4223189b3612f3Stefan Lafon                ALOGW("metrics has a MetricConditionLink but doesn't have a condition");
4645c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen                return false;
4655c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen            }
466b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu        }
467b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu
468b356151e63140085cb96fa16804ee18b3862a4fcYao Chen        sp<MetricProducer> valueProducer = new ValueMetricProducer(key, metric, conditionIndex,
46915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                                                                   wizard, pullTagId,
47015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                                                                   timeBaseTimeNs, currentTimeNs);
471b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu        allMetricProducers.push_back(valueProducer);
472b3dda41a5a48ddfa44dc8fa939ab495926a0195dChenjie Yu    }
4731d4d686001b220e114df737154f143ffabc212f1Yangster
4741d4d686001b220e114df737154f143ffabc212f1Yangster    // Gauge metrics.
4751d4d686001b220e114df737154f143ffabc212f1Yangster    for (int i = 0; i < config.gauge_metric_size(); i++) {
4761d4d686001b220e114df737154f143ffabc212f1Yangster        const GaugeMetric& metric = config.gauge_metric(i);
4771d4d686001b220e114df737154f143ffabc212f1Yangster        if (!metric.has_what()) {
47894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            ALOGW("cannot find \"what\" in GaugeMetric \"%lld\"", (long long)metric.id());
479d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu            return false;
480d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu        }
481d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu
4822087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        if ((!metric.gauge_fields_filter().has_include_all() ||
4832087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac             (metric.gauge_fields_filter().include_all() == false)) &&
4842087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac            !hasLeafNode(metric.gauge_fields_filter().fields())) {
48594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            ALOGW("Incorrect field filter setting in GaugeMetric %lld", (long long)metric.id());
4862b4fc9d657feaafb654a38096ec46622dcdb37bcChenjie Yu            return false;
4872b4fc9d657feaafb654a38096ec46622dcdb37bcChenjie Yu        }
4882087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        if ((metric.gauge_fields_filter().has_include_all() &&
4892087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac             metric.gauge_fields_filter().include_all() == true) &&
4902087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac            hasLeafNode(metric.gauge_fields_filter().fields())) {
49194e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            ALOGW("Incorrect field filter setting in GaugeMetric %lld", (long long)metric.id());
4921d4d686001b220e114df737154f143ffabc212f1Yangster            return false;
4931d4d686001b220e114df737154f143ffabc212f1Yangster        }
4941d4d686001b220e114df737154f143ffabc212f1Yangster
4951d4d686001b220e114df737154f143ffabc212f1Yangster        int metricIndex = allMetricProducers.size();
49694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        metricMap.insert({metric.id(), metricIndex});
4971d4d686001b220e114df737154f143ffabc212f1Yangster        int trackerIndex;
498468ff04fd4cb43a384a3d4948cccd4438be7202aYangster-mac        if (!handleMetricWithLogTrackers(metric.what(), metricIndex,
499468ff04fd4cb43a384a3d4948cccd4438be7202aYangster-mac                                         metric.has_dimensions_in_what(),
500b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon                                         allAtomMatchers, logTrackerMap, trackerToMetricMap,
5011d4d686001b220e114df737154f143ffabc212f1Yangster                                         trackerIndex)) {
5021d4d686001b220e114df737154f143ffabc212f1Yangster            return false;
5031d4d686001b220e114df737154f143ffabc212f1Yangster        }
5041d4d686001b220e114df737154f143ffabc212f1Yangster
505b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon        sp<LogMatchingTracker> atomMatcher = allAtomMatchers.at(trackerIndex);
5061d4d686001b220e114df737154f143ffabc212f1Yangster        // If it is pulled atom, it should be simple matcher with one tagId.
5072087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        if (atomMatcher->getAtomIds().size() != 1) {
508d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu            return false;
5091d4d686001b220e114df737154f143ffabc212f1Yangster        }
5102087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac        int atomTagId = *(atomMatcher->getAtomIds().begin());
511d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu        int pullTagId = statsPullerManager.PullerForMatcherExists(atomTagId) ? atomTagId : -1;
5121d4d686001b220e114df737154f143ffabc212f1Yangster
5131d4d686001b220e114df737154f143ffabc212f1Yangster        int conditionIndex = -1;
5141d4d686001b220e114df737154f143ffabc212f1Yangster        if (metric.has_condition()) {
51510535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen            bool good = handleMetricWithConditions(
51610535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen                    metric.condition(), metricIndex, conditionTrackerMap, metric.links(),
51710535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen                    allConditionTrackers, conditionIndex, conditionToMetricMap);
51810535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen            if (!good) {
51910535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen                return false;
52010535b9ad0b8be8f07d27f1d6a13372be31cbf65Yao Chen            }
5215c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen        } else {
5225c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen            if (metric.links_size() > 0) {
523a5b5191351a85ea33641dc42ee4223189b3612f3Stefan Lafon                ALOGW("metrics has a MetricConditionLink but doesn't have a condition");
5245c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen                return false;
5255c925ad04ffe959e8fb00253b20daf1f7128b8d6Yao Chen            }
5261d4d686001b220e114df737154f143ffabc212f1Yangster        }
5271d4d686001b220e114df737154f143ffabc212f1Yangster
528d9dfda76e0aa8b8aa4d2562a7ff4259f4500e355Chenjie Yu        sp<MetricProducer> gaugeProducer = new GaugeMetricProducer(
52915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                key, metric, conditionIndex, wizard, pullTagId, timeBaseTimeNs, currentTimeNs);
5301d4d686001b220e114df737154f143ffabc212f1Yangster        allMetricProducers.push_back(gaugeProducer);
5311d4d686001b220e114df737154f143ffabc212f1Yangster    }
53294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    for (int i = 0; i < config.no_report_metric_size(); ++i) {
53394e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        const auto no_report_metric = config.no_report_metric(i);
53494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        if (metricMap.find(no_report_metric) == metricMap.end()) {
53594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            ALOGW("no_report_metric %lld not exist", no_report_metric);
53694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            return false;
53794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        }
53894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        noReportMetricIds.insert(no_report_metric);
53994e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    }
540bd12527c90d55eefa657e6a71cfdd287ecdb4ab3David Chen    for (auto it : allMetricProducers) {
541bd12527c90d55eefa657e6a71cfdd287ecdb4ab3David Chen        uidMap.addListener(it);
542bd12527c90d55eefa657e6a71cfdd287ecdb4ab3David Chen    }
543caf339d004fad667748b68912c254df4e75cdc5aYao Chen    return true;
544caf339d004fad667748b68912c254df4e75cdc5aYao Chen}
545caf339d004fad667748b68912c254df4e75cdc5aYao Chen
5462087716f2bdca90c7c3034d556ac12911bd8018eYangster-macbool initAlerts(const StatsdConfig& config,
54794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                const unordered_map<int64_t, int>& metricProducerMap,
548932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                const sp<AlarmMonitor>& anomalyAlarmMonitor,
549e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac                vector<sp<MetricProducer>>& allMetricProducers,
550e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac                vector<sp<AnomalyTracker>>& allAnomalyTrackers) {
55194e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    unordered_map<int64_t, int> anomalyTrackerMap;
552e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac    for (int i = 0; i < config.alert_size(); i++) {
553e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac        const Alert& alert = config.alert(i);
55494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        const auto& itr = metricProducerMap.find(alert.metric_id());
555e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac        if (itr == metricProducerMap.end()) {
55694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            ALOGW("alert \"%lld\" has unknown metric id: \"%lld\"", (long long)alert.id(),
55794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                  (long long)alert.metric_id());
558e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac            return false;
559e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac        }
5606bf9825b1575bfc3c62ef0a5129f94b6a776ef66Bookatz        if (!alert.has_trigger_if_sum_gt()) {
5616bf9825b1575bfc3c62ef0a5129f94b6a776ef66Bookatz            ALOGW("invalid alert: missing threshold");
5626bf9825b1575bfc3c62ef0a5129f94b6a776ef66Bookatz            return false;
5636bf9825b1575bfc3c62ef0a5129f94b6a776ef66Bookatz        }
564a7fb12d2d285a3a62f5e8956d1bacfa0e15e9d0fYangster-mac        if (alert.trigger_if_sum_gt() < 0 || alert.num_buckets() <= 0) {
565a7fb12d2d285a3a62f5e8956d1bacfa0e15e9d0fYangster-mac            ALOGW("invalid alert: threshold=%f num_buckets= %d",
566a7fb12d2d285a3a62f5e8956d1bacfa0e15e9d0fYangster-mac                  alert.trigger_if_sum_gt(), alert.num_buckets());
567cc5adef2d0c5f96a225fd69517fd1eecb557f46dBookatz            return false;
568cc5adef2d0c5f96a225fd69517fd1eecb557f46dBookatz        }
569e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac        const int metricIndex = itr->second;
570450099db169d386077584d93486908c3bae1244eBookatz        sp<MetricProducer> metric = allMetricProducers[metricIndex];
571932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        sp<AnomalyTracker> anomalyTracker = metric->addAnomalyTracker(alert, anomalyAlarmMonitor);
5721476ef24f33fd9ff7d0e748f61cc964723e6bb1cBookatz        if (anomalyTracker == nullptr) {
5731476ef24f33fd9ff7d0e748f61cc964723e6bb1cBookatz            // The ALOGW for this invalid alert was already displayed in addAnomalyTracker().
5741476ef24f33fd9ff7d0e748f61cc964723e6bb1cBookatz            return false;
575cc5adef2d0c5f96a225fd69517fd1eecb557f46dBookatz        }
5761476ef24f33fd9ff7d0e748f61cc964723e6bb1cBookatz        anomalyTrackerMap.insert(std::make_pair(alert.id(), allAnomalyTrackers.size()));
5771476ef24f33fd9ff7d0e748f61cc964723e6bb1cBookatz        allAnomalyTrackers.push_back(anomalyTracker);
578e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac    }
57994e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    for (int i = 0; i < config.subscription_size(); ++i) {
58094e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        const Subscription& subscription = config.subscription(i);
581932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        if (subscription.rule_type() != Subscription::ALERT) {
582932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            continue;
583932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        }
58494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        if (subscription.subscriber_information_case() ==
58594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            Subscription::SubscriberInformationCase::SUBSCRIBER_INFORMATION_NOT_SET) {
58694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            ALOGW("subscription \"%lld\" has no subscriber info.\"",
58794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                (long long)subscription.id());
58894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            return false;
58994e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        }
59094e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        const auto& itr = anomalyTrackerMap.find(subscription.rule_id());
59194e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        if (itr == anomalyTrackerMap.end()) {
59294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            ALOGW("subscription \"%lld\" has unknown rule id: \"%lld\"",
59394e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                (long long)subscription.id(), (long long)subscription.rule_id());
59494e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac            return false;
59594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        }
59694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        const int anomalyTrackerIndex = itr->second;
59794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac        allAnomalyTrackers[anomalyTrackerIndex]->addSubscription(subscription);
59894e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    }
599e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac    return true;
600e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac}
601e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac
602932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-macbool initAlarms(const StatsdConfig& config, const ConfigKey& key,
603932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                const sp<AlarmMonitor>& periodicAlarmMonitor,
60415f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                const int64_t timeBaseNs, const int64_t currentTimeNs,
605932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                vector<sp<AlarmTracker>>& allAlarmTrackers) {
606932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac    unordered_map<int64_t, int> alarmTrackerMap;
60715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac    int64_t startMillis = timeBaseNs / 1000 / 1000;
60815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac    int64_t currentTimeMillis = currentTimeNs / 1000 /1000;
609932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac    for (int i = 0; i < config.alarm_size(); i++) {
610932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        const Alarm& alarm = config.alarm(i);
611932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        if (alarm.offset_millis() <= 0) {
612932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            ALOGW("Alarm offset_millis should be larger than 0.");
613932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            return false;
614932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        }
615932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        if (alarm.period_millis() <= 0) {
616932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            ALOGW("Alarm period_millis should be larger than 0.");
617932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            return false;
618932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        }
619932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        alarmTrackerMap.insert(std::make_pair(alarm.id(), allAlarmTrackers.size()));
620932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        allAlarmTrackers.push_back(
621c04feba805c5acde92638a062cc13030fc4d3308Yangster-mac            new AlarmTracker(startMillis, currentTimeMillis,
622c04feba805c5acde92638a062cc13030fc4d3308Yangster-mac                             alarm, key, periodicAlarmMonitor));
623932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac    }
624932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac    for (int i = 0; i < config.subscription_size(); ++i) {
625932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        const Subscription& subscription = config.subscription(i);
626932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        if (subscription.rule_type() != Subscription::ALARM) {
627932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            continue;
628932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        }
629932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        if (subscription.subscriber_information_case() ==
630932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            Subscription::SubscriberInformationCase::SUBSCRIBER_INFORMATION_NOT_SET) {
631932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            ALOGW("subscription \"%lld\" has no subscriber info.\"",
632932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                (long long)subscription.id());
633932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            return false;
634932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        }
635932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        const auto& itr = alarmTrackerMap.find(subscription.rule_id());
636932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        if (itr == alarmTrackerMap.end()) {
637932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            ALOGW("subscription \"%lld\" has unknown rule id: \"%lld\"",
638932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                (long long)subscription.id(), (long long)subscription.rule_id());
639932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac            return false;
640932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        }
641932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        const int trackerIndex = itr->second;
642932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        allAlarmTrackers[trackerIndex]->addSubscription(subscription);
643932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac    }
644932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac    return true;
645932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac}
646932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac
647bd12527c90d55eefa657e6a71cfdd287ecdb4ab3David Chenbool initStatsdConfig(const ConfigKey& key, const StatsdConfig& config, UidMap& uidMap,
648932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                      const sp<AlarmMonitor>& anomalyAlarmMonitor,
64915f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                      const sp<AlarmMonitor>& periodicAlarmMonitor,
65015f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                      const int64_t timeBaseNs, const int64_t currentTimeNs,
65115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                      set<int>& allTagIds,
652b8c9aa8c9ccba4e64759c177381b742ca99a5487Stefan Lafon                      vector<sp<LogMatchingTracker>>& allAtomMatchers,
653caf339d004fad667748b68912c254df4e75cdc5aYao Chen                      vector<sp<ConditionTracker>>& allConditionTrackers,
654caf339d004fad667748b68912c254df4e75cdc5aYao Chen                      vector<sp<MetricProducer>>& allMetricProducers,
655e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac                      vector<sp<AnomalyTracker>>& allAnomalyTrackers,
656932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                      vector<sp<AlarmTracker>>& allPeriodicAlarmTrackers,
657caf339d004fad667748b68912c254df4e75cdc5aYao Chen                      unordered_map<int, std::vector<int>>& conditionToMetricMap,
658caf339d004fad667748b68912c254df4e75cdc5aYao Chen                      unordered_map<int, std::vector<int>>& trackerToMetricMap,
65994e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac                      unordered_map<int, std::vector<int>>& trackerToConditionMap,
660bd12527c90d55eefa657e6a71cfdd287ecdb4ab3David Chen                      std::set<int64_t>& noReportMetricIds) {
66194e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    unordered_map<int64_t, int> logTrackerMap;
66294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    unordered_map<int64_t, int> conditionTrackerMap;
66394e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac    unordered_map<int64_t, int> metricProducerMap;
664caf339d004fad667748b68912c254df4e75cdc5aYao Chen
6652087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac    if (!initLogTrackers(config, uidMap, logTrackerMap, allAtomMatchers, allTagIds)) {
666caf339d004fad667748b68912c254df4e75cdc5aYao Chen        ALOGE("initLogMatchingTrackers failed");
667caf339d004fad667748b68912c254df4e75cdc5aYao Chen        return false;
668caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
669484524a246ffe453f8cd89b698a279c23b0bde1fTej Singh    VLOG("initLogMatchingTrackers succeed...");
670caf339d004fad667748b68912c254df4e75cdc5aYao Chen
671b356151e63140085cb96fa16804ee18b3862a4fcYao Chen    if (!initConditions(key, config, logTrackerMap, conditionTrackerMap, allConditionTrackers,
672caf339d004fad667748b68912c254df4e75cdc5aYao Chen                        trackerToConditionMap)) {
673caf339d004fad667748b68912c254df4e75cdc5aYao Chen        ALOGE("initConditionTrackers failed");
674caf339d004fad667748b68912c254df4e75cdc5aYao Chen        return false;
675caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
676caf339d004fad667748b68912c254df4e75cdc5aYao Chen
67715f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac    if (!initMetrics(key, config, timeBaseNs, currentTimeNs, uidMap,
67815f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                     logTrackerMap, conditionTrackerMap,
679bd12527c90d55eefa657e6a71cfdd287ecdb4ab3David Chen                     allAtomMatchers, allConditionTrackers, allMetricProducers,
680bd12527c90d55eefa657e6a71cfdd287ecdb4ab3David Chen                     conditionToMetricMap, trackerToMetricMap, metricProducerMap,
681bd12527c90d55eefa657e6a71cfdd287ecdb4ab3David Chen                     noReportMetricIds)) {
682caf339d004fad667748b68912c254df4e75cdc5aYao Chen        ALOGE("initMetricProducers failed");
683caf339d004fad667748b68912c254df4e75cdc5aYao Chen        return false;
684caf339d004fad667748b68912c254df4e75cdc5aYao Chen    }
685932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac    if (!initAlerts(config, metricProducerMap, anomalyAlarmMonitor, allMetricProducers,
686932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac                    allAnomalyTrackers)) {
687e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac        ALOGE("initAlerts failed");
688e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac        return false;
689e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac    }
690c04feba805c5acde92638a062cc13030fc4d3308Yangster-mac    if (!initAlarms(config, key, periodicAlarmMonitor,
69115f6bbc24f4d7a3d4481d90a18df33d402ddacbaYangster-mac                    timeBaseNs, currentTimeNs, allPeriodicAlarmTrackers)) {
692932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        ALOGE("initAlarms failed");
693932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac        return false;
694932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac    }
695932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac
696caf339d004fad667748b68912c254df4e75cdc5aYao Chen    return true;
697caf339d004fad667748b68912c254df4e75cdc5aYao Chen}
698caf339d004fad667748b68912c254df4e75cdc5aYao Chen
699caf339d004fad667748b68912c254df4e75cdc5aYao Chen}  // namespace statsd
700caf339d004fad667748b68912c254df4e75cdc5aYao Chen}  // namespace os
701caf339d004fad667748b68912c254df4e75cdc5aYao Chen}  // namespace android
702