diff options
Diffstat (limited to 'cmds')
| -rw-r--r-- | cmds/statsd/src/StatsLogProcessor.cpp | 13 | ||||
| -rw-r--r-- | cmds/statsd/src/StatsLogProcessor.h | 6 | ||||
| -rw-r--r-- | cmds/statsd/src/StatsService.cpp | 7 | ||||
| -rw-r--r-- | cmds/statsd/src/StatsService.h | 5 | ||||
| -rw-r--r-- | cmds/statsd/src/atoms.proto | 21 | ||||
| -rw-r--r-- | cmds/statsd/src/main.cpp | 36 | ||||
| -rw-r--r-- | cmds/statsd/src/stats_log.proto | 1 |
7 files changed, 82 insertions, 7 deletions
diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp index e7f1caf26932..e7adba4d194a 100644 --- a/cmds/statsd/src/StatsLogProcessor.cpp +++ b/cmds/statsd/src/StatsLogProcessor.cpp @@ -71,6 +71,9 @@ const int FIELD_ID_STRINGS = 9; #define STATS_DATA_DIR "/data/misc/stats-data" +// Cool down period for writing data to disk to avoid overwriting files. +#define WRITE_DATA_COOL_DOWN_SEC 5 + StatsLogProcessor::StatsLogProcessor(const sp<UidMap>& uidMap, const sp<AlarmMonitor>& anomalyAlarmMonitor, const sp<AlarmMonitor>& periodicAlarmMonitor, @@ -526,6 +529,16 @@ void StatsLogProcessor::WriteDataToDiskLocked(const ConfigKey& key, void StatsLogProcessor::WriteDataToDiskLocked(const DumpReportReason dumpReportReason) { 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) < + mLastWriteTimeNs + WRITE_DATA_COOL_DOWN_SEC * NS_PER_SEC) { + ALOGI("Statsd skipping writing data to disk. Already wrote data in last %d seconds", + WRITE_DATA_COOL_DOWN_SEC); + return; + } + mLastWriteTimeNs = timeNs; for (auto& pair : mMetricsManagers) { WriteDataToDiskLocked(pair.first, timeNs, dumpReportReason); } diff --git a/cmds/statsd/src/StatsLogProcessor.h b/cmds/statsd/src/StatsLogProcessor.h index b175b3c544b5..86eb855825aa 100644 --- a/cmds/statsd/src/StatsLogProcessor.h +++ b/cmds/statsd/src/StatsLogProcessor.h @@ -40,7 +40,8 @@ enum DumpReportReason { GET_DATA_CALLED = 4, ADB_DUMP = 5, CONFIG_RESET = 6, - STATSCOMPANION_DIED = 7 + STATSCOMPANION_DIED = 7, + TERMINATION_SIGNAL_RECEIVED = 8 }; class StatsLogProcessor : public ConfigListener { @@ -183,6 +184,9 @@ private: long mLastPullerCacheClearTimeSec = 0; + // Last time we wrote data to disk. + int64_t mLastWriteTimeNs = 0; + #ifdef VERY_VERBOSE_PRINTING bool mPrintAllLogs = false; #endif diff --git a/cmds/statsd/src/StatsService.cpp b/cmds/statsd/src/StatsService.cpp index 10c04f67ca05..cb48a716231f 100644 --- a/cmds/statsd/src/StatsService.cpp +++ b/cmds/statsd/src/StatsService.cpp @@ -881,6 +881,13 @@ void StatsService::Startup() { mConfigManager->Startup(); } +void StatsService::Terminate() { + ALOGI("StatsService::Terminating"); + if (mProcessor != nullptr) { + mProcessor->WriteDataToDisk(TERMINATION_SIGNAL_RECEIVED); + } +} + void StatsService::OnLogEvent(LogEvent* event, bool reconnectionStarts) { mProcessor->OnLogEvent(event, reconnectionStarts); } diff --git a/cmds/statsd/src/StatsService.h b/cmds/statsd/src/StatsService.h index b3a477645b73..d8aab88ce9f9 100644 --- a/cmds/statsd/src/StatsService.h +++ b/cmds/statsd/src/StatsService.h @@ -74,6 +74,11 @@ public: void Startup(); /** + * Called when terminiation signal received. + */ + void Terminate(); + + /** * Called by LogReader when there's a log event to process. */ virtual void OnLogEvent(LogEvent* event, bool reconnectionStarts); diff --git a/cmds/statsd/src/atoms.proto b/cmds/statsd/src/atoms.proto index 1d629da2f250..2fe6caf8844c 100644 --- a/cmds/statsd/src/atoms.proto +++ b/cmds/statsd/src/atoms.proto @@ -131,6 +131,7 @@ message Atom { PhoneServiceStateChanged phone_service_state_changed = 94; PhoneStateChanged phone_state_changed = 95; LowMemReported low_mem_reported = 81; + ThermalThrottlingStateChanged thermal_throttling = 86; NetworkDnsEventReported network_dns_event_reported = 116; DataStallEvent data_stall_event = 121; BluetoothLinkLayerConnectionEvent bluetooth_link_layer_connection_event = 125; @@ -239,6 +240,26 @@ message AttributionNode { */ /** + * Logs when the Thermal service HAL notifies the throttling start/stop events. + * + * Logged from: + * frameworks/base/services/core/java/com/android/server/stats/StatsCompanionService.java + */ +message ThermalThrottlingStateChanged { + optional android.os.TemperatureTypeEnum sensor_type = 1; + + enum State { + UNKNOWN = 0; + START = 1; + STOP = 2; + } + + optional State state = 2; + + optional float temperature = 3; +} + +/** * Logs when the screen state changes. * * Logged from: diff --git a/cmds/statsd/src/main.cpp b/cmds/statsd/src/main.cpp index e8904c625325..58bbd96af7cf 100644 --- a/cmds/statsd/src/main.cpp +++ b/cmds/statsd/src/main.cpp @@ -96,6 +96,27 @@ static status_t start_log_reader_thread(const sp<StatsService>& service) { return NO_ERROR; } + +sp<StatsService> gStatsService = nullptr; + +void sigHandler(int sig) { + if (gStatsService != nullptr) { + gStatsService->Terminate(); + } +} + +void registerSigHandler() +{ + struct sigaction sa; + sigemptyset(&sa.sa_mask); + sa.sa_flags = 0; + sa.sa_handler = sigHandler; + sigaction(SIGHUP, &sa, nullptr); + sigaction(SIGINT, &sa, nullptr); + sigaction(SIGQUIT, &sa, nullptr); + sigaction(SIGTERM, &sa, nullptr); +} + int main(int /*argc*/, char** /*argv*/) { // Set up the looper sp<Looper> looper(Looper::prepare(0 /* opts */)); @@ -108,21 +129,24 @@ int main(int /*argc*/, char** /*argv*/) { IPCThreadState::self()->disableBackgroundScheduling(true); // Create the service - sp<StatsService> service = new StatsService(looper); - if (defaultServiceManager()->addService(String16("stats"), service) != 0) { + gStatsService = new StatsService(looper); + if (defaultServiceManager()->addService(String16("stats"), gStatsService) != 0) { ALOGE("Failed to add service"); return -1; } - service->sayHiToStatsCompanion(); - service->Startup(); + registerSigHandler(); + + gStatsService->sayHiToStatsCompanion(); + + gStatsService->Startup(); - sp<StatsSocketListener> socketListener = new StatsSocketListener(service); + sp<StatsSocketListener> socketListener = new StatsSocketListener(gStatsService); if (kUseLogd) { ALOGI("using logd"); // Start the log reader thread - status_t err = start_log_reader_thread(service); + status_t err = start_log_reader_thread(gStatsService); if (err != NO_ERROR) { return 1; } diff --git a/cmds/statsd/src/stats_log.proto b/cmds/statsd/src/stats_log.proto index 2fe17daf7542..1c70d88f6cf3 100644 --- a/cmds/statsd/src/stats_log.proto +++ b/cmds/statsd/src/stats_log.proto @@ -265,6 +265,7 @@ message ConfigMetricsReport { ADB_DUMP = 5; CONFIG_RESET = 6; STATSCOMPANION_DIED = 7; + TERMINATION_SIGNAL_RECEIVED = 8; } optional DumpReportReason dump_report_reason = 8; |