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