Loading cmds/statsd/src/StatsLogProcessor.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -526,9 +526,10 @@ void StatsLogProcessor::WriteMetricsActivationToDisk(int64_t currentTimeNs) { proto.write(FIELD_TYPE_INT64 | FIELD_ID_CONFIG_ID, (long long)pair.first.GetId()); proto.write(FIELD_TYPE_INT32 | FIELD_ID_CONFIG_UID, pair.first.GetUid()); vector<const MetricProducer*> acrtiveMetrics; pair.second->getActiveMetrics(acrtiveMetrics); for (const MetricProducer* metric : acrtiveMetrics) { vector<MetricProducer*> activeMetrics; pair.second->prepForShutDown(currentTimeNs); pair.second->getActiveMetrics(activeMetrics); for (MetricProducer* metric : activeMetrics) { if (metric->isActive()) { uint64_t metricToken = proto.start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_ACTIVE_METRIC); Loading cmds/statsd/src/StatsLogProcessor.h +1 −0 Original line number Diff line number Diff line Loading @@ -195,6 +195,7 @@ private: FRIEND_TEST(StatsLogProcessorTest, TestRateLimitBroadcast); FRIEND_TEST(StatsLogProcessorTest, TestDropWhenByteSizeTooLarge); FRIEND_TEST(StatsLogProcessorTest, TestActiveConfigMetricDiskWriteRead); FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBoot); FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration1); FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration2); Loading cmds/statsd/src/metrics/MetricProducer.cpp +30 −6 Original line number Diff line number Diff line Loading @@ -107,6 +107,10 @@ void MetricProducer::activateLocked(int activationTrackerIndex, int64_t elapsedT if (it == mEventActivationMap.end()) { return; } if (mActivationType == MetricActivation::ACTIVATE_ON_BOOT) { it->second.state = ActivationState::kActiveOnBoot; return; } it->second.activation_ns = elapsedTimestampNs; it->second.state = ActivationState::kActive; mIsActive = true; Loading @@ -116,12 +120,19 @@ void MetricProducer::setActiveLocked(int64_t currentTimeNs, int64_t remainingTtl if (mEventActivationMap.size() == 0) { return; } auto& activation = mEventActivationMap.begin()->second; for (auto& pair : mEventActivationMap) { auto& activation = pair.second; if (activation.ttl_ns >= remainingTtlNs) { activation.activation_ns = currentTimeNs + remainingTtlNs - activation.ttl_ns; activation.state = kActive; mIsActive = true; VLOG("setting new activation time to %lld, %lld, %lld", (long long)activation.activation_ns, (long long)currentTimeNs, (long long)remainingTtlNs); VLOG("setting new activation time to %lld, %lld, %lld", (long long)activation.activation_ns, (long long)currentTimeNs, (long long)remainingTtlNs); return; } } ALOGE("Required ttl is longer than all possible activations."); } int64_t MetricProducer::getRemainingTtlNsLocked(int64_t currentTimeNs) const { Loading @@ -135,6 +146,19 @@ int64_t MetricProducer::getRemainingTtlNsLocked(int64_t currentTimeNs) const { return maxTtl; } void MetricProducer::prepActiveForBootIfNecessaryLocked(int64_t currentTimeNs) { if (mActivationType != MetricActivation::ACTIVATE_ON_BOOT) { return; } for (auto& activation : mEventActivationMap) { if (activation.second.state == kActiveOnBoot) { activation.second.state = kActive; activation.second.activation_ns = currentTimeNs; mIsActive = true; } } } } // namespace statsd } // namespace os } // namespace android cmds/statsd/src/metrics/MetricProducer.h +18 −3 Original line number Diff line number Diff line Loading @@ -37,12 +37,13 @@ namespace statsd { // If the metric has no activation requirement, it will be active once the metric producer is // created. // If the metric needs to be activated by atoms, the metric producer will start // with kNotActive state, turn to kActive when the activation event arrives, become kNotActive // when it reaches the duration limit (timebomb). If the activation event arrives again before // or after it expires, the event producer will be re-activated and ttl will be reset. // with kNotActive state, turn to kActive or kActiveOnBoot when the activation event arrives, become // kNotActive when it reaches the duration limit (timebomb). If the activation event arrives again // before or after it expires, the event producer will be re-activated and ttl will be reset. enum ActivationState { kNotActive = 0, kActive = 1, kActiveOnBoot = 2, }; // A MetricProducer is responsible for compute one single metrics, creating stats log report, and Loading Loading @@ -218,8 +219,17 @@ public: return isActiveLocked(); } void prepActiveForBootIfNecessary(int64_t currentTimeNs) { std::lock_guard<std::mutex> lock(mMutex); prepActiveForBootIfNecessaryLocked(currentTimeNs); } void addActivation(int activationTrackerIndex, int64_t ttl_seconds); inline void setActivationType(const MetricActivation::ActivationType& activationType) { mActivationType = activationType; } void flushIfExpire(int64_t elapsedTimestampNs); protected: Loading @@ -243,6 +253,8 @@ protected: return mIsActive; } void prepActiveForBootIfNecessaryLocked(int64_t currentTimeNs); int64_t getRemainingTtlNsLocked(int64_t currentTimeNs) const; void setActiveLocked(int64_t currentTimeNs, int64_t remainingTtlNs); Loading Loading @@ -367,9 +379,12 @@ protected: bool mIsActive; MetricActivation::ActivationType mActivationType; FRIEND_TEST(MetricActivationE2eTest, TestCountMetric); FRIEND_TEST(StatsLogProcessorTest, TestActiveConfigMetricDiskWriteRead); FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBoot); }; } // namespace statsd Loading cmds/statsd/src/metrics/MetricsManager.h +8 −1 Original line number Diff line number Diff line Loading @@ -132,7 +132,7 @@ public: return mIsActive; } inline void getActiveMetrics(std::vector<const MetricProducer*>& metrics) const { inline void getActiveMetrics(std::vector<MetricProducer*>& metrics) const { for (const auto& metric : mAllMetricProducers) { if (metric->isActive()) { metrics.push_back(metric.get()); Loading @@ -140,6 +140,12 @@ public: } } inline void prepForShutDown(int64_t currentTimeNs) { for (const auto& metric : mAllMetricProducers) { metric->prepActiveForBootIfNecessary(currentTimeNs); } } void setActiveMetrics(ActiveConfig config, int64_t currentTimeNs); private: Loading Loading @@ -271,6 +277,7 @@ private: FRIEND_TEST(MetricActivationE2eTest, TestCountMetric); FRIEND_TEST(StatsLogProcessorTest, TestActiveConfigMetricDiskWriteRead); FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBoot); }; } // namespace statsd Loading Loading
cmds/statsd/src/StatsLogProcessor.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -526,9 +526,10 @@ void StatsLogProcessor::WriteMetricsActivationToDisk(int64_t currentTimeNs) { proto.write(FIELD_TYPE_INT64 | FIELD_ID_CONFIG_ID, (long long)pair.first.GetId()); proto.write(FIELD_TYPE_INT32 | FIELD_ID_CONFIG_UID, pair.first.GetUid()); vector<const MetricProducer*> acrtiveMetrics; pair.second->getActiveMetrics(acrtiveMetrics); for (const MetricProducer* metric : acrtiveMetrics) { vector<MetricProducer*> activeMetrics; pair.second->prepForShutDown(currentTimeNs); pair.second->getActiveMetrics(activeMetrics); for (MetricProducer* metric : activeMetrics) { if (metric->isActive()) { uint64_t metricToken = proto.start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_ACTIVE_METRIC); Loading
cmds/statsd/src/StatsLogProcessor.h +1 −0 Original line number Diff line number Diff line Loading @@ -195,6 +195,7 @@ private: FRIEND_TEST(StatsLogProcessorTest, TestRateLimitBroadcast); FRIEND_TEST(StatsLogProcessorTest, TestDropWhenByteSizeTooLarge); FRIEND_TEST(StatsLogProcessorTest, TestActiveConfigMetricDiskWriteRead); FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBoot); FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration1); FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration2); Loading
cmds/statsd/src/metrics/MetricProducer.cpp +30 −6 Original line number Diff line number Diff line Loading @@ -107,6 +107,10 @@ void MetricProducer::activateLocked(int activationTrackerIndex, int64_t elapsedT if (it == mEventActivationMap.end()) { return; } if (mActivationType == MetricActivation::ACTIVATE_ON_BOOT) { it->second.state = ActivationState::kActiveOnBoot; return; } it->second.activation_ns = elapsedTimestampNs; it->second.state = ActivationState::kActive; mIsActive = true; Loading @@ -116,12 +120,19 @@ void MetricProducer::setActiveLocked(int64_t currentTimeNs, int64_t remainingTtl if (mEventActivationMap.size() == 0) { return; } auto& activation = mEventActivationMap.begin()->second; for (auto& pair : mEventActivationMap) { auto& activation = pair.second; if (activation.ttl_ns >= remainingTtlNs) { activation.activation_ns = currentTimeNs + remainingTtlNs - activation.ttl_ns; activation.state = kActive; mIsActive = true; VLOG("setting new activation time to %lld, %lld, %lld", (long long)activation.activation_ns, (long long)currentTimeNs, (long long)remainingTtlNs); VLOG("setting new activation time to %lld, %lld, %lld", (long long)activation.activation_ns, (long long)currentTimeNs, (long long)remainingTtlNs); return; } } ALOGE("Required ttl is longer than all possible activations."); } int64_t MetricProducer::getRemainingTtlNsLocked(int64_t currentTimeNs) const { Loading @@ -135,6 +146,19 @@ int64_t MetricProducer::getRemainingTtlNsLocked(int64_t currentTimeNs) const { return maxTtl; } void MetricProducer::prepActiveForBootIfNecessaryLocked(int64_t currentTimeNs) { if (mActivationType != MetricActivation::ACTIVATE_ON_BOOT) { return; } for (auto& activation : mEventActivationMap) { if (activation.second.state == kActiveOnBoot) { activation.second.state = kActive; activation.second.activation_ns = currentTimeNs; mIsActive = true; } } } } // namespace statsd } // namespace os } // namespace android
cmds/statsd/src/metrics/MetricProducer.h +18 −3 Original line number Diff line number Diff line Loading @@ -37,12 +37,13 @@ namespace statsd { // If the metric has no activation requirement, it will be active once the metric producer is // created. // If the metric needs to be activated by atoms, the metric producer will start // with kNotActive state, turn to kActive when the activation event arrives, become kNotActive // when it reaches the duration limit (timebomb). If the activation event arrives again before // or after it expires, the event producer will be re-activated and ttl will be reset. // with kNotActive state, turn to kActive or kActiveOnBoot when the activation event arrives, become // kNotActive when it reaches the duration limit (timebomb). If the activation event arrives again // before or after it expires, the event producer will be re-activated and ttl will be reset. enum ActivationState { kNotActive = 0, kActive = 1, kActiveOnBoot = 2, }; // A MetricProducer is responsible for compute one single metrics, creating stats log report, and Loading Loading @@ -218,8 +219,17 @@ public: return isActiveLocked(); } void prepActiveForBootIfNecessary(int64_t currentTimeNs) { std::lock_guard<std::mutex> lock(mMutex); prepActiveForBootIfNecessaryLocked(currentTimeNs); } void addActivation(int activationTrackerIndex, int64_t ttl_seconds); inline void setActivationType(const MetricActivation::ActivationType& activationType) { mActivationType = activationType; } void flushIfExpire(int64_t elapsedTimestampNs); protected: Loading @@ -243,6 +253,8 @@ protected: return mIsActive; } void prepActiveForBootIfNecessaryLocked(int64_t currentTimeNs); int64_t getRemainingTtlNsLocked(int64_t currentTimeNs) const; void setActiveLocked(int64_t currentTimeNs, int64_t remainingTtlNs); Loading Loading @@ -367,9 +379,12 @@ protected: bool mIsActive; MetricActivation::ActivationType mActivationType; FRIEND_TEST(MetricActivationE2eTest, TestCountMetric); FRIEND_TEST(StatsLogProcessorTest, TestActiveConfigMetricDiskWriteRead); FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBoot); }; } // namespace statsd Loading
cmds/statsd/src/metrics/MetricsManager.h +8 −1 Original line number Diff line number Diff line Loading @@ -132,7 +132,7 @@ public: return mIsActive; } inline void getActiveMetrics(std::vector<const MetricProducer*>& metrics) const { inline void getActiveMetrics(std::vector<MetricProducer*>& metrics) const { for (const auto& metric : mAllMetricProducers) { if (metric->isActive()) { metrics.push_back(metric.get()); Loading @@ -140,6 +140,12 @@ public: } } inline void prepForShutDown(int64_t currentTimeNs) { for (const auto& metric : mAllMetricProducers) { metric->prepActiveForBootIfNecessary(currentTimeNs); } } void setActiveMetrics(ActiveConfig config, int64_t currentTimeNs); private: Loading Loading @@ -271,6 +277,7 @@ private: FRIEND_TEST(MetricActivationE2eTest, TestCountMetric); FRIEND_TEST(StatsLogProcessorTest, TestActiveConfigMetricDiskWriteRead); FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBoot); }; } // namespace statsd Loading