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