blob: 86eb855825aa8a9a206aa72053be8ec7f274fbb3 [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
Chenjie Yue36018b2018-04-16 15:18:30 -070035// Keep this in sync with DumpReportReason enum in stats_log.proto
36enum DumpReportReason {
37 DEVICE_SHUTDOWN = 1,
38 CONFIG_UPDATED = 2,
39 CONFIG_REMOVED = 3,
40 GET_DATA_CALLED = 4,
41 ADB_DUMP = 5,
42 CONFIG_RESET = 6,
Yang Lu658bc0e2018-10-19 09:03:51 -070043 STATSCOMPANION_DIED = 7,
44 TERMINATION_SIGNAL_RECEIVED = 8
Chenjie Yue36018b2018-04-16 15:18:30 -070045};
46
Joe Onorato9fc9edf2017-10-15 20:08:52 -070047class StatsLogProcessor : public ConfigListener {
Yao Chenab273e22017-09-06 12:53:50 -070048public:
Yangster-mac932ecec2018-02-01 10:23:52 -080049 StatsLogProcessor(const sp<UidMap>& uidMap, const sp<AlarmMonitor>& anomalyAlarmMonitor,
50 const sp<AlarmMonitor>& subscriberTriggerAlarmMonitor,
Yangster-mac15f6bbc2018-04-08 11:52:26 -070051 const int64_t timeBaseNs,
David Chen48944902018-05-03 10:29:11 -070052 const std::function<bool(const ConfigKey&)>& sendBroadcast);
Yao Chenab273e22017-09-06 12:53:50 -070053 virtual ~StatsLogProcessor();
54
Yao Chen163d2602018-04-10 10:39:53 -070055 void OnLogEvent(LogEvent* event, bool reconnectionStarts);
56
57 // for testing only.
Yangster-macd40053e2018-01-09 16:29:22 -080058 void OnLogEvent(LogEvent* event);
Yao Chenab273e22017-09-06 12:53:50 -070059
Yangster-macc04feba2018-04-02 14:37:33 -070060 void OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key,
61 const StatsdConfig& config);
Joe Onorato9fc9edf2017-10-15 20:08:52 -070062 void OnConfigRemoved(const ConfigKey& key);
David Chen0656b7a2017-09-13 15:53:39 -070063
Yangster7c334a12017-11-22 14:24:24 -080064 size_t GetMetricsSize(const ConfigKey& key) const;
65
Yangster-mace68f3a52018-04-04 00:01:43 -070066 void onDumpReport(const ConfigKey& key, const int64_t dumpTimeNs,
David Chen56ae0d92018-05-11 16:00:22 -070067 const bool include_current_partial_bucket,
Chenjie Yue36018b2018-04-16 15:18:30 -070068 const DumpReportReason dumpReportReason, vector<uint8_t>* outData);
Bookatzcc5adef2017-11-21 14:36:23 -080069
Yangster-mac932ecec2018-02-01 10:23:52 -080070 /* Tells MetricsManager that the alarms in alarmSet have fired. Modifies anomaly alarmSet. */
Yangster-mace2cd6d52017-11-09 20:38:30 -080071 void onAnomalyAlarmFired(
Yangster-macb142cc82018-03-30 15:22:08 -070072 const int64_t& timestampNs,
Yangster-mac932ecec2018-02-01 10:23:52 -080073 unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet);
74
75 /* Tells MetricsManager that the alarms in alarmSet have fired. Modifies periodic alarmSet. */
76 void onPeriodicAlarmFired(
Yangster-macb142cc82018-03-30 15:22:08 -070077 const int64_t& timestampNs,
Yangster-mac932ecec2018-02-01 10:23:52 -080078 unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet);
yro31eb67b2017-10-24 13:33:21 -070079
yro947fbce2017-11-15 22:50:23 -080080 /* Flushes data to disk. Data on memory will be gone after written to disk. */
Yangster-mac892f3d32018-05-02 14:16:48 -070081 void WriteDataToDisk(const DumpReportReason dumpReportReason);
82
83 // Reset all configs.
84 void resetConfigs();
yro947fbce2017-11-15 22:50:23 -080085
Yangster-macb5bc7412018-01-06 23:17:45 -080086 inline sp<UidMap> getUidMap() {
87 return mUidMap;
88 }
89
Yao Chen884c8c12018-01-26 10:36:25 -080090 void dumpStates(FILE* out, bool verbose);
91
Yangster-mac15f6bbc2018-04-08 11:52:26 -070092 void informPullAlarmFired(const int64_t timestampNs);
Yangster-macb142cc82018-03-30 15:22:08 -070093
David Chend37bc232018-04-12 18:05:11 -070094 int64_t getLastReportTimeNs(const ConfigKey& key);
95
Yao Chen876889c2018-05-02 11:16:16 -070096 inline void setPrintLogs(bool enabled) {
97#ifdef VERY_VERBOSE_PRINTING
98 std::lock_guard<std::mutex> lock(mMetricsMutex);
99 mPrintAllLogs = enabled;
100#endif
101 }
102
David Chen48944902018-05-03 10:29:11 -0700103 // Add a specific config key to the possible configs to dump ASAP.
104 void noteOnDiskData(const ConfigKey& key);
105
Yao Chenab273e22017-09-06 12:53:50 -0700106private:
Yangster-macbe10ddf2018-03-13 15:39:51 -0700107 // For testing only.
108 inline sp<AlarmMonitor> getAnomalyAlarmMonitor() const {
109 return mAnomalyAlarmMonitor;
110 }
111
Yangster-mac684d1952018-03-24 16:47:16 -0700112 inline sp<AlarmMonitor> getPeriodicAlarmMonitor() const {
113 return mPeriodicAlarmMonitor;
114 }
115
Yangster-macb0d06282018-01-05 15:44:07 -0800116 mutable mutex mMetricsMutex;
David Chen1d7b0cd2017-11-15 14:20:04 -0800117
Yao Chend10f7b12017-12-18 12:53:50 -0800118 std::unordered_map<ConfigKey, sp<MetricsManager>> mMetricsManagers;
David Chende701692017-10-05 13:16:02 -0700119
David Chen1d7b0cd2017-11-15 14:20:04 -0800120 std::unordered_map<ConfigKey, long> mLastBroadcastTimes;
yro69007c82017-10-26 20:42:57 -0700121
David Chend9269e22017-12-05 13:43:51 -0800122 // Tracks when we last checked the bytes consumed for each config key.
123 std::unordered_map<ConfigKey, long> mLastByteSizeTimes;
124
David Chen48944902018-05-03 10:29:11 -0700125 // Tracks which config keys has metric reports on disk
126 std::set<ConfigKey> mOnDiskDataConfigs;
127
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700128 sp<UidMap> mUidMap; // Reference to the UidMap to lookup app name and version for each uid.
yro31eb67b2017-10-24 13:33:21 -0700129
Chenjie Yufa22d652018-02-05 14:37:48 -0800130 StatsPullerManager mStatsPullerManager;
131
Yangster-mac932ecec2018-02-01 10:23:52 -0800132 sp<AlarmMonitor> mAnomalyAlarmMonitor;
133
134 sp<AlarmMonitor> mPeriodicAlarmMonitor;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800135
Yangster-macb142cc82018-03-30 15:22:08 -0700136 void resetIfConfigTtlExpiredLocked(const int64_t timestampNs);
137
138 void OnConfigUpdatedLocked(
139 const int64_t currentTimestampNs, const ConfigKey& key, const StatsdConfig& config);
140
Yangster-mac892f3d32018-05-02 14:16:48 -0700141 void WriteDataToDiskLocked(const DumpReportReason dumpReportReason);
142 void WriteDataToDiskLocked(const ConfigKey& key, const int64_t timestampNs,
143 const DumpReportReason dumpReportReason);
Yangster-mace68f3a52018-04-04 00:01:43 -0700144
Yangster-macb142cc82018-03-30 15:22:08 -0700145 void onConfigMetricsReportLocked(const ConfigKey& key, const int64_t dumpTimeStampNs,
Yangster-mace68f3a52018-04-04 00:01:43 -0700146 const bool include_current_partial_bucket,
Chenjie Yue36018b2018-04-16 15:18:30 -0700147 const DumpReportReason dumpReportReason,
yro4beccbe2018-03-15 19:42:05 -0700148 util::ProtoOutputStream* proto);
Yangster-mac86179502018-01-23 15:47:15 -0800149
David Chen1d7b0cd2017-11-15 14:20:04 -0800150 /* Check if we should send a broadcast if approaching memory limits and if we're over, we
151 * actually delete the data. */
Yangster-macb142cc82018-03-30 15:22:08 -0700152 void flushIfNecessaryLocked(int64_t timestampNs, const ConfigKey& key,
Yangster-macb0d06282018-01-05 15:44:07 -0800153 MetricsManager& metricsManager);
yro31eb67b2017-10-24 13:33:21 -0700154
Yangster-macd40053e2018-01-09 16:29:22 -0800155 // Maps the isolated uid in the log event to host uid if the log event contains uid fields.
156 void mapIsolatedUidToHostUidIfNecessaryLocked(LogEvent* event) const;
157
158 // Handler over the isolated uid change event.
159 void onIsolatedUidChangedEventLocked(const LogEvent& event);
160
Yangster-mac892f3d32018-05-02 14:16:48 -0700161 // Reset all configs.
162 void resetConfigsLocked(const int64_t timestampNs);
163 // Reset the specified configs.
Yao Chen163d2602018-04-10 10:39:53 -0700164 void resetConfigsLocked(const int64_t timestampNs, const std::vector<ConfigKey>& configs);
165
David Chen1d7b0cd2017-11-15 14:20:04 -0800166 // Function used to send a broadcast so that receiver for the config key can call getData
167 // to retrieve the stored data.
David Chen48944902018-05-03 10:29:11 -0700168 std::function<bool(const ConfigKey& key)> mSendBroadcast;
yro69007c82017-10-26 20:42:57 -0700169
Yangster-mac15f6bbc2018-04-08 11:52:26 -0700170 const int64_t mTimeBaseNs;
Chenjie Yu85ed8382017-12-14 16:48:54 -0800171
Yao Chen163d2602018-04-10 10:39:53 -0700172 // Largest timestamp of the events that we have processed.
173 int64_t mLargestTimestampSeen = 0;
174
175 int64_t mLastTimestampSeen = 0;
176
177 bool mInReconnection = false;
178
179 // Processed log count
180 uint64_t mLogCount = 0;
181
182 // Log loss detected count
183 int mLogLossCount = 0;
Yao Chen8f42ba02018-02-27 15:17:07 -0800184
Chenjie Yufa22d652018-02-05 14:37:48 -0800185 long mLastPullerCacheClearTimeSec = 0;
186
Tej Singh42f9e062018-11-09 10:01:00 -0800187 // Last time we wrote data to disk.
188 int64_t mLastWriteTimeNs = 0;
189
Yao Chen876889c2018-05-02 11:16:16 -0700190#ifdef VERY_VERBOSE_PRINTING
191 bool mPrintAllLogs = false;
192#endif
193
Yao Chen163d2602018-04-10 10:39:53 -0700194 FRIEND_TEST(StatsLogProcessorTest, TestOutOfOrderLogs);
David Chend9269e22017-12-05 13:43:51 -0800195 FRIEND_TEST(StatsLogProcessorTest, TestRateLimitByteSize);
196 FRIEND_TEST(StatsLogProcessorTest, TestRateLimitBroadcast);
197 FRIEND_TEST(StatsLogProcessorTest, TestDropWhenByteSizeTooLarge);
Yao Chen8a8d16c2018-02-08 14:50:40 -0800198 FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration1);
199 FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration2);
200 FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration3);
201 FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForMaxDuration1);
202 FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForMaxDuration2);
203 FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForMaxDuration3);
204 FRIEND_TEST(MetricConditionLinkE2eTest, TestMultiplePredicatesAndLinks1);
205 FRIEND_TEST(MetricConditionLinkE2eTest, TestMultiplePredicatesAndLinks2);
Yangster-mace06cfd72018-03-10 23:22:59 -0800206 FRIEND_TEST(AttributionE2eTest, TestAttributionMatchAndSliceByFirstUid);
207 FRIEND_TEST(AttributionE2eTest, TestAttributionMatchAndSliceByChain);
Yangster-mac87718e22018-01-11 16:16:26 -0800208 FRIEND_TEST(GaugeMetricE2eTest, TestMultipleFieldsForPushedEvent);
Yangster-mac15f6bbc2018-04-08 11:52:26 -0700209 FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvents);
210 FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvent_LateAlarm);
211 FRIEND_TEST(GaugeMetricE2eTest, TestAllConditionChangesSamplePulledEvents);
212 FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents);
213 FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm);
214
Yangster13fb7e42018-03-07 17:30:49 -0800215 FRIEND_TEST(DimensionInConditionE2eTest, TestCreateCountMetric_NoLink_OR_CombinationCondition);
216 FRIEND_TEST(DimensionInConditionE2eTest, TestCreateCountMetric_Link_OR_CombinationCondition);
217 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_OR_CombinationCondition);
218 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_Link_OR_CombinationCondition);
219
220 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_SimpleCondition);
221 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_Link_SimpleCondition);
222 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_SimpleCondition);
223
Yangster13fb7e42018-03-07 17:30:49 -0800224 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_CombinationCondition);
225 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondition);
226 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_Link_AND_CombinationCondition);
227
Yangster-macbe10ddf2018-03-13 15:39:51 -0700228 FRIEND_TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_single_bucket);
229 FRIEND_TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_multiple_buckets);
230 FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_single_bucket);
231 FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_multiple_buckets);
232 FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_long_refractory_period);
Yangster-macb142cc82018-03-30 15:22:08 -0700233
Yangster-mac684d1952018-03-24 16:47:16 -0700234 FRIEND_TEST(AlarmE2eTest, TestMultipleAlarms);
Yangster-macb142cc82018-03-30 15:22:08 -0700235 FRIEND_TEST(ConfigTtlE2eTest, TestCountMetric);
Yao Chenab273e22017-09-06 12:53:50 -0700236};
Bookatz906a35c2017-09-20 15:26:44 -0700237
Yao Chenef99c4f2017-09-22 16:26:54 -0700238} // namespace statsd
239} // namespace os
240} // namespace android