blob: 02e6903e3260d653ba29d53437df1b2101b73a34 [file] [log] [blame]
Joe Onorato9fc9edf2017-10-15 20:08:52 -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 */
16
17#include "config/ConfigManager.h"
18
19#include "stats_util.h"
20
21#include <vector>
22
23#include <stdio.h>
24
25namespace android {
26namespace os {
27namespace statsd {
28
29static StatsdConfig build_fake_config();
30
31ConfigManager::ConfigManager() {
32}
33
34ConfigManager::~ConfigManager() {
35}
36
37void ConfigManager::Startup() {
38 // TODO: Implement me -- read from storage and call onto all of the listeners.
39 // Instead, we'll just make a fake one.
40
41 // this should be called from StatsService when it receives a statsd_config
42 UpdateConfig(ConfigKey(0, "fake"), build_fake_config());
43}
44
45void ConfigManager::AddListener(const sp<ConfigListener>& listener) {
46 mListeners.push_back(listener);
47}
48
49void ConfigManager::UpdateConfig(const ConfigKey& key, const StatsdConfig& config) {
50 // Add to map
51 mConfigs[key] = config;
52 // Why doesn't this work? mConfigs.insert({key, config});
53
54 // Save to disk
55 update_saved_configs();
56
57 // Tell everyone
58 for (auto& listener : mListeners) {
59 listener->OnConfigUpdated(key, config);
60 }
61}
62
63void ConfigManager::RemoveConfig(const ConfigKey& key) {
64 unordered_map<ConfigKey, StatsdConfig>::iterator it = mConfigs.find(key);
65 if (it != mConfigs.end()) {
66 // Remove from map
67 mConfigs.erase(it);
68
69 // Save to disk
70 update_saved_configs();
71
72 // Tell everyone
73 for (auto& listener : mListeners) {
74 listener->OnConfigRemoved(key);
75 }
76 }
77 // If we didn't find it, just quietly ignore it.
78}
79
80void ConfigManager::RemoveConfigs(int uid) {
81 vector<ConfigKey> removed;
82
83 for (auto it = mConfigs.begin(); it != mConfigs.end();) {
84 // Remove from map
85 if (it->first.GetUid() == uid) {
86 removed.push_back(it->first);
87 it = mConfigs.erase(it);
88 } else {
89 it++;
90 }
91 }
92
93 // Remove separately so if they do anything in the callback they can't mess up our iteration.
94 for (auto& key : removed) {
95 // Tell everyone
96 for (auto& listener : mListeners) {
97 listener->OnConfigRemoved(key);
98 }
99 }
100}
101
102void ConfigManager::Dump(FILE* out) {
103 fprintf(out, "CONFIGURATIONS (%d)\n", (int)mConfigs.size());
104 fprintf(out, " uid name\n");
105 for (unordered_map<ConfigKey, StatsdConfig>::const_iterator it = mConfigs.begin();
106 it != mConfigs.end(); it++) {
107 fprintf(out, " %6d %s\n", it->first.GetUid(), it->first.GetName().c_str());
108 // TODO: Print the contents of the config too.
109 }
110}
111
112void ConfigManager::update_saved_configs() {
113 // TODO: Implement me -- write to disk.
114}
115
116static StatsdConfig build_fake_config() {
117 // HACK: Hard code a test metric for counting screen on events...
118 StatsdConfig config;
119 config.set_config_id(12345L);
120
Yao Chen5154a3792017-10-30 22:57:06 -0700121 int WAKE_LOCK_TAG_ID = 1111; // put a fake id here to make testing easier.
Yao Chen729093d2017-10-16 10:33:26 -0700122 int WAKE_LOCK_UID_KEY_ID = 1;
Yao Chen5154a3792017-10-30 22:57:06 -0700123 int WAKE_LOCK_NAME_KEY = 3;
124 int WAKE_LOCK_STATE_KEY = 4;
Yao Chen729093d2017-10-16 10:33:26 -0700125 int WAKE_LOCK_ACQUIRE_VALUE = 1;
126 int WAKE_LOCK_RELEASE_VALUE = 0;
127
128 int APP_USAGE_ID = 12345;
129 int APP_USAGE_UID_KEY_ID = 1;
130 int APP_USAGE_STATE_KEY = 2;
131 int APP_USAGE_FOREGROUND = 1;
132 int APP_USAGE_BACKGROUND = 0;
133
Bookatzc1a050a2017-10-10 15:49:28 -0700134 int SCREEN_EVENT_TAG_ID = 29;
Yao Chen729093d2017-10-16 10:33:26 -0700135 int SCREEN_EVENT_STATE_KEY = 1;
136 int SCREEN_EVENT_ON_VALUE = 2;
137 int SCREEN_EVENT_OFF_VALUE = 1;
138
Bookatzc1a050a2017-10-10 15:49:28 -0700139 int UID_PROCESS_STATE_TAG_ID = 27;
Yao Chen729093d2017-10-16 10:33:26 -0700140 int UID_PROCESS_STATE_UID_KEY = 1;
141
Chenjie Yu5305e1d2017-10-31 13:49:36 -0700142 int KERNEL_WAKELOCK_TAG_ID = 1004;
Chenjie Yub3dda412017-10-24 13:41:59 -0700143 int KERNEL_WAKELOCK_NAME_KEY = 4;
144
Yangster1d4d6862017-10-31 12:58:51 -0700145 int DEVICE_TEMPERATURE_TAG_ID = 33;
146 int DEVICE_TEMPERATURE_KEY = 1;
147
Yao Chen729093d2017-10-16 10:33:26 -0700148 // Count Screen ON events.
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700149 CountMetric* metric = config.add_count_metric();
Yao Chen729093d2017-10-16 10:33:26 -0700150 metric->set_metric_id(1);
151 metric->set_what("SCREEN_TURNED_ON");
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700152 metric->mutable_bucket()->set_bucket_size_millis(30 * 1000L);
153
Bookatzd3606c72017-10-19 10:13:49 -0700154 // Anomaly threshold for screen-on count.
155 Alert* alert = metric->add_alerts();
156 alert->set_number_of_buckets(6);
157 alert->set_trigger_if_sum_gt(10);
158 alert->set_refractory_period_secs(30);
159
Yao Chen729093d2017-10-16 10:33:26 -0700160 // Count process state changes, slice by uid.
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700161 metric = config.add_count_metric();
Yao Chen729093d2017-10-16 10:33:26 -0700162 metric->set_metric_id(2);
163 metric->set_what("PROCESS_STATE_CHANGE");
164 metric->mutable_bucket()->set_bucket_size_millis(30 * 1000L);
165 KeyMatcher* keyMatcher = metric->add_dimension();
166 keyMatcher->set_key(UID_PROCESS_STATE_UID_KEY);
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700167
Yao Chen729093d2017-10-16 10:33:26 -0700168 // Count process state changes, slice by uid, while SCREEN_IS_OFF
169 metric = config.add_count_metric();
170 metric->set_metric_id(3);
171 metric->set_what("PROCESS_STATE_CHANGE");
172 metric->mutable_bucket()->set_bucket_size_millis(30 * 1000L);
173 keyMatcher = metric->add_dimension();
174 keyMatcher->set_key(UID_PROCESS_STATE_UID_KEY);
175 metric->set_condition("SCREEN_IS_OFF");
176
Yao Chen5110bed2017-10-23 12:50:02 -0700177 // Count wake lock, slice by uid, while SCREEN_IS_ON and app in background
Yao Chen729093d2017-10-16 10:33:26 -0700178 metric = config.add_count_metric();
179 metric->set_metric_id(4);
180 metric->set_what("APP_GET_WL");
181 metric->mutable_bucket()->set_bucket_size_millis(30 * 1000L);
182 keyMatcher = metric->add_dimension();
183 keyMatcher->set_key(WAKE_LOCK_UID_KEY_ID);
184 metric->set_condition("APP_IS_BACKGROUND_AND_SCREEN_ON");
185 EventConditionLink* link = metric->add_links();
186 link->set_condition("APP_IS_BACKGROUND");
187 link->add_key_in_main()->set_key(WAKE_LOCK_UID_KEY_ID);
188 link->add_key_in_condition()->set_key(APP_USAGE_UID_KEY_ID);
189
Yao Chen5154a3792017-10-30 22:57:06 -0700190 // Duration of an app holding any wl, while screen on and app in background, slice by uid
Yao Chen729093d2017-10-16 10:33:26 -0700191 DurationMetric* durationMetric = config.add_duration_metric();
192 durationMetric->set_metric_id(5);
Yao Chen729093d2017-10-16 10:33:26 -0700193 durationMetric->mutable_bucket()->set_bucket_size_millis(30 * 1000L);
194 durationMetric->set_type(DurationMetric_AggregationType_DURATION_SUM);
195 keyMatcher = durationMetric->add_dimension();
196 keyMatcher->set_key(WAKE_LOCK_UID_KEY_ID);
Yao Chen5154a3792017-10-30 22:57:06 -0700197 durationMetric->set_what("WL_STATE_PER_APP_PER_NAME");
Yao Chen729093d2017-10-16 10:33:26 -0700198 durationMetric->set_predicate("APP_IS_BACKGROUND_AND_SCREEN_ON");
199 link = durationMetric->add_links();
200 link->set_condition("APP_IS_BACKGROUND");
201 link->add_key_in_main()->set_key(WAKE_LOCK_UID_KEY_ID);
202 link->add_key_in_condition()->set_key(APP_USAGE_UID_KEY_ID);
203
Yao Chen5154a3792017-10-30 22:57:06 -0700204 // max Duration of an app holding any wl, while screen on and app in background, slice by uid
205 durationMetric = config.add_duration_metric();
206 durationMetric->set_metric_id(6);
207 durationMetric->mutable_bucket()->set_bucket_size_millis(30 * 1000L);
208 durationMetric->set_type(DurationMetric_AggregationType_DURATION_MAX_SPARSE);
209 keyMatcher = durationMetric->add_dimension();
210 keyMatcher->set_key(WAKE_LOCK_UID_KEY_ID);
211 durationMetric->set_what("WL_STATE_PER_APP_PER_NAME");
212 durationMetric->set_predicate("APP_IS_BACKGROUND_AND_SCREEN_ON");
213 link = durationMetric->add_links();
214 link->set_condition("APP_IS_BACKGROUND");
215 link->add_key_in_main()->set_key(WAKE_LOCK_UID_KEY_ID);
216 link->add_key_in_condition()->set_key(APP_USAGE_UID_KEY_ID);
217
218 // Duration of an app holding any wl, while screen on and app in background
219 durationMetric = config.add_duration_metric();
220 durationMetric->set_metric_id(7);
221 durationMetric->mutable_bucket()->set_bucket_size_millis(30 * 1000L);
222 durationMetric->set_type(DurationMetric_AggregationType_DURATION_MAX_SPARSE);
223 durationMetric->set_what("WL_STATE_PER_APP_PER_NAME");
224 durationMetric->set_predicate("APP_IS_BACKGROUND_AND_SCREEN_ON");
225 link = durationMetric->add_links();
226 link->set_condition("APP_IS_BACKGROUND");
227 link->add_key_in_main()->set_key(WAKE_LOCK_UID_KEY_ID);
228 link->add_key_in_condition()->set_key(APP_USAGE_UID_KEY_ID);
229
230 // Duration of screen on time.
231 durationMetric = config.add_duration_metric();
232 durationMetric->set_metric_id(8);
Yangster1d4d6862017-10-31 12:58:51 -0700233 durationMetric->mutable_bucket()->set_bucket_size_millis(10 * 1000L);
Yao Chen5154a3792017-10-30 22:57:06 -0700234 durationMetric->set_type(DurationMetric_AggregationType_DURATION_SUM);
235 durationMetric->set_what("SCREEN_IS_ON");
236
Chenjie Yub3dda412017-10-24 13:41:59 -0700237 // Value metric to count KERNEL_WAKELOCK when screen turned on
238 ValueMetric* valueMetric = config.add_value_metric();
239 valueMetric->set_metric_id(6);
240 valueMetric->set_what("KERNEL_WAKELOCK");
241 valueMetric->set_value_field(1);
242 valueMetric->set_condition("SCREEN_IS_ON");
243 keyMatcher = valueMetric->add_dimension();
244 keyMatcher->set_key(KERNEL_WAKELOCK_NAME_KEY);
245 // This is for testing easier. We should never set bucket size this small.
246 valueMetric->mutable_bucket()->set_bucket_size_millis(60 * 1000L);
247
Yao Chen5110bed2017-10-23 12:50:02 -0700248 // Add an EventMetric to log process state change events.
249 EventMetric* eventMetric = config.add_event_metric();
Yao Chen5154a3792017-10-30 22:57:06 -0700250 eventMetric->set_metric_id(9);
Yao Chen5110bed2017-10-23 12:50:02 -0700251 eventMetric->set_what("SCREEN_TURNED_ON");
252
Yangster1d4d6862017-10-31 12:58:51 -0700253 // Add an GaugeMetric.
254 GaugeMetric* gaugeMetric = config.add_gauge_metric();
255 gaugeMetric->set_metric_id(10);
256 gaugeMetric->set_what("DEVICE_TEMPERATURE");
257 gaugeMetric->set_gauge_field(DEVICE_TEMPERATURE_KEY);
258 gaugeMetric->mutable_bucket()->set_bucket_size_millis(60 * 1000L);
259
Yao Chen729093d2017-10-16 10:33:26 -0700260 // Event matchers............
Yangster1d4d6862017-10-31 12:58:51 -0700261 LogEntryMatcher* temperatureEntryMatcher = config.add_log_entry_matcher();
262 temperatureEntryMatcher->set_name("DEVICE_TEMPERATURE");
263 temperatureEntryMatcher->mutable_simple_log_entry_matcher()->set_tag(
264 DEVICE_TEMPERATURE_TAG_ID);
265
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700266 LogEntryMatcher* eventMatcher = config.add_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -0700267 eventMatcher->set_name("SCREEN_TURNED_ON");
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700268 SimpleLogEntryMatcher* simpleLogEntryMatcher = eventMatcher->mutable_simple_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -0700269 simpleLogEntryMatcher->set_tag(SCREEN_EVENT_TAG_ID);
270 KeyValueMatcher* keyValueMatcher = simpleLogEntryMatcher->add_key_value_matcher();
271 keyValueMatcher->mutable_key_matcher()->set_key(SCREEN_EVENT_STATE_KEY);
272 keyValueMatcher->set_eq_int(SCREEN_EVENT_ON_VALUE);
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700273
274 eventMatcher = config.add_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -0700275 eventMatcher->set_name("SCREEN_TURNED_OFF");
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700276 simpleLogEntryMatcher = eventMatcher->mutable_simple_log_entry_matcher();
Yao Chen729093d2017-10-16 10:33:26 -0700277 simpleLogEntryMatcher->set_tag(SCREEN_EVENT_TAG_ID);
278 keyValueMatcher = simpleLogEntryMatcher->add_key_value_matcher();
279 keyValueMatcher->mutable_key_matcher()->set_key(SCREEN_EVENT_STATE_KEY);
280 keyValueMatcher->set_eq_int(SCREEN_EVENT_OFF_VALUE);
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700281
Yao Chen729093d2017-10-16 10:33:26 -0700282 eventMatcher = config.add_log_entry_matcher();
283 eventMatcher->set_name("PROCESS_STATE_CHANGE");
284 simpleLogEntryMatcher = eventMatcher->mutable_simple_log_entry_matcher();
285 simpleLogEntryMatcher->set_tag(UID_PROCESS_STATE_TAG_ID);
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700286
Yao Chen729093d2017-10-16 10:33:26 -0700287 eventMatcher = config.add_log_entry_matcher();
288 eventMatcher->set_name("APP_GOES_BACKGROUND");
289 simpleLogEntryMatcher = eventMatcher->mutable_simple_log_entry_matcher();
290 simpleLogEntryMatcher->set_tag(APP_USAGE_ID);
291 keyValueMatcher = simpleLogEntryMatcher->add_key_value_matcher();
292 keyValueMatcher->mutable_key_matcher()->set_key(APP_USAGE_STATE_KEY);
293 keyValueMatcher->set_eq_int(APP_USAGE_BACKGROUND);
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700294
Yao Chen729093d2017-10-16 10:33:26 -0700295 eventMatcher = config.add_log_entry_matcher();
296 eventMatcher->set_name("APP_GOES_FOREGROUND");
297 simpleLogEntryMatcher = eventMatcher->mutable_simple_log_entry_matcher();
298 simpleLogEntryMatcher->set_tag(APP_USAGE_ID);
299 keyValueMatcher = simpleLogEntryMatcher->add_key_value_matcher();
300 keyValueMatcher->mutable_key_matcher()->set_key(APP_USAGE_STATE_KEY);
301 keyValueMatcher->set_eq_int(APP_USAGE_FOREGROUND);
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700302
Yao Chen729093d2017-10-16 10:33:26 -0700303 eventMatcher = config.add_log_entry_matcher();
304 eventMatcher->set_name("APP_GET_WL");
305 simpleLogEntryMatcher = eventMatcher->mutable_simple_log_entry_matcher();
306 simpleLogEntryMatcher->set_tag(WAKE_LOCK_TAG_ID);
307 keyValueMatcher = simpleLogEntryMatcher->add_key_value_matcher();
308 keyValueMatcher->mutable_key_matcher()->set_key(WAKE_LOCK_STATE_KEY);
309 keyValueMatcher->set_eq_int(WAKE_LOCK_ACQUIRE_VALUE);
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700310
Yao Chen729093d2017-10-16 10:33:26 -0700311 eventMatcher = config.add_log_entry_matcher();
312 eventMatcher->set_name("APP_RELEASE_WL");
313 simpleLogEntryMatcher = eventMatcher->mutable_simple_log_entry_matcher();
314 simpleLogEntryMatcher->set_tag(WAKE_LOCK_TAG_ID);
315 keyValueMatcher = simpleLogEntryMatcher->add_key_value_matcher();
316 keyValueMatcher->mutable_key_matcher()->set_key(WAKE_LOCK_STATE_KEY);
317 keyValueMatcher->set_eq_int(WAKE_LOCK_RELEASE_VALUE);
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700318
Chenjie Yu5305e1d2017-10-31 13:49:36 -0700319 // pulled events
320 eventMatcher = config.add_log_entry_matcher();
321 eventMatcher->set_name("KERNEL_WAKELOCK");
322 simpleLogEntryMatcher = eventMatcher->mutable_simple_log_entry_matcher();
323 simpleLogEntryMatcher->set_tag(KERNEL_WAKELOCK_TAG_ID);
324
Yao Chen729093d2017-10-16 10:33:26 -0700325 // Conditions.............
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700326 Condition* condition = config.add_condition();
327 condition->set_name("SCREEN_IS_ON");
328 SimpleCondition* simpleCondition = condition->mutable_simple_condition();
Yao Chen729093d2017-10-16 10:33:26 -0700329 simpleCondition->set_start("SCREEN_TURNED_ON");
330 simpleCondition->set_stop("SCREEN_TURNED_OFF");
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700331
332 condition = config.add_condition();
333 condition->set_name("SCREEN_IS_OFF");
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700334 simpleCondition = condition->mutable_simple_condition();
Yao Chen729093d2017-10-16 10:33:26 -0700335 simpleCondition->set_start("SCREEN_TURNED_OFF");
336 simpleCondition->set_stop("SCREEN_TURNED_ON");
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700337
338 condition = config.add_condition();
Yao Chen729093d2017-10-16 10:33:26 -0700339 condition->set_name("APP_IS_BACKGROUND");
340 simpleCondition = condition->mutable_simple_condition();
341 simpleCondition->set_start("APP_GOES_BACKGROUND");
342 simpleCondition->set_stop("APP_GOES_FOREGROUND");
Yao Chen5154a3792017-10-30 22:57:06 -0700343 KeyMatcher* condition_dimension1 = simpleCondition->add_dimension();
344 condition_dimension1->set_key(APP_USAGE_UID_KEY_ID);
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700345
346 condition = config.add_condition();
Yao Chen729093d2017-10-16 10:33:26 -0700347 condition->set_name("APP_IS_BACKGROUND_AND_SCREEN_ON");
348 Condition_Combination* combination_condition = condition->mutable_combination();
349 combination_condition->set_operation(LogicalOperation::AND);
350 combination_condition->add_condition("APP_IS_BACKGROUND");
351 combination_condition->add_condition("SCREEN_IS_ON");
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700352
Yao Chen5154a3792017-10-30 22:57:06 -0700353 condition = config.add_condition();
354 condition->set_name("WL_STATE_PER_APP_PER_NAME");
355 simpleCondition = condition->mutable_simple_condition();
356 simpleCondition->set_start("APP_GET_WL");
357 simpleCondition->set_stop("APP_RELEASE_WL");
358 KeyMatcher* condition_dimension = simpleCondition->add_dimension();
359 condition_dimension->set_key(WAKE_LOCK_UID_KEY_ID);
360 condition_dimension = simpleCondition->add_dimension();
361 condition_dimension->set_key(WAKE_LOCK_NAME_KEY);
362
Joe Onorato9fc9edf2017-10-15 20:08:52 -0700363 return config;
364}
365
366} // namespace statsd
367} // namespace os
368} // namespace android