blob: 89fd3d9b29ab94fd44c5f5d65f781c3b4ffb7e46 [file] [log] [blame]
Yangster13fb7e42018-03-07 17:30:49 -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#include "metric_util.h"
16
tsaichristine63143252020-03-20 17:03:49 -070017#include "stats_event.h"
18
Yangster13fb7e42018-03-07 17:30:49 -080019namespace android {
20namespace os {
21namespace statsd {
22
23AtomMatcher CreateSimpleAtomMatcher(const string& name, int atomId) {
24 AtomMatcher atom_matcher;
25 atom_matcher.set_id(StringToId(name));
26 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
27 simple_atom_matcher->set_atom_id(atomId);
28 return atom_matcher;
29}
30
31AtomMatcher CreateScheduledJobStateChangedAtomMatcher(const string& name,
32 ScheduledJobStateChanged::State state) {
33 AtomMatcher atom_matcher;
34 atom_matcher.set_id(StringToId(name));
35 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
36 simple_atom_matcher->set_atom_id(android::util::SCHEDULED_JOB_STATE_CHANGED);
37 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
38 field_value_matcher->set_field(3); // State field.
39 field_value_matcher->set_eq_int(state);
40 return atom_matcher;
41}
42
43AtomMatcher CreateStartScheduledJobAtomMatcher() {
44 return CreateScheduledJobStateChangedAtomMatcher("ScheduledJobStart",
45 ScheduledJobStateChanged::STARTED);
46}
47
48AtomMatcher CreateFinishScheduledJobAtomMatcher() {
49 return CreateScheduledJobStateChangedAtomMatcher("ScheduledJobFinish",
50 ScheduledJobStateChanged::FINISHED);
51}
52
53AtomMatcher CreateScreenBrightnessChangedAtomMatcher() {
54 AtomMatcher atom_matcher;
55 atom_matcher.set_id(StringToId("ScreenBrightnessChanged"));
56 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
57 simple_atom_matcher->set_atom_id(android::util::SCREEN_BRIGHTNESS_CHANGED);
58 return atom_matcher;
59}
60
61AtomMatcher CreateUidProcessStateChangedAtomMatcher() {
62 AtomMatcher atom_matcher;
63 atom_matcher.set_id(StringToId("UidProcessStateChanged"));
64 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
65 simple_atom_matcher->set_atom_id(android::util::UID_PROCESS_STATE_CHANGED);
66 return atom_matcher;
67}
68
69AtomMatcher CreateWakelockStateChangedAtomMatcher(const string& name,
70 WakelockStateChanged::State state) {
71 AtomMatcher atom_matcher;
72 atom_matcher.set_id(StringToId(name));
73 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
74 simple_atom_matcher->set_atom_id(android::util::WAKELOCK_STATE_CHANGED);
75 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
76 field_value_matcher->set_field(4); // State field.
77 field_value_matcher->set_eq_int(state);
78 return atom_matcher;
79}
80
81AtomMatcher CreateAcquireWakelockAtomMatcher() {
82 return CreateWakelockStateChangedAtomMatcher("AcquireWakelock", WakelockStateChanged::ACQUIRE);
83}
84
85AtomMatcher CreateReleaseWakelockAtomMatcher() {
86 return CreateWakelockStateChangedAtomMatcher("ReleaseWakelock", WakelockStateChanged::RELEASE);
87}
88
89AtomMatcher CreateScreenStateChangedAtomMatcher(
90 const string& name, android::view::DisplayStateEnum state) {
91 AtomMatcher atom_matcher;
92 atom_matcher.set_id(StringToId(name));
93 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
94 simple_atom_matcher->set_atom_id(android::util::SCREEN_STATE_CHANGED);
95 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
96 field_value_matcher->set_field(1); // State field.
97 field_value_matcher->set_eq_int(state);
98 return atom_matcher;
99}
100
101AtomMatcher CreateScreenTurnedOnAtomMatcher() {
102 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOn",
103 android::view::DisplayStateEnum::DISPLAY_STATE_ON);
104}
105
106AtomMatcher CreateScreenTurnedOffAtomMatcher() {
107 return CreateScreenStateChangedAtomMatcher("ScreenTurnedOff",
108 ::android::view::DisplayStateEnum::DISPLAY_STATE_OFF);
109}
110
111AtomMatcher CreateSyncStateChangedAtomMatcher(
112 const string& name, SyncStateChanged::State state) {
113 AtomMatcher atom_matcher;
114 atom_matcher.set_id(StringToId(name));
115 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
116 simple_atom_matcher->set_atom_id(android::util::SYNC_STATE_CHANGED);
117 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
118 field_value_matcher->set_field(3); // State field.
119 field_value_matcher->set_eq_int(state);
120 return atom_matcher;
121}
122
123AtomMatcher CreateSyncStartAtomMatcher() {
124 return CreateSyncStateChangedAtomMatcher("SyncStart", SyncStateChanged::ON);
125}
126
127AtomMatcher CreateSyncEndAtomMatcher() {
128 return CreateSyncStateChangedAtomMatcher("SyncEnd", SyncStateChanged::OFF);
129}
130
131AtomMatcher CreateActivityForegroundStateChangedAtomMatcher(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800132 const string& name, ActivityForegroundStateChanged::State state) {
Yangster13fb7e42018-03-07 17:30:49 -0800133 AtomMatcher atom_matcher;
134 atom_matcher.set_id(StringToId(name));
135 auto simple_atom_matcher = atom_matcher.mutable_simple_atom_matcher();
136 simple_atom_matcher->set_atom_id(android::util::ACTIVITY_FOREGROUND_STATE_CHANGED);
137 auto field_value_matcher = simple_atom_matcher->add_field_value_matcher();
138 field_value_matcher->set_field(4); // Activity field.
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800139 field_value_matcher->set_eq_int(state);
Yangster13fb7e42018-03-07 17:30:49 -0800140 return atom_matcher;
141}
142
143AtomMatcher CreateMoveToBackgroundAtomMatcher() {
144 return CreateActivityForegroundStateChangedAtomMatcher(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800145 "MoveToBackground", ActivityForegroundStateChanged::BACKGROUND);
Yangster13fb7e42018-03-07 17:30:49 -0800146}
147
148AtomMatcher CreateMoveToForegroundAtomMatcher() {
149 return CreateActivityForegroundStateChangedAtomMatcher(
Chenjie Yu5caaa9d2018-03-06 15:48:54 -0800150 "MoveToForeground", ActivityForegroundStateChanged::FOREGROUND);
Yangster13fb7e42018-03-07 17:30:49 -0800151}
152
153Predicate CreateScheduledJobPredicate() {
154 Predicate predicate;
155 predicate.set_id(StringToId("ScheduledJobRunningPredicate"));
156 predicate.mutable_simple_predicate()->set_start(StringToId("ScheduledJobStart"));
157 predicate.mutable_simple_predicate()->set_stop(StringToId("ScheduledJobFinish"));
158 return predicate;
159}
160
161Predicate CreateBatterySaverModePredicate() {
162 Predicate predicate;
163 predicate.set_id(StringToId("BatterySaverIsOn"));
164 predicate.mutable_simple_predicate()->set_start(StringToId("BatterySaverModeStart"));
165 predicate.mutable_simple_predicate()->set_stop(StringToId("BatterySaverModeStop"));
166 return predicate;
167}
168
169Predicate CreateScreenIsOnPredicate() {
170 Predicate predicate;
171 predicate.set_id(StringToId("ScreenIsOn"));
172 predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOn"));
173 predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOff"));
174 return predicate;
175}
176
177Predicate CreateScreenIsOffPredicate() {
178 Predicate predicate;
179 predicate.set_id(1111123);
180 predicate.mutable_simple_predicate()->set_start(StringToId("ScreenTurnedOff"));
181 predicate.mutable_simple_predicate()->set_stop(StringToId("ScreenTurnedOn"));
182 return predicate;
183}
184
185Predicate CreateHoldingWakelockPredicate() {
186 Predicate predicate;
187 predicate.set_id(StringToId("HoldingWakelock"));
188 predicate.mutable_simple_predicate()->set_start(StringToId("AcquireWakelock"));
189 predicate.mutable_simple_predicate()->set_stop(StringToId("ReleaseWakelock"));
190 return predicate;
191}
192
193Predicate CreateIsSyncingPredicate() {
194 Predicate predicate;
195 predicate.set_id(33333333333333);
196 predicate.mutable_simple_predicate()->set_start(StringToId("SyncStart"));
197 predicate.mutable_simple_predicate()->set_stop(StringToId("SyncEnd"));
198 return predicate;
199}
200
201Predicate CreateIsInBackgroundPredicate() {
202 Predicate predicate;
203 predicate.set_id(StringToId("IsInBackground"));
204 predicate.mutable_simple_predicate()->set_start(StringToId("MoveToBackground"));
205 predicate.mutable_simple_predicate()->set_stop(StringToId("MoveToForeground"));
206 return predicate;
207}
208
209void addPredicateToPredicateCombination(const Predicate& predicate,
210 Predicate* combinationPredicate) {
211 combinationPredicate->mutable_combination()->add_predicate(predicate.id());
212}
213
214FieldMatcher CreateAttributionUidDimensions(const int atomId,
215 const std::vector<Position>& positions) {
216 FieldMatcher dimensions;
217 dimensions.set_field(atomId);
218 for (const auto position : positions) {
219 auto child = dimensions.add_child();
220 child->set_field(1);
221 child->set_position(position);
222 child->add_child()->set_field(1);
223 }
224 return dimensions;
225}
226
227FieldMatcher CreateAttributionUidAndTagDimensions(const int atomId,
228 const std::vector<Position>& positions) {
229 FieldMatcher dimensions;
230 dimensions.set_field(atomId);
231 for (const auto position : positions) {
232 auto child = dimensions.add_child();
233 child->set_field(1);
234 child->set_position(position);
235 child->add_child()->set_field(1);
236 child->add_child()->set_field(2);
237 }
238 return dimensions;
239}
240
241FieldMatcher CreateDimensions(const int atomId, const std::vector<int>& fields) {
242 FieldMatcher dimensions;
243 dimensions.set_field(atomId);
244 for (const int field : fields) {
245 dimensions.add_child()->set_field(field);
246 }
247 return dimensions;
248}
249
tsaichristine8dca82e2020-04-07 09:40:03 -0700250void writeAttribution(AStatsEvent* statsEvent, const vector<int>& attributionUids,
251 const vector<string>& attributionTags) {
252 vector<const char*> cTags(attributionTags.size());
253 for (int i = 0; i < cTags.size(); i++) {
254 cTags[i] = attributionTags[i].c_str();
255 }
256
257 AStatsEvent_writeAttributionChain(statsEvent,
258 reinterpret_cast<const uint32_t*>(attributionUids.data()),
259 cTags.data(), attributionUids.size());
260}
261
262void parseStatsEventToLogEvent(AStatsEvent* statsEvent, LogEvent* logEvent) {
263 AStatsEvent_build(statsEvent);
264
265 size_t size;
266 uint8_t* buf = AStatsEvent_getBuffer(statsEvent, &size);
267 logEvent->parseBuffer(buf, size);
268
269 AStatsEvent_release(statsEvent);
270}
271
Yangster13fb7e42018-03-07 17:30:49 -0800272std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(
tsaichristine63143252020-03-20 17:03:49 -0700273 uint64_t timestampNs, const android::view::DisplayStateEnum state) {
274 AStatsEvent* statsEvent = AStatsEvent_obtain();
275 AStatsEvent_setAtomId(statsEvent, util::SCREEN_STATE_CHANGED);
276 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
tsaichristine63143252020-03-20 17:03:49 -0700277 AStatsEvent_writeInt32(statsEvent, state);
tsaichristine63143252020-03-20 17:03:49 -0700278
279 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700280 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristine63143252020-03-20 17:03:49 -0700281 return logEvent;
Yangster13fb7e42018-03-07 17:30:49 -0800282}
283
284std::unique_ptr<LogEvent> CreateScheduledJobStateChangedEvent(
tsaichristine63143252020-03-20 17:03:49 -0700285 const vector<int>& attributionUids, const vector<string>& attributionTags,
286 const string& jobName, const ScheduledJobStateChanged::State state, uint64_t timestampNs) {
287 AStatsEvent* statsEvent = AStatsEvent_obtain();
288 AStatsEvent_setAtomId(statsEvent, util::SCHEDULED_JOB_STATE_CHANGED);
289 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
290
tsaichristine8dca82e2020-04-07 09:40:03 -0700291 writeAttribution(statsEvent, attributionUids, attributionTags);
tsaichristine63143252020-03-20 17:03:49 -0700292 AStatsEvent_writeString(statsEvent, jobName.c_str());
293 AStatsEvent_writeInt32(statsEvent, state);
tsaichristine63143252020-03-20 17:03:49 -0700294
295 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700296 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristine63143252020-03-20 17:03:49 -0700297 return logEvent;
Yangster13fb7e42018-03-07 17:30:49 -0800298}
299
tsaichristine63143252020-03-20 17:03:49 -0700300std::unique_ptr<LogEvent> CreateStartScheduledJobEvent(uint64_t timestampNs,
301 const vector<int>& attributionUids,
302 const vector<string>& attributionTags,
303 const string& jobName) {
304 return CreateScheduledJobStateChangedEvent(attributionUids, attributionTags, jobName,
305 ScheduledJobStateChanged::STARTED, timestampNs);
Yangster13fb7e42018-03-07 17:30:49 -0800306}
307
308// Create log event when scheduled job finishes.
tsaichristine63143252020-03-20 17:03:49 -0700309std::unique_ptr<LogEvent> CreateFinishScheduledJobEvent(uint64_t timestampNs,
310 const vector<int>& attributionUids,
311 const vector<string>& attributionTags,
312 const string& jobName) {
313 return CreateScheduledJobStateChangedEvent(attributionUids, attributionTags, jobName,
314 ScheduledJobStateChanged::FINISHED, timestampNs);
Yangster13fb7e42018-03-07 17:30:49 -0800315}
316
tsaichristine63143252020-03-20 17:03:49 -0700317std::unique_ptr<LogEvent> CreateSyncStateChangedEvent(uint64_t timestampNs,
318 const vector<int>& attributionUids,
319 const vector<string>& attributionTags,
320 const string& name,
321 const SyncStateChanged::State state) {
322 AStatsEvent* statsEvent = AStatsEvent_obtain();
323 AStatsEvent_setAtomId(statsEvent, util::SYNC_STATE_CHANGED);
324 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
325
tsaichristine8dca82e2020-04-07 09:40:03 -0700326 writeAttribution(statsEvent, attributionUids, attributionTags);
tsaichristine63143252020-03-20 17:03:49 -0700327 AStatsEvent_writeString(statsEvent, name.c_str());
328 AStatsEvent_writeInt32(statsEvent, state);
tsaichristine63143252020-03-20 17:03:49 -0700329
330 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
tsaichristine8dca82e2020-04-07 09:40:03 -0700331 parseStatsEventToLogEvent(statsEvent, logEvent.get());
tsaichristine63143252020-03-20 17:03:49 -0700332 return logEvent;
Yangster13fb7e42018-03-07 17:30:49 -0800333}
334
tsaichristine63143252020-03-20 17:03:49 -0700335std::unique_ptr<LogEvent> CreateSyncStartEvent(uint64_t timestampNs,
336 const vector<int>& attributionUids,
337 const vector<string>& attributionTags,
338 const string& name) {
339 return CreateSyncStateChangedEvent(timestampNs, attributionUids, attributionTags, name,
340 SyncStateChanged::ON);
Yangster13fb7e42018-03-07 17:30:49 -0800341}
342
tsaichristine63143252020-03-20 17:03:49 -0700343std::unique_ptr<LogEvent> CreateSyncEndEvent(uint64_t timestampNs,
344 const vector<int>& attributionUids,
345 const vector<string>& attributionTags,
346 const string& name) {
347 return CreateSyncStateChangedEvent(timestampNs, attributionUids, attributionTags, name,
348 SyncStateChanged::OFF);
Yangster13fb7e42018-03-07 17:30:49 -0800349}
350
351sp<StatsLogProcessor> CreateStatsLogProcessor(const long timeBaseSec, const StatsdConfig& config,
352 const ConfigKey& key) {
353 sp<UidMap> uidMap = new UidMap();
Chenjie Yue2219202018-06-08 10:07:51 -0700354 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster13fb7e42018-03-07 17:30:49 -0800355 sp<AlarmMonitor> anomalyAlarmMonitor;
356 sp<AlarmMonitor> periodicAlarmMonitor;
Chenjie Yue2219202018-06-08 10:07:51 -0700357 sp<StatsLogProcessor> processor =
358 new StatsLogProcessor(uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor,
Tej Singh6ede28b2019-01-29 17:06:54 -0800359 timeBaseSec * NS_PER_SEC, [](const ConfigKey&) { return true; },
360 [](const int&, const vector<int64_t>&) { return true; });
Yangster-macb142cc82018-03-30 15:22:08 -0700361 processor->OnConfigUpdated(timeBaseSec * NS_PER_SEC, key, config);
Yangster13fb7e42018-03-07 17:30:49 -0800362 return processor;
363}
364
Yangster13fb7e42018-03-07 17:30:49 -0800365void sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> *events) {
366 std::sort(events->begin(), events->end(),
367 [](const std::unique_ptr<LogEvent>& a, const std::unique_ptr<LogEvent>& b) {
368 return a->GetElapsedTimestampNs() < b->GetElapsedTimestampNs();
369 });
370}
371
372int64_t StringToId(const string& str) {
373 return static_cast<int64_t>(std::hash<std::string>()(str));
374}
375
376
377} // namespace statsd
378} // namespace os
Tej Singh6ede28b2019-01-29 17:06:54 -0800379} // namespace android