blob: 4bce89fd7f9c0c7854c42b4b8c328b22f469a04f [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
250std::unique_ptr<LogEvent> CreateScreenStateChangedEvent(
tsaichristine63143252020-03-20 17:03:49 -0700251 uint64_t timestampNs, const android::view::DisplayStateEnum state) {
252 AStatsEvent* statsEvent = AStatsEvent_obtain();
253 AStatsEvent_setAtomId(statsEvent, util::SCREEN_STATE_CHANGED);
254 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
Yangster13fb7e42018-03-07 17:30:49 -0800255
tsaichristine63143252020-03-20 17:03:49 -0700256 AStatsEvent_writeInt32(statsEvent, state);
257 AStatsEvent_build(statsEvent);
Yangster13fb7e42018-03-07 17:30:49 -0800258
tsaichristine63143252020-03-20 17:03:49 -0700259 size_t size;
260 uint8_t* buf = AStatsEvent_getBuffer(statsEvent, &size);
261
262 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
263 logEvent->parseBuffer(buf, size);
264 AStatsEvent_release(statsEvent);
265 return logEvent;
Yangster13fb7e42018-03-07 17:30:49 -0800266}
267
268std::unique_ptr<LogEvent> CreateScheduledJobStateChangedEvent(
tsaichristine63143252020-03-20 17:03:49 -0700269 const vector<int>& attributionUids, const vector<string>& attributionTags,
270 const string& jobName, const ScheduledJobStateChanged::State state, uint64_t timestampNs) {
271 AStatsEvent* statsEvent = AStatsEvent_obtain();
272 AStatsEvent_setAtomId(statsEvent, util::SCHEDULED_JOB_STATE_CHANGED);
273 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
274
275 vector<const char*> cTags(attributionTags.size());
276 for (int i = 0; i < cTags.size(); i++) {
277 cTags[i] = attributionTags[i].c_str();
278 }
279
280 AStatsEvent_writeAttributionChain(statsEvent,
281 reinterpret_cast<const uint32_t*>(attributionUids.data()),
282 cTags.data(), attributionUids.size());
283 AStatsEvent_writeString(statsEvent, jobName.c_str());
284 AStatsEvent_writeInt32(statsEvent, state);
285 AStatsEvent_build(statsEvent);
286
287 size_t size;
288 uint8_t* buf = AStatsEvent_getBuffer(statsEvent, &size);
289
290 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
291 logEvent->parseBuffer(buf, size);
292 AStatsEvent_release(statsEvent);
293 return logEvent;
Yangster13fb7e42018-03-07 17:30:49 -0800294}
295
tsaichristine63143252020-03-20 17:03:49 -0700296std::unique_ptr<LogEvent> CreateStartScheduledJobEvent(uint64_t timestampNs,
297 const vector<int>& attributionUids,
298 const vector<string>& attributionTags,
299 const string& jobName) {
300 return CreateScheduledJobStateChangedEvent(attributionUids, attributionTags, jobName,
301 ScheduledJobStateChanged::STARTED, timestampNs);
Yangster13fb7e42018-03-07 17:30:49 -0800302}
303
304// Create log event when scheduled job finishes.
tsaichristine63143252020-03-20 17:03:49 -0700305std::unique_ptr<LogEvent> CreateFinishScheduledJobEvent(uint64_t timestampNs,
306 const vector<int>& attributionUids,
307 const vector<string>& attributionTags,
308 const string& jobName) {
309 return CreateScheduledJobStateChangedEvent(attributionUids, attributionTags, jobName,
310 ScheduledJobStateChanged::FINISHED, timestampNs);
Yangster13fb7e42018-03-07 17:30:49 -0800311}
312
tsaichristine63143252020-03-20 17:03:49 -0700313std::unique_ptr<LogEvent> CreateSyncStateChangedEvent(uint64_t timestampNs,
314 const vector<int>& attributionUids,
315 const vector<string>& attributionTags,
316 const string& name,
317 const SyncStateChanged::State state) {
318 AStatsEvent* statsEvent = AStatsEvent_obtain();
319 AStatsEvent_setAtomId(statsEvent, util::SYNC_STATE_CHANGED);
320 AStatsEvent_overwriteTimestamp(statsEvent, timestampNs);
321
322 vector<const char*> cTags(attributionTags.size());
323 for (int i = 0; i < cTags.size(); i++) {
324 cTags[i] = attributionTags[i].c_str();
325 }
326
327 AStatsEvent_writeAttributionChain(statsEvent,
328 reinterpret_cast<const uint32_t*>(attributionUids.data()),
329 cTags.data(), attributionUids.size());
330 AStatsEvent_writeString(statsEvent, name.c_str());
331 AStatsEvent_writeInt32(statsEvent, state);
332 AStatsEvent_build(statsEvent);
333
334 size_t size;
335 uint8_t* buf = AStatsEvent_getBuffer(statsEvent, &size);
336
337 std::unique_ptr<LogEvent> logEvent = std::make_unique<LogEvent>(/*uid=*/0, /*pid=*/0);
338 logEvent->parseBuffer(buf, size);
339 AStatsEvent_release(statsEvent);
340 return logEvent;
Yangster13fb7e42018-03-07 17:30:49 -0800341}
342
tsaichristine63143252020-03-20 17:03:49 -0700343std::unique_ptr<LogEvent> CreateSyncStartEvent(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::ON);
Yangster13fb7e42018-03-07 17:30:49 -0800349}
350
tsaichristine63143252020-03-20 17:03:49 -0700351std::unique_ptr<LogEvent> CreateSyncEndEvent(uint64_t timestampNs,
352 const vector<int>& attributionUids,
353 const vector<string>& attributionTags,
354 const string& name) {
355 return CreateSyncStateChangedEvent(timestampNs, attributionUids, attributionTags, name,
356 SyncStateChanged::OFF);
Yangster13fb7e42018-03-07 17:30:49 -0800357}
358
359sp<StatsLogProcessor> CreateStatsLogProcessor(const long timeBaseSec, const StatsdConfig& config,
360 const ConfigKey& key) {
361 sp<UidMap> uidMap = new UidMap();
Chenjie Yue2219202018-06-08 10:07:51 -0700362 sp<StatsPullerManager> pullerManager = new StatsPullerManager();
Yangster13fb7e42018-03-07 17:30:49 -0800363 sp<AlarmMonitor> anomalyAlarmMonitor;
364 sp<AlarmMonitor> periodicAlarmMonitor;
Chenjie Yue2219202018-06-08 10:07:51 -0700365 sp<StatsLogProcessor> processor =
366 new StatsLogProcessor(uidMap, pullerManager, anomalyAlarmMonitor, periodicAlarmMonitor,
Tej Singh6ede28b2019-01-29 17:06:54 -0800367 timeBaseSec * NS_PER_SEC, [](const ConfigKey&) { return true; },
368 [](const int&, const vector<int64_t>&) { return true; });
Yangster-macb142cc82018-03-30 15:22:08 -0700369 processor->OnConfigUpdated(timeBaseSec * NS_PER_SEC, key, config);
Yangster13fb7e42018-03-07 17:30:49 -0800370 return processor;
371}
372
373AttributionNodeInternal CreateAttribution(const int& uid, const string& tag) {
374 AttributionNodeInternal attribution;
375 attribution.set_uid(uid);
376 attribution.set_tag(tag);
377 return attribution;
378}
379
380void sortLogEventsByTimestamp(std::vector<std::unique_ptr<LogEvent>> *events) {
381 std::sort(events->begin(), events->end(),
382 [](const std::unique_ptr<LogEvent>& a, const std::unique_ptr<LogEvent>& b) {
383 return a->GetElapsedTimestampNs() < b->GetElapsedTimestampNs();
384 });
385}
386
387int64_t StringToId(const string& str) {
388 return static_cast<int64_t>(std::hash<std::string>()(str));
389}
390
391
392} // namespace statsd
393} // namespace os
Tej Singh6ede28b2019-01-29 17:06:54 -0800394} // namespace android