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 #ifndef METRICS_DAEMON_H_ | 5 #ifndef METRICS_DAEMON_H_ |
6 #define METRICS_DAEMON_H_ | 6 #define METRICS_DAEMON_H_ |
7 | 7 |
8 #include <dbus/dbus.h> | 8 #include <dbus/dbus.h> |
9 #include <glib.h> | 9 #include <glib.h> |
| 10 #include <map> |
10 | 11 |
| 12 #include <base/file_path.h> |
11 #include <base/scoped_ptr.h> | 13 #include <base/scoped_ptr.h> |
12 #include <base/time.h> | 14 #include <base/time.h> |
13 #include <gtest/gtest_prod.h> // for FRIEND_TEST | 15 #include <gtest/gtest_prod.h> // for FRIEND_TEST |
14 | 16 |
15 #include "metrics_library.h" | 17 #include "metrics_library.h" |
16 | 18 |
17 namespace chromeos_metrics { | 19 namespace chromeos_metrics { |
18 class FrequencyCounter; | 20 class FrequencyCounter; |
19 class TaggedCounterInterface; | 21 class TaggedCounter; |
| 22 class TaggedCounterReporter; |
20 } | 23 } |
21 | 24 |
22 class MetricsDaemon { | 25 class MetricsDaemon { |
23 | 26 |
24 public: | 27 public: |
25 MetricsDaemon(); | 28 MetricsDaemon(); |
26 ~MetricsDaemon(); | 29 ~MetricsDaemon(); |
27 | 30 |
28 // Initializes. | 31 // Initializes. |
29 void Init(bool testing, MetricsLibraryInterface* metrics_lib); | 32 void Init(bool testing, MetricsLibraryInterface* metrics_lib); |
30 | 33 |
31 // Does all the work. If |run_as_daemon| is true, daemonizes by | 34 // Does all the work. If |run_as_daemon| is true, daemonizes by |
32 // forking. | 35 // forking. |
33 void Run(bool run_as_daemon); | 36 void Run(bool run_as_daemon); |
34 | 37 |
35 private: | 38 private: |
36 friend class MetricsDaemonTest; | 39 friend class MetricsDaemonTest; |
37 FRIEND_TEST(MetricsDaemonTest, CheckSystemCrash); | 40 FRIEND_TEST(MetricsDaemonTest, CheckSystemCrash); |
| 41 FRIEND_TEST(MetricsDaemonTest, ComputeEpochNoCurrent); |
| 42 FRIEND_TEST(MetricsDaemonTest, ComputeEpochNoLast); |
| 43 FRIEND_TEST(MetricsDaemonTest, GetHistogramPath); |
| 44 FRIEND_TEST(MetricsDaemonTest, IsNewEpoch); |
38 FRIEND_TEST(MetricsDaemonTest, LookupNetworkState); | 45 FRIEND_TEST(MetricsDaemonTest, LookupNetworkState); |
39 FRIEND_TEST(MetricsDaemonTest, LookupPowerState); | 46 FRIEND_TEST(MetricsDaemonTest, LookupPowerState); |
40 FRIEND_TEST(MetricsDaemonTest, LookupScreenSaverState); | 47 FRIEND_TEST(MetricsDaemonTest, LookupScreenSaverState); |
41 FRIEND_TEST(MetricsDaemonTest, LookupSessionState); | 48 FRIEND_TEST(MetricsDaemonTest, LookupSessionState); |
42 FRIEND_TEST(MetricsDaemonTest, MessageFilter); | 49 FRIEND_TEST(MetricsDaemonTest, MessageFilter); |
43 FRIEND_TEST(MetricsDaemonTest, NetStateChangedSimpleDrop); | 50 FRIEND_TEST(MetricsDaemonTest, NetStateChangedSimpleDrop); |
44 FRIEND_TEST(MetricsDaemonTest, NetStateChangedSuspend); | 51 FRIEND_TEST(MetricsDaemonTest, NetStateChangedSuspend); |
45 FRIEND_TEST(MetricsDaemonTest, PowerStateChanged); | 52 FRIEND_TEST(MetricsDaemonTest, PowerStateChanged); |
46 FRIEND_TEST(MetricsDaemonTest, ProcessKernelCrash); | 53 FRIEND_TEST(MetricsDaemonTest, ProcessKernelCrash); |
47 FRIEND_TEST(MetricsDaemonTest, ProcessUncleanShutdown); | 54 FRIEND_TEST(MetricsDaemonTest, ProcessUncleanShutdown); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 }; | 89 }; |
83 | 90 |
84 // Data record for aggregating daily usage. | 91 // Data record for aggregating daily usage. |
85 class UseRecord { | 92 class UseRecord { |
86 public: | 93 public: |
87 UseRecord() : day_(0), seconds_(0) {} | 94 UseRecord() : day_(0), seconds_(0) {} |
88 int day_; | 95 int day_; |
89 int seconds_; | 96 int seconds_; |
90 }; | 97 }; |
91 | 98 |
| 99 typedef std::map<std::string, chromeos_metrics::FrequencyCounter*> |
| 100 FrequencyCounters; |
| 101 |
92 // Metric parameters. | 102 // Metric parameters. |
93 static const char kMetricAnyCrashesDailyName[]; | 103 static const char kMetricAnyCrashesDailyName[]; |
94 static const char kMetricCrashesDailyBuckets; | 104 static const char kMetricAnyCrashesWeeklyName[]; |
95 static const char kMetricCrashesDailyMax; | 105 static const char kMetricCrashFrequencyBuckets; |
96 static const char kMetricCrashesDailyMin; | 106 static const char kMetricCrashFrequencyMax; |
| 107 static const char kMetricCrashFrequencyMin; |
97 static const int kMetricCrashIntervalBuckets; | 108 static const int kMetricCrashIntervalBuckets; |
98 static const int kMetricCrashIntervalMax; | 109 static const int kMetricCrashIntervalMax; |
99 static const int kMetricCrashIntervalMin; | 110 static const int kMetricCrashIntervalMin; |
100 static const int kMetricDailyUseTimeBuckets; | 111 static const int kMetricDailyUseTimeBuckets; |
101 static const int kMetricDailyUseTimeMax; | 112 static const int kMetricDailyUseTimeMax; |
102 static const int kMetricDailyUseTimeMin; | 113 static const int kMetricDailyUseTimeMin; |
103 static const char kMetricDailyUseTimeName[]; | 114 static const char kMetricDailyUseTimeName[]; |
104 static const char kMetricKernelCrashesDailyName[]; | 115 static const char kMetricKernelCrashesDailyName[]; |
| 116 static const char kMetricKernelCrashesWeeklyName[]; |
105 static const char kMetricKernelCrashIntervalName[]; | 117 static const char kMetricKernelCrashIntervalName[]; |
| 118 static const char kMetricsPath[]; |
106 static const int kMetricTimeToNetworkDropBuckets; | 119 static const int kMetricTimeToNetworkDropBuckets; |
107 static const int kMetricTimeToNetworkDropMax; | 120 static const int kMetricTimeToNetworkDropMax; |
108 static const int kMetricTimeToNetworkDropMin; | 121 static const int kMetricTimeToNetworkDropMin; |
109 static const char kMetricTimeToNetworkDropName[]; | 122 static const char kMetricTimeToNetworkDropName[]; |
110 static const char kMetricUncleanShutdownIntervalName[]; | 123 static const char kMetricUncleanShutdownIntervalName[]; |
111 static const char kMetricUncleanShutdownsDailyName[]; | 124 static const char kMetricUncleanShutdownsDailyName[]; |
| 125 static const char kMetricUncleanShutdownsWeeklyName[]; |
112 static const char kMetricUserCrashesDailyName[]; | 126 static const char kMetricUserCrashesDailyName[]; |
| 127 static const char kMetricUserCrashesWeeklyName[]; |
113 static const char kMetricUserCrashIntervalName[]; | 128 static const char kMetricUserCrashIntervalName[]; |
114 | 129 |
115 // D-Bus message match strings. | 130 // D-Bus message match strings. |
116 static const char* kDBusMatches_[]; | 131 static const char* kDBusMatches_[]; |
117 | 132 |
118 // Array of network states. | 133 // Array of network states. |
119 static const char* kNetworkStates_[kNumberNetworkStates]; | 134 static const char* kNetworkStates_[kNumberNetworkStates]; |
120 | 135 |
121 // Array of power states. | 136 // Array of power states. |
122 static const char* kPowerStates_[kNumberPowerStates]; | 137 static const char* kPowerStates_[kNumberPowerStates]; |
123 | 138 |
124 // Array of user session states. | 139 // Array of user session states. |
125 static const char* kSessionStates_[kNumberSessionStates]; | 140 static const char* kSessionStates_[kNumberSessionStates]; |
126 | 141 |
| 142 // Clears and deletes the data contained in frequency_counters_. |
| 143 void DeleteFrequencyCounters(); |
| 144 |
| 145 // Configures the given crash interval reporter. |
| 146 void ConfigureCrashIntervalReporter( |
| 147 const char* histogram_name, |
| 148 scoped_ptr<chromeos_metrics::TaggedCounterReporter>* reporter); |
| 149 |
| 150 // Configures the given frequency counter reporter. |
| 151 void ConfigureCrashFrequencyReporter(const char* histogram_name); |
| 152 |
| 153 // Returns file path to persistent file for generating given histogram. |
| 154 FilePath GetHistogramPath(const char* histogram_name); |
| 155 |
127 // Creates the event loop and enters it. | 156 // Creates the event loop and enters it. |
128 void Loop(); | 157 void Loop(); |
129 | 158 |
130 // D-Bus filter callback. | 159 // D-Bus filter callback. |
131 static DBusHandlerResult MessageFilter(DBusConnection* connection, | 160 static DBusHandlerResult MessageFilter(DBusConnection* connection, |
132 DBusMessage* message, | 161 DBusMessage* message, |
133 void* user_data); | 162 void* user_data); |
134 | 163 |
135 // Processes network state change. | 164 // Processes network state change. |
136 void NetStateChanged(const char* state_name, base::TimeTicks ticks); | 165 void NetStateChanged(const char* state_name, base::TimeTicks ticks); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
196 // |backoff| is false, unschedules it first. Doesn't schedule a | 225 // |backoff| is false, unschedules it first. Doesn't schedule a |
197 // monitor for more than kUseMonitorIntervalMax seconds in the | 226 // monitor for more than kUseMonitorIntervalMax seconds in the |
198 // future (see metrics_daemon.cc). Returns true if a new use monitor | 227 // future (see metrics_daemon.cc). Returns true if a new use monitor |
199 // was scheduled, false otherwise (note that if |backoff| is false a | 228 // was scheduled, false otherwise (note that if |backoff| is false a |
200 // new use monitor will always be scheduled). | 229 // new use monitor will always be scheduled). |
201 bool ScheduleUseMonitor(int interval, bool backoff); | 230 bool ScheduleUseMonitor(int interval, bool backoff); |
202 | 231 |
203 // Unschedules a scheduled use monitor, if any. | 232 // Unschedules a scheduled use monitor, if any. |
204 void UnscheduleUseMonitor(); | 233 void UnscheduleUseMonitor(); |
205 | 234 |
| 235 // Report daily use through UMA. |
| 236 static void ReportDailyUse(void* handle, int tag, int count); |
| 237 |
206 // Sends a regular (exponential) histogram sample to Chrome for | 238 // Sends a regular (exponential) histogram sample to Chrome for |
207 // transport to UMA. See MetricsLibrary::SendToUMA in | 239 // transport to UMA. See MetricsLibrary::SendToUMA in |
208 // metrics_library.h for a description of the arguments. | 240 // metrics_library.h for a description of the arguments. |
209 void SendMetric(const std::string& name, int sample, | 241 void SendMetric(const std::string& name, int sample, |
210 int min, int max, int nbuckets); | 242 int min, int max, int nbuckets); |
211 | 243 |
212 // TaggedCounter callback to process aggregated daily usage data and | |
213 // send to UMA. | |
214 static void ReportDailyUse(void* data, int tag, int count); | |
215 | |
216 // Helper to report a crash interval to UMA. | |
217 static void ReportCrashInterval(const char* histogram_name, | |
218 void* handle, int count); | |
219 | |
220 // TaggedCounter callback to process time between user-space process | |
221 // crashes and send to UMA. | |
222 static void ReportUserCrashInterval(void* data, int tag, int count); | |
223 | |
224 // TaggedCounter callback to process time between kernel crashes and | |
225 // send to UMA. | |
226 static void ReportKernelCrashInterval(void* data, int tag, int count); | |
227 | |
228 // TaggedCounter callback to process time between unclean shutdowns and | |
229 // send to UMA. | |
230 static void ReportUncleanShutdownInterval(void* data, int tag, int count); | |
231 | |
232 // Helper to report a daily crash frequency to UMA. | |
233 static void ReportCrashesDailyFrequency(const char* histogram_name, | |
234 void* handle, int count); | |
235 | |
236 // TaggedCounter callback to report daily crash frequency to UMA. | |
237 static void ReportUserCrashesDaily(void* handle, int tag, int count); | |
238 | |
239 // TaggedCounter callback to report kernel crash frequency to UMA. | |
240 static void ReportKernelCrashesDaily(void* handle, int tag, int count); | |
241 | |
242 // TaggedCounter callback to report unclean shutdown frequency to UMA. | |
243 static void ReportUncleanShutdownsDaily(void* handle, int tag, int count); | |
244 | |
245 // TaggedCounter callback to report frequency of any crashes to UMA. | |
246 static void ReportAnyCrashesDaily(void* handle, int tag, int count); | |
247 | |
248 // Test mode. | 244 // Test mode. |
249 bool testing_; | 245 bool testing_; |
250 | 246 |
251 // The metrics library handle. | 247 // The metrics library handle. |
252 MetricsLibraryInterface* metrics_lib_; | 248 MetricsLibraryInterface* metrics_lib_; |
253 | 249 |
254 // Current network state. | 250 // Current network state. |
255 NetworkState network_state_; | 251 NetworkState network_state_; |
256 | 252 |
257 // Timestamps last network state update. This timestamp is used to | 253 // Timestamps last network state update. This timestamp is used to |
(...skipping 10 matching lines...) Expand all Loading... |
268 // Is the user currently active: power is on, user session has | 264 // Is the user currently active: power is on, user session has |
269 // started, screen is not locked. | 265 // started, screen is not locked. |
270 bool user_active_; | 266 bool user_active_; |
271 | 267 |
272 // Timestamps last user active update. Active use time is aggregated | 268 // Timestamps last user active update. Active use time is aggregated |
273 // each day before sending to UMA so using time since the epoch as | 269 // each day before sending to UMA so using time since the epoch as |
274 // the timestamp. | 270 // the timestamp. |
275 base::Time user_active_last_; | 271 base::Time user_active_last_; |
276 | 272 |
277 // Daily active use time in seconds. | 273 // Daily active use time in seconds. |
278 scoped_ptr<chromeos_metrics::TaggedCounterInterface> daily_use_; | 274 scoped_ptr<chromeos_metrics::TaggedCounter> daily_use_; |
279 | 275 |
280 // Active use time between user-space process crashes. | 276 // Active use time between user-space process crashes. |
281 scoped_ptr<chromeos_metrics::TaggedCounterInterface> user_crash_interval_; | 277 scoped_ptr<chromeos_metrics::TaggedCounterReporter> user_crash_interval_; |
282 | 278 |
283 // Active use time between kernel crashes. | 279 // Active use time between kernel crashes. |
284 scoped_ptr<chromeos_metrics::TaggedCounterInterface> kernel_crash_interval_; | 280 scoped_ptr<chromeos_metrics::TaggedCounterReporter> kernel_crash_interval_; |
285 | 281 |
286 // Active use time between unclean shutdowns crashes. | 282 // Active use time between unclean shutdowns crashes. |
287 scoped_ptr<chromeos_metrics::TaggedCounterInterface> | 283 scoped_ptr<chromeos_metrics::TaggedCounterReporter> |
288 unclean_shutdown_interval_; | 284 unclean_shutdown_interval_; |
289 | 285 |
290 // Daily count of user-space process crashes. | 286 // Map of all frequency counters, to simplify flushing them. |
291 scoped_ptr<chromeos_metrics::FrequencyCounter> user_crashes_daily_; | 287 FrequencyCounters frequency_counters_; |
292 | |
293 // Daily count of kernel crashes. | |
294 scoped_ptr<chromeos_metrics::FrequencyCounter> kernel_crashes_daily_; | |
295 | |
296 // Daily count of unclean shutdowns. | |
297 scoped_ptr<chromeos_metrics::FrequencyCounter> unclean_shutdowns_daily_; | |
298 | |
299 // Daily count of any crashes (user-space processes, kernel, or | |
300 // unclean shutdowns). | |
301 scoped_ptr<chromeos_metrics::FrequencyCounter> any_crashes_daily_; | |
302 | 288 |
303 // Sleep period until the next daily usage aggregation performed by | 289 // Sleep period until the next daily usage aggregation performed by |
304 // the daily use monitor (see ScheduleUseMonitor). | 290 // the daily use monitor (see ScheduleUseMonitor). |
305 int usemon_interval_; | 291 int usemon_interval_; |
306 | 292 |
307 // Scheduled daily use monitor source (see ScheduleUseMonitor). | 293 // Scheduled daily use monitor source (see ScheduleUseMonitor). |
308 GSource* usemon_source_; | 294 GSource* usemon_source_; |
309 }; | 295 }; |
310 | 296 |
311 #endif // METRICS_DAEMON_H_ | 297 #endif // METRICS_DAEMON_H_ |
OLD | NEW |