Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(916)

Side by Side Diff: metrics_daemon.h

Issue 3171023: Add weekly crash counters, refactor metrics_daemon, respect opt-in in library. (Closed) Base URL: http://src.chromium.org/git/metrics.git
Patch Set: Respond to review Created 10 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « counter_test.cc ('k') | metrics_daemon.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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_
OLDNEW
« no previous file with comments | « counter_test.cc ('k') | metrics_daemon.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698