blob: 8bbcd751252a6da698d06b07891cccf0c9e7c47b [file] [log] [blame]
Yao Chenab273e22017-09-06 12:53:50 -07001/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Yao Chenab273e22017-09-06 12:53:50 -070016
Yangster-mac20877162017-12-22 17:19:39 -080017#pragma once
18
19#include <gtest/gtest_prod.h>
Joe Onorato9fc9edf2017-10-15 20:08:52 -070020#include "config/ConfigListener.h"
21#include "logd/LogReader.h"
Yao Chen44cf27c2017-09-14 22:32:50 -070022#include "metrics/MetricsManager.h"
Joe Onorato9fc9edf2017-10-15 20:08:52 -070023#include "packages/UidMap.h"
Chenjie Yufa22d652018-02-05 14:37:48 -080024#include "external/StatsPullerManager.h"
Joe Onorato9fc9edf2017-10-15 20:08:52 -070025
26#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
Yao Chenab273e22017-09-06 12:53:50 -070027
Yao Chen44cf27c2017-09-14 22:32:50 -070028#include <stdio.h>
David Chen0656b7a2017-09-13 15:53:39 -070029#include <unordered_map>
30
Bookatz906a35c2017-09-20 15:26:44 -070031namespace android {
32namespace os {
33namespace statsd {
Yao Chenab273e22017-09-06 12:53:50 -070034
Joe Onorato9fc9edf2017-10-15 20:08:52 -070035class StatsLogProcessor : public ConfigListener {
Yao Chenab273e22017-09-06 12:53:50 -070036public:
Yangster-mace2cd6d52017-11-09 20:38:30 -080037 StatsLogProcessor(const sp<UidMap>& uidMap, const sp<AnomalyMonitor>& anomalyMonitor,
Yangster-mac20877162017-12-22 17:19:39 -080038 const long timeBaseSec,
David Chen1d7b0cd2017-11-15 14:20:04 -080039 const std::function<void(const ConfigKey&)>& sendBroadcast);
Yao Chenab273e22017-09-06 12:53:50 -070040 virtual ~StatsLogProcessor();
41
Yangster-macd40053e2018-01-09 16:29:22 -080042 void OnLogEvent(LogEvent* event);
Yao Chenab273e22017-09-06 12:53:50 -070043
Joe Onorato9fc9edf2017-10-15 20:08:52 -070044 void OnConfigUpdated(const ConfigKey& key, const StatsdConfig& config);
45 void OnConfigRemoved(const ConfigKey& key);
David Chen0656b7a2017-09-13 15:53:39 -070046
Yangster7c334a12017-11-22 14:24:24 -080047 size_t GetMetricsSize(const ConfigKey& key) const;
48
David Chen1d7b0cd2017-11-15 14:20:04 -080049 void onDumpReport(const ConfigKey& key, vector<uint8_t>* outData);
Yangster-macd40053e2018-01-09 16:29:22 -080050 void onDumpReport(const ConfigKey& key, const uint64_t& dumpTimeStampNs,
51 ConfigMetricsReportList* report);
Bookatzcc5adef22017-11-21 14:36:23 -080052
53 /* Tells MetricsManager that the alarms in anomalySet have fired. Modifies anomalySet. */
Yangster-mace2cd6d52017-11-09 20:38:30 -080054 void onAnomalyAlarmFired(
55 const uint64_t timestampNs,
56 unordered_set<sp<const AnomalyAlarm>, SpHash<AnomalyAlarm>> anomalySet);
yro31eb67b2017-10-24 13:33:21 -070057
yro947fbce2017-11-15 22:50:23 -080058 /* Flushes data to disk. Data on memory will be gone after written to disk. */
59 void WriteDataToDisk();
60
Yangster-macb5bc7412018-01-06 23:17:45 -080061 inline sp<UidMap> getUidMap() {
62 return mUidMap;
63 }
64
Yao Chen884c8c12018-01-26 10:36:25 -080065 void dumpStates(FILE* out, bool verbose);
66
Yao Chenab273e22017-09-06 12:53:50 -070067private:
Yangster-macb0d06282018-01-05 15:44:07 -080068 mutable mutex mMetricsMutex;
David Chen1d7b0cd2017-11-15 14:20:04 -080069
Yao Chend10f7b12017-12-18 12:53:50 -080070 std::unordered_map<ConfigKey, sp<MetricsManager>> mMetricsManagers;
David Chende701692017-10-05 13:16:02 -070071
David Chen1d7b0cd2017-11-15 14:20:04 -080072 std::unordered_map<ConfigKey, long> mLastBroadcastTimes;
yro69007c82017-10-26 20:42:57 -070073
David Chend9269e22017-12-05 13:43:51 -080074 // Tracks when we last checked the bytes consumed for each config key.
75 std::unordered_map<ConfigKey, long> mLastByteSizeTimes;
76
Joe Onorato9fc9edf2017-10-15 20:08:52 -070077 sp<UidMap> mUidMap; // Reference to the UidMap to lookup app name and version for each uid.
yro31eb67b2017-10-24 13:33:21 -070078
Chenjie Yufa22d652018-02-05 14:37:48 -080079 StatsPullerManager mStatsPullerManager;
80
Yangster-mace2cd6d52017-11-09 20:38:30 -080081 sp<AnomalyMonitor> mAnomalyMonitor;
82
Yangster-mac86179502018-01-23 15:47:15 -080083 void onDumpReportLocked(const ConfigKey& key, vector<uint8_t>* outData);
84
David Chen1d7b0cd2017-11-15 14:20:04 -080085 /* Check if we should send a broadcast if approaching memory limits and if we're over, we
86 * actually delete the data. */
Yangster-macb0d06282018-01-05 15:44:07 -080087 void flushIfNecessaryLocked(uint64_t timestampNs, const ConfigKey& key,
88 MetricsManager& metricsManager);
yro31eb67b2017-10-24 13:33:21 -070089
Yangster-macd40053e2018-01-09 16:29:22 -080090 // Maps the isolated uid in the log event to host uid if the log event contains uid fields.
91 void mapIsolatedUidToHostUidIfNecessaryLocked(LogEvent* event) const;
92
93 // Handler over the isolated uid change event.
94 void onIsolatedUidChangedEventLocked(const LogEvent& event);
95
David Chen1d7b0cd2017-11-15 14:20:04 -080096 // Function used to send a broadcast so that receiver for the config key can call getData
97 // to retrieve the stored data.
98 std::function<void(const ConfigKey& key)> mSendBroadcast;
yro69007c82017-10-26 20:42:57 -070099
Chenjie Yu85ed8382017-12-14 16:48:54 -0800100 const long mTimeBaseSec;
101
Chenjie Yufa22d652018-02-05 14:37:48 -0800102 long mLastPullerCacheClearTimeSec = 0;
103
David Chend9269e22017-12-05 13:43:51 -0800104 FRIEND_TEST(StatsLogProcessorTest, TestRateLimitByteSize);
105 FRIEND_TEST(StatsLogProcessorTest, TestRateLimitBroadcast);
106 FRIEND_TEST(StatsLogProcessorTest, TestDropWhenByteSizeTooLarge);
Yangster-mac20877162017-12-22 17:19:39 -0800107 FRIEND_TEST(StatsLogProcessorTest, TestDropWhenByteSizeTooLarge);
David Chen27785a82018-01-19 17:06:45 -0800108 FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration);
109 FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForMaxDuration);
Yangster-mac20877162017-12-22 17:19:39 -0800110 FRIEND_TEST(MetricConditionLinkE2eTest, TestMultiplePredicatesAndLinks);
Yangster-macb5bc7412018-01-06 23:17:45 -0800111 FRIEND_TEST(AttributionE2eTest, TestAttributionMatchAndSlice);
Yangster-mac87718e22018-01-11 16:16:26 -0800112 FRIEND_TEST(GaugeMetricE2eTest, TestMultipleFieldsForPushedEvent);
Yangster-mac93694462018-01-22 20:49:31 -0800113 FRIEND_TEST(DimensionInConditionE2eTest, TestCountMetricNoLink);
114 FRIEND_TEST(DimensionInConditionE2eTest, TestCountMetricWithLink);
115 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetricNoLink);
116 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetricWithLink);
Yao Chenab273e22017-09-06 12:53:50 -0700117};
Bookatz906a35c2017-09-20 15:26:44 -0700118
Yao Chenef99c4f2017-09-22 16:26:54 -0700119} // namespace statsd
120} // namespace os
121} // namespace android