Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 1 | /* |
| 2 | * Copyright (C) 2017 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | #include "../condition/CombinationConditionTracker.h" |
| 18 | #include "../condition/SimpleConditionTracker.h" |
Chenjie Yu | b3dda41 | 2017-10-24 13:41:59 -0700 | [diff] [blame] | 19 | #include "../external/StatsPullerManager.h" |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 20 | #include "../matchers/CombinationLogMatchingTracker.h" |
| 21 | #include "../matchers/SimpleLogMatchingTracker.h" |
| 22 | #include "CountMetricProducer.h" |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 23 | #include "DurationMetricProducer.h" |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 24 | #include "EventMetricProducer.h" |
Yangster | 1d4d686 | 2017-10-31 12:58:51 -0700 | [diff] [blame] | 25 | #include "GaugeMetricProducer.h" |
Chenjie Yu | b3dda41 | 2017-10-24 13:41:59 -0700 | [diff] [blame] | 26 | #include "ValueMetricProducer.h" |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 27 | #include "stats_util.h" |
| 28 | |
| 29 | using std::set; |
| 30 | using std::string; |
| 31 | using std::unordered_map; |
| 32 | using std::vector; |
| 33 | |
| 34 | namespace android { |
| 35 | namespace os { |
| 36 | namespace statsd { |
| 37 | |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 38 | bool handleMetricWithLogTrackers(const string what, const int metricIndex, |
Yao Chen | 5154a37 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 39 | const bool usedForDimension, |
| 40 | const vector<sp<LogMatchingTracker>>& allLogEntryMatchers, |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 41 | const unordered_map<string, int>& logTrackerMap, |
| 42 | unordered_map<int, std::vector<int>>& trackerToMetricMap, |
| 43 | int& logTrackerIndex) { |
| 44 | auto logTrackerIt = logTrackerMap.find(what); |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 45 | if (logTrackerIt == logTrackerMap.end()) { |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 46 | ALOGW("cannot find the LogEntryMatcher %s in config", what.c_str()); |
| 47 | return false; |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 48 | } |
Yao Chen | 5154a37 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 49 | if (usedForDimension && allLogEntryMatchers[logTrackerIt->second]->getTagIds().size() > 1) { |
| 50 | ALOGE("LogEntryMatcher %s has more than one tag ids. When a metric has dimension, the " |
| 51 | "\"what\" can only about one atom type.", |
| 52 | what.c_str()); |
| 53 | return false; |
| 54 | } |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 55 | logTrackerIndex = logTrackerIt->second; |
| 56 | auto& metric_list = trackerToMetricMap[logTrackerIndex]; |
| 57 | metric_list.push_back(metricIndex); |
| 58 | return true; |
| 59 | } |
| 60 | |
| 61 | bool handleMetricWithConditions( |
| 62 | const string condition, const int metricIndex, |
| 63 | const unordered_map<string, int>& conditionTrackerMap, |
| 64 | const ::google::protobuf::RepeatedPtrField<::android::os::statsd::EventConditionLink>& |
| 65 | links, |
| 66 | vector<sp<ConditionTracker>>& allConditionTrackers, int& conditionIndex, |
| 67 | unordered_map<int, std::vector<int>>& conditionToMetricMap) { |
| 68 | auto condition_it = conditionTrackerMap.find(condition); |
| 69 | if (condition_it == conditionTrackerMap.end()) { |
| 70 | ALOGW("cannot find the Condition %s in the config", condition.c_str()); |
| 71 | return false; |
| 72 | } |
| 73 | |
| 74 | for (const auto& link : links) { |
| 75 | auto it = conditionTrackerMap.find(link.condition()); |
| 76 | if (it == conditionTrackerMap.end()) { |
| 77 | ALOGW("cannot find the Condition %s in the config", link.condition().c_str()); |
| 78 | return false; |
| 79 | } |
| 80 | allConditionTrackers[condition_it->second]->setSliced(true); |
| 81 | allConditionTrackers[it->second]->setSliced(true); |
Yao Chen | 5154a37 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 82 | // TODO: We need to verify the link is valid. |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 83 | } |
| 84 | conditionIndex = condition_it->second; |
| 85 | |
| 86 | // will create new vector if not exist before. |
| 87 | auto& metricList = conditionToMetricMap[condition_it->second]; |
| 88 | metricList.push_back(metricIndex); |
| 89 | return true; |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 90 | } |
| 91 | |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 92 | bool initLogTrackers(const StatsdConfig& config, unordered_map<string, int>& logTrackerMap, |
| 93 | vector<sp<LogMatchingTracker>>& allLogEntryMatchers, set<int>& allTagIds) { |
| 94 | vector<LogEntryMatcher> matcherConfigs; |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 95 | const int logEntryMatcherCount = config.log_entry_matcher_size(); |
| 96 | matcherConfigs.reserve(logEntryMatcherCount); |
| 97 | allLogEntryMatchers.reserve(logEntryMatcherCount); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 98 | |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 99 | for (int i = 0; i < logEntryMatcherCount; i++) { |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 100 | const LogEntryMatcher& logMatcher = config.log_entry_matcher(i); |
| 101 | |
| 102 | int index = allLogEntryMatchers.size(); |
| 103 | switch (logMatcher.contents_case()) { |
| 104 | case LogEntryMatcher::ContentsCase::kSimpleLogEntryMatcher: |
| 105 | allLogEntryMatchers.push_back(new SimpleLogMatchingTracker( |
| 106 | logMatcher.name(), index, logMatcher.simple_log_entry_matcher())); |
| 107 | break; |
| 108 | case LogEntryMatcher::ContentsCase::kCombination: |
| 109 | allLogEntryMatchers.push_back( |
| 110 | new CombinationLogMatchingTracker(logMatcher.name(), index)); |
| 111 | break; |
| 112 | default: |
| 113 | ALOGE("Matcher %s malformed", logMatcher.name().c_str()); |
| 114 | return false; |
| 115 | // continue; |
| 116 | } |
| 117 | if (logTrackerMap.find(logMatcher.name()) != logTrackerMap.end()) { |
| 118 | ALOGE("Duplicate LogEntryMatcher found!"); |
| 119 | return false; |
| 120 | } |
| 121 | logTrackerMap[logMatcher.name()] = index; |
| 122 | matcherConfigs.push_back(logMatcher); |
| 123 | } |
| 124 | |
| 125 | vector<bool> stackTracker2(allLogEntryMatchers.size(), false); |
| 126 | for (auto& matcher : allLogEntryMatchers) { |
| 127 | if (!matcher->init(matcherConfigs, allLogEntryMatchers, logTrackerMap, stackTracker2)) { |
| 128 | return false; |
| 129 | } |
| 130 | // Collect all the tag ids that are interesting. TagIds exist in leaf nodes only. |
| 131 | const set<int>& tagIds = matcher->getTagIds(); |
| 132 | allTagIds.insert(tagIds.begin(), tagIds.end()); |
| 133 | } |
| 134 | return true; |
| 135 | } |
| 136 | |
| 137 | bool initConditions(const StatsdConfig& config, const unordered_map<string, int>& logTrackerMap, |
| 138 | unordered_map<string, int>& conditionTrackerMap, |
| 139 | vector<sp<ConditionTracker>>& allConditionTrackers, |
| 140 | unordered_map<int, std::vector<int>>& trackerToConditionMap) { |
| 141 | vector<Condition> conditionConfigs; |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 142 | const int conditionTrackerCount = config.condition_size(); |
| 143 | conditionConfigs.reserve(conditionTrackerCount); |
| 144 | allConditionTrackers.reserve(conditionTrackerCount); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 145 | |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 146 | for (int i = 0; i < conditionTrackerCount; i++) { |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 147 | const Condition& condition = config.condition(i); |
| 148 | int index = allConditionTrackers.size(); |
| 149 | switch (condition.contents_case()) { |
| 150 | case Condition::ContentsCase::kSimpleCondition: { |
| 151 | allConditionTrackers.push_back(new SimpleConditionTracker( |
| 152 | condition.name(), index, condition.simple_condition(), logTrackerMap)); |
| 153 | break; |
| 154 | } |
| 155 | case Condition::ContentsCase::kCombination: { |
| 156 | allConditionTrackers.push_back( |
| 157 | new CombinationConditionTracker(condition.name(), index)); |
| 158 | break; |
| 159 | } |
| 160 | default: |
| 161 | ALOGE("Condition %s malformed", condition.name().c_str()); |
| 162 | return false; |
| 163 | } |
| 164 | if (conditionTrackerMap.find(condition.name()) != conditionTrackerMap.end()) { |
| 165 | ALOGE("Duplicate Condition found!"); |
| 166 | return false; |
| 167 | } |
| 168 | conditionTrackerMap[condition.name()] = index; |
| 169 | conditionConfigs.push_back(condition); |
| 170 | } |
| 171 | |
| 172 | vector<bool> stackTracker(allConditionTrackers.size(), false); |
| 173 | for (size_t i = 0; i < allConditionTrackers.size(); i++) { |
| 174 | auto& conditionTracker = allConditionTrackers[i]; |
| 175 | if (!conditionTracker->init(conditionConfigs, allConditionTrackers, conditionTrackerMap, |
| 176 | stackTracker)) { |
| 177 | return false; |
| 178 | } |
| 179 | for (const int trackerIndex : conditionTracker->getLogTrackerIndex()) { |
| 180 | auto& conditionList = trackerToConditionMap[trackerIndex]; |
| 181 | conditionList.push_back(i); |
| 182 | } |
| 183 | } |
| 184 | return true; |
| 185 | } |
| 186 | |
| 187 | bool initMetrics(const StatsdConfig& config, const unordered_map<string, int>& logTrackerMap, |
| 188 | const unordered_map<string, int>& conditionTrackerMap, |
Yao Chen | 5154a37 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 189 | const vector<sp<LogMatchingTracker>>& allLogEntryMatchers, |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 190 | vector<sp<ConditionTracker>>& allConditionTrackers, |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 191 | vector<sp<MetricProducer>>& allMetricProducers, |
| 192 | unordered_map<int, std::vector<int>>& conditionToMetricMap, |
| 193 | unordered_map<int, std::vector<int>>& trackerToMetricMap) { |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 194 | sp<ConditionWizard> wizard = new ConditionWizard(allConditionTrackers); |
Yao Chen | 93fe3a3 | 2017-11-02 13:52:59 -0700 | [diff] [blame] | 195 | const int allMetricsCount = config.count_metric_size() + config.duration_metric_size() + |
| 196 | config.event_metric_size() + config.value_metric_size(); |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 197 | allMetricProducers.reserve(allMetricsCount); |
Chenjie Yu | 6736c89 | 2017-11-09 10:50:09 -0800 | [diff] [blame^] | 198 | StatsPullerManager statsPullerManager; |
Yao Chen | 93fe3a3 | 2017-11-02 13:52:59 -0700 | [diff] [blame] | 199 | uint64_t startTimeNs = time(nullptr) * NS_PER_SEC; |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 200 | |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 201 | // Build MetricProducers for each metric defined in config. |
Chenjie Yu | 5305e1d | 2017-10-31 13:49:36 -0700 | [diff] [blame] | 202 | // build CountMetricProducer |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 203 | for (int i = 0; i < config.count_metric_size(); i++) { |
| 204 | const CountMetric& metric = config.count_metric(i); |
| 205 | if (!metric.has_what()) { |
| 206 | ALOGW("cannot find what in CountMetric %lld", metric.metric_id()); |
| 207 | return false; |
| 208 | } |
| 209 | |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 210 | int metricIndex = allMetricProducers.size(); |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 211 | int trackerIndex; |
Yao Chen | 5154a37 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 212 | if (!handleMetricWithLogTrackers(metric.what(), metricIndex, metric.dimension_size() > 0, |
| 213 | allLogEntryMatchers, logTrackerMap, trackerToMetricMap, |
| 214 | trackerIndex)) { |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 215 | return false; |
| 216 | } |
| 217 | |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 218 | int conditionIndex = -1; |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 219 | if (metric.has_condition()) { |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 220 | handleMetricWithConditions(metric.condition(), metricIndex, conditionTrackerMap, |
| 221 | metric.links(), allConditionTrackers, conditionIndex, |
| 222 | conditionToMetricMap); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 223 | } |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 224 | |
Yao Chen | 93fe3a3 | 2017-11-02 13:52:59 -0700 | [diff] [blame] | 225 | sp<MetricProducer> countProducer = |
| 226 | new CountMetricProducer(metric, conditionIndex, wizard, startTimeNs); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 227 | allMetricProducers.push_back(countProducer); |
| 228 | } |
| 229 | |
Chenjie Yu | 5305e1d | 2017-10-31 13:49:36 -0700 | [diff] [blame] | 230 | // build DurationMetricProducer |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 231 | for (int i = 0; i < config.duration_metric_size(); i++) { |
| 232 | int metricIndex = allMetricProducers.size(); |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 233 | const DurationMetric& metric = config.duration_metric(i); |
Yao Chen | 5154a37 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 234 | |
| 235 | auto what_it = conditionTrackerMap.find(metric.what()); |
| 236 | if (what_it == conditionTrackerMap.end()) { |
| 237 | ALOGE("DurationMetric's \"what\" is invalid"); |
| 238 | return false; |
| 239 | } |
| 240 | |
| 241 | const Condition& durationWhat = config.condition(what_it->second); |
| 242 | |
| 243 | if (durationWhat.contents_case() != Condition::ContentsCase::kSimpleCondition) { |
| 244 | ALOGE("DurationMetric's \"what\" must be a simple condition"); |
| 245 | return false; |
| 246 | } |
| 247 | |
| 248 | const auto& simpleCondition = durationWhat.simple_condition(); |
| 249 | |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 250 | int trackerIndices[3] = {-1, -1, -1}; |
Yao Chen | 5154a37 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 251 | if (!simpleCondition.has_start() || |
| 252 | !handleMetricWithLogTrackers(simpleCondition.start(), metricIndex, |
| 253 | metric.dimension_size() > 0, allLogEntryMatchers, |
| 254 | logTrackerMap, trackerToMetricMap, trackerIndices[0])) { |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 255 | ALOGE("Duration metrics must specify a valid the start event matcher"); |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 256 | return false; |
| 257 | } |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 258 | |
Yao Chen | 5154a37 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 259 | if (simpleCondition.has_stop() && |
| 260 | !handleMetricWithLogTrackers(simpleCondition.stop(), metricIndex, |
| 261 | metric.dimension_size() > 0, allLogEntryMatchers, |
| 262 | logTrackerMap, trackerToMetricMap, trackerIndices[1])) { |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 263 | return false; |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 264 | } |
| 265 | |
Yao Chen | 5154a37 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 266 | if (simpleCondition.has_stop_all() && |
| 267 | !handleMetricWithLogTrackers(simpleCondition.stop_all(), metricIndex, |
| 268 | metric.dimension_size() > 0, allLogEntryMatchers, |
| 269 | logTrackerMap, trackerToMetricMap, trackerIndices[2])) { |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 270 | return false; |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 271 | } |
| 272 | |
Yao Chen | 5154a37 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 273 | vector<KeyMatcher> internalDimension; |
| 274 | internalDimension.insert(internalDimension.begin(), simpleCondition.dimension().begin(), |
| 275 | simpleCondition.dimension().end()); |
| 276 | |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 277 | int conditionIndex = -1; |
| 278 | |
| 279 | if (metric.has_predicate()) { |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 280 | handleMetricWithConditions(metric.predicate(), metricIndex, conditionTrackerMap, |
| 281 | metric.links(), allConditionTrackers, conditionIndex, |
| 282 | conditionToMetricMap); |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 283 | } |
| 284 | |
Yao Chen | 5154a37 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 285 | sp<MetricProducer> durationMetric = new DurationMetricProducer( |
| 286 | metric, conditionIndex, trackerIndices[0], trackerIndices[1], trackerIndices[2], |
Yao Chen | 93fe3a3 | 2017-11-02 13:52:59 -0700 | [diff] [blame] | 287 | wizard, internalDimension, startTimeNs); |
Yao Chen | 729093d | 2017-10-16 10:33:26 -0700 | [diff] [blame] | 288 | |
| 289 | allMetricProducers.push_back(durationMetric); |
| 290 | } |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 291 | |
Chenjie Yu | 5305e1d | 2017-10-31 13:49:36 -0700 | [diff] [blame] | 292 | // build EventMetricProducer |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 293 | for (int i = 0; i < config.event_metric_size(); i++) { |
| 294 | int metricIndex = allMetricProducers.size(); |
| 295 | const EventMetric& metric = config.event_metric(i); |
| 296 | if (!metric.has_metric_id() || !metric.has_what()) { |
| 297 | ALOGW("cannot find the metric id or what in config"); |
| 298 | return false; |
| 299 | } |
| 300 | int trackerIndex; |
Yao Chen | 5154a37 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 301 | if (!handleMetricWithLogTrackers(metric.what(), metricIndex, false, allLogEntryMatchers, |
| 302 | logTrackerMap, trackerToMetricMap, trackerIndex)) { |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 303 | return false; |
| 304 | } |
| 305 | |
| 306 | int conditionIndex = -1; |
| 307 | if (metric.has_condition()) { |
| 308 | handleMetricWithConditions(metric.condition(), metricIndex, conditionTrackerMap, |
| 309 | metric.links(), allConditionTrackers, conditionIndex, |
| 310 | conditionToMetricMap); |
| 311 | } |
| 312 | |
Yao Chen | 93fe3a3 | 2017-11-02 13:52:59 -0700 | [diff] [blame] | 313 | sp<MetricProducer> eventMetric = |
| 314 | new EventMetricProducer(metric, conditionIndex, wizard, startTimeNs); |
| 315 | |
Yao Chen | 5110bed | 2017-10-23 12:50:02 -0700 | [diff] [blame] | 316 | allMetricProducers.push_back(eventMetric); |
| 317 | } |
| 318 | |
Chenjie Yu | 5305e1d | 2017-10-31 13:49:36 -0700 | [diff] [blame] | 319 | // build ValueMetricProducer |
Chenjie Yu | b3dda41 | 2017-10-24 13:41:59 -0700 | [diff] [blame] | 320 | for (int i = 0; i < config.value_metric_size(); i++) { |
| 321 | const ValueMetric& metric = config.value_metric(i); |
| 322 | if (!metric.has_what()) { |
| 323 | ALOGW("cannot find what in ValueMetric %lld", metric.metric_id()); |
| 324 | return false; |
| 325 | } |
| 326 | |
Chenjie Yu | b3dda41 | 2017-10-24 13:41:59 -0700 | [diff] [blame] | 327 | int metricIndex = allMetricProducers.size(); |
Chenjie Yu | 5305e1d | 2017-10-31 13:49:36 -0700 | [diff] [blame] | 328 | int trackerIndex; |
| 329 | if (!handleMetricWithLogTrackers(metric.what(), metricIndex, metric.dimension_size() > 0, |
| 330 | allLogEntryMatchers, logTrackerMap, trackerToMetricMap, |
| 331 | trackerIndex)) { |
| 332 | return false; |
| 333 | } |
Chenjie Yu | b3dda41 | 2017-10-24 13:41:59 -0700 | [diff] [blame] | 334 | |
Chenjie Yu | 5305e1d | 2017-10-31 13:49:36 -0700 | [diff] [blame] | 335 | sp<LogMatchingTracker> atomMatcher = allLogEntryMatchers.at(trackerIndex); |
| 336 | // If it is pulled atom, it should be simple matcher with one tagId. |
| 337 | int pullTagId = -1; |
| 338 | for (int tagId : atomMatcher->getTagIds()) { |
| 339 | if (statsPullerManager.PullerForMatcherExists(tagId)) { |
| 340 | if (atomMatcher->getTagIds().size() != 1) { |
| 341 | return false; |
| 342 | } |
| 343 | pullTagId = tagId; |
| 344 | } |
| 345 | } |
| 346 | |
| 347 | int conditionIndex = -1; |
| 348 | if (metric.has_condition()) { |
| 349 | handleMetricWithConditions(metric.condition(), metricIndex, conditionTrackerMap, |
| 350 | metric.links(), allConditionTrackers, conditionIndex, |
| 351 | conditionToMetricMap); |
| 352 | } |
| 353 | |
| 354 | sp<MetricProducer> valueProducer = |
Yao Chen | 93fe3a3 | 2017-11-02 13:52:59 -0700 | [diff] [blame] | 355 | new ValueMetricProducer(metric, conditionIndex, wizard, pullTagId, startTimeNs); |
Chenjie Yu | b3dda41 | 2017-10-24 13:41:59 -0700 | [diff] [blame] | 356 | allMetricProducers.push_back(valueProducer); |
| 357 | } |
Yangster | 1d4d686 | 2017-10-31 12:58:51 -0700 | [diff] [blame] | 358 | |
| 359 | // Gauge metrics. |
| 360 | for (int i = 0; i < config.gauge_metric_size(); i++) { |
| 361 | const GaugeMetric& metric = config.gauge_metric(i); |
| 362 | if (!metric.has_what()) { |
| 363 | ALOGW("cannot find what in ValueMetric %lld", metric.metric_id()); |
| 364 | return false; |
| 365 | } |
| 366 | |
| 367 | int metricIndex = allMetricProducers.size(); |
| 368 | int trackerIndex; |
| 369 | if (!handleMetricWithLogTrackers(metric.what(), metricIndex, metric.dimension_size() > 0, |
| 370 | allLogEntryMatchers, logTrackerMap, trackerToMetricMap, |
| 371 | trackerIndex)) { |
| 372 | return false; |
| 373 | } |
| 374 | |
| 375 | sp<LogMatchingTracker> atomMatcher = allLogEntryMatchers.at(trackerIndex); |
| 376 | // If it is pulled atom, it should be simple matcher with one tagId. |
| 377 | int pullTagId = -1; |
| 378 | for (int tagId : atomMatcher->getTagIds()) { |
| 379 | if (statsPullerManager.PullerForMatcherExists(tagId)) { |
| 380 | if (atomMatcher->getTagIds().size() != 1) { |
| 381 | return false; |
| 382 | } |
| 383 | pullTagId = tagId; |
| 384 | } |
| 385 | } |
| 386 | |
| 387 | int conditionIndex = -1; |
| 388 | if (metric.has_condition()) { |
| 389 | handleMetricWithConditions(metric.condition(), metricIndex, conditionTrackerMap, |
| 390 | metric.links(), allConditionTrackers, conditionIndex, |
| 391 | conditionToMetricMap); |
| 392 | } |
| 393 | |
| 394 | sp<MetricProducer> gaugeProducer = |
| 395 | new GaugeMetricProducer(metric, conditionIndex, wizard, pullTagId); |
| 396 | allMetricProducers.push_back(gaugeProducer); |
| 397 | } |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 398 | return true; |
| 399 | } |
| 400 | |
| 401 | bool initStatsdConfig(const StatsdConfig& config, set<int>& allTagIds, |
| 402 | vector<sp<LogMatchingTracker>>& allLogEntryMatchers, |
| 403 | vector<sp<ConditionTracker>>& allConditionTrackers, |
| 404 | vector<sp<MetricProducer>>& allMetricProducers, |
| 405 | unordered_map<int, std::vector<int>>& conditionToMetricMap, |
| 406 | unordered_map<int, std::vector<int>>& trackerToMetricMap, |
| 407 | unordered_map<int, std::vector<int>>& trackerToConditionMap) { |
| 408 | unordered_map<string, int> logTrackerMap; |
| 409 | unordered_map<string, int> conditionTrackerMap; |
| 410 | |
| 411 | if (!initLogTrackers(config, logTrackerMap, allLogEntryMatchers, allTagIds)) { |
| 412 | ALOGE("initLogMatchingTrackers failed"); |
| 413 | return false; |
| 414 | } |
Yangster | 1d4d686 | 2017-10-31 12:58:51 -0700 | [diff] [blame] | 415 | ALOGD("initLogMatchingTrackers succeed..."); |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 416 | |
| 417 | if (!initConditions(config, logTrackerMap, conditionTrackerMap, allConditionTrackers, |
| 418 | trackerToConditionMap)) { |
| 419 | ALOGE("initConditionTrackers failed"); |
| 420 | return false; |
| 421 | } |
| 422 | |
Yao Chen | 5154a37 | 2017-10-30 22:57:06 -0700 | [diff] [blame] | 423 | if (!initMetrics(config, logTrackerMap, conditionTrackerMap, allLogEntryMatchers, |
| 424 | allConditionTrackers, allMetricProducers, conditionToMetricMap, |
| 425 | trackerToMetricMap)) { |
Yao Chen | caf339d | 2017-10-06 16:01:10 -0700 | [diff] [blame] | 426 | ALOGE("initMetricProducers failed"); |
| 427 | return false; |
| 428 | } |
| 429 | return true; |
| 430 | } |
| 431 | |
| 432 | } // namespace statsd |
| 433 | } // namespace os |
| 434 | } // namespace android |