OLD | NEW |
1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium OS Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "metrics_daemon.h" | 5 #include "metrics_daemon.h" |
6 | 6 |
7 #include <dbus/dbus-glib-lowlevel.h> | 7 #include <dbus/dbus-glib-lowlevel.h> |
8 #include <sys/file.h> | 8 #include <sys/file.h> |
9 | 9 |
10 #include <base/eintr_wrapper.h> | 10 #include <base/eintr_wrapper.h> |
11 #include <base/logging.h> | 11 #include <base/logging.h> |
12 | 12 |
13 using base::Time; | 13 using base::Time; |
14 using base::TimeDelta; | 14 using base::TimeDelta; |
15 using base::TimeTicks; | 15 using base::TimeTicks; |
16 | 16 |
17 #define SAFE_MESSAGE(e) (e.message ? e.message : "unknown error") | 17 #define SAFE_MESSAGE(e) (e.message ? e.message : "unknown error") |
18 #define DBUS_IFACE_FLIMFLAM_MANAGER "org.chromium.flimflam.Manager" | 18 #define DBUS_IFACE_FLIMFLAM_MANAGER "org.chromium.flimflam.Manager" |
19 #define DBUS_IFACE_POWER_MANAGER "org.chromium.Power.Manager" | 19 #define DBUS_IFACE_POWER_MANAGER "org.chromium.PowerManager" |
20 #define DBUS_IFACE_SCREENSAVER_MANAGER "org.chromium.ScreenSaver.Manager" | |
21 #define DBUS_IFACE_SESSION_MANAGER "org.chromium.SessionManagerInterface" | 20 #define DBUS_IFACE_SESSION_MANAGER "org.chromium.SessionManagerInterface" |
22 | 21 |
23 // File to aggregate daily usage before sending to UMA. | 22 // File to aggregate daily usage before sending to UMA. |
24 // TODO(petkov): This file should probably live in a user-specific stateful | 23 // TODO(petkov): This file should probably live in a user-specific stateful |
25 // location, e.g., /home/chronos/user. | 24 // location, e.g., /home/chronos/user. |
26 static const char kDailyUseRecordFile[] = "/var/log/metrics/daily-usage"; | 25 static const char kDailyUseRecordFile[] = "/var/log/metrics/daily-usage"; |
27 | 26 |
28 static const int kSecondsPerMinute = 60; | 27 static const int kSecondsPerMinute = 60; |
29 static const int kMinutesPerHour = 60; | 28 static const int kMinutesPerHour = 60; |
30 static const int kHoursPerDay = 24; | 29 static const int kHoursPerDay = 24; |
(...skipping 25 matching lines...) Expand all Loading... |
56 // static | 55 // static |
57 const char* MetricsDaemon::kDBusMatches_[] = { | 56 const char* MetricsDaemon::kDBusMatches_[] = { |
58 "type='signal'," | 57 "type='signal'," |
59 "sender='org.chromium.flimflam'," | 58 "sender='org.chromium.flimflam'," |
60 "interface='" DBUS_IFACE_FLIMFLAM_MANAGER "'," | 59 "interface='" DBUS_IFACE_FLIMFLAM_MANAGER "'," |
61 "path='/'," | 60 "path='/'," |
62 "member='StateChanged'", | 61 "member='StateChanged'", |
63 | 62 |
64 "type='signal'," | 63 "type='signal'," |
65 "interface='" DBUS_IFACE_POWER_MANAGER "'," | 64 "interface='" DBUS_IFACE_POWER_MANAGER "'," |
66 "path='/'," | 65 "path='/'" |
67 "member='PowerStateChanged'", | |
68 | |
69 "type='signal'," | |
70 "interface='" DBUS_IFACE_SCREENSAVER_MANAGER "'," | |
71 "path='/'," | |
72 "member='LockStateChanged'", | |
73 | 66 |
74 "type='signal'," | 67 "type='signal'," |
75 "sender='org.chromium.SessionManager'," | 68 "sender='org.chromium.SessionManager'," |
76 "interface='" DBUS_IFACE_SESSION_MANAGER "'," | 69 "interface='" DBUS_IFACE_SESSION_MANAGER "'," |
77 "path='/org/chromium/SessionManager'," | 70 "path='/org/chromium/SessionManager'," |
78 "member='SessionStateChanged'", | 71 "member='SessionStateChanged'", |
79 }; | 72 }; |
80 | 73 |
81 // static | 74 // static |
82 const char* MetricsDaemon::kNetworkStates_[] = { | 75 const char* MetricsDaemon::kNetworkStates_[] = { |
83 #define STATE(name, capname) #name, | 76 #define STATE(name, capname) #name, |
84 #include "network_states.h" | 77 #include "network_states.h" |
85 }; | 78 }; |
86 | 79 |
87 // static | 80 // static |
88 const char* MetricsDaemon::kPowerStates_[] = { | 81 const char* MetricsDaemon::kPowerStates_[] = { |
89 #define STATE(name, capname) #name, | 82 #define STATE(name, capname) #name, |
90 #include "power_states.h" | 83 #include "power_states.h" |
91 }; | 84 }; |
92 | 85 |
93 // static | 86 // static |
94 const char* MetricsDaemon::kScreenSaverStates_[] = { | |
95 #define STATE(name, capname) #name, | |
96 #include "screensaver_states.h" | |
97 }; | |
98 | |
99 // static | |
100 const char* MetricsDaemon::kSessionStates_[] = { | 87 const char* MetricsDaemon::kSessionStates_[] = { |
101 #define STATE(name, capname) #name, | 88 #define STATE(name, capname) #name, |
102 #include "session_states.h" | 89 #include "session_states.h" |
103 }; | 90 }; |
104 | 91 |
105 void MetricsDaemon::Run(bool run_as_daemon) { | 92 void MetricsDaemon::Run(bool run_as_daemon) { |
106 if (!run_as_daemon || daemon(0, 0) == 0) { | 93 if (!run_as_daemon || daemon(0, 0) == 0) { |
107 Loop(); | 94 Loop(); |
108 } | 95 } |
109 } | 96 } |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
174 DBusMessageIter iter; | 161 DBusMessageIter iter; |
175 dbus_message_iter_init(message, &iter); | 162 dbus_message_iter_init(message, &iter); |
176 if (strcmp(interface, DBUS_IFACE_FLIMFLAM_MANAGER) == 0) { | 163 if (strcmp(interface, DBUS_IFACE_FLIMFLAM_MANAGER) == 0) { |
177 CHECK(strcmp(dbus_message_get_member(message), | 164 CHECK(strcmp(dbus_message_get_member(message), |
178 "StateChanged") == 0); | 165 "StateChanged") == 0); |
179 | 166 |
180 char* state_name; | 167 char* state_name; |
181 dbus_message_iter_get_basic(&iter, &state_name); | 168 dbus_message_iter_get_basic(&iter, &state_name); |
182 daemon->NetStateChanged(state_name, ticks); | 169 daemon->NetStateChanged(state_name, ticks); |
183 } else if (strcmp(interface, DBUS_IFACE_POWER_MANAGER) == 0) { | 170 } else if (strcmp(interface, DBUS_IFACE_POWER_MANAGER) == 0) { |
184 CHECK(strcmp(dbus_message_get_member(message), | 171 const char* member = dbus_message_get_member(message); |
185 "PowerStateChanged") == 0); | 172 if (strcmp(member, "ScreenIsLocked") == 0) { |
186 | 173 daemon->SetUserActiveState(false, now); |
187 char* state_name; | 174 } else if (strcmp(member, "ScreenIsUnlocked") == 0) { |
188 dbus_message_iter_get_basic(&iter, &state_name); | 175 daemon->SetUserActiveState(true, now); |
189 daemon->PowerStateChanged(state_name, now); | 176 } else if (strcmp(member, "PowerStateChanged") == 0) { |
190 } else if (strcmp(interface, DBUS_IFACE_SCREENSAVER_MANAGER) == 0) { | 177 char* state_name; |
191 CHECK(strcmp(dbus_message_get_member(message), | 178 dbus_message_iter_get_basic(&iter, &state_name); |
192 "LockStateChanged") == 0); | 179 daemon->PowerStateChanged(state_name, now); |
193 | 180 } |
194 char* state_name; | |
195 dbus_message_iter_get_basic(&iter, &state_name); | |
196 daemon->ScreenSaverStateChanged(state_name, now); | |
197 } else if (strcmp(interface, DBUS_IFACE_SESSION_MANAGER) == 0) { | 181 } else if (strcmp(interface, DBUS_IFACE_SESSION_MANAGER) == 0) { |
198 CHECK(strcmp(dbus_message_get_member(message), | 182 CHECK(strcmp(dbus_message_get_member(message), |
199 "SessionStateChanged") == 0); | 183 "SessionStateChanged") == 0); |
200 | 184 |
201 char* state_name; | 185 char* state_name; |
202 dbus_message_iter_get_basic(&iter, &state_name); | 186 dbus_message_iter_get_basic(&iter, &state_name); |
203 daemon->SessionStateChanged(state_name, now); | 187 daemon->SessionStateChanged(state_name, now); |
204 } else { | 188 } else { |
205 DLOG(WARNING) << "unexpected interface: " << interface; | 189 DLOG(WARNING) << "unexpected interface: " << interface; |
206 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; | 190 return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 MetricsDaemon::LookupPowerState(const char* state_name) { | 242 MetricsDaemon::LookupPowerState(const char* state_name) { |
259 for (int i = 0; i < kNumberPowerStates; i++) { | 243 for (int i = 0; i < kNumberPowerStates; i++) { |
260 if (strcmp(state_name, kPowerStates_[i]) == 0) { | 244 if (strcmp(state_name, kPowerStates_[i]) == 0) { |
261 return static_cast<PowerState>(i); | 245 return static_cast<PowerState>(i); |
262 } | 246 } |
263 } | 247 } |
264 DLOG(WARNING) << "unknown power state: " << state_name; | 248 DLOG(WARNING) << "unknown power state: " << state_name; |
265 return kUnknownPowerState; | 249 return kUnknownPowerState; |
266 } | 250 } |
267 | 251 |
268 void MetricsDaemon::ScreenSaverStateChanged(const char* state_name, Time now) { | |
269 DLOG(INFO) << "screen-saver state: " << state_name; | |
270 screensaver_state_ = LookupScreenSaverState(state_name); | |
271 SetUserActiveState(screensaver_state_ == kScreenSaverStateUnlocked, now); | |
272 } | |
273 | |
274 MetricsDaemon::ScreenSaverState | |
275 MetricsDaemon::LookupScreenSaverState(const char* state_name) { | |
276 for (int i = 0; i < kNumberScreenSaverStates; i++) { | |
277 if (strcmp(state_name, kScreenSaverStates_[i]) == 0) { | |
278 return static_cast<ScreenSaverState>(i); | |
279 } | |
280 } | |
281 DLOG(WARNING) << "unknown screen-saver state: " << state_name; | |
282 return kUnknownScreenSaverState; | |
283 } | |
284 | |
285 void MetricsDaemon::SessionStateChanged(const char* state_name, Time now) { | 252 void MetricsDaemon::SessionStateChanged(const char* state_name, Time now) { |
286 DLOG(INFO) << "user session state: " << state_name; | 253 DLOG(INFO) << "user session state: " << state_name; |
287 session_state_ = LookupSessionState(state_name); | 254 session_state_ = LookupSessionState(state_name); |
288 SetUserActiveState(session_state_ == kSessionStateStarted, now); | 255 SetUserActiveState(session_state_ == kSessionStateStarted, now); |
289 } | 256 } |
290 | 257 |
291 MetricsDaemon::SessionState | 258 MetricsDaemon::SessionState |
292 MetricsDaemon::LookupSessionState(const char* state_name) { | 259 MetricsDaemon::LookupSessionState(const char* state_name) { |
293 for (int i = 0; i < kNumberSessionStates; i++) { | 260 for (int i = 0; i < kNumberSessionStates; i++) { |
294 if (strcmp(state_name, kSessionStates_[i]) == 0) { | 261 if (strcmp(state_name, kSessionStates_[i]) == 0) { |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
454 usemon_source_ = NULL; | 421 usemon_source_ = NULL; |
455 usemon_interval_ = 0; | 422 usemon_interval_ = 0; |
456 } | 423 } |
457 | 424 |
458 void MetricsDaemon::SendMetric(const std::string& name, int sample, | 425 void MetricsDaemon::SendMetric(const std::string& name, int sample, |
459 int min, int max, int nbuckets) { | 426 int min, int max, int nbuckets) { |
460 DLOG(INFO) << "received metric: " << name << " " << sample << " " | 427 DLOG(INFO) << "received metric: " << name << " " << sample << " " |
461 << min << " " << max << " " << nbuckets; | 428 << min << " " << max << " " << nbuckets; |
462 metrics_lib_->SendToUMA(name, sample, min, max, nbuckets); | 429 metrics_lib_->SendToUMA(name, sample, min, max, nbuckets); |
463 } | 430 } |
OLD | NEW |