DurationMetricProducer.cpp revision 5ee0787024cc446a21008ff5710dec19c6afc834
1729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen/* 2729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * Copyright (C) 2017 The Android Open Source Project 3729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * 4729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * you may not use this file except in compliance with the License. 6729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * You may obtain a copy of the License at 7729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * 8729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * http://www.apache.org/licenses/LICENSE-2.0 9729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * 10729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * Unless required by applicable law or agreed to in writing, software 11729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * distributed under the License is distributed on an "AS IS" BASIS, 12729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * See the License for the specific language governing permissions and 14729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen * limitations under the License. 15729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen */ 16729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 173c0b95ceb520c6b23871da90c23f89c55b76b560Yao Chen#define DEBUG false 185154a379303ab90a2b2914676a4441917a329b5dYao Chen 19729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen#include "Log.h" 205154a379303ab90a2b2914676a4441917a329b5dYao Chen#include "DurationMetricProducer.h" 21b356151e63140085cb96fa16804ee18b3862a4fcYao Chen#include "guardrail/StatsdStats.h" 22729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen#include "stats_util.h" 232087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac#include "stats_log_util.h" 24729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 25729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen#include <limits.h> 26729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen#include <stdlib.h> 27729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 28b0378b093d9b937fe9a731a601d670d50f263078yrousing android::util::FIELD_COUNT_REPEATED; 292b0f88678b2877a8e9f83cea60f097322b078367yrousing android::util::FIELD_TYPE_BOOL; 302b0f88678b2877a8e9f83cea60f097322b078367yrousing android::util::FIELD_TYPE_FLOAT; 312b0f88678b2877a8e9f83cea60f097322b078367yrousing android::util::FIELD_TYPE_INT32; 322b0f88678b2877a8e9f83cea60f097322b078367yrousing android::util::FIELD_TYPE_INT64; 332b0f88678b2877a8e9f83cea60f097322b078367yrousing android::util::FIELD_TYPE_MESSAGE; 34d1815dc7b82f99259f6c41cfacc44972b867ef2dYangster-macusing android::util::FIELD_TYPE_STRING; 352b0f88678b2877a8e9f83cea60f097322b078367yrousing android::util::ProtoOutputStream; 36729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chenusing std::string; 37729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chenusing std::unordered_map; 38729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chenusing std::vector; 39729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 40729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chennamespace android { 41729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chennamespace os { 42729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chennamespace statsd { 43729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 442b0f88678b2877a8e9f83cea60f097322b078367yro// for StatsLogReport 4594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-macconst int FIELD_ID_ID = 1; 462b0f88678b2877a8e9f83cea60f097322b078367yroconst int FIELD_ID_DURATION_METRICS = 6; 472b0f88678b2877a8e9f83cea60f097322b078367yro// for DurationMetricDataWrapper 482b0f88678b2877a8e9f83cea60f097322b078367yroconst int FIELD_ID_DATA = 1; 492b0f88678b2877a8e9f83cea60f097322b078367yro// for DurationMetricData 50468ff04fd4cb43a384a3d4948cccd4438be7202aYangster-macconst int FIELD_ID_DIMENSION_IN_WHAT = 1; 51468ff04fd4cb43a384a3d4948cccd4438be7202aYangster-macconst int FIELD_ID_DIMENSION_IN_CONDITION = 2; 52468ff04fd4cb43a384a3d4948cccd4438be7202aYangster-macconst int FIELD_ID_BUCKET_INFO = 3; 532b0f88678b2877a8e9f83cea60f097322b078367yro// for DurationBucketInfo 54330af58f2b8582b855085655fae553cdfaf44e6cYangster-macconst int FIELD_ID_START_BUCKET_ELAPSED_NANOS = 1; 55330af58f2b8582b855085655fae553cdfaf44e6cYangster-macconst int FIELD_ID_END_BUCKET_ELAPSED_NANOS = 2; 562b0f88678b2877a8e9f83cea60f097322b078367yroconst int FIELD_ID_DURATION = 3; 572b0f88678b2877a8e9f83cea60f097322b078367yro 58b356151e63140085cb96fa16804ee18b3862a4fcYao ChenDurationMetricProducer::DurationMetricProducer(const ConfigKey& key, const DurationMetric& metric, 59729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen const int conditionIndex, const size_t startIndex, 60729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen const size_t stopIndex, const size_t stopAllIndex, 610ea19901ef78de19437c08bbcbb7af6663ad6f4bYao Chen const bool nesting, 625154a379303ab90a2b2914676a4441917a329b5dYao Chen const sp<ConditionWizard>& wizard, 632087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac const FieldMatcher& internalDimensions, 6493fe3a34a02c673eaee4a2d18565ba8df20685cbYao Chen const uint64_t startTimeNs) 6594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac : MetricProducer(metric.id(), key, startTimeNs, conditionIndex, wizard), 66f09569f848ca0b81a21a74e9f4dd8bd9a886151aYao Chen mAggregationType(metric.aggregation_type()), 67729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen mStartIndex(startIndex), 68729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen mStopIndex(stopIndex), 695154a379303ab90a2b2914676a4441917a329b5dYao Chen mStopAllIndex(stopAllIndex), 708a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen mNested(nesting) { 71729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen // TODO: The following boiler plate code appears in all MetricProducers, but we can't abstract 72729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen // them in the base class, because the proto generated CountMetric, and DurationMetric are 73729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen // not related. Maybe we should add a template in the future?? 74b814481ad1f8d0e429d799b1571a6272e1a7f6c5Yangster-mac if (metric.has_bucket()) { 7559cc24dbfda4148c1f5ef4de9c8763caa8672443yro mBucketSizeNs = 7659cc24dbfda4148c1f5ef4de9c8763caa8672443yro TimeUnitToBucketSizeInMillisGuardrailed(key.GetUid(), metric.bucket()) * 1000000; 77729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen } else { 78729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen mBucketSizeNs = LLONG_MAX; 79729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen } 80729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 818a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (metric.has_dimensions_in_what()) { 828a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen translateFieldMatcher(metric.dimensions_in_what(), &mDimensionsInWhat); 838a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 848a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 858a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (internalDimensions.has_field()) { 868a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen translateFieldMatcher(internalDimensions, &mInternalDimensions); 878a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 888a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen 898a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen if (metric.has_dimensions_in_condition()) { 908a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen translateFieldMatcher(metric.dimensions_in_condition(), &mDimensionsInCondition); 918a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 92729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 93729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen if (metric.links().size() > 0) { 948a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen for (const auto& link : metric.links()) { 958a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen Metric2Condition mc; 968a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen mc.conditionId = link.condition(); 978a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen translateFieldMatcher(link.fields_in_what(), &mc.metricFields); 988a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen translateFieldMatcher(link.fields_in_condition(), &mc.conditionFields); 998a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen mMetric2ConditionLinks.push_back(mc); 1008a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen } 101729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen } 1028a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen mConditionSliced = (metric.links().size() > 0) || (mDimensionsInCondition.size() > 0); 103729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 104539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (mDimensionsInWhat.size() == mInternalDimensions.size()) { 105539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac bool mUseWhatDimensionAsInternalDimension = true; 106539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (size_t i = 0; mUseWhatDimensionAsInternalDimension && 107539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac i < mDimensionsInWhat.size(); ++i) { 108539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (mDimensionsInWhat[i] != mInternalDimensions[i]) { 109539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac mUseWhatDimensionAsInternalDimension = false; 110539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 111539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 112539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } else { 113539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac mUseWhatDimensionAsInternalDimension = false; 114539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 115539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac 11694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac VLOG("metric %lld created. bucket size %lld start_time: %lld", (long long)metric.id(), 117729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen (long long)mBucketSizeNs, (long long)mStartTimeNs); 118729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen} 119729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 120729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao ChenDurationMetricProducer::~DurationMetricProducer() { 121729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen VLOG("~DurationMetric() called"); 122729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen} 123729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 124932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-macsp<AnomalyTracker> DurationMetricProducer::addAnomalyTracker( 125932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac const Alert &alert, const sp<AlarmMonitor>& anomalyAlarmMonitor) { 126857aaa520804d846a050e1eeb85d82977c983666Bookatz std::lock_guard<std::mutex> lock(mMutex); 127932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac sp<DurationAnomalyTracker> anomalyTracker = 128932ececa1674c59a8da9f3e32d2651e781b86fc4Yangster-mac new DurationAnomalyTracker(alert, mConfigKey, anomalyAlarmMonitor); 129857aaa520804d846a050e1eeb85d82977c983666Bookatz if (anomalyTracker != nullptr) { 130857aaa520804d846a050e1eeb85d82977c983666Bookatz mAnomalyTrackers.push_back(anomalyTracker); 131857aaa520804d846a050e1eeb85d82977c983666Bookatz } 132857aaa520804d846a050e1eeb85d82977c983666Bookatz return anomalyTracker; 133450099db169d386077584d93486908c3bae1244eBookatz} 134450099db169d386077584d93486908c3bae1244eBookatz 1355154a379303ab90a2b2914676a4441917a329b5dYao Chenunique_ptr<DurationTracker> DurationMetricProducer::createDurationTracker( 1369369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac const MetricDimensionKey& eventKey) const { 137f09569f848ca0b81a21a74e9f4dd8bd9a886151aYao Chen switch (mAggregationType) { 138cfed20bce8a66bde6ad0d74a44fc0a2764b2886dStefan Lafon case DurationMetric_AggregationType_SUM: 139b356151e63140085cb96fa16804ee18b3862a4fcYao Chen return make_unique<OringDurationTracker>( 1409369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac mConfigKey, mMetricId, eventKey, mWizard, mConditionTrackerIndex, 14127785a8a4a684c831c18f7189a6fa1b98c3573e6David Chen mDimensionsInCondition, mNested, mCurrentBucketStartTimeNs, mCurrentBucketNum, 14227785a8a4a684c831c18f7189a6fa1b98c3573e6David Chen mStartTimeNs, mBucketSizeNs, mConditionSliced, mAnomalyTrackers); 143cfed20bce8a66bde6ad0d74a44fc0a2764b2886dStefan Lafon case DurationMetric_AggregationType_MAX_SPARSE: 144b356151e63140085cb96fa16804ee18b3862a4fcYao Chen return make_unique<MaxDurationTracker>( 1459369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac mConfigKey, mMetricId, eventKey, mWizard, mConditionTrackerIndex, 14627785a8a4a684c831c18f7189a6fa1b98c3573e6David Chen mDimensionsInCondition, mNested, mCurrentBucketStartTimeNs, mCurrentBucketNum, 14727785a8a4a684c831c18f7189a6fa1b98c3573e6David Chen mStartTimeNs, mBucketSizeNs, mConditionSliced, mAnomalyTrackers); 1485154a379303ab90a2b2914676a4441917a329b5dYao Chen } 1495154a379303ab90a2b2914676a4441917a329b5dYao Chen} 1505154a379303ab90a2b2914676a4441917a329b5dYao Chen 151f2bee6fec965fd42ab223f1a3aa705f07ba79aeaYangstervoid DurationMetricProducer::onSlicedConditionMayChangeLocked(const uint64_t eventTime) { 15294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac VLOG("Metric %lld onSlicedConditionMayChange", (long long)mMetricId); 153f2bee6fec965fd42ab223f1a3aa705f07ba79aeaYangster flushIfNeededLocked(eventTime); 1549369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 155729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen // Now for each of the on-going event, check if the condition has changed for them. 156539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (auto& whatIt : mCurrentSlicedDurationTrackerMap) { 157539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (auto& pair : whatIt.second) { 158539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac pair.second->onSlicedConditionMayChange(eventTime); 159539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 160729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen } 1619369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 162539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (mDimensionsInCondition.empty()) { 163539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac return; 1649369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac } 165539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac 166539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (mMetric2ConditionLinks.empty()) { 167539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac std::unordered_set<HashableDimensionKey> conditionDimensionsKeySet; 168539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac mWizard->getMetConditionDimension(mConditionTrackerIndex, mDimensionsInCondition, 169539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac &conditionDimensionsKeySet); 170539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const auto& whatIt : mCurrentSlicedDurationTrackerMap) { 171539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const auto& pair : whatIt.second) { 172539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac conditionDimensionsKeySet.erase(pair.first); 173539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 174539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 175539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const auto& conditionDimension : conditionDimensionsKeySet) { 176539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (auto& whatIt : mCurrentSlicedDurationTrackerMap) { 177539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (!whatIt.second.empty()) { 178539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac unique_ptr<DurationTracker> newTracker = 179539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac whatIt.second.begin()->second->clone(eventTime); 180539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac newTracker->setEventKey(MetricDimensionKey(whatIt.first, conditionDimension)); 181539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac newTracker->onSlicedConditionMayChange(eventTime); 182539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac whatIt.second[conditionDimension] = std::move(newTracker); 183539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 184539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 185539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 186539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } else { 187539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (auto& whatIt : mCurrentSlicedDurationTrackerMap) { 188539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac ConditionKey conditionKey; 189539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const auto& link : mMetric2ConditionLinks) { 190539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac getDimensionForCondition(whatIt.first.getValues(), link, 191539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac &conditionKey[link.conditionId]); 192539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 193539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac std::unordered_set<HashableDimensionKey> conditionDimensionsKeys; 194539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac mWizard->query(mConditionTrackerIndex, conditionKey, mDimensionsInCondition, 195539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac &conditionDimensionsKeys); 196539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac 197539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const auto& conditionDimension : conditionDimensionsKeys) { 198539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (!whatIt.second.empty() && 199539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac whatIt.second.find(conditionDimension) == whatIt.second.end()) { 200539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac auto newTracker = whatIt.second.begin()->second->clone(eventTime); 201539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac newTracker->setEventKey(MetricDimensionKey(whatIt.first, conditionDimension)); 202539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac newTracker->onSlicedConditionMayChange(eventTime); 203539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac whatIt.second[conditionDimension] = std::move(newTracker); 204539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 2059369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac } 2069369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac } 2079369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac } 208729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen} 209729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 210f2bee6fec965fd42ab223f1a3aa705f07ba79aeaYangstervoid DurationMetricProducer::onConditionChangedLocked(const bool conditionMet, 211f2bee6fec965fd42ab223f1a3aa705f07ba79aeaYangster const uint64_t eventTime) { 21294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac VLOG("Metric %lld onConditionChanged", (long long)mMetricId); 213729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen mCondition = conditionMet; 214f2bee6fec965fd42ab223f1a3aa705f07ba79aeaYangster flushIfNeededLocked(eventTime); 215729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen // TODO: need to populate the condition change time from the event which triggers the condition 216729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen // change, instead of using current time. 217539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (auto& whatIt : mCurrentSlicedDurationTrackerMap) { 218539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (auto& pair : whatIt.second) { 219539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac pair.second->onConditionChanged(conditionMet, eventTime); 220539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 221729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen } 222729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen} 223729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 22406dba5d79c096b02d3ba6fb73e64451ff12e388dYao Chenvoid DurationMetricProducer::dropDataLocked(const uint64_t dropTimeNs) { 22506dba5d79c096b02d3ba6fb73e64451ff12e388dYao Chen flushIfNeededLocked(dropTimeNs); 22606dba5d79c096b02d3ba6fb73e64451ff12e388dYao Chen mPastBuckets.clear(); 22706dba5d79c096b02d3ba6fb73e64451ff12e388dYao Chen} 22806dba5d79c096b02d3ba6fb73e64451ff12e388dYao Chen 229288c60001330a5a924a47c0eebd6097ae3ee5d67Yao Chenvoid DurationMetricProducer::onDumpReportLocked(const uint64_t dumpTimeNs, 230288c60001330a5a924a47c0eebd6097ae3ee5d67Yao Chen ProtoOutputStream* protoOutput) { 231288c60001330a5a924a47c0eebd6097ae3ee5d67Yao Chen flushIfNeededLocked(dumpTimeNs); 232635b4b37210bd61b73aebf19298e38b8fb382e85Yangster-mac if (mPastBuckets.empty()) { 2338a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen VLOG(" Duration metric, empty return"); 234635b4b37210bd61b73aebf19298e38b8fb382e85Yangster-mac return; 235635b4b37210bd61b73aebf19298e38b8fb382e85Yangster-mac } 236288c60001330a5a924a47c0eebd6097ae3ee5d67Yao Chen 23794e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_ID, (long long)mMetricId); 2385ee0787024cc446a21008ff5710dec19c6afc834Yi Jin uint64_t protoToken = protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_ID_DURATION_METRICS); 2396a8c799d901cbd166aa6463d7dea231bcf594a1eYao Chen 2408a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen VLOG("Duration metric %lld dump report now...", (long long)mMetricId); 2416a8c799d901cbd166aa6463d7dea231bcf594a1eYao Chen 242729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen for (const auto& pair : mPastBuckets) { 2439369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac const MetricDimensionKey& dimensionKey = pair.first; 2449369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac VLOG(" dimension key %s", dimensionKey.c_str()); 2451ff4f4325882d812ded4f75ee6c2b6d352a85c9eYao Chen 2465ee0787024cc446a21008ff5710dec19c6afc834Yi Jin uint64_t wrapperToken = 247288c60001330a5a924a47c0eebd6097ae3ee5d67Yao Chen protoOutput->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_DATA); 2482b0f88678b2877a8e9f83cea60f097322b078367yro 2492087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac // First fill dimension. 2505ee0787024cc446a21008ff5710dec19c6afc834Yi Jin uint64_t dimensionToken = protoOutput->start( 251468ff04fd4cb43a384a3d4948cccd4438be7202aYangster-mac FIELD_TYPE_MESSAGE | FIELD_ID_DIMENSION_IN_WHAT); 2528a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen writeDimensionToProto(dimensionKey.getDimensionKeyInWhat(), protoOutput); 2532087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac protoOutput->end(dimensionToken); 2542b0f88678b2877a8e9f83cea60f097322b078367yro 2559369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac if (dimensionKey.hasDimensionKeyInCondition()) { 2565ee0787024cc446a21008ff5710dec19c6afc834Yi Jin uint64_t dimensionInConditionToken = protoOutput->start( 2579369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac FIELD_TYPE_MESSAGE | FIELD_ID_DIMENSION_IN_CONDITION); 2588a8d16ceea1e5b7a2f8c41e17b5d993035f50f5dYao Chen writeDimensionToProto(dimensionKey.getDimensionKeyInCondition(), protoOutput); 2599369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac protoOutput->end(dimensionInConditionToken); 2609369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac } 2619369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac 2622b0f88678b2877a8e9f83cea60f097322b078367yro // Then fill bucket_info (DurationBucketInfo). 2632b0f88678b2877a8e9f83cea60f097322b078367yro for (const auto& bucket : pair.second) { 2645ee0787024cc446a21008ff5710dec19c6afc834Yi Jin uint64_t bucketInfoToken = protoOutput->start( 265288c60001330a5a924a47c0eebd6097ae3ee5d67Yao Chen FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_BUCKET_INFO); 266330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_START_BUCKET_ELAPSED_NANOS, 267288c60001330a5a924a47c0eebd6097ae3ee5d67Yao Chen (long long)bucket.mBucketStartNs); 268330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_END_BUCKET_ELAPSED_NANOS, 269288c60001330a5a924a47c0eebd6097ae3ee5d67Yao Chen (long long)bucket.mBucketEndNs); 270288c60001330a5a924a47c0eebd6097ae3ee5d67Yao Chen protoOutput->write(FIELD_TYPE_INT64 | FIELD_ID_DURATION, (long long)bucket.mDuration); 271288c60001330a5a924a47c0eebd6097ae3ee5d67Yao Chen protoOutput->end(bucketInfoToken); 2722b0f88678b2877a8e9f83cea60f097322b078367yro VLOG("\t bucket [%lld - %lld] duration: %lld", (long long)bucket.mBucketStartNs, 2732b0f88678b2877a8e9f83cea60f097322b078367yro (long long)bucket.mBucketEndNs, (long long)bucket.mDuration); 2742b0f88678b2877a8e9f83cea60f097322b078367yro } 2752b0f88678b2877a8e9f83cea60f097322b078367yro 276288c60001330a5a924a47c0eebd6097ae3ee5d67Yao Chen protoOutput->end(wrapperToken); 277729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen } 2782b0f88678b2877a8e9f83cea60f097322b078367yro 279288c60001330a5a924a47c0eebd6097ae3ee5d67Yao Chen protoOutput->end(protoToken); 280f60e0bad5908c51c954ca8dc763c8efd394c56dcYao Chen mPastBuckets.clear(); 2812b0f88678b2877a8e9f83cea60f097322b078367yro} 282729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 28327785a8a4a684c831c18f7189a6fa1b98c3573e6David Chenvoid DurationMetricProducer::flushIfNeededLocked(const uint64_t& eventTimeNs) { 28427785a8a4a684c831c18f7189a6fa1b98c3573e6David Chen uint64_t currentBucketEndTimeNs = getCurrentBucketEndTimeNs(); 28527785a8a4a684c831c18f7189a6fa1b98c3573e6David Chen 28627785a8a4a684c831c18f7189a6fa1b98c3573e6David Chen if (currentBucketEndTimeNs > eventTimeNs) { 287729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen return; 288729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen } 2895154a379303ab90a2b2914676a4441917a329b5dYao Chen VLOG("flushing..........."); 290539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (auto whatIt = mCurrentSlicedDurationTrackerMap.begin(); 291539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac whatIt != mCurrentSlicedDurationTrackerMap.end();) { 292539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (auto it = whatIt->second.begin(); it != whatIt->second.end();) { 293539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (it->second->flushIfNeeded(eventTimeNs, &mPastBuckets)) { 294539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac VLOG("erase bucket for key %s %s", whatIt->first.c_str(), it->first.c_str()); 295539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac it = whatIt->second.erase(it); 296539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } else { 297539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac ++it; 298539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 299539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 300539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (whatIt->second.empty()) { 301539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac whatIt = mCurrentSlicedDurationTrackerMap.erase(whatIt); 302d41c4220d06875cea2d19a7991c3227bd56ea611Yao Chen } else { 303539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac whatIt++; 304729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen } 305729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen } 306729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 30727785a8a4a684c831c18f7189a6fa1b98c3573e6David Chen int numBucketsForward = 1 + (eventTimeNs - currentBucketEndTimeNs) / mBucketSizeNs; 30827785a8a4a684c831c18f7189a6fa1b98c3573e6David Chen mCurrentBucketStartTimeNs = currentBucketEndTimeNs + (numBucketsForward - 1) * mBucketSizeNs; 309e2cd6d509b17894b95d14523ae3e7c4c7a9a74e3Yangster-mac mCurrentBucketNum += numBucketsForward; 310729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen} 311729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 31227785a8a4a684c831c18f7189a6fa1b98c3573e6David Chenvoid DurationMetricProducer::flushCurrentBucketLocked(const uint64_t& eventTimeNs) { 313539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (auto whatIt = mCurrentSlicedDurationTrackerMap.begin(); 314539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac whatIt != mCurrentSlicedDurationTrackerMap.end();) { 315539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (auto it = whatIt->second.begin(); it != whatIt->second.end();) { 316539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (it->second->flushCurrentBucket(eventTimeNs, &mPastBuckets)) { 317539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac VLOG("erase bucket for key %s %s", whatIt->first.c_str(), it->first.c_str()); 318539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac it = whatIt->second.erase(it); 319539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } else { 320539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac ++it; 321539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 322539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 323539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (whatIt->second.empty()) { 324539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac whatIt = mCurrentSlicedDurationTrackerMap.erase(whatIt); 32527785a8a4a684c831c18f7189a6fa1b98c3573e6David Chen } else { 326539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac whatIt++; 32727785a8a4a684c831c18f7189a6fa1b98c3573e6David Chen } 32827785a8a4a684c831c18f7189a6fa1b98c3573e6David Chen } 32927785a8a4a684c831c18f7189a6fa1b98c3573e6David Chen} 33027785a8a4a684c831c18f7189a6fa1b98c3573e6David Chen 331884c8c130fde0d02ada1316f7c27f0f55e7e48b9Yao Chenvoid DurationMetricProducer::dumpStatesLocked(FILE* out, bool verbose) const { 3329369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac if (mCurrentSlicedDurationTrackerMap.size() == 0) { 333884c8c130fde0d02ada1316f7c27f0f55e7e48b9Yao Chen return; 334884c8c130fde0d02ada1316f7c27f0f55e7e48b9Yao Chen } 335884c8c130fde0d02ada1316f7c27f0f55e7e48b9Yao Chen 336884c8c130fde0d02ada1316f7c27f0f55e7e48b9Yao Chen fprintf(out, "DurationMetric %lld dimension size %lu\n", (long long)mMetricId, 3379369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac (unsigned long)mCurrentSlicedDurationTrackerMap.size()); 338884c8c130fde0d02ada1316f7c27f0f55e7e48b9Yao Chen if (verbose) { 339539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const auto& whatIt : mCurrentSlicedDurationTrackerMap) { 340539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const auto& slice : whatIt.second) { 341539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac fprintf(out, "\t%s\t%s\n", whatIt.first.c_str(), slice.first.c_str()); 342539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac slice.second->dumpStates(out, verbose); 343539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 344884c8c130fde0d02ada1316f7c27f0f55e7e48b9Yao Chen } 345884c8c130fde0d02ada1316f7c27f0f55e7e48b9Yao Chen } 346884c8c130fde0d02ada1316f7c27f0f55e7e48b9Yao Chen} 347884c8c130fde0d02ada1316f7c27f0f55e7e48b9Yao Chen 3489369446f0b04945d6674550728ae81196d6fb5c2Yangster-macbool DurationMetricProducer::hitGuardRailLocked(const MetricDimensionKey& newKey) { 349b356151e63140085cb96fa16804ee18b3862a4fcYao Chen // 1. Report the tuple count if the tuple count > soft limit 3509369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac if (mCurrentSlicedDurationTrackerMap.size() > StatsdStats::kDimensionKeySizeSoftLimit - 1) { 3519369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac size_t newTupleCount = mCurrentSlicedDurationTrackerMap.size() + 1; 35294e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac StatsdStats::getInstance().noteMetricDimensionSize(mConfigKey, mMetricId, newTupleCount); 353b356151e63140085cb96fa16804ee18b3862a4fcYao Chen // 2. Don't add more tuples, we are above the allowed threshold. Drop the data. 354b356151e63140085cb96fa16804ee18b3862a4fcYao Chen if (newTupleCount > StatsdStats::kDimensionKeySizeHardLimit) { 35594e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac ALOGE("DurationMetric %lld dropping data for dimension key %s", 35694e197cceb2ba7df13ff8de04f60bfeec64015d9Yangster-mac (long long)mMetricId, newKey.c_str()); 357b356151e63140085cb96fa16804ee18b3862a4fcYao Chen return true; 358b356151e63140085cb96fa16804ee18b3862a4fcYao Chen } 359b356151e63140085cb96fa16804ee18b3862a4fcYao Chen } 360b356151e63140085cb96fa16804ee18b3862a4fcYao Chen return false; 361b356151e63140085cb96fa16804ee18b3862a4fcYao Chen} 362b356151e63140085cb96fa16804ee18b3862a4fcYao Chen 363539288806fe5ae3733ef7883eb8ec01cce293988Yangster-macvoid DurationMetricProducer::handleStartEvent(const MetricDimensionKey& eventKey, 364539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac const ConditionKey& conditionKeys, 365539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac bool condition, const LogEvent& event) { 366539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac const auto& whatKey = eventKey.getDimensionKeyInWhat(); 367539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac const auto& condKey = eventKey.getDimensionKeyInCondition(); 368539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac 369539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac auto whatIt = mCurrentSlicedDurationTrackerMap.find(whatKey); 370539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (whatIt == mCurrentSlicedDurationTrackerMap.end()) { 371539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (hitGuardRailLocked(eventKey)) { 372539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac return; 373539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 374539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac mCurrentSlicedDurationTrackerMap[whatKey][condKey] = createDurationTracker(eventKey); 375539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } else { 376539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (whatIt->second.find(condKey) == whatIt->second.end()) { 377539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (hitGuardRailLocked(eventKey)) { 378539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac return; 379539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 380539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac mCurrentSlicedDurationTrackerMap[whatKey][condKey] = createDurationTracker(eventKey); 381539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 382539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 383539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac 384539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac auto it = mCurrentSlicedDurationTrackerMap.find(whatKey)->second.find(condKey); 385539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (mUseWhatDimensionAsInternalDimension) { 386539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac it->second->noteStart(whatKey, condition, 387539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac event.GetElapsedTimestampNs(), conditionKeys); 388539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac return; 389539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 390539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac 391539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac std::vector<HashableDimensionKey> values; 392539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac filterValues(mInternalDimensions, event.getValues(), &values); 393539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (values.empty()) { 394539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac it->second->noteStart(DEFAULT_DIMENSION_KEY, condition, 395539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac event.GetElapsedTimestampNs(), conditionKeys); 396539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } else { 397539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const auto& value : values) { 398539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac it->second->noteStart(value, condition, event.GetElapsedTimestampNs(), conditionKeys); 399539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 400539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 401539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac 402539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac} 403539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac 404f2bee6fec965fd42ab223f1a3aa705f07ba79aeaYangstervoid DurationMetricProducer::onMatchedLogEventInternalLocked( 4059369446f0b04945d6674550728ae81196d6fb5c2Yangster-mac const size_t matcherIndex, const MetricDimensionKey& eventKey, 4062087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac const ConditionKey& conditionKeys, bool condition, 407a7259abde4e89fd91404b14b4845113cd313d1ecChenjie Yu const LogEvent& event) { 408539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac ALOGW("Not used in duration tracker."); 409539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac} 410539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac 411539288806fe5ae3733ef7883eb8ec01cce293988Yangster-macvoid DurationMetricProducer::onMatchedLogEventLocked(const size_t matcherIndex, 412539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac const LogEvent& event) { 413539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac uint64_t eventTimeNs = event.GetElapsedTimestampNs(); 414539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (eventTimeNs < mStartTimeNs) { 415539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac return; 416539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 417539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac 418330af58f2b8582b855085655fae553cdfaf44e6cYangster-mac flushIfNeededLocked(event.GetElapsedTimestampNs()); 419729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 420539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac // Handles Stopall events. 4216a8c799d901cbd166aa6463d7dea231bcf594a1eYao Chen if (matcherIndex == mStopAllIndex) { 422539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (auto& whatIt : mCurrentSlicedDurationTrackerMap) { 423539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (auto& pair : whatIt.second) { 424539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac pair.second->noteStopAll(event.GetElapsedTimestampNs()); 425539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 4265154a379303ab90a2b2914676a4441917a329b5dYao Chen } 4276a8c799d901cbd166aa6463d7dea231bcf594a1eYao Chen return; 4286a8c799d901cbd166aa6463d7dea231bcf594a1eYao Chen } 429729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 430539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac vector<HashableDimensionKey> dimensionInWhatValues; 431539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (!mDimensionsInWhat.empty()) { 432539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac filterValues(mDimensionsInWhat, event.getValues(), &dimensionInWhatValues); 433539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } else { 434539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac dimensionInWhatValues.push_back(DEFAULT_DIMENSION_KEY); 435539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 436539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac 437539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac // Handles Stop events. 438539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (matcherIndex == mStopIndex) { 439539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (mUseWhatDimensionAsInternalDimension) { 440539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const HashableDimensionKey& whatKey : dimensionInWhatValues) { 441539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac auto whatIt = mCurrentSlicedDurationTrackerMap.find(whatKey); 442539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (whatIt != mCurrentSlicedDurationTrackerMap.end()) { 443539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const auto& condIt : whatIt->second) { 444539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac condIt.second->noteStop(whatKey, event.GetElapsedTimestampNs(), false); 445539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 446539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 447539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 4486a8c799d901cbd166aa6463d7dea231bcf594a1eYao Chen return; 449b356151e63140085cb96fa16804ee18b3862a4fcYao Chen } 450539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac 451539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac std::vector<HashableDimensionKey> internalDimensionKeys; 452539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac filterValues(mInternalDimensions, event.getValues(), &internalDimensionKeys); 453539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (internalDimensionKeys.empty()) { 454539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac internalDimensionKeys.push_back(DEFAULT_DIMENSION_KEY); 455539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 456539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const HashableDimensionKey& whatDimension : dimensionInWhatValues) { 457539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac auto whatIt = mCurrentSlicedDurationTrackerMap.find(whatDimension); 458539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (whatIt != mCurrentSlicedDurationTrackerMap.end()) { 459539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const auto& condIt : whatIt->second) { 460539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const auto& internalDimensionKey : internalDimensionKeys) { 461539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac condIt.second->noteStop( 462539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac internalDimensionKey, event.GetElapsedTimestampNs(), false); 463539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 464539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 465539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 466539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 467539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac return; 4686a8c799d901cbd166aa6463d7dea231bcf594a1eYao Chen } 469729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 470539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac bool condition; 471539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac ConditionKey conditionKey; 472539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac std::unordered_set<HashableDimensionKey> dimensionKeysInCondition; 473539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (mConditionSliced) { 474539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const auto& link : mMetric2ConditionLinks) { 475539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac getDimensionForCondition(event.getValues(), link, &conditionKey[link.conditionId]); 476539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 4776a8c799d901cbd166aa6463d7dea231bcf594a1eYao Chen 478539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac auto conditionState = 479539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac mWizard->query(mConditionTrackerIndex, conditionKey, mDimensionsInCondition, 480539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac &dimensionKeysInCondition); 481539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac condition = (conditionState == ConditionState::kTrue); 482539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (mDimensionsInCondition.empty() && condition) { 483539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac dimensionKeysInCondition.insert(DEFAULT_DIMENSION_KEY); 4842087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 4852087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } else { 486539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac condition = mCondition; 487539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (condition) { 488539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac dimensionKeysInCondition.insert(DEFAULT_DIMENSION_KEY); 4892087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac } 490729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen } 4912087716f2bdca90c7c3034d556ac12911bd8018eYangster-mac 492539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const auto& whatDimension : dimensionInWhatValues) { 493539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac auto whatIt = mCurrentSlicedDurationTrackerMap.find(whatDimension); 494539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac // If the what dimension is already there, we should update all the trackers even 495539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac // the condition is false. 496539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (whatIt != mCurrentSlicedDurationTrackerMap.end()) { 497539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const auto& condIt : whatIt->second) { 498539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac const bool cond = dimensionKeysInCondition.find(condIt.first) != 499539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac dimensionKeysInCondition.end(); 500539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac handleStartEvent(MetricDimensionKey(whatDimension, condIt.first), 501539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac conditionKey, cond, event); 502539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 503539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } else { 504539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac // If it is a new what dimension key, we need to handle the start events for all current 505539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac // condition dimensions. 506539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac for (const auto& conditionDimension : dimensionKeysInCondition) { 507539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac handleStartEvent(MetricDimensionKey(whatDimension, conditionDimension), 508539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac conditionKey, condition, event); 509539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 510539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 511539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac if (dimensionKeysInCondition.empty()) { 512539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac handleStartEvent(MetricDimensionKey(whatDimension, DEFAULT_DIMENSION_KEY), 513539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac conditionKey, condition, event); 514539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 515539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac } 516729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen} 517729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 518539288806fe5ae3733ef7883eb8ec01cce293988Yangster-mac 519f2bee6fec965fd42ab223f1a3aa705f07ba79aeaYangstersize_t DurationMetricProducer::byteSizeLocked() const { 5207c334a129e93e405a72e8299a1cd928af079d14fYangster size_t totalSize = 0; 5217c334a129e93e405a72e8299a1cd928af079d14fYangster for (const auto& pair : mPastBuckets) { 5227c334a129e93e405a72e8299a1cd928af079d14fYangster totalSize += pair.second.size() * kBucketSize; 5237c334a129e93e405a72e8299a1cd928af079d14fYangster } 5247c334a129e93e405a72e8299a1cd928af079d14fYangster return totalSize; 52569007c82625dd8b19bd68d1031191e2ff83b5f49yro} 52669007c82625dd8b19bd68d1031191e2ff83b5f49yro 527729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen} // namespace statsd 528729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen} // namespace os 529729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen} // namespace android 530