| 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 |