blob: 2c8382df2828f4fd3cf038eb27dd983e3b3c7e18 [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"
Yao Chen44cf27c2017-09-14 22:32:50 -070021#include "metrics/MetricsManager.h"
Joe Onorato9fc9edf2017-10-15 20:08:52 -070022#include "packages/UidMap.h"
Chenjie Yufa22d652018-02-05 14:37:48 -080023#include "external/StatsPullerManager.h"
Joe Onorato9fc9edf2017-10-15 20:08:52 -070024
25#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
Yao Chenab273e22017-09-06 12:53:50 -070026
Yao Chen44cf27c2017-09-14 22:32:50 -070027#include <stdio.h>
David Chen0656b7a2017-09-13 15:53:39 -070028#include <unordered_map>
29
Bookatz906a35c2017-09-20 15:26:44 -070030namespace android {
31namespace os {
32namespace statsd {
Yao Chenab273e22017-09-06 12:53:50 -070033
Chenjie Yue36018b2018-04-16 15:18:30 -070034// Keep this in sync with DumpReportReason enum in stats_log.proto
35enum DumpReportReason {
36 DEVICE_SHUTDOWN = 1,
37 CONFIG_UPDATED = 2,
38 CONFIG_REMOVED = 3,
39 GET_DATA_CALLED = 4,
40 ADB_DUMP = 5,
41 CONFIG_RESET = 6,
Yangster-mac97e7d202018-10-09 11:05:39 -070042 STATSCOMPANION_DIED = 7,
43 TERMINATION_SIGNAL_RECEIVED = 8
Chenjie Yue36018b2018-04-16 15:18:30 -070044};
45
Joe Onorato9fc9edf2017-10-15 20:08:52 -070046class StatsLogProcessor : public ConfigListener {
Yao Chenab273e22017-09-06 12:53:50 -070047public:
Chenjie Yue2219202018-06-08 10:07:51 -070048 StatsLogProcessor(const sp<UidMap>& uidMap, const sp<StatsPullerManager>& pullerManager,
49 const sp<AlarmMonitor>& anomalyAlarmMonitor,
Yangster-mac932ecec2018-02-01 10:23:52 -080050 const sp<AlarmMonitor>& subscriberTriggerAlarmMonitor,
Yangster-mac15f6bbc2018-04-08 11:52:26 -070051 const int64_t timeBaseNs,
Tej Singh6ede28b2019-01-29 17:06:54 -080052 const std::function<bool(const ConfigKey&)>& sendBroadcast,
53 const std::function<bool(const int&,
54 const vector<int64_t>&)>& sendActivationBroadcast);
Yao Chenab273e22017-09-06 12:53:50 -070055 virtual ~StatsLogProcessor();
56
Yangster-macd40053e2018-01-09 16:29:22 -080057 void OnLogEvent(LogEvent* event);
Yao Chenab273e22017-09-06 12:53:50 -070058
Yangster-macc04feba2018-04-02 14:37:33 -070059 void OnConfigUpdated(const int64_t timestampNs, const ConfigKey& key,
60 const StatsdConfig& config);
Joe Onorato9fc9edf2017-10-15 20:08:52 -070061 void OnConfigRemoved(const ConfigKey& key);
David Chen0656b7a2017-09-13 15:53:39 -070062
Yangster7c334a12017-11-22 14:24:24 -080063 size_t GetMetricsSize(const ConfigKey& key) const;
64
Tej Singh6ede28b2019-01-29 17:06:54 -080065 void GetActiveConfigs(const int uid, vector<int64_t>& outActiveConfigs);
66
Yangster-mace68f3a52018-04-04 00:01:43 -070067 void onDumpReport(const ConfigKey& key, const int64_t dumpTimeNs,
Bookatzff71cad2018-09-20 17:17:49 -070068 const bool include_current_partial_bucket, const bool erase_data,
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -070069 const DumpReportReason dumpReportReason,
Olivier Gaillard6c75ecd2019-02-20 09:57:33 +000070 const DumpLatency dumpLatency,
71 vector<uint8_t>* outData);
Bookatzff71cad2018-09-20 17:17:49 -070072 void onDumpReport(const ConfigKey& key, const int64_t dumpTimeNs,
73 const bool include_current_partial_bucket, const bool erase_data,
Olivier Gaillard6c75ecd2019-02-20 09:57:33 +000074 const DumpReportReason dumpReportReason,
75 const DumpLatency dumpLatency,
76 ProtoOutputStream* proto);
Bookatzcc5adef2017-11-21 14:36:23 -080077
Yangster-mac932ecec2018-02-01 10:23:52 -080078 /* Tells MetricsManager that the alarms in alarmSet have fired. Modifies anomaly alarmSet. */
Yangster-mace2cd6d52017-11-09 20:38:30 -080079 void onAnomalyAlarmFired(
Yangster-macb142cc82018-03-30 15:22:08 -070080 const int64_t& timestampNs,
Yangster-mac932ecec2018-02-01 10:23:52 -080081 unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet);
82
83 /* Tells MetricsManager that the alarms in alarmSet have fired. Modifies periodic alarmSet. */
84 void onPeriodicAlarmFired(
Yangster-macb142cc82018-03-30 15:22:08 -070085 const int64_t& timestampNs,
Yangster-mac932ecec2018-02-01 10:23:52 -080086 unordered_set<sp<const InternalAlarm>, SpHash<InternalAlarm>> alarmSet);
yro31eb67b2017-10-24 13:33:21 -070087
yro947fbce2017-11-15 22:50:23 -080088 /* Flushes data to disk. Data on memory will be gone after written to disk. */
Olivier Gaillard6c75ecd2019-02-20 09:57:33 +000089 void WriteDataToDisk(const DumpReportReason dumpReportReason,
90 const DumpLatency dumpLatency);
Yangster-mac892f3d32018-05-02 14:16:48 -070091
Muhammad Qureshi844694b2019-04-05 10:10:40 -070092 /* Persist configs containing metrics with active activations to disk. */
93 void SaveActiveConfigsToDisk(int64_t currentTimeNs);
Chenjie Yuc7939cb2019-02-04 17:25:45 -080094
Muhammad Qureshi844694b2019-04-05 10:10:40 -070095 /* Load configs containing metrics with active activations from disk. */
96 void LoadActiveConfigsFromDisk();
Chenjie Yuc7939cb2019-02-04 17:25:45 -080097
Yangster-mac892f3d32018-05-02 14:16:48 -070098 // Reset all configs.
99 void resetConfigs();
yro947fbce2017-11-15 22:50:23 -0800100
Yangster-macb5bc7412018-01-06 23:17:45 -0800101 inline sp<UidMap> getUidMap() {
102 return mUidMap;
103 }
104
Yao Chena80e5c02018-09-04 13:55:29 -0700105 void dumpStates(int outFd, bool verbose);
Yao Chen884c8c12018-01-26 10:36:25 -0800106
Yangster-mac15f6bbc2018-04-08 11:52:26 -0700107 void informPullAlarmFired(const int64_t timestampNs);
Yangster-macb142cc82018-03-30 15:22:08 -0700108
David Chend37bc232018-04-12 18:05:11 -0700109 int64_t getLastReportTimeNs(const ConfigKey& key);
110
Yao Chen876889c2018-05-02 11:16:16 -0700111 inline void setPrintLogs(bool enabled) {
112#ifdef VERY_VERBOSE_PRINTING
113 std::lock_guard<std::mutex> lock(mMetricsMutex);
114 mPrintAllLogs = enabled;
115#endif
116 }
117
David Chen48944902018-05-03 10:29:11 -0700118 // Add a specific config key to the possible configs to dump ASAP.
119 void noteOnDiskData(const ConfigKey& key);
120
Yao Chenab273e22017-09-06 12:53:50 -0700121private:
Yangster-macbe10ddf2018-03-13 15:39:51 -0700122 // For testing only.
123 inline sp<AlarmMonitor> getAnomalyAlarmMonitor() const {
124 return mAnomalyAlarmMonitor;
125 }
126
Yangster-mac684d1952018-03-24 16:47:16 -0700127 inline sp<AlarmMonitor> getPeriodicAlarmMonitor() const {
128 return mPeriodicAlarmMonitor;
129 }
130
Yangster-macb0d06282018-01-05 15:44:07 -0800131 mutable mutex mMetricsMutex;
David Chen1d7b0cd2017-11-15 14:20:04 -0800132
Yao Chend10f7b12017-12-18 12:53:50 -0800133 std::unordered_map<ConfigKey, sp<MetricsManager>> mMetricsManagers;
David Chende701692017-10-05 13:16:02 -0700134
David Chen1d7b0cd2017-11-15 14:20:04 -0800135 std::unordered_map<ConfigKey, long> mLastBroadcastTimes;
yro69007c82017-10-26 20:42:57 -0700136
Tej Singh6ede28b2019-01-29 17:06:54 -0800137 // Last time we sent a broadcast to this uid that the active configs had changed.
138 std::unordered_map<int, long> mLastActivationBroadcastTimes;
139
David Chend9269e22017-12-05 13:43:51 -0800140 // Tracks when we last checked the bytes consumed for each config key.
141 std::unordered_map<ConfigKey, long> mLastByteSizeTimes;
142
David Chen48944902018-05-03 10:29:11 -0700143 // Tracks which config keys has metric reports on disk
144 std::set<ConfigKey> mOnDiskDataConfigs;
145
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700146 sp<UidMap> mUidMap; // Reference to the UidMap to lookup app name and version for each uid.
yro31eb67b2017-10-24 13:33:21 -0700147
Chenjie Yue2219202018-06-08 10:07:51 -0700148 sp<StatsPullerManager> mPullerManager; // Reference to StatsPullerManager
Chenjie Yufa22d652018-02-05 14:37:48 -0800149
Yangster-mac932ecec2018-02-01 10:23:52 -0800150 sp<AlarmMonitor> mAnomalyAlarmMonitor;
151
152 sp<AlarmMonitor> mPeriodicAlarmMonitor;
Yangster-mace2cd6d52017-11-09 20:38:30 -0800153
Yangster-macb142cc82018-03-30 15:22:08 -0700154 void resetIfConfigTtlExpiredLocked(const int64_t timestampNs);
155
156 void OnConfigUpdatedLocked(
157 const int64_t currentTimestampNs, const ConfigKey& key, const StatsdConfig& config);
158
Tej Singh6ede28b2019-01-29 17:06:54 -0800159 void GetActiveConfigsLocked(const int uid, vector<int64_t>& outActiveConfigs);
160
Olivier Gaillard6c75ecd2019-02-20 09:57:33 +0000161 void WriteDataToDiskLocked(const DumpReportReason dumpReportReason,
162 const DumpLatency dumpLatency);
Yangster-mac892f3d32018-05-02 14:16:48 -0700163 void WriteDataToDiskLocked(const ConfigKey& key, const int64_t timestampNs,
Olivier Gaillard6c75ecd2019-02-20 09:57:33 +0000164 const DumpReportReason dumpReportReason,
165 const DumpLatency dumpLatency);
Yangster-mace68f3a52018-04-04 00:01:43 -0700166
Yao Chen9a43b4f2019-04-10 10:43:20 -0700167 void onConfigMetricsReportLocked(
168 const ConfigKey& key, const int64_t dumpTimeStampNs,
169 const bool include_current_partial_bucket, const bool erase_data,
170 const DumpReportReason dumpReportReason, const DumpLatency dumpLatency,
171 /*if dataSavedToDisk is true, it indicates the caller will write the data to disk
172 (e.g., before reboot). So no need to further persist local history.*/
173 const bool dataSavedToDisk, vector<uint8_t>* proto);
Yangster-mac86179502018-01-23 15:47:15 -0800174
David Chen1d7b0cd2017-11-15 14:20:04 -0800175 /* Check if we should send a broadcast if approaching memory limits and if we're over, we
176 * actually delete the data. */
Yangster-macb142cc82018-03-30 15:22:08 -0700177 void flushIfNecessaryLocked(int64_t timestampNs, const ConfigKey& key,
Yangster-macb0d06282018-01-05 15:44:07 -0800178 MetricsManager& metricsManager);
yro31eb67b2017-10-24 13:33:21 -0700179
Yangster-macd40053e2018-01-09 16:29:22 -0800180 // Maps the isolated uid in the log event to host uid if the log event contains uid fields.
181 void mapIsolatedUidToHostUidIfNecessaryLocked(LogEvent* event) const;
182
183 // Handler over the isolated uid change event.
184 void onIsolatedUidChangedEventLocked(const LogEvent& event);
185
Yangster-mac892f3d32018-05-02 14:16:48 -0700186 // Reset all configs.
187 void resetConfigsLocked(const int64_t timestampNs);
188 // Reset the specified configs.
Yao Chen163d2602018-04-10 10:39:53 -0700189 void resetConfigsLocked(const int64_t timestampNs, const std::vector<ConfigKey>& configs);
190
David Chen1d7b0cd2017-11-15 14:20:04 -0800191 // Function used to send a broadcast so that receiver for the config key can call getData
192 // to retrieve the stored data.
David Chen48944902018-05-03 10:29:11 -0700193 std::function<bool(const ConfigKey& key)> mSendBroadcast;
yro69007c82017-10-26 20:42:57 -0700194
Tej Singh6ede28b2019-01-29 17:06:54 -0800195 // Function used to send a broadcast so that receiver can be notified of which configs
196 // are currently active.
197 std::function<bool(const int& uid, const vector<int64_t>& configIds)> mSendActivationBroadcast;
198
Yangster-mac15f6bbc2018-04-08 11:52:26 -0700199 const int64_t mTimeBaseNs;
Chenjie Yu85ed8382017-12-14 16:48:54 -0800200
Yao Chen163d2602018-04-10 10:39:53 -0700201 // Largest timestamp of the events that we have processed.
202 int64_t mLargestTimestampSeen = 0;
203
204 int64_t mLastTimestampSeen = 0;
205
Chenjie Yufa22d652018-02-05 14:37:48 -0800206 long mLastPullerCacheClearTimeSec = 0;
207
Tej Singh42f9e062018-11-09 10:01:00 -0800208 // Last time we wrote data to disk.
209 int64_t mLastWriteTimeNs = 0;
210
jianjin996f40d2019-03-29 13:53:48 -0700211 // Last time we wrote active metrics to disk.
212 int64_t mLastActiveMetricsWriteNs = 0;
213
Yao Chen876889c2018-05-02 11:16:16 -0700214#ifdef VERY_VERBOSE_PRINTING
215 bool mPrintAllLogs = false;
216#endif
217
Yao Chen163d2602018-04-10 10:39:53 -0700218 FRIEND_TEST(StatsLogProcessorTest, TestOutOfOrderLogs);
David Chend9269e22017-12-05 13:43:51 -0800219 FRIEND_TEST(StatsLogProcessorTest, TestRateLimitByteSize);
220 FRIEND_TEST(StatsLogProcessorTest, TestRateLimitBroadcast);
221 FRIEND_TEST(StatsLogProcessorTest, TestDropWhenByteSizeTooLarge);
Chenjie Yuc7939cb2019-02-04 17:25:45 -0800222 FRIEND_TEST(StatsLogProcessorTest, TestActiveConfigMetricDiskWriteRead);
Chenjie Yua9a310e2019-02-06 13:40:10 -0800223 FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBoot);
Muhammad Qureshi844694b2019-04-05 10:10:40 -0700224 FRIEND_TEST(StatsLogProcessorTest, TestActivationOnBootMultipleActivations);
Chenjie Yuc7939cb2019-02-04 17:25:45 -0800225
Yao Chen8a8d16c2018-02-08 14:50:40 -0800226 FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration1);
227 FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration2);
228 FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForSumDuration3);
229 FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForMaxDuration1);
230 FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForMaxDuration2);
231 FRIEND_TEST(WakelockDurationE2eTest, TestAggregatedPredicateDimensionsForMaxDuration3);
232 FRIEND_TEST(MetricConditionLinkE2eTest, TestMultiplePredicatesAndLinks1);
233 FRIEND_TEST(MetricConditionLinkE2eTest, TestMultiplePredicatesAndLinks2);
Yangster-mace06cfd72018-03-10 23:22:59 -0800234 FRIEND_TEST(AttributionE2eTest, TestAttributionMatchAndSliceByFirstUid);
235 FRIEND_TEST(AttributionE2eTest, TestAttributionMatchAndSliceByChain);
Yangster-mac87718e22018-01-11 16:16:26 -0800236 FRIEND_TEST(GaugeMetricE2eTest, TestMultipleFieldsForPushedEvent);
Yangster-mac15f6bbc2018-04-08 11:52:26 -0700237 FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvents);
238 FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEvent_LateAlarm);
Tej Singh597c7162019-04-17 16:41:45 -0700239 FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEventsWithActivation);
240 FRIEND_TEST(GaugeMetricE2eTest, TestRandomSamplePulledEventsNoCondition);
Yangster-mac32f07af2018-10-13 17:08:11 -0700241 FRIEND_TEST(GaugeMetricE2eTest, TestConditionChangeToTrueSamplePulledEvents);
Yangster-mac15f6bbc2018-04-08 11:52:26 -0700242 FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents);
243 FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_LateAlarm);
Tej Singh597c7162019-04-17 16:41:45 -0700244 FRIEND_TEST(ValueMetricE2eTest, TestPulledEvents_WithActivation);
Yangster-mac15f6bbc2018-04-08 11:52:26 -0700245
Yangster13fb7e42018-03-07 17:30:49 -0800246 FRIEND_TEST(DimensionInConditionE2eTest, TestCreateCountMetric_NoLink_OR_CombinationCondition);
247 FRIEND_TEST(DimensionInConditionE2eTest, TestCreateCountMetric_Link_OR_CombinationCondition);
248 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_OR_CombinationCondition);
249 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_Link_OR_CombinationCondition);
250
251 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_SimpleCondition);
252 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_Link_SimpleCondition);
253 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_SimpleCondition);
254
Yangster13fb7e42018-03-07 17:30:49 -0800255 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_PartialLink_AND_CombinationCondition);
256 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_NoLink_AND_CombinationCondition);
257 FRIEND_TEST(DimensionInConditionE2eTest, TestDurationMetric_Link_AND_CombinationCondition);
258
Yangster-macbe10ddf2018-03-13 15:39:51 -0700259 FRIEND_TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_single_bucket);
260 FRIEND_TEST(AnomalyDetectionE2eTest, TestSlicedCountMetric_multiple_buckets);
261 FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_single_bucket);
262 FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_multiple_buckets);
263 FRIEND_TEST(AnomalyDetectionE2eTest, TestDurationMetric_SUM_long_refractory_period);
Yangster-macb142cc82018-03-30 15:22:08 -0700264
Yangster-mac684d1952018-03-24 16:47:16 -0700265 FRIEND_TEST(AlarmE2eTest, TestMultipleAlarms);
Yangster-macb142cc82018-03-30 15:22:08 -0700266 FRIEND_TEST(ConfigTtlE2eTest, TestCountMetric);
Yangster-mac849dfdc22018-10-12 15:41:45 -0700267 FRIEND_TEST(MetricActivationE2eTest, TestCountMetric);
Muhammad Qureshi3a5ebf52019-03-28 12:38:21 -0700268 FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithOneDeactivation);
269 FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoDeactivations);
270 FRIEND_TEST(MetricActivationE2eTest, TestCountMetricWithTwoMetricsTwoDeactivations);
Yao Chenab273e22017-09-06 12:53:50 -0700271};
Bookatz906a35c2017-09-20 15:26:44 -0700272
Yao Chenef99c4f2017-09-22 16:26:54 -0700273} // namespace statsd
274} // namespace os
275} // namespace android