diff options
author | Scott Lobdell <slobdell@google.com> | 2019-02-19 10:33:50 -0800 |
---|---|---|
committer | Scott Lobdell <slobdell@google.com> | 2019-02-19 11:36:09 -0800 |
commit | 81b587a542e8381268a9ba8e7461712ef23cd11f (patch) | |
tree | bace051dc4f3efad7dcd091ea0481167815bfaa7 /cmds/statsd/src/StatsLogProcessor.cpp | |
parent | bf4a1865530dd9a1e4b203d4e9d67fce0958c3fa (diff) | |
parent | 13327cc461d8f54550866bc404a99205f95ab92f (diff) |
Merge QP1A.190212.003
Conflicts:
core/java/android/view/SurfaceControl.java
media/java/android/media/MediaCodecInfo.java
packages/SettingsLib/res/values/strings.xml
services/core/java/com/android/server/am/ActiveServices.java
services/core/java/com/android/server/am/OomAdjuster.java
services/core/java/com/android/server/audio/AudioDeviceInventory.java
services/core/java/com/android/server/display/LocalDisplayAdapter.java
services/core/java/com/android/server/wm/ActivityDisplay.java
services/core/java/com/android/server/wm/DisplayPolicy.java
Change-Id: Idc7582978996d2f7c44f599f221e8d7cc9eedf43
Diffstat (limited to 'cmds/statsd/src/StatsLogProcessor.cpp')
-rw-r--r-- | cmds/statsd/src/StatsLogProcessor.cpp | 80 |
1 files changed, 77 insertions, 3 deletions
diff --git a/cmds/statsd/src/StatsLogProcessor.cpp b/cmds/statsd/src/StatsLogProcessor.cpp index 69cb264ef237..dd18bd4cc8ad 100644 --- a/cmds/statsd/src/StatsLogProcessor.cpp +++ b/cmds/statsd/src/StatsLogProcessor.cpp @@ -14,18 +14,19 @@ * limitations under the License. */ -#define DEBUG false // STOPSHIP if true +#define DEBUG false // STOPSHIP if true #include "Log.h" #include "statslog.h" #include <android-base/file.h> #include <dirent.h> +#include <frameworks/base/cmds/statsd/src/active_config_list.pb.h> #include "StatsLogProcessor.h" -#include "stats_log_util.h" #include "android-base/stringprintf.h" +#include "external/StatsPullerManager.h" #include "guardrail/StatsdStats.h" #include "metrics/CountMetricProducer.h" -#include "external/StatsPullerManager.h" +#include "stats_log_util.h" #include "stats_util.h" #include "storage/StorageManager.h" @@ -67,9 +68,17 @@ const int FIELD_ID_CURRENT_REPORT_WALL_CLOCK_NANOS = 6; const int FIELD_ID_DUMP_REPORT_REASON = 8; const int FIELD_ID_STRINGS = 9; +const int FIELD_ID_ACTIVE_CONFIG_LIST = 1; +const int FIELD_ID_CONFIG_ID = 1; +const int FIELD_ID_CONFIG_UID = 2; +const int FIELD_ID_ACTIVE_METRIC = 3; +const int FIELD_ID_METRIC_ID = 1; +const int FIELD_ID_TIME_TO_LIVE_NANOS = 2; + #define NS_PER_HOUR 3600 * NS_PER_SEC #define STATS_DATA_DIR "/data/misc/stats-data" +#define STATS_ACTIVE_METRIC_DIR "/data/misc/stats-active-metric" // Cool down period for writing data to disk to avoid overwriting files. #define WRITE_DATA_COOL_DOWN_SEC 5 @@ -507,6 +516,71 @@ void StatsLogProcessor::WriteDataToDiskLocked(const ConfigKey& key, mOnDiskDataConfigs.insert(key); } +void StatsLogProcessor::WriteMetricsActivationToDisk(int64_t currentTimeNs) { + std::lock_guard<std::mutex> lock(mMetricsMutex); + ProtoOutputStream proto; + + for (const auto& pair : mMetricsManagers) { + uint64_t activeConfigListToken = proto.start(FIELD_TYPE_MESSAGE | FIELD_COUNT_REPEATED | + FIELD_ID_ACTIVE_CONFIG_LIST); + 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<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); + proto.write(FIELD_TYPE_INT64 | FIELD_ID_METRIC_ID, + (long long)metric->getMetricId()); + proto.write(FIELD_TYPE_INT64 | FIELD_ID_TIME_TO_LIVE_NANOS, + (long long)metric->getRemainingTtlNs(currentTimeNs)); + proto.end(metricToken); + } + } + proto.end(activeConfigListToken); + } + + string file_name = StringPrintf("%s/active_metrics", STATS_ACTIVE_METRIC_DIR); + StorageManager::deleteFile(file_name.c_str()); + android::base::unique_fd fd( + open(file_name.c_str(), O_WRONLY | O_CREAT | O_CLOEXEC, S_IRUSR | S_IWUSR)); + if (fd == -1) { + ALOGE("Attempt to write %s but failed", file_name.c_str()); + return; + } + proto.flush(fd.get()); +} + +void StatsLogProcessor::LoadMetricsActivationFromDisk() { + string file_name = StringPrintf("%s/active_metrics", STATS_ACTIVE_METRIC_DIR); + int fd = open(file_name.c_str(), O_RDONLY | O_CLOEXEC); + if (fd != -1) { + string content; + if (android::base::ReadFdToString(fd, &content)) { + ActiveConfigList activeConfigList; + if (activeConfigList.ParseFromString(content)) { + for (int i = 0; i < activeConfigList.active_config_size(); i++) { + const auto& config = activeConfigList.active_config(i); + ConfigKey key(config.uid(), config.config_id()); + auto it = mMetricsManagers.find(key); + if (it == mMetricsManagers.end()) { + ALOGE("No config found for config %s", key.ToString().c_str()); + continue; + } + VLOG("Setting active config %s", key.ToString().c_str()); + it->second->setActiveMetrics(config, mTimeBaseNs); + } + } + VLOG("Successfully loaded %d active configs.", activeConfigList.active_config_size()); + } + close(fd); + } + StorageManager::deleteFile(file_name.c_str()); +} + 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. |