StatsLogProcessor.h revision 31eb67b3498d326659b2b164ff367a01a793d641
1ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen/* 2ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen * Copyright (C) 2017 The Android Open Source Project 3ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen * 4ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen * you may not use this file except in compliance with the License. 6ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen * You may obtain a copy of the License at 7ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen * 8ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen * http://www.apache.org/licenses/LICENSE-2.0 9ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen * 10ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen * Unless required by applicable law or agreed to in writing, software 11ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen * distributed under the License is distributed on an "AS IS" BASIS, 12ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen * See the License for the specific language governing permissions and 14ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen * limitations under the License. 15ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen */ 16ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen#ifndef STATS_LOG_PROCESSOR_H 17ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen#define STATS_LOG_PROCESSOR_H 18ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen 199fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato#include "config/ConfigListener.h" 209fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato#include "logd/LogReader.h" 2144cf27c14880005df093f372491c593e1a9a3c58Yao Chen#include "metrics/MetricsManager.h" 229fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato#include "packages/UidMap.h" 239fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato#include "storage/DropboxWriter.h" 249fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato 259fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h" 26ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen 2744cf27c14880005df093f372491c593e1a9a3c58Yao Chen#include <stdio.h> 280656b7a158f6f71989e76ba55423217e3e75d8b4David Chen#include <unordered_map> 290656b7a158f6f71989e76ba55423217e3e75d8b4David Chen 30906a35c814817c8bd503c3f4df8af9a2f622169dBookatznamespace android { 31906a35c814817c8bd503c3f4df8af9a2f622169dBookatznamespace os { 32906a35c814817c8bd503c3f4df8af9a2f622169dBookatznamespace statsd { 33ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen 349fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onoratoclass StatsLogProcessor : public ConfigListener { 35ab273e2e13f87d57f66395c52df424710b8066e1Yao Chenpublic: 3631eb67b3498d326659b2b164ff367a01a793d641yro StatsLogProcessor(const sp<UidMap>& uidMap, 3731eb67b3498d326659b2b164ff367a01a793d641yro const std::function<void(const vector<uint8_t>&)>& pushLog); 38ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen virtual ~StatsLogProcessor(); 39ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen 40c4dfae56c10a1dd571baa78c750f2e68c919d74fJoe Onorato virtual void OnLogEvent(const LogEvent& event); 41ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen 429fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato void OnConfigUpdated(const ConfigKey& key, const StatsdConfig& config); 439fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato void OnConfigRemoved(const ConfigKey& key); 440656b7a158f6f71989e76ba55423217e3e75d8b4David Chen 45729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen // TODO: Once we have the ProtoOutputStream in c++, we can just return byte array. 46729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen std::vector<StatsLogReport> onDumpReport(const ConfigKey& key); 47729093df0dd7d7038ad43b16ecdb59a1404f3b50Yao Chen 4831eb67b3498d326659b2b164ff367a01a793d641yro /* Request a flush through a binder call. */ 4931eb67b3498d326659b2b164ff367a01a793d641yro void flush(); 5031eb67b3498d326659b2b164ff367a01a793d641yro 51ab273e2e13f87d57f66395c52df424710b8066e1Yao Chenprivate: 5244cf27c14880005df093f372491c593e1a9a3c58Yao Chen // TODO: use EventMetrics to log the events. 53ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen DropboxWriter m_dropbox_writer; 540656b7a158f6f71989e76ba55423217e3e75d8b4David Chen 559fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato std::unordered_map<ConfigKey, std::unique_ptr<MetricsManager>> mMetricsManagers; 56de70169109c57787a23c732ec4b361ade2e9850eDavid Chen 579fc9edf95a308f5884bf541cac81ce1f41aba0baJoe Onorato sp<UidMap> mUidMap; // Reference to the UidMap to lookup app name and version for each uid. 5831eb67b3498d326659b2b164ff367a01a793d641yro 5931eb67b3498d326659b2b164ff367a01a793d641yro /* Max *serialized* size of the logs kept in memory before flushing through binder call. 6031eb67b3498d326659b2b164ff367a01a793d641yro Proto lite does not implement the SpaceUsed() function which gives the in memory byte size. 6131eb67b3498d326659b2b164ff367a01a793d641yro So we cap memory usage by limiting the serialized size. Note that protobuf's in memory size 6231eb67b3498d326659b2b164ff367a01a793d641yro is higher than its serialized size. 6331eb67b3498d326659b2b164ff367a01a793d641yro */ 6431eb67b3498d326659b2b164ff367a01a793d641yro static const size_t kMaxSerializedBytes = 16 * 1024; 6531eb67b3498d326659b2b164ff367a01a793d641yro 6631eb67b3498d326659b2b164ff367a01a793d641yro /* List of data that was captured for a single metric over a given interval of time. */ 6731eb67b3498d326659b2b164ff367a01a793d641yro vector<string> mEvents; 6831eb67b3498d326659b2b164ff367a01a793d641yro 6931eb67b3498d326659b2b164ff367a01a793d641yro /* Current *serialized* size of the logs kept in memory. 7031eb67b3498d326659b2b164ff367a01a793d641yro To save computation, we will not calculate the size of the StatsLogReport every time when a 7131eb67b3498d326659b2b164ff367a01a793d641yro new entry is added, which would recursively call ByteSize() on every log entry. Instead, we 7231eb67b3498d326659b2b164ff367a01a793d641yro keep the sum of all individual stats log entry sizes. The size of a proto is approximately 7331eb67b3498d326659b2b164ff367a01a793d641yro the sum of the size of all member protos. 7431eb67b3498d326659b2b164ff367a01a793d641yro */ 7531eb67b3498d326659b2b164ff367a01a793d641yro size_t mBufferSize = 0; 7631eb67b3498d326659b2b164ff367a01a793d641yro 7731eb67b3498d326659b2b164ff367a01a793d641yro /* Check if the buffer size exceeds the max buffer size when the new entry is added, and flush 7831eb67b3498d326659b2b164ff367a01a793d641yro the logs to dropbox if true. */ 7931eb67b3498d326659b2b164ff367a01a793d641yro void flushIfNecessary(const EventMetricData& eventMetricData); 8031eb67b3498d326659b2b164ff367a01a793d641yro 8131eb67b3498d326659b2b164ff367a01a793d641yro /* Append event metric data to StatsLogReport. */ 8231eb67b3498d326659b2b164ff367a01a793d641yro void addEventMetricData(const EventMetricData& eventMetricData); 8331eb67b3498d326659b2b164ff367a01a793d641yro 8431eb67b3498d326659b2b164ff367a01a793d641yro std::function<void(const vector<uint8_t>&)> mPushLog; 85ab273e2e13f87d57f66395c52df424710b8066e1Yao Chen}; 86906a35c814817c8bd503c3f4df8af9a2f622169dBookatz 87ef99c4fa23b42fe6e58db706b9f4780018b6bf3eYao Chen} // namespace statsd 88ef99c4fa23b42fe6e58db706b9f4780018b6bf3eYao Chen} // namespace os 89ef99c4fa23b42fe6e58db706b9f4780018b6bf3eYao Chen} // namespace android 90906a35c814817c8bd503c3f4df8af9a2f622169dBookatz 91ef99c4fa23b42fe6e58db706b9f4780018b6bf3eYao Chen#endif // STATS_LOG_PROCESSOR_H 92