Loading cmds/statsd/src/StatsLogProcessor.cpp +31 −14 Original line number Diff line number Diff line Loading @@ -611,11 +611,8 @@ void StatsLogProcessor::WriteDataToDiskLocked(const ConfigKey& key, void StatsLogProcessor::SaveActiveConfigsToDisk(int64_t currentTimeNs) { std::lock_guard<std::mutex> lock(mMetricsMutex); const int64_t timeNs = getElapsedRealtimeNs(); // Do not write to disk if we already have in the last few seconds. // This is to avoid overwriting files that would have the same name if we // write twice in the same second. if (static_cast<unsigned long long> (timeNs) < mLastActiveMetricsWriteNs + WRITE_DATA_COOL_DOWN_SEC * NS_PER_SEC) { ALOGI("Statsd skipping writing active metrics to disk. Already wrote data in last %d seconds", Loading @@ -625,13 +622,7 @@ void StatsLogProcessor::SaveActiveConfigsToDisk(int64_t currentTimeNs) { mLastActiveMetricsWriteNs = timeNs; ProtoOutputStream proto; for (const auto& pair : mMetricsManagers) { const sp<MetricsManager>& metricsManager = pair.second; uint64_t configToken = proto.start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_ACTIVE_CONFIG_LIST_CONFIG); metricsManager->writeActiveConfigToProtoOutputStream(currentTimeNs, &proto); proto.end(configToken); } WriteActiveConfigsToProtoOutputStreamLocked(currentTimeNs, DEVICE_SHUTDOWN, &proto); string file_name = StringPrintf("%s/active_metrics", STATS_ACTIVE_METRIC_DIR); StorageManager::deleteFile(file_name.c_str()); Loading @@ -644,9 +635,24 @@ void StatsLogProcessor::SaveActiveConfigsToDisk(int64_t currentTimeNs) { proto.flush(fd.get()); } void StatsLogProcessor::LoadActiveConfigsFromDisk() { void StatsLogProcessor::WriteActiveConfigsToProtoOutputStream( int64_t currentTimeNs, const DumpReportReason reason, ProtoOutputStream* proto) { std::lock_guard<std::mutex> lock(mMetricsMutex); WriteActiveConfigsToProtoOutputStreamLocked(currentTimeNs, reason, proto); } void StatsLogProcessor::WriteActiveConfigsToProtoOutputStreamLocked( int64_t currentTimeNs, const DumpReportReason reason, ProtoOutputStream* proto) { for (const auto& pair : mMetricsManagers) { const sp<MetricsManager>& metricsManager = pair.second; uint64_t configToken = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_ACTIVE_CONFIG_LIST_CONFIG); metricsManager->writeActiveConfigToProtoOutputStream(currentTimeNs, reason, proto); proto->end(configToken); } } void StatsLogProcessor::LoadActiveConfigsFromDisk() { std::lock_guard<std::mutex> lock(mMetricsMutex); string file_name = StringPrintf("%s/active_metrics", STATS_ACTIVE_METRIC_DIR); int fd = open(file_name.c_str(), O_RDONLY | O_CLOEXEC); if (-1 == fd) { Loading @@ -670,6 +676,19 @@ void StatsLogProcessor::LoadActiveConfigsFromDisk() { StorageManager::deleteFile(file_name.c_str()); return; } // Passing in mTimeBaseNs only works as long as we only load from disk is when statsd starts. SetConfigsActiveStateLocked(activeConfigList, mTimeBaseNs); StorageManager::deleteFile(file_name.c_str()); } void StatsLogProcessor::SetConfigsActiveState(const ActiveConfigList& activeConfigList, int64_t currentTimeNs) { std::lock_guard<std::mutex> lock(mMetricsMutex); SetConfigsActiveStateLocked(activeConfigList, currentTimeNs); } void StatsLogProcessor::SetConfigsActiveStateLocked(const ActiveConfigList& activeConfigList, int64_t currentTimeNs) { for (int i = 0; i < activeConfigList.config_size(); i++) { const auto& config = activeConfigList.config(i); ConfigKey key(config.uid(), config.id()); Loading @@ -679,11 +698,9 @@ void StatsLogProcessor::LoadActiveConfigsFromDisk() { continue; } VLOG("Setting active config %s", key.ToString().c_str()); it->second->loadActiveConfig(config, mTimeBaseNs); it->second->loadActiveConfig(config, currentTimeNs); } VLOG("Successfully loaded %d active configs.", activeConfigList.config_size()); StorageManager::deleteFile(file_name.c_str()); } void StatsLogProcessor::WriteDataToDiskLocked(const DumpReportReason dumpReportReason, Loading cmds/statsd/src/StatsLogProcessor.h +14 −11 Original line number Diff line number Diff line Loading @@ -31,17 +31,6 @@ namespace android { namespace os { namespace statsd { // Keep this in sync with DumpReportReason enum in stats_log.proto enum DumpReportReason { DEVICE_SHUTDOWN = 1, CONFIG_UPDATED = 2, CONFIG_REMOVED = 3, GET_DATA_CALLED = 4, ADB_DUMP = 5, CONFIG_RESET = 6, STATSCOMPANION_DIED = 7, TERMINATION_SIGNAL_RECEIVED = 8 }; class StatsLogProcessor : public ConfigListener { public: Loading Loading @@ -92,9 +81,16 @@ public: /* Persist configs containing metrics with active activations to disk. */ void SaveActiveConfigsToDisk(int64_t currentTimeNs); /* Writes the current active status/ttl for all configs and metrics to ProtoOutputStream. */ void WriteActiveConfigsToProtoOutputStream( int64_t currentTimeNs, const DumpReportReason reason, ProtoOutputStream* proto); /* Load configs containing metrics with active activations from disk. */ void LoadActiveConfigsFromDisk(); /* Sets the active status/ttl for all configs and metrics to the status in ActiveConfigList. */ void SetConfigsActiveState(const ActiveConfigList& activeConfigList, int64_t currentTimeNs); // Reset all configs. void resetConfigs(); Loading Loading @@ -158,6 +154,12 @@ private: void GetActiveConfigsLocked(const int uid, vector<int64_t>& outActiveConfigs); void WriteActiveConfigsToProtoOutputStreamLocked( int64_t currentTimeNs, const DumpReportReason reason, ProtoOutputStream* proto); void SetConfigsActiveStateLocked(const ActiveConfigList& activeConfigList, int64_t currentTimeNs); void WriteDataToDiskLocked(const DumpReportReason dumpReportReason, const DumpLatency dumpLatency); void WriteDataToDiskLocked(const ConfigKey& key, const int64_t timestampNs, Loading Loading @@ -224,6 +226,7 @@ private: FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBootMultipleActivations); FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBootMultipleActivationsDifferentActivationTypes); FRIEND_TEST(StatsLogProcessorTest, TestActivationsPersistAcrossSystemServerRestart); FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration1); FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration2); Loading cmds/statsd/src/StatsService.cpp +13 −0 Original line number Diff line number Diff line Loading @@ -1478,8 +1478,21 @@ void StatsService::binderDied(const wp <IBinder>& who) { StatsdStats::getInstance().noteSystemServerRestart(getWallClockSec()); if (mProcessor != nullptr) { ALOGW("Reset statsd upon system server restarts."); int64_t systemServerRestartNs = getElapsedRealtimeNs(); ProtoOutputStream proto; mProcessor->WriteActiveConfigsToProtoOutputStream(systemServerRestartNs, STATSCOMPANION_DIED, &proto); mProcessor->WriteDataToDisk(STATSCOMPANION_DIED, FAST); mProcessor->resetConfigs(); std::string serializedActiveConfigs; if (proto.serializeToString(&serializedActiveConfigs)) { ActiveConfigList activeConfigs; if (activeConfigs.ParseFromString(serializedActiveConfigs)) { mProcessor->SetConfigsActiveState(activeConfigs, systemServerRestartNs); } } } mAnomalyAlarmMonitor->setStatsCompanionService(nullptr); mPeriodicAlarmMonitor->setStatsCompanionService(nullptr); Loading cmds/statsd/src/StatsService.h +1 −0 Original line number Diff line number Diff line Loading @@ -427,6 +427,7 @@ private: std::shared_ptr<LogEventQueue> mEventQueue; FRIEND_TEST(StatsLogProcessorTest, TestActivationsPersistAcrossSystemServerRestart); FRIEND_TEST(StatsServiceTest, TestAddConfig_simple); FRIEND_TEST(StatsServiceTest, TestAddConfig_empty); FRIEND_TEST(StatsServiceTest, TestAddConfig_invalid); Loading cmds/statsd/src/active_config_list.proto +11 −0 Original line number Diff line number Diff line Loading @@ -26,7 +26,18 @@ message ActiveEventActivation { // Time left in activation. When this proto is loaded after device boot, // the activation should be set to active for this duration. // This field will only be set when the state is ACTIVE optional int64 remaining_ttl_nanos = 2; enum State { UNNKNOWN = 0; // This metric should activate for remaining_ttl_nanos when we load the activations. ACTIVE = 1; // When we load the activations, this metric should activate on next boot for the tll // specified in the config. ACTIVATE_ON_BOOT = 2; } optional State state = 3; } message ActiveMetric { Loading Loading
cmds/statsd/src/StatsLogProcessor.cpp +31 −14 Original line number Diff line number Diff line Loading @@ -611,11 +611,8 @@ void StatsLogProcessor::WriteDataToDiskLocked(const ConfigKey& key, void StatsLogProcessor::SaveActiveConfigsToDisk(int64_t currentTimeNs) { std::lock_guard<std::mutex> lock(mMetricsMutex); const int64_t timeNs = getElapsedRealtimeNs(); // Do not write to disk if we already have in the last few seconds. // This is to avoid overwriting files that would have the same name if we // write twice in the same second. if (static_cast<unsigned long long> (timeNs) < mLastActiveMetricsWriteNs + WRITE_DATA_COOL_DOWN_SEC * NS_PER_SEC) { ALOGI("Statsd skipping writing active metrics to disk. Already wrote data in last %d seconds", Loading @@ -625,13 +622,7 @@ void StatsLogProcessor::SaveActiveConfigsToDisk(int64_t currentTimeNs) { mLastActiveMetricsWriteNs = timeNs; ProtoOutputStream proto; for (const auto& pair : mMetricsManagers) { const sp<MetricsManager>& metricsManager = pair.second; uint64_t configToken = proto.start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_ACTIVE_CONFIG_LIST_CONFIG); metricsManager->writeActiveConfigToProtoOutputStream(currentTimeNs, &proto); proto.end(configToken); } WriteActiveConfigsToProtoOutputStreamLocked(currentTimeNs, DEVICE_SHUTDOWN, &proto); string file_name = StringPrintf("%s/active_metrics", STATS_ACTIVE_METRIC_DIR); StorageManager::deleteFile(file_name.c_str()); Loading @@ -644,9 +635,24 @@ void StatsLogProcessor::SaveActiveConfigsToDisk(int64_t currentTimeNs) { proto.flush(fd.get()); } void StatsLogProcessor::LoadActiveConfigsFromDisk() { void StatsLogProcessor::WriteActiveConfigsToProtoOutputStream( int64_t currentTimeNs, const DumpReportReason reason, ProtoOutputStream* proto) { std::lock_guard<std::mutex> lock(mMetricsMutex); WriteActiveConfigsToProtoOutputStreamLocked(currentTimeNs, reason, proto); } void StatsLogProcessor::WriteActiveConfigsToProtoOutputStreamLocked( int64_t currentTimeNs, const DumpReportReason reason, ProtoOutputStream* proto) { for (const auto& pair : mMetricsManagers) { const sp<MetricsManager>& metricsManager = pair.second; uint64_t configToken = proto->start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | FIELD_ID_ACTIVE_CONFIG_LIST_CONFIG); metricsManager->writeActiveConfigToProtoOutputStream(currentTimeNs, reason, proto); proto->end(configToken); } } void StatsLogProcessor::LoadActiveConfigsFromDisk() { std::lock_guard<std::mutex> lock(mMetricsMutex); string file_name = StringPrintf("%s/active_metrics", STATS_ACTIVE_METRIC_DIR); int fd = open(file_name.c_str(), O_RDONLY | O_CLOEXEC); if (-1 == fd) { Loading @@ -670,6 +676,19 @@ void StatsLogProcessor::LoadActiveConfigsFromDisk() { StorageManager::deleteFile(file_name.c_str()); return; } // Passing in mTimeBaseNs only works as long as we only load from disk is when statsd starts. SetConfigsActiveStateLocked(activeConfigList, mTimeBaseNs); StorageManager::deleteFile(file_name.c_str()); } void StatsLogProcessor::SetConfigsActiveState(const ActiveConfigList& activeConfigList, int64_t currentTimeNs) { std::lock_guard<std::mutex> lock(mMetricsMutex); SetConfigsActiveStateLocked(activeConfigList, currentTimeNs); } void StatsLogProcessor::SetConfigsActiveStateLocked(const ActiveConfigList& activeConfigList, int64_t currentTimeNs) { for (int i = 0; i < activeConfigList.config_size(); i++) { const auto& config = activeConfigList.config(i); ConfigKey key(config.uid(), config.id()); Loading @@ -679,11 +698,9 @@ void StatsLogProcessor::LoadActiveConfigsFromDisk() { continue; } VLOG("Setting active config %s", key.ToString().c_str()); it->second->loadActiveConfig(config, mTimeBaseNs); it->second->loadActiveConfig(config, currentTimeNs); } VLOG("Successfully loaded %d active configs.", activeConfigList.config_size()); StorageManager::deleteFile(file_name.c_str()); } void StatsLogProcessor::WriteDataToDiskLocked(const DumpReportReason dumpReportReason, Loading
cmds/statsd/src/StatsLogProcessor.h +14 −11 Original line number Diff line number Diff line Loading @@ -31,17 +31,6 @@ namespace android { namespace os { namespace statsd { // Keep this in sync with DumpReportReason enum in stats_log.proto enum DumpReportReason { DEVICE_SHUTDOWN = 1, CONFIG_UPDATED = 2, CONFIG_REMOVED = 3, GET_DATA_CALLED = 4, ADB_DUMP = 5, CONFIG_RESET = 6, STATSCOMPANION_DIED = 7, TERMINATION_SIGNAL_RECEIVED = 8 }; class StatsLogProcessor : public ConfigListener { public: Loading Loading @@ -92,9 +81,16 @@ public: /* Persist configs containing metrics with active activations to disk. */ void SaveActiveConfigsToDisk(int64_t currentTimeNs); /* Writes the current active status/ttl for all configs and metrics to ProtoOutputStream. */ void WriteActiveConfigsToProtoOutputStream( int64_t currentTimeNs, const DumpReportReason reason, ProtoOutputStream* proto); /* Load configs containing metrics with active activations from disk. */ void LoadActiveConfigsFromDisk(); /* Sets the active status/ttl for all configs and metrics to the status in ActiveConfigList. */ void SetConfigsActiveState(const ActiveConfigList& activeConfigList, int64_t currentTimeNs); // Reset all configs. void resetConfigs(); Loading Loading @@ -158,6 +154,12 @@ private: void GetActiveConfigsLocked(const int uid, vector<int64_t>& outActiveConfigs); void WriteActiveConfigsToProtoOutputStreamLocked( int64_t currentTimeNs, const DumpReportReason reason, ProtoOutputStream* proto); void SetConfigsActiveStateLocked(const ActiveConfigList& activeConfigList, int64_t currentTimeNs); void WriteDataToDiskLocked(const DumpReportReason dumpReportReason, const DumpLatency dumpLatency); void WriteDataToDiskLocked(const ConfigKey& key, const int64_t timestampNs, Loading Loading @@ -224,6 +226,7 @@ private: FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBootMultipleActivations); FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBootMultipleActivationsDifferentActivationTypes); FRIEND_TEST(StatsLogProcessorTest, TestActivationsPersistAcrossSystemServerRestart); FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration1); FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration2); Loading
cmds/statsd/src/StatsService.cpp +13 −0 Original line number Diff line number Diff line Loading @@ -1478,8 +1478,21 @@ void StatsService::binderDied(const wp <IBinder>& who) { StatsdStats::getInstance().noteSystemServerRestart(getWallClockSec()); if (mProcessor != nullptr) { ALOGW("Reset statsd upon system server restarts."); int64_t systemServerRestartNs = getElapsedRealtimeNs(); ProtoOutputStream proto; mProcessor->WriteActiveConfigsToProtoOutputStream(systemServerRestartNs, STATSCOMPANION_DIED, &proto); mProcessor->WriteDataToDisk(STATSCOMPANION_DIED, FAST); mProcessor->resetConfigs(); std::string serializedActiveConfigs; if (proto.serializeToString(&serializedActiveConfigs)) { ActiveConfigList activeConfigs; if (activeConfigs.ParseFromString(serializedActiveConfigs)) { mProcessor->SetConfigsActiveState(activeConfigs, systemServerRestartNs); } } } mAnomalyAlarmMonitor->setStatsCompanionService(nullptr); mPeriodicAlarmMonitor->setStatsCompanionService(nullptr); Loading
cmds/statsd/src/StatsService.h +1 −0 Original line number Diff line number Diff line Loading @@ -427,6 +427,7 @@ private: std::shared_ptr<LogEventQueue> mEventQueue; FRIEND_TEST(StatsLogProcessorTest, TestActivationsPersistAcrossSystemServerRestart); FRIEND_TEST(StatsServiceTest, TestAddConfig_simple); FRIEND_TEST(StatsServiceTest, TestAddConfig_empty); FRIEND_TEST(StatsServiceTest, TestAddConfig_invalid); Loading
cmds/statsd/src/active_config_list.proto +11 −0 Original line number Diff line number Diff line Loading @@ -26,7 +26,18 @@ message ActiveEventActivation { // Time left in activation. When this proto is loaded after device boot, // the activation should be set to active for this duration. // This field will only be set when the state is ACTIVE optional int64 remaining_ttl_nanos = 2; enum State { UNNKNOWN = 0; // This metric should activate for remaining_ttl_nanos when we load the activations. ACTIVE = 1; // When we load the activations, this metric should activate on next boot for the tll // specified in the config. ACTIVATE_ON_BOOT = 2; } optional State state = 3; } message ActiveMetric { Loading