blob: 4371015783973552cb5a9ae2145e1f8d8610c3b0 [file] [log] [blame]
Yangster-mac20877162017-12-22 17:19:39 -08001// Copyright (C) 2017 The Android Open Source Project
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#pragma once
16
Ruchir Rastogie449b0c2020-02-10 17:40:09 -080017#include <aidl/android/os/BnPullAtomCallback.h>
18#include <aidl/android/os/IPullAtomCallback.h>
19#include <aidl/android/os/IPullAtomResultReceiver.h>
Yangster-mac93694462018-01-22 20:49:31 -080020#include <gtest/gtest.h>
Tej Singh730ed292020-02-03 17:24:27 -080021
Yao Chen9c1debe2018-02-19 14:39:19 -080022#include "frameworks/base/cmds/statsd/src/stats_log.pb.h"
Yangster-mac20877162017-12-22 17:19:39 -080023#include "frameworks/base/cmds/statsd/src/statsd_config.pb.h"
Yangster-mac20877162017-12-22 17:19:39 -080024#include "src/StatsLogProcessor.h"
Yangster-mac9def8e32018-04-17 13:55:51 -070025#include "src/hash.h"
Tej Singh730ed292020-02-03 17:24:27 -080026#include "src/logd/LogEvent.h"
Yangster-mac9def8e32018-04-17 13:55:51 -070027#include "src/stats_log_util.h"
Yao Chen9c1debe2018-02-19 14:39:19 -080028#include "statslog.h"
Yangster-mac20877162017-12-22 17:19:39 -080029
30namespace android {
31namespace os {
32namespace statsd {
33
Ruchir Rastogie449b0c2020-02-10 17:40:09 -080034using ::aidl::android::os::BnPullAtomCallback;
35using ::aidl::android::os::IPullAtomCallback;
36using ::aidl::android::os::IPullAtomResultReceiver;
tsaichristineb87ca152019-12-09 15:19:41 -080037using android::util::ProtoReader;
Yangster-mac9def8e32018-04-17 13:55:51 -070038using google::protobuf::RepeatedPtrField;
Ruchir Rastogie449b0c2020-02-10 17:40:09 -080039using Status = ::ndk::ScopedAStatus;
Yangster-mac9def8e32018-04-17 13:55:51 -070040
tsaichristinec876b492019-12-10 13:47:05 -080041const int SCREEN_STATE_ATOM_ID = android::util::SCREEN_STATE_CHANGED;
42const int UID_PROCESS_STATE_ATOM_ID = android::util::UID_PROCESS_STATE_CHANGED;
43
tsaichristineb87ca152019-12-09 15:19:41 -080044// Converts a ProtoOutputStream to a StatsLogReport proto.
45StatsLogReport outputStreamToProto(ProtoOutputStream* proto);
46
Yangster-mac87718e22018-01-11 16:16:26 -080047// Create AtomMatcher proto to simply match a specific atom type.
48AtomMatcher CreateSimpleAtomMatcher(const string& name, int atomId);
49
Yangster-mac15f6bbc2018-04-08 11:52:26 -070050// Create AtomMatcher proto for temperature atom.
51AtomMatcher CreateTemperatureAtomMatcher();
52
Yangster13fb7e42018-03-07 17:30:49 -080053// Create AtomMatcher proto for scheduled job state changed.
54AtomMatcher CreateScheduledJobStateChangedAtomMatcher();
55
56// Create AtomMatcher proto for starting a scheduled job.
57AtomMatcher CreateStartScheduledJobAtomMatcher();
58
59// Create AtomMatcher proto for a scheduled job is done.
60AtomMatcher CreateFinishScheduledJobAtomMatcher();
61
Yangster-mac93694462018-01-22 20:49:31 -080062// Create AtomMatcher proto for screen brightness state changed.
63AtomMatcher CreateScreenBrightnessChangedAtomMatcher();
64
65// Create AtomMatcher proto for starting battery save mode.
66AtomMatcher CreateBatterySaverModeStartAtomMatcher();
67
68// Create AtomMatcher proto for stopping battery save mode.
69AtomMatcher CreateBatterySaverModeStopAtomMatcher();
70
71// Create AtomMatcher proto for process state changed.
72AtomMatcher CreateUidProcessStateChangedAtomMatcher();
73
Yangster-mac20877162017-12-22 17:19:39 -080074// Create AtomMatcher proto for acquiring wakelock.
75AtomMatcher CreateAcquireWakelockAtomMatcher();
76
77// Create AtomMatcher proto for releasing wakelock.
78AtomMatcher CreateReleaseWakelockAtomMatcher() ;
79
80// Create AtomMatcher proto for screen turned on.
81AtomMatcher CreateScreenTurnedOnAtomMatcher();
82
83// Create AtomMatcher proto for screen turned off.
84AtomMatcher CreateScreenTurnedOffAtomMatcher();
85
86// Create AtomMatcher proto for app sync turned on.
87AtomMatcher CreateSyncStartAtomMatcher();
88
89// Create AtomMatcher proto for app sync turned off.
90AtomMatcher CreateSyncEndAtomMatcher();
91
92// Create AtomMatcher proto for app sync moves to background.
93AtomMatcher CreateMoveToBackgroundAtomMatcher();
94
95// Create AtomMatcher proto for app sync moves to foreground.
96AtomMatcher CreateMoveToForegroundAtomMatcher();
97
98// Create AtomMatcher proto for process crashes
99AtomMatcher CreateProcessCrashAtomMatcher() ;
100
101// Create Predicate proto for screen is on.
102Predicate CreateScreenIsOnPredicate();
103
104// Create Predicate proto for screen is off.
105Predicate CreateScreenIsOffPredicate();
106
Yangster13fb7e42018-03-07 17:30:49 -0800107// Create Predicate proto for a running scheduled job.
108Predicate CreateScheduledJobPredicate();
109
Yangster-mac93694462018-01-22 20:49:31 -0800110// Create Predicate proto for battery saver mode.
111Predicate CreateBatterySaverModePredicate();
112
Yangster-mac20877162017-12-22 17:19:39 -0800113// Create Predicate proto for holding wakelock.
114Predicate CreateHoldingWakelockPredicate();
115
116// Create a Predicate proto for app syncing.
117Predicate CreateIsSyncingPredicate();
118
119// Create a Predicate proto for app is in background.
120Predicate CreateIsInBackgroundPredicate();
121
tsaichristined21aacf2019-10-07 14:47:38 -0700122// Create State proto for screen state atom.
123State CreateScreenState();
124
125// Create State proto for uid process state atom.
126State CreateUidProcessState();
127
128// Create State proto for overlay state atom.
129State CreateOverlayState();
130
131State CreateScreenStateWithOnOffMap();
132
133State CreateScreenStateWithInDozeMap();
134
135// Create StateGroup proto for ScreenState ON group
136StateMap_StateGroup CreateScreenStateOnGroup();
137
138// Create StateGroup proto for ScreenState OFF group
139StateMap_StateGroup CreateScreenStateOffGroup();
140
141// Create StateMap proto for ScreenState ON/OFF map
142StateMap CreateScreenStateOnOffMap();
143
144// Create StateGroup proto for ScreenState IN DOZE group
145StateMap_StateGroup CreateScreenStateInDozeGroup();
146
147// Create StateGroup proto for ScreenState NOT IN DOZE group
148StateMap_StateGroup CreateScreenStateNotDozeGroup();
149
150// Create StateMap proto for ScreenState IN DOZE map
151StateMap CreateScreenStateInDozeMap();
152
Yangster-mac20877162017-12-22 17:19:39 -0800153// Add a predicate to the predicate combination.
154void addPredicateToPredicateCombination(const Predicate& predicate, Predicate* combination);
155
156// Create dimensions from primitive fields.
157FieldMatcher CreateDimensions(const int atomId, const std::vector<int>& fields);
158
159// Create dimensions by attribution uid and tag.
160FieldMatcher CreateAttributionUidAndTagDimensions(const int atomId,
161 const std::vector<Position>& positions);
162
163// Create dimensions by attribution uid only.
164FieldMatcher CreateAttributionUidDimensions(const int atomId,
165 const std::vector<Position>& positions);
166
167// Create log event for screen state changed.
168std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(
tsaichristine7747d372020-02-28 17:36:59 -0800169 uint64_t timestampNs, const android::view::DisplayStateEnum state);
Yangster-mac20877162017-12-22 17:19:39 -0800170
Yangster-mac93694462018-01-22 20:49:31 -0800171// Create log event for screen brightness state changed.
tsaichristine7747d372020-02-28 17:36:59 -0800172std::unique_ptr<LogEvent> CreateScreenBrightnessChangedEvent(uint64_t timestampNs, int level);
Yangster-mac93694462018-01-22 20:49:31 -0800173
Yangster13fb7e42018-03-07 17:30:49 -0800174// Create log event when scheduled job starts.
175std::unique_ptr<LogEvent> CreateStartScheduledJobEvent(
176 const std::vector<AttributionNodeInternal>& attributions,
177 const string& name, uint64_t timestampNs);
178
179// Create log event when scheduled job finishes.
180std::unique_ptr<LogEvent> CreateFinishScheduledJobEvent(
181 const std::vector<AttributionNodeInternal>& attributions,
182 const string& name, uint64_t timestampNs);
183
Yangster-mac93694462018-01-22 20:49:31 -0800184// Create log event when battery saver starts.
185std::unique_ptr<LogEvent> CreateBatterySaverOnEvent(uint64_t timestampNs);
186// Create log event when battery saver stops.
187std::unique_ptr<LogEvent> CreateBatterySaverOffEvent(uint64_t timestampNs);
188
Yangster-mac20877162017-12-22 17:19:39 -0800189// Create log event for app moving to background.
tsaichristine7747d372020-02-28 17:36:59 -0800190std::unique_ptr<LogEvent> CreateMoveToBackgroundEvent(uint64_t timestampNs, const int uid);
Yangster-mac20877162017-12-22 17:19:39 -0800191
192// Create log event for app moving to foreground.
tsaichristine7747d372020-02-28 17:36:59 -0800193std::unique_ptr<LogEvent> CreateMoveToForegroundEvent(uint64_t timestampNs, const int uid);
Yangster-mac20877162017-12-22 17:19:39 -0800194
195// Create log event when the app sync starts.
tsaichristine7747d372020-02-28 17:36:59 -0800196std::unique_ptr<LogEvent> CreateSyncStartEvent(uint64_t timestampNs, const vector<int>& uids,
197 const vector<string>& tags, const string& name);
Yangster-mac20877162017-12-22 17:19:39 -0800198
199// Create log event when the app sync ends.
tsaichristine7747d372020-02-28 17:36:59 -0800200std::unique_ptr<LogEvent> CreateSyncEndEvent(uint64_t timestampNs, const vector<int>& uids,
201 const vector<string>& tags, const string& name);
Yangster-mac20877162017-12-22 17:19:39 -0800202
203// Create log event when the app sync ends.
tsaichristine7747d372020-02-28 17:36:59 -0800204std::unique_ptr<LogEvent> CreateAppCrashEvent(uint64_t timestampNs, const int uid);
Yangster-mac20877162017-12-22 17:19:39 -0800205
tsaichristine69000e62019-10-18 17:34:52 -0700206// Create log event for an app crash.
tsaichristine7747d372020-02-28 17:36:59 -0800207std::unique_ptr<LogEvent> CreateAppCrashOccurredEvent(uint64_t timestampNs, const int uid);
tsaichristine69000e62019-10-18 17:34:52 -0700208
Yangster-mac20877162017-12-22 17:19:39 -0800209// Create log event for acquiring wakelock.
tsaichristine7747d372020-02-28 17:36:59 -0800210std::unique_ptr<LogEvent> CreateAcquireWakelockEvent(uint64_t timestampNs, const vector<int>& uids,
211 const vector<string>& tags,
212 const string& wakelockName);
Yangster-mac20877162017-12-22 17:19:39 -0800213
214// Create log event for releasing wakelock.
tsaichristine7747d372020-02-28 17:36:59 -0800215std::unique_ptr<LogEvent> CreateReleaseWakelockEvent(uint64_t timestampNs, const vector<int>& uids,
216 const vector<string>& tags,
217 const string& wakelockName);
Yangster-mac20877162017-12-22 17:19:39 -0800218
Yangster-macd40053e2018-01-09 16:29:22 -0800219// Create log event for releasing wakelock.
tsaichristine0defefc2020-03-11 07:52:37 -0700220std::unique_ptr<LogEvent> CreateIsolatedUidChangedEvent(uint64_t timestampNs, int hostUid,
221 int isolatedUid, bool is_create);
Yangster-macd40053e2018-01-09 16:29:22 -0800222
tsaichristine69000e62019-10-18 17:34:52 -0700223// Create log event for uid process state change.
224std::unique_ptr<LogEvent> CreateUidProcessStateChangedEvent(
tsaichristine7747d372020-02-28 17:36:59 -0800225 uint64_t timestampNs, int uid, const android::app::ProcessStateEnum state);
tsaichristine69000e62019-10-18 17:34:52 -0700226
Yao Chen9c1debe2018-02-19 14:39:19 -0800227// Helper function to create an AttributionNodeInternal proto.
228AttributionNodeInternal CreateAttribution(const int& uid, const string& tag);
Yangster-mac20877162017-12-22 17:19:39 -0800229
230// Create a statsd log event processor upon the start time in seconds, config and key.
Tej Singh730ed292020-02-03 17:24:27 -0800231sp<StatsLogProcessor> CreateStatsLogProcessor(const int64_t timeBaseNs, const int64_t currentTimeNs,
232 const StatsdConfig& config, const ConfigKey& key,
Ruchir Rastogie449b0c2020-02-10 17:40:09 -0800233 const shared_ptr<IPullAtomCallback>& puller = nullptr,
Tej Singh730ed292020-02-03 17:24:27 -0800234 const int32_t atomTag = 0 /*for puller only*/);
Yangster-mac20877162017-12-22 17:19:39 -0800235
236// Util function to sort the log events by timestamp.
237void sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> *events);
238
Yangster-mac94e197c2018-01-02 16:03:03 -0800239int64_t StringToId(const string& str);
240
Yangster-mace06cfd72018-03-10 23:22:59 -0800241void ValidateUidDimension(const DimensionsValue& value, int node_idx, int atomId, int uid);
Yangster-macb5bc7412018-01-06 23:17:45 -0800242void ValidateAttributionUidDimension(const DimensionsValue& value, int atomId, int uid);
243void ValidateAttributionUidAndTagDimension(
244 const DimensionsValue& value, int atomId, int uid, const std::string& tag);
Yangster-mace06cfd72018-03-10 23:22:59 -0800245void ValidateAttributionUidAndTagDimension(
246 const DimensionsValue& value, int node_idx, int atomId, int uid, const std::string& tag);
Yangster-macb5bc7412018-01-06 23:17:45 -0800247
Yao Chen8a8d16c2018-02-08 14:50:40 -0800248struct DimensionsPair {
249 DimensionsPair(DimensionsValue m1, DimensionsValue m2) : dimInWhat(m1), dimInCondition(m2){};
250
251 DimensionsValue dimInWhat;
252 DimensionsValue dimInCondition;
253};
254
255bool LessThan(const DimensionsValue& s1, const DimensionsValue& s2);
256bool LessThan(const DimensionsPair& s1, const DimensionsPair& s2);
257
Yangster-mac9def8e32018-04-17 13:55:51 -0700258
259void backfillStartEndTimestamp(ConfigMetricsReport *config_report);
260void backfillStartEndTimestamp(ConfigMetricsReportList *config_report_list);
261
262void backfillStringInReport(ConfigMetricsReportList *config_report_list);
263void backfillStringInDimension(const std::map<uint64_t, string>& str_map,
264 DimensionsValue* dimension);
265
266template <typename T>
267void backfillStringInDimension(const std::map<uint64_t, string>& str_map,
268 T* metrics) {
269 for (int i = 0; i < metrics->data_size(); ++i) {
270 auto data = metrics->mutable_data(i);
271 if (data->has_dimensions_in_what()) {
272 backfillStringInDimension(str_map, data->mutable_dimensions_in_what());
273 }
274 if (data->has_dimensions_in_condition()) {
275 backfillStringInDimension(str_map, data->mutable_dimensions_in_condition());
276 }
277 }
278}
279
280void backfillDimensionPath(ConfigMetricsReportList* config_report_list);
281
282bool backfillDimensionPath(const DimensionsValue& path,
283 const google::protobuf::RepeatedPtrField<DimensionsValue>& leafValues,
284 DimensionsValue* dimension);
285
Tej Singh730ed292020-02-03 17:24:27 -0800286class FakeSubsystemSleepCallback : public BnPullAtomCallback {
287public:
Ruchir Rastogie449b0c2020-02-10 17:40:09 -0800288 Status onPullAtom(int atomTag,
289 const shared_ptr<IPullAtomResultReceiver>& resultReceiver) override;
Tej Singh730ed292020-02-03 17:24:27 -0800290};
291
Yangster-mac9def8e32018-04-17 13:55:51 -0700292template <typename T>
293void backfillDimensionPath(const DimensionsValue& whatPath,
294 const DimensionsValue& conditionPath,
295 T* metricData) {
296 for (int i = 0; i < metricData->data_size(); ++i) {
297 auto data = metricData->mutable_data(i);
298 if (data->dimension_leaf_values_in_what_size() > 0) {
299 backfillDimensionPath(whatPath, data->dimension_leaf_values_in_what(),
300 data->mutable_dimensions_in_what());
301 data->clear_dimension_leaf_values_in_what();
302 }
303 if (data->dimension_leaf_values_in_condition_size() > 0) {
304 backfillDimensionPath(conditionPath, data->dimension_leaf_values_in_condition(),
305 data->mutable_dimensions_in_condition());
306 data->clear_dimension_leaf_values_in_condition();
307 }
308 }
309}
310
Yao Chen8a8d16c2018-02-08 14:50:40 -0800311struct DimensionCompare {
312 bool operator()(const DimensionsPair& s1, const DimensionsPair& s2) const {
313 return LessThan(s1, s2);
314 }
315};
316
Yangster-macb5bc7412018-01-06 23:17:45 -0800317template <typename T>
318void sortMetricDataByDimensionsValue(const T& metricData, T* sortedMetricData) {
Yao Chen8a8d16c2018-02-08 14:50:40 -0800319 std::map<DimensionsPair, int, DimensionCompare> dimensionIndexMap;
Yangster-macb5bc7412018-01-06 23:17:45 -0800320 for (int i = 0; i < metricData.data_size(); ++i) {
Yao Chen8a8d16c2018-02-08 14:50:40 -0800321 dimensionIndexMap.insert(
322 std::make_pair(DimensionsPair(metricData.data(i).dimensions_in_what(),
323 metricData.data(i).dimensions_in_condition()),
324 i));
Yangster-macb5bc7412018-01-06 23:17:45 -0800325 }
326 for (const auto& itr : dimensionIndexMap) {
327 *sortedMetricData->add_data() = metricData.data(itr.second);
328 }
329}
330
Yangster-mac9def8e32018-04-17 13:55:51 -0700331template <typename T>
332void backfillStartEndTimestampForFullBucket(
333 const int64_t timeBaseNs, const int64_t bucketSizeNs, T* bucket) {
334 bucket->set_start_bucket_elapsed_nanos(timeBaseNs + bucketSizeNs * bucket->bucket_num());
335 bucket->set_end_bucket_elapsed_nanos(
336 timeBaseNs + bucketSizeNs * bucket->bucket_num() + bucketSizeNs);
337 bucket->clear_bucket_num();
338}
339
340template <typename T>
341void backfillStartEndTimestampForPartialBucket(const int64_t timeBaseNs, T* bucket) {
342 if (bucket->has_start_bucket_elapsed_millis()) {
343 bucket->set_start_bucket_elapsed_nanos(
344 MillisToNano(bucket->start_bucket_elapsed_millis()));
345 bucket->clear_start_bucket_elapsed_millis();
346 }
347 if (bucket->has_end_bucket_elapsed_millis()) {
348 bucket->set_end_bucket_elapsed_nanos(
349 MillisToNano(bucket->end_bucket_elapsed_millis()));
350 bucket->clear_end_bucket_elapsed_millis();
351 }
352}
353
354template <typename T>
355void backfillStartEndTimestampForMetrics(const int64_t timeBaseNs, const int64_t bucketSizeNs,
356 T* metrics) {
357 for (int i = 0; i < metrics->data_size(); ++i) {
358 auto data = metrics->mutable_data(i);
359 for (int j = 0; j < data->bucket_info_size(); ++j) {
360 auto bucket = data->mutable_bucket_info(j);
361 if (bucket->has_bucket_num()) {
362 backfillStartEndTimestampForFullBucket(timeBaseNs, bucketSizeNs, bucket);
363 } else {
364 backfillStartEndTimestampForPartialBucket(timeBaseNs, bucket);
365 }
366 }
367 }
368}
369
370template <typename T>
371void backfillStartEndTimestampForSkippedBuckets(const int64_t timeBaseNs, T* metrics) {
372 for (int i = 0; i < metrics->skipped_size(); ++i) {
373 backfillStartEndTimestampForPartialBucket(timeBaseNs, metrics->mutable_skipped(i));
374 }
375}
Yangster-mac20877162017-12-22 17:19:39 -0800376} // namespace statsd
377} // namespace os
tsaichristined21aacf2019-10-07 14:47:38 -0700378} // namespace android