Loading cmds/statsd/src/StatsLogProcessor.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -196,6 +196,14 @@ size_t StatsLogProcessor::GetMetricsSize(const ConfigKey& key) const { return it->second->byteSize(); } void StatsLogProcessor::dumpStates(FILE* out, bool verbose) { std::lock_guard<std::mutex> lock(mMetricsMutex); fprintf(out, "MetricsManager count: %lu\n", (unsigned long)mMetricsManagers.size()); for (auto metricsManager : mMetricsManagers) { metricsManager.second->dumpStates(out, verbose); } } void StatsLogProcessor::onDumpReport(const ConfigKey& key, const uint64_t& dumpTimeStampNs, ConfigMetricsReportList* report) { std::lock_guard<std::mutex> lock(mMetricsMutex); Loading cmds/statsd/src/StatsLogProcessor.h +2 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,8 @@ public: return mUidMap; } void dumpStates(FILE* out, bool verbose); private: mutable mutex mMetricsMutex; Loading cmds/statsd/src/StatsService.cpp +8 −3 Original line number Diff line number Diff line Loading @@ -175,8 +175,13 @@ status_t StatsService::dump(int fd, const Vector<String16>& args) { return NO_MEMORY; // the fd is already open } bool verbose = false; if (args.size() > 0 && !args[0].compare(String16("-v"))) { verbose = true; } // TODO: Proto format for incident reports dump_impl(out); dump_impl(out, verbose); fclose(out); return NO_ERROR; Loading @@ -185,9 +190,9 @@ status_t StatsService::dump(int fd, const Vector<String16>& args) { /** * Write debugging data about statsd in text format. */ void StatsService::dump_impl(FILE* out) { mConfigManager->Dump(out); void StatsService::dump_impl(FILE* out, bool verbose) { StatsdStats::getInstance().dumpStats(out); mProcessor->dumpStates(out, verbose); } /** Loading cmds/statsd/src/StatsService.h +1 −1 Original line number Diff line number Diff line Loading @@ -140,7 +140,7 @@ private: /** * Text output of dumpsys. */ void dump_impl(FILE* out); void dump_impl(FILE* out, bool verbose); /** * Print usage information for the commands Loading cmds/statsd/src/guardrail/StatsdStats.cpp +31 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,8 @@ const int FIELD_ID_CONFIG_STATS = 3; const int FIELD_ID_ATOM_STATS = 7; const int FIELD_ID_UIDMAP_STATS = 8; const int FIELD_ID_ANOMALY_ALARM_STATS = 9; const int FIELD_ID_PULLED_ATOM_STATS = 10; const int FIELD_ID_LOGGER_ERROR_STATS = 11; const int FIELD_ID_MATCHER_STATS_NAME = 1; const int FIELD_ID_MATCHER_STATS_COUNT = 2; Loading @@ -60,6 +62,9 @@ const int FIELD_ID_ATOM_STATS_COUNT = 2; const int FIELD_ID_ANOMALY_ALARMS_REGISTERED = 1; const int FIELD_ID_LOGGER_STATS_TIME = 1; const int FIELD_ID_LOGGER_STATS_ERROR_CODE = 2; std::map<int, long> StatsdStats::kPullerCooldownMap = { {android::util::KERNEL_WAKELOCK, 1}, {android::util::WIFI_BYTES_TRANSFER, 1}, Loading Loading @@ -282,6 +287,15 @@ void StatsdStats::noteAtomLogged(int atomId, int32_t timeSec) { mPushedAtomStats[atomId]++; } void StatsdStats::noteLoggerError(int error) { lock_guard<std::mutex> lock(mLock); // grows strictly one at a time. so it won't > kMaxLoggerErrors if (mLoggerErrors.size() == kMaxLoggerErrors) { mLoggerErrors.pop_front(); } mLoggerErrors.push_back(std::make_pair(time(nullptr), error)); } void StatsdStats::reset() { lock_guard<std::mutex> lock(mLock); resetInternalLocked(); Loading @@ -297,6 +311,7 @@ void StatsdStats::resetInternalLocked() { mAlertStats.clear(); mAnomalyAlarmRegisteredStats = 0; mMatcherStats.clear(); mLoggerErrors.clear(); for (auto& config : mConfigStats) { config.second.clear_broadcast_sent_time_sec(); config.second.clear_data_drop_time_sec(); Loading Loading @@ -465,6 +480,14 @@ void StatsdStats::dumpStats(FILE* out) const { "lost=%d\n", mUidMapStats.bytes_used(), mUidMapStats.snapshots(), mUidMapStats.changes(), mUidMapStats.dropped_snapshots(), mUidMapStats.dropped_changes()); for (const auto& error : mLoggerErrors) { time_t error_time = error.first; struct tm* error_tm = localtime(&error_time); char buffer[80]; strftime(buffer, sizeof(buffer), "%Y-%m-%d %I:%M%p\n", error_tm); fprintf(out, "Logger error %d at %s\n", error.second, buffer); } } void StatsdStats::dumpStats(std::vector<uint8_t>* output, bool reset) { Loading Loading @@ -526,6 +549,14 @@ void StatsdStats::dumpStats(std::vector<uint8_t>* output, bool reset) { mUidMapStats.SerializeToArray(&buffer[0], numBytes); proto.write(FIELD_TYPE_MESSAGE | FIELD_ID_UIDMAP_STATS, &buffer[0], buffer.size()); for (const auto& error : mLoggerErrors) { long long token = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_LOGGER_ERROR_STATS | FIELD_COUNT_REPEATED); proto.write(FIELD_TYPE_INT32 | FIELD_ID_LOGGER_STATS_TIME, error.first); proto.write(FIELD_TYPE_INT32 | FIELD_ID_LOGGER_STATS_ERROR_CODE, error.second); proto.end(token); } output->clear(); size_t bufferSize = proto.size(); output->resize(bufferSize); Loading Loading
cmds/statsd/src/StatsLogProcessor.cpp +8 −0 Original line number Diff line number Diff line Loading @@ -196,6 +196,14 @@ size_t StatsLogProcessor::GetMetricsSize(const ConfigKey& key) const { return it->second->byteSize(); } void StatsLogProcessor::dumpStates(FILE* out, bool verbose) { std::lock_guard<std::mutex> lock(mMetricsMutex); fprintf(out, "MetricsManager count: %lu\n", (unsigned long)mMetricsManagers.size()); for (auto metricsManager : mMetricsManagers) { metricsManager.second->dumpStates(out, verbose); } } void StatsLogProcessor::onDumpReport(const ConfigKey& key, const uint64_t& dumpTimeStampNs, ConfigMetricsReportList* report) { std::lock_guard<std::mutex> lock(mMetricsMutex); Loading
cmds/statsd/src/StatsLogProcessor.h +2 −0 Original line number Diff line number Diff line Loading @@ -61,6 +61,8 @@ public: return mUidMap; } void dumpStates(FILE* out, bool verbose); private: mutable mutex mMetricsMutex; Loading
cmds/statsd/src/StatsService.cpp +8 −3 Original line number Diff line number Diff line Loading @@ -175,8 +175,13 @@ status_t StatsService::dump(int fd, const Vector<String16>& args) { return NO_MEMORY; // the fd is already open } bool verbose = false; if (args.size() > 0 && !args[0].compare(String16("-v"))) { verbose = true; } // TODO: Proto format for incident reports dump_impl(out); dump_impl(out, verbose); fclose(out); return NO_ERROR; Loading @@ -185,9 +190,9 @@ status_t StatsService::dump(int fd, const Vector<String16>& args) { /** * Write debugging data about statsd in text format. */ void StatsService::dump_impl(FILE* out) { mConfigManager->Dump(out); void StatsService::dump_impl(FILE* out, bool verbose) { StatsdStats::getInstance().dumpStats(out); mProcessor->dumpStates(out, verbose); } /** Loading
cmds/statsd/src/StatsService.h +1 −1 Original line number Diff line number Diff line Loading @@ -140,7 +140,7 @@ private: /** * Text output of dumpsys. */ void dump_impl(FILE* out); void dump_impl(FILE* out, bool verbose); /** * Print usage information for the commands Loading
cmds/statsd/src/guardrail/StatsdStats.cpp +31 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,8 @@ const int FIELD_ID_CONFIG_STATS = 3; const int FIELD_ID_ATOM_STATS = 7; const int FIELD_ID_UIDMAP_STATS = 8; const int FIELD_ID_ANOMALY_ALARM_STATS = 9; const int FIELD_ID_PULLED_ATOM_STATS = 10; const int FIELD_ID_LOGGER_ERROR_STATS = 11; const int FIELD_ID_MATCHER_STATS_NAME = 1; const int FIELD_ID_MATCHER_STATS_COUNT = 2; Loading @@ -60,6 +62,9 @@ const int FIELD_ID_ATOM_STATS_COUNT = 2; const int FIELD_ID_ANOMALY_ALARMS_REGISTERED = 1; const int FIELD_ID_LOGGER_STATS_TIME = 1; const int FIELD_ID_LOGGER_STATS_ERROR_CODE = 2; std::map<int, long> StatsdStats::kPullerCooldownMap = { {android::util::KERNEL_WAKELOCK, 1}, {android::util::WIFI_BYTES_TRANSFER, 1}, Loading Loading @@ -282,6 +287,15 @@ void StatsdStats::noteAtomLogged(int atomId, int32_t timeSec) { mPushedAtomStats[atomId]++; } void StatsdStats::noteLoggerError(int error) { lock_guard<std::mutex> lock(mLock); // grows strictly one at a time. so it won't > kMaxLoggerErrors if (mLoggerErrors.size() == kMaxLoggerErrors) { mLoggerErrors.pop_front(); } mLoggerErrors.push_back(std::make_pair(time(nullptr), error)); } void StatsdStats::reset() { lock_guard<std::mutex> lock(mLock); resetInternalLocked(); Loading @@ -297,6 +311,7 @@ void StatsdStats::resetInternalLocked() { mAlertStats.clear(); mAnomalyAlarmRegisteredStats = 0; mMatcherStats.clear(); mLoggerErrors.clear(); for (auto& config : mConfigStats) { config.second.clear_broadcast_sent_time_sec(); config.second.clear_data_drop_time_sec(); Loading Loading @@ -465,6 +480,14 @@ void StatsdStats::dumpStats(FILE* out) const { "lost=%d\n", mUidMapStats.bytes_used(), mUidMapStats.snapshots(), mUidMapStats.changes(), mUidMapStats.dropped_snapshots(), mUidMapStats.dropped_changes()); for (const auto& error : mLoggerErrors) { time_t error_time = error.first; struct tm* error_tm = localtime(&error_time); char buffer[80]; strftime(buffer, sizeof(buffer), "%Y-%m-%d %I:%M%p\n", error_tm); fprintf(out, "Logger error %d at %s\n", error.second, buffer); } } void StatsdStats::dumpStats(std::vector<uint8_t>* output, bool reset) { Loading Loading @@ -526,6 +549,14 @@ void StatsdStats::dumpStats(std::vector<uint8_t>* output, bool reset) { mUidMapStats.SerializeToArray(&buffer[0], numBytes); proto.write(FIELD_TYPE_MESSAGE | FIELD_ID_UIDMAP_STATS, &buffer[0], buffer.size()); for (const auto& error : mLoggerErrors) { long long token = proto.start(FIELD_TYPE_MESSAGE | FIELD_ID_LOGGER_ERROR_STATS | FIELD_COUNT_REPEATED); proto.write(FIELD_TYPE_INT32 | FIELD_ID_LOGGER_STATS_TIME, error.first); proto.write(FIELD_TYPE_INT32 | FIELD_ID_LOGGER_STATS_ERROR_CODE, error.second); proto.end(token); } output->clear(); size_t bufferSize = proto.size(); output->resize(bufferSize); Loading