Loading cmds/statsd/src/StatsLogProcessor.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -199,6 +199,7 @@ void StatsLogProcessor::onDumpReport(const ConfigKey& key, vector<uint8_t>* outD iter.rp()->move(toRead); } } StatsdStats::getInstance().noteMetricsReportSent(key); } void StatsLogProcessor::OnConfigRemoved(const ConfigKey& key) { Loading Loading @@ -234,7 +235,7 @@ void StatsLogProcessor::flushIfNecessary(uint64_t timestampNs, } else if (totalBytes > kMaxSerializedBytes) { // Too late. We need to start clearing data. // We ignore the return value so we force each metric producer to clear its contents. metricsManager->onDumpReport(); StatsdStats::getInstance().noteDataDrop(key); StatsdStats::getInstance().noteDataDropped(key); VLOG("StatsD had to toss out metrics for %s", key.ToString().c_str()); } } Loading cmds/statsd/src/StatsService.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -488,7 +488,7 @@ status_t StatsService::cmd_print_stats(FILE* out, const Vector<String8>& args) { if (args.size() > 1) { reset = strtol(args[1].string(), NULL, 10); } vector<int8_t> output; vector<uint8_t> output; statsdStats.dumpStats(&output, reset); return NO_ERROR; } Loading cmds/statsd/src/guardrail/StatsdStats.cpp +23 −7 Original line number Diff line number Diff line Loading @@ -61,7 +61,7 @@ const int FIELD_ID_ATOM_STATS_COUNT = 2; // TODO: add stats for pulled atoms. StatsdStats::StatsdStats() { mPushedAtomStats.resize(android::util::kMaxPushedAtomId + 1); mStartTime = time(nullptr); mStartTimeSec = time(nullptr); } StatsdStats& StatsdStats::getInstance() { Loading Loading @@ -107,6 +107,7 @@ void StatsdStats::noteConfigRemovedInternalLocked(const ConfigKey& key) { mMetricsStats.erase(key); mConditionStats.erase(key); mIceBox.push_back(it->second); mConfigStats.erase(it); } } Loading @@ -126,7 +127,7 @@ void StatsdStats::noteBroadcastSent(const ConfigKey& key) { it->second.add_broadcast_sent_time_sec(time(nullptr)); } void StatsdStats::noteDataDrop(const ConfigKey& key) { void StatsdStats::noteDataDropped(const ConfigKey& key) { lock_guard<std::mutex> lock(mLock); auto it = mConfigStats.find(key); if (it == mConfigStats.end()) { Loading @@ -137,6 +138,17 @@ void StatsdStats::noteDataDrop(const ConfigKey& key) { it->second.add_data_drop_time_sec(time(nullptr)); } void StatsdStats::noteMetricsReportSent(const ConfigKey& key) { lock_guard<std::mutex> lock(mLock); auto it = mConfigStats.find(key); if (it == mConfigStats.end()) { ALOGE("Config key %s not found!", key.ToString().c_str()); return; } it->second.add_dump_report_time_sec(time(nullptr)); } void StatsdStats::noteConditionDimensionSize(const ConfigKey& key, const string& name, int size) { lock_guard<std::mutex> lock(mLock); // if name doesn't exist before, it will create the key with count 0. Loading Loading @@ -164,7 +176,7 @@ void StatsdStats::noteMatcherMatched(const ConfigKey& key, const string& name) { void StatsdStats::noteAtomLogged(int atomId, int32_t timeSec) { lock_guard<std::mutex> lock(mLock); if (timeSec < mStartTime) { if (timeSec < mStartTimeSec) { return; } Loading @@ -183,7 +195,7 @@ void StatsdStats::reset() { void StatsdStats::resetInternalLocked() { // Reset the historical data, but keep the active ConfigStats mStartTime = time(nullptr); mStartTimeSec = time(nullptr); mIceBox.clear(); mConditionStats.clear(); mMetricsStats.clear(); Loading Loading @@ -225,11 +237,11 @@ void StatsdStats::addSubStatsToConfig(const ConfigKey& key, } } void StatsdStats::dumpStats(std::vector<int8_t>* output, bool reset) { void StatsdStats::dumpStats(std::vector<uint8_t>* output, bool reset) { lock_guard<std::mutex> lock(mLock); if (DEBUG) { time_t t = time(nullptr); time_t t = mStartTimeSec; struct tm* tm = localtime(&t); char timeBuffer[80]; strftime(timeBuffer, sizeof(timeBuffer), "%Y-%m-%d %I:%M%p", tm); Loading @@ -237,7 +249,7 @@ void StatsdStats::dumpStats(std::vector<int8_t>* output, bool reset) { VLOG("Stats collection start second: %s", timeBuffer); } ProtoOutputStream proto; proto.write(FIELD_TYPE_INT32 | FIELD_ID_BEGIN_TIME, mStartTime); proto.write(FIELD_TYPE_INT32 | FIELD_ID_BEGIN_TIME, mStartTimeSec); proto.write(FIELD_TYPE_INT32 | FIELD_ID_END_TIME, (int32_t)time(nullptr)); VLOG("%lu Config in icebox: ", (unsigned long)mIceBox.size()); Loading Loading @@ -286,6 +298,10 @@ void StatsdStats::dumpStats(std::vector<int8_t>* output, bool reset) { for (const auto& dataDropTime : configStats.data_drop_time_sec()) { VLOG("\tdata drop time: %d", dataDropTime); } for (const auto& dumpTime : configStats.dump_report_time_sec()) { VLOG("\tdump report time: %d", dumpTime); } } addSubStatsToConfig(pair.first, configStats); Loading cmds/statsd/src/guardrail/StatsdStats.h +17 −3 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include "config/ConfigKey.h" #include "frameworks/base/cmds/statsd/src/stats_log.pb.h" #include <gtest/gtest_prod.h> #include <mutex> #include <string> #include <vector> Loading Loading @@ -63,7 +64,14 @@ public: /** * Report a config's metrics data has been dropped. */ void noteDataDrop(const ConfigKey& key); void noteDataDropped(const ConfigKey& key); /** * Report metrics data report has been sent. * * The report may be requested via StatsManager API, or through adb cmd. */ void noteMetricsReportSent(const ConfigKey& key); /** * Report the size of output tuple of a condition. Loading Loading @@ -114,14 +122,14 @@ public: * * [reset]: whether to clear the historical stats after the call. */ void dumpStats(std::vector<int8_t>* buffer, bool reset); void dumpStats(std::vector<uint8_t>* buffer, bool reset); private: StatsdStats(); mutable std::mutex mLock; int32_t mStartTime; int32_t mStartTimeSec; // The stats about the configs that are still in use. std::map<const ConfigKey, StatsdStatsReport_ConfigStats> mConfigStats; Loading Loading @@ -153,6 +161,12 @@ private: void resetInternalLocked(); void addSubStatsToConfig(const ConfigKey& key, StatsdStatsReport_ConfigStats& configStats); FRIEND_TEST(StatsdStatsTest, TestValidConfigAdd); FRIEND_TEST(StatsdStatsTest, TestInvalidConfigAdd); FRIEND_TEST(StatsdStatsTest, TestConfigRemove); FRIEND_TEST(StatsdStatsTest, TestSubStats); FRIEND_TEST(StatsdStatsTest, TestAtomLog); }; } // namespace statsd Loading cmds/statsd/src/stats_log.proto +4 −3 Original line number Diff line number Diff line Loading @@ -206,9 +206,10 @@ message StatsdStatsReport { repeated int32 broadcast_sent_time_sec = 10; repeated int32 data_drop_time_sec = 11; repeated MatcherStats matcher_stats = 12; repeated ConditionStats condition_stats = 13; repeated MetricStats metric_stats = 14; repeated int32 dump_report_time_sec = 12; repeated MatcherStats matcher_stats = 13; repeated ConditionStats condition_stats = 14; repeated MetricStats metric_stats = 15; } repeated ConfigStats config_stats = 3; Loading Loading
cmds/statsd/src/StatsLogProcessor.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -199,6 +199,7 @@ void StatsLogProcessor::onDumpReport(const ConfigKey& key, vector<uint8_t>* outD iter.rp()->move(toRead); } } StatsdStats::getInstance().noteMetricsReportSent(key); } void StatsLogProcessor::OnConfigRemoved(const ConfigKey& key) { Loading Loading @@ -234,7 +235,7 @@ void StatsLogProcessor::flushIfNecessary(uint64_t timestampNs, } else if (totalBytes > kMaxSerializedBytes) { // Too late. We need to start clearing data. // We ignore the return value so we force each metric producer to clear its contents. metricsManager->onDumpReport(); StatsdStats::getInstance().noteDataDrop(key); StatsdStats::getInstance().noteDataDropped(key); VLOG("StatsD had to toss out metrics for %s", key.ToString().c_str()); } } Loading
cmds/statsd/src/StatsService.cpp +1 −1 Original line number Diff line number Diff line Loading @@ -488,7 +488,7 @@ status_t StatsService::cmd_print_stats(FILE* out, const Vector<String8>& args) { if (args.size() > 1) { reset = strtol(args[1].string(), NULL, 10); } vector<int8_t> output; vector<uint8_t> output; statsdStats.dumpStats(&output, reset); return NO_ERROR; } Loading
cmds/statsd/src/guardrail/StatsdStats.cpp +23 −7 Original line number Diff line number Diff line Loading @@ -61,7 +61,7 @@ const int FIELD_ID_ATOM_STATS_COUNT = 2; // TODO: add stats for pulled atoms. StatsdStats::StatsdStats() { mPushedAtomStats.resize(android::util::kMaxPushedAtomId + 1); mStartTime = time(nullptr); mStartTimeSec = time(nullptr); } StatsdStats& StatsdStats::getInstance() { Loading Loading @@ -107,6 +107,7 @@ void StatsdStats::noteConfigRemovedInternalLocked(const ConfigKey& key) { mMetricsStats.erase(key); mConditionStats.erase(key); mIceBox.push_back(it->second); mConfigStats.erase(it); } } Loading @@ -126,7 +127,7 @@ void StatsdStats::noteBroadcastSent(const ConfigKey& key) { it->second.add_broadcast_sent_time_sec(time(nullptr)); } void StatsdStats::noteDataDrop(const ConfigKey& key) { void StatsdStats::noteDataDropped(const ConfigKey& key) { lock_guard<std::mutex> lock(mLock); auto it = mConfigStats.find(key); if (it == mConfigStats.end()) { Loading @@ -137,6 +138,17 @@ void StatsdStats::noteDataDrop(const ConfigKey& key) { it->second.add_data_drop_time_sec(time(nullptr)); } void StatsdStats::noteMetricsReportSent(const ConfigKey& key) { lock_guard<std::mutex> lock(mLock); auto it = mConfigStats.find(key); if (it == mConfigStats.end()) { ALOGE("Config key %s not found!", key.ToString().c_str()); return; } it->second.add_dump_report_time_sec(time(nullptr)); } void StatsdStats::noteConditionDimensionSize(const ConfigKey& key, const string& name, int size) { lock_guard<std::mutex> lock(mLock); // if name doesn't exist before, it will create the key with count 0. Loading Loading @@ -164,7 +176,7 @@ void StatsdStats::noteMatcherMatched(const ConfigKey& key, const string& name) { void StatsdStats::noteAtomLogged(int atomId, int32_t timeSec) { lock_guard<std::mutex> lock(mLock); if (timeSec < mStartTime) { if (timeSec < mStartTimeSec) { return; } Loading @@ -183,7 +195,7 @@ void StatsdStats::reset() { void StatsdStats::resetInternalLocked() { // Reset the historical data, but keep the active ConfigStats mStartTime = time(nullptr); mStartTimeSec = time(nullptr); mIceBox.clear(); mConditionStats.clear(); mMetricsStats.clear(); Loading Loading @@ -225,11 +237,11 @@ void StatsdStats::addSubStatsToConfig(const ConfigKey& key, } } void StatsdStats::dumpStats(std::vector<int8_t>* output, bool reset) { void StatsdStats::dumpStats(std::vector<uint8_t>* output, bool reset) { lock_guard<std::mutex> lock(mLock); if (DEBUG) { time_t t = time(nullptr); time_t t = mStartTimeSec; struct tm* tm = localtime(&t); char timeBuffer[80]; strftime(timeBuffer, sizeof(timeBuffer), "%Y-%m-%d %I:%M%p", tm); Loading @@ -237,7 +249,7 @@ void StatsdStats::dumpStats(std::vector<int8_t>* output, bool reset) { VLOG("Stats collection start second: %s", timeBuffer); } ProtoOutputStream proto; proto.write(FIELD_TYPE_INT32 | FIELD_ID_BEGIN_TIME, mStartTime); proto.write(FIELD_TYPE_INT32 | FIELD_ID_BEGIN_TIME, mStartTimeSec); proto.write(FIELD_TYPE_INT32 | FIELD_ID_END_TIME, (int32_t)time(nullptr)); VLOG("%lu Config in icebox: ", (unsigned long)mIceBox.size()); Loading Loading @@ -286,6 +298,10 @@ void StatsdStats::dumpStats(std::vector<int8_t>* output, bool reset) { for (const auto& dataDropTime : configStats.data_drop_time_sec()) { VLOG("\tdata drop time: %d", dataDropTime); } for (const auto& dumpTime : configStats.dump_report_time_sec()) { VLOG("\tdump report time: %d", dumpTime); } } addSubStatsToConfig(pair.first, configStats); Loading
cmds/statsd/src/guardrail/StatsdStats.h +17 −3 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #include "config/ConfigKey.h" #include "frameworks/base/cmds/statsd/src/stats_log.pb.h" #include <gtest/gtest_prod.h> #include <mutex> #include <string> #include <vector> Loading Loading @@ -63,7 +64,14 @@ public: /** * Report a config's metrics data has been dropped. */ void noteDataDrop(const ConfigKey& key); void noteDataDropped(const ConfigKey& key); /** * Report metrics data report has been sent. * * The report may be requested via StatsManager API, or through adb cmd. */ void noteMetricsReportSent(const ConfigKey& key); /** * Report the size of output tuple of a condition. Loading Loading @@ -114,14 +122,14 @@ public: * * [reset]: whether to clear the historical stats after the call. */ void dumpStats(std::vector<int8_t>* buffer, bool reset); void dumpStats(std::vector<uint8_t>* buffer, bool reset); private: StatsdStats(); mutable std::mutex mLock; int32_t mStartTime; int32_t mStartTimeSec; // The stats about the configs that are still in use. std::map<const ConfigKey, StatsdStatsReport_ConfigStats> mConfigStats; Loading Loading @@ -153,6 +161,12 @@ private: void resetInternalLocked(); void addSubStatsToConfig(const ConfigKey& key, StatsdStatsReport_ConfigStats& configStats); FRIEND_TEST(StatsdStatsTest, TestValidConfigAdd); FRIEND_TEST(StatsdStatsTest, TestInvalidConfigAdd); FRIEND_TEST(StatsdStatsTest, TestConfigRemove); FRIEND_TEST(StatsdStatsTest, TestSubStats); FRIEND_TEST(StatsdStatsTest, TestAtomLog); }; } // namespace statsd Loading
cmds/statsd/src/stats_log.proto +4 −3 Original line number Diff line number Diff line Loading @@ -206,9 +206,10 @@ message StatsdStatsReport { repeated int32 broadcast_sent_time_sec = 10; repeated int32 data_drop_time_sec = 11; repeated MatcherStats matcher_stats = 12; repeated ConditionStats condition_stats = 13; repeated MetricStats metric_stats = 14; repeated int32 dump_report_time_sec = 12; repeated MatcherStats matcher_stats = 13; repeated ConditionStats condition_stats = 14; repeated MetricStats metric_stats = 15; } repeated ConfigStats config_stats = 3; Loading