blob: 9d7942fa730288fd56a222b0803ecc4d3c938c30 [file] [log] [blame]
Thieu Le3426c8f2012-01-11 17:35:11 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Thieu Le48e6d6d2011-12-06 00:40:27 +00002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef SHILL_METRICS_
6#define SHILL_METRICS_
7
8#include <list>
9
Thieu Le48e6d6d2011-12-06 00:40:27 +000010#include <base/memory/scoped_vector.h>
11#include <metrics/metrics_library.h>
12#include <metrics/timer.h>
13
Thieu Le6c1e3bb2013-02-06 15:20:35 -080014#include "shill/event_dispatcher.h"
Wade Guthried4977f22012-08-22 12:37:54 -070015#include "shill/ieee80211.h"
Thieu Le85e050b2012-03-13 15:04:38 -070016#include "shill/portal_detector.h"
Thieu Leb84ba342012-03-02 15:15:19 -080017#include "shill/power_manager.h"
Thieu Le48e6d6d2011-12-06 00:40:27 +000018#include "shill/refptr_types.h"
19#include "shill/service.h"
20
21namespace shill {
22
Gaurav Shah6d2c72d2012-10-16 16:30:44 -070023class WiFiMainTest;
Thieu Le48e6d6d2011-12-06 00:40:27 +000024class WiFiService;
25
26class Metrics {
27 public:
28 enum WiFiChannel {
29 kWiFiChannelUndef = 0,
30 kWiFiChannel2412 = 1,
31 kWiFiChannel2417 = 2,
32 kWiFiChannel2422 = 3,
33 kWiFiChannel2427 = 4,
34 kWiFiChannel2432 = 5,
35 kWiFiChannel2437 = 6,
36 kWiFiChannel2442 = 7,
37 kWiFiChannel2447 = 8,
38 kWiFiChannel2452 = 9,
39 kWiFiChannel2457 = 10,
40 kWiFiChannel2462 = 11,
41 kWiFiChannel2467 = 12,
42 kWiFiChannel2472 = 13,
43 kWiFiChannel2484 = 14,
44
45 kWiFiChannel5180 = 15,
46 kWiFiChannel5200 = 16,
47 kWiFiChannel5220 = 17,
48 kWiFiChannel5240 = 18,
49 kWiFiChannel5260 = 19,
50 kWiFiChannel5280 = 20,
51 kWiFiChannel5300 = 21,
52 kWiFiChannel5320 = 22,
53
54 kWiFiChannel5500 = 23,
55 kWiFiChannel5520 = 24,
56 kWiFiChannel5540 = 25,
57 kWiFiChannel5560 = 26,
58 kWiFiChannel5580 = 27,
59 kWiFiChannel5600 = 28,
60 kWiFiChannel5620 = 29,
61 kWiFiChannel5640 = 30,
62 kWiFiChannel5660 = 31,
63 kWiFiChannel5680 = 32,
64 kWiFiChannel5700 = 33,
65
66 kWiFiChannel5745 = 34,
67 kWiFiChannel5765 = 35,
68 kWiFiChannel5785 = 36,
69 kWiFiChannel5805 = 37,
70 kWiFiChannel5825 = 38,
71
72 kWiFiChannel5170 = 39,
73 kWiFiChannel5190 = 40,
74 kWiFiChannel5210 = 41,
75 kWiFiChannel5230 = 42,
76
77 /* NB: ignore old 11b bands 2312..2372 and 2512..2532 */
78 /* NB: ignore regulated bands 4920..4980 and 5020..5160 */
79 kWiFiChannelMax
80 };
81
Thieu Lead1ec2c2012-01-05 23:39:48 +000082 enum WiFiNetworkPhyMode {
83 kWiFiNetworkPhyModeUndef = 0, // Unknown/undefined
84 kWiFiNetworkPhyMode11a = 1, // 802.11a
85 kWiFiNetworkPhyMode11b = 2, // 802.11b
86 kWiFiNetworkPhyMode11g = 3, // 802.11g
87 kWiFiNetworkPhyMode11n = 4, // 802.11n
88 kWiFiNetworkPhyModeHalf = 5, // PSB Half-width
89 kWiFiNetworkPhyModeQuarter = 6, // PSB Quarter-width
90 kWiFiNetworkPhyModeTurbo = 7, // Atheros Turbo mode
91
92 kWiFiNetworkPhyModeMax
93 };
94
95 enum WiFiSecurity {
96 kWiFiSecurityUnknown = 0,
97 kWiFiSecurityNone = 1,
98 kWiFiSecurityWep = 2,
99 kWiFiSecurityWpa = 3,
100 kWiFiSecurityRsn = 4,
101 kWiFiSecurity8021x = 5,
102 kWiFiSecurityPsk = 6,
103
104 kWiFiSecurityMax
105 };
106
Thieu Le85e050b2012-03-13 15:04:38 -0700107 enum PortalResult {
108 kPortalResultSuccess = 0,
109 kPortalResultDNSFailure = 1,
110 kPortalResultDNSTimeout = 2,
111 kPortalResultConnectionFailure = 3,
112 kPortalResultConnectionTimeout = 4,
113 kPortalResultHTTPFailure = 5,
114 kPortalResultHTTPTimeout = 6,
115 kPortalResultContentFailure = 7,
116 kPortalResultContentTimeout = 8,
117 kPortalResultUnknown = 9,
118
119 kPortalResultMax
120 };
121
Paul Stewartff845fc2012-08-07 07:28:44 -0700122 enum LinkMonitorFailure {
123 kLinkMonitorMacAddressNotFound = 0,
124 kLinkMonitorClientStartFailure = 1,
125 kLinkMonitorTransmitFailure = 2,
126 kLinkMonitorFailureThresholdReached = 3,
127
128 kLinkMonitorFailureMax
129 };
130
Wade Guthried4977f22012-08-22 12:37:54 -0700131 enum WiFiStatusType {
132 kStatusCodeTypeByAp,
133 kStatusCodeTypeByClient,
134 kStatusCodeTypeByUser,
135 kStatusCodeTypeConsideredDead,
136 kStatusCodeTypeMax
137 };
138
139 enum WiFiDisconnectByWhom {
140 kDisconnectedByAp,
141 kDisconnectedNotByAp
142 };
143
Paul Stewart85aea152013-01-22 09:31:56 -0800144 enum ServiceFixupProfileType {
145 kMetricServiceFixupDefaultProfile,
146 kMetricServiceFixupUserProfile,
147 kMetricServiceFixupMax
148 };
149
Arman Uguray6d528f12012-09-13 13:44:55 -0700150 enum TerminationActionResult {
Arman Ugurayab22c162012-10-08 19:08:38 -0700151 kTerminationActionResultSuccess,
152 kTerminationActionResultFailure,
Arman Uguray6d528f12012-09-13 13:44:55 -0700153 kTerminationActionResultMax
154 };
155
Arman Ugurayab22c162012-10-08 19:08:38 -0700156 enum TerminationActionReason {
157 kTerminationActionReasonSuspend,
158 kTerminationActionReasonTerminate
159 };
160
Thieu Le26fc01b2013-01-28 12:08:48 -0800161 enum CellularDropTechnology {
162 kCellularDropTechnology1Xrtt = 0,
163 kCellularDropTechnologyEdge = 1,
164 kCellularDropTechnologyEvdo = 2,
165 kCellularDropTechnologyGprs = 3,
166 kCellularDropTechnologyGsm = 4,
167 kCellularDropTechnologyHspa = 5,
168 kCellularDropTechnologyHspaPlus = 6,
169 kCellularDropTechnologyLte = 7,
170 kCellularDropTechnologyUmts = 8,
171 kCellularDropTechnologyUnknown = 9,
172 kCellularDropTechnologyMax
173 };
174
Thieu Le5133b712013-02-19 14:47:21 -0800175 enum CorruptedProfile {
176 kCorruptedProfile = 1,
177 kCorruptedProfileMax
178 };
179
Thieu Le67370f62012-02-14 23:01:42 +0000180 static const char kMetricDisconnect[];
181 static const int kMetricDisconnectMax;
182 static const int kMetricDisconnectMin;
183 static const int kMetricDisconnectNumBuckets;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000184 static const char kMetricNetworkChannel[];
185 static const int kMetricNetworkChannelMax;
Thieu Lead1ec2c2012-01-05 23:39:48 +0000186 static const char kMetricNetworkPhyMode[];
187 static const int kMetricNetworkPhyModeMax;
188 static const char kMetricNetworkSecurity[];
189 static const int kMetricNetworkSecurityMax;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000190 static const char kMetricNetworkServiceErrors[];
191 static const int kMetricNetworkServiceErrorsMax;
Paul Stewart23b393a2012-09-25 21:21:06 -0700192 static const char kMetricNetworkSignalStrength[];
193 static const int kMetricNetworkSignalStrengthMin;
194 static const int kMetricNetworkSignalStrengthMax;
195 static const int kMetricNetworkSignalStrengthNumBuckets;
Thieu Lea20cbc22012-01-09 22:01:43 +0000196 static const char kMetricTimeOnlineSeconds[];
197 static const int kMetricTimeOnlineSecondsMax;
198 static const int kMetricTimeOnlineSecondsMin;
199 static const int kMetricTimeOnlineSecondsNumBuckets;
Thieu Leb84ba342012-03-02 15:15:19 -0800200 static const char kMetricTimeResumeToReadyMilliseconds[];
Thieu Le48e6d6d2011-12-06 00:40:27 +0000201 static const char kMetricTimeToConfigMilliseconds[];
Thieu Lecdb5a212013-01-25 11:17:18 -0800202 static const char kMetricTimeToConnectMilliseconds[];
203 static const int kMetricTimeToConnectMillisecondsMax;
204 static const int kMetricTimeToConnectMillisecondsMin;
205 static const int kMetricTimeToConnectMillisecondsNumBuckets;
Thieu Lea20cbc22012-01-09 22:01:43 +0000206 static const char kMetricTimeToDropSeconds[];
207 static const int kMetricTimeToDropSecondsMax;
208 static const int kMetricTimeToDropSecondsMin;
Thieu Lea2519bf2013-01-23 16:51:54 -0800209 static const char kMetricTimeToDisableMilliseconds[];
210 static const int kMetricTimeToDisableMillisecondsMax;
211 static const int kMetricTimeToDisableMillisecondsMin;
212 static const int kMetricTimeToDisableMillisecondsNumBuckets;
Thieu Lece4483e2013-01-23 15:12:03 -0800213 static const char kMetricTimeToEnableMilliseconds[];
214 static const int kMetricTimeToEnableMillisecondsMax;
215 static const int kMetricTimeToEnableMillisecondsMin;
216 static const int kMetricTimeToEnableMillisecondsNumBuckets;
Thieu Lec8078a62013-01-22 18:01:12 -0800217 static const char kMetricTimeToInitializeMilliseconds[];
Thieu Lec8078a62013-01-22 18:01:12 -0800218 static const int kMetricTimeToInitializeMillisecondsMax;
Thieu Lece4483e2013-01-23 15:12:03 -0800219 static const int kMetricTimeToInitializeMillisecondsMin;
Thieu Lec8078a62013-01-22 18:01:12 -0800220 static const int kMetricTimeToInitializeMillisecondsNumBuckets;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000221 static const char kMetricTimeToJoinMilliseconds[];
222 static const char kMetricTimeToOnlineMilliseconds[];
223 static const char kMetricTimeToPortalMilliseconds[];
Thieu Le18c11072013-01-28 17:21:37 -0800224 static const char kMetricTimeToScanMilliseconds[];
225 static const int kMetricTimeToScanMillisecondsMax;
226 static const int kMetricTimeToScanMillisecondsMin;
227 static const int kMetricTimeToScanMillisecondsNumBuckets;
Thieu Lea20cbc22012-01-09 22:01:43 +0000228 static const int kTimerHistogramMillisecondsMax;
229 static const int kTimerHistogramMillisecondsMin;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000230 static const int kTimerHistogramNumBuckets;
231
Thieu Le85e050b2012-03-13 15:04:38 -0700232 // The number of portal detections attempted for each pass.
233 // This includes both failure/timeout attempts and successful attempt
234 // (if any).
235 static const char kMetricPortalAttempts[];
236 static const int kMetricPortalAttemptsMax;
237 static const int kMetricPortalAttemptsMin;
238 static const int kMetricPortalAttemptsNumBuckets;
239
240 // The total number of portal detections attempted between the Connected
241 // state and the Online state. This includes both failure/timeout attempts
242 // and the final successful attempt.
243 static const char kMetricPortalAttemptsToOnline[];
244 static const int kMetricPortalAttemptsToOnlineMax;
245 static const int kMetricPortalAttemptsToOnlineMin;
246 static const int kMetricPortalAttemptsToOnlineNumBuckets;
247
248 // The result of the portal detection.
249 static const char kMetricPortalResult[];
250
Thieu Leb84ba342012-03-02 15:15:19 -0800251 static const char kMetricPowerManagerKey[];
252
Paul Stewartff845fc2012-08-07 07:28:44 -0700253 // LinkMonitor statistics.
254 static const char kMetricLinkMonitorFailure[];
255 static const char kMetricLinkMonitorResponseTimeSample[];
Paul Stewartf1961f82012-09-11 20:45:39 -0700256 static const int kMetricLinkMonitorResponseTimeSampleMin;
257 static const int kMetricLinkMonitorResponseTimeSampleMax;
Paul Stewartff845fc2012-08-07 07:28:44 -0700258 static const int kMetricLinkMonitorResponseTimeSampleNumBuckets;
Paul Stewart0443aa52012-08-09 10:43:50 -0700259 static const char kMetricLinkMonitorSecondsToFailure[];
Paul Stewartf1961f82012-09-11 20:45:39 -0700260 static const int kMetricLinkMonitorSecondsToFailureMin;
261 static const int kMetricLinkMonitorSecondsToFailureMax;
Paul Stewart0443aa52012-08-09 10:43:50 -0700262 static const int kMetricLinkMonitorSecondsToFailureNumBuckets;
263 static const char kMetricLinkMonitorBroadcastErrorsAtFailure[];
264 static const char kMetricLinkMonitorUnicastErrorsAtFailure[];
Paul Stewartf1961f82012-09-11 20:45:39 -0700265 static const int kMetricLinkMonitorErrorCountMin;
266 static const int kMetricLinkMonitorErrorCountMax;
Paul Stewart0443aa52012-08-09 10:43:50 -0700267 static const int kMetricLinkMonitorErrorCountNumBuckets;
Paul Stewartff845fc2012-08-07 07:28:44 -0700268
Wade Guthried4977f22012-08-22 12:37:54 -0700269 static const char kMetricLinkClientDisconnectReason[];
270 static const char kMetricLinkApDisconnectReason[];
271 static const char kMetricLinkClientDisconnectType[];
272 static const char kMetricLinkApDisconnectType[];
273
Arman Uguray6d528f12012-09-13 13:44:55 -0700274 // Shill termination action statistics.
Arman Ugurayab22c162012-10-08 19:08:38 -0700275 static const char kMetricTerminationActionTimeOnTerminate[];
276 static const char kMetricTerminationActionResultOnTerminate[];
277 static const char kMetricTerminationActionTimeOnSuspend[];
278 static const char kMetricTerminationActionResultOnSuspend[];
279 static const int kMetricTerminationActionTimeMillisecondsMax;
280 static const int kMetricTerminationActionTimeMillisecondsMin;
Arman Uguray6d528f12012-09-13 13:44:55 -0700281
Paul Stewart85aea152013-01-22 09:31:56 -0800282 // WiFiService Entry Fixup.
283 static const char kMetricServiceFixupEntries[];
284
Thieu Le26fc01b2013-01-28 12:08:48 -0800285 // Cellular specific statistics.
286 static const char kMetricCellularDrop[];
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800287 static const char kMetricCellularDropsPerHour[];
288 static const int kMetricCellularDropsPerHourMax;
289 static const int kMetricCellularDropsPerHourMin;
290 static const int kMetricCellularDropsPerHourNumBuckets;
Thieu Leb7aa5f72013-01-31 15:57:48 -0800291 static const char kMetricCellularFailureReason[];
Thieu Le26fc01b2013-01-28 12:08:48 -0800292 static const char kMetricCellularSignalStrengthBeforeDrop[];
293 static const int kMetricCellularSignalStrengthBeforeDropMax;
294 static const int kMetricCellularSignalStrengthBeforeDropMin;
295 static const int kMetricCellularSignalStrengthBeforeDropNumBuckets;
Thieu Le7cf36b02013-01-30 17:15:56 -0800296 static const char kMetricCellularAutoConnectTries[];
297 static const int kMetricCellularAutoConnectTriesMax;
298 static const int kMetricCellularAutoConnectTriesMin;
299 static const int kMetricCellularAutoConnectTriesNumBuckets;
300 static const char kMetricCellularAutoConnectTotalTime[];
301 static const int kMetricCellularAutoConnectTotalTimeMax;
302 static const int kMetricCellularAutoConnectTotalTimeMin;
303 static const int kMetricCellularAutoConnectTotalTimeNumBuckets;
Thieu Le26fc01b2013-01-28 12:08:48 -0800304
Thieu Le5133b712013-02-19 14:47:21 -0800305 // Profile statistics.
306 static const char kMetricCorruptedProfile[];
307
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800308 explicit Metrics(EventDispatcher *dispatcher);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000309 virtual ~Metrics();
310
Thieu Le48e6d6d2011-12-06 00:40:27 +0000311 // Converts the WiFi frequency into the associated UMA channel enumerator.
312 static WiFiChannel WiFiFrequencyToChannel(uint16 frequency);
313
Thieu Lead1ec2c2012-01-05 23:39:48 +0000314 // Converts a flimflam security string into its UMA security enumerator.
315 static WiFiSecurity WiFiSecurityStringToEnum(const std::string &security);
316
Thieu Le85e050b2012-03-13 15:04:38 -0700317 // Converts portal detection result to UMA portal result enumerator.
318 static PortalResult PortalDetectionResultToEnum(
319 const PortalDetector::Result &result);
320
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800321 // Starts this object. Call this during initialization.
322 virtual void Start();
323
324 // Stops this object. Call this during cleanup.
325 virtual void Stop();
326
Thieu Le48e6d6d2011-12-06 00:40:27 +0000327 // Registers a service with this object so it can use the timers to track
328 // state transition metrics.
329 void RegisterService(const Service *service);
330
331 // Deregisters the service from this class. All state transition timers
332 // will be removed.
333 void DeregisterService(const Service *service);
334
335 // Tracks the time it takes |service| to go from |start_state| to
336 // |stop_state|. When |stop_state| is reached, the time is sent to UMA.
337 void AddServiceStateTransitionTimer(const Service *service,
338 const std::string &histogram_name,
339 Service::ConnectState start_state,
340 Service::ConnectState stop_state);
341
342 // Specializes |metric_name| for the specified |technology_id|.
343 std::string GetFullMetricName(const char *metric_name,
344 Technology::Identifier technology_id);
345
346 // Notifies this object that the default service has changed.
347 // |service| is the new default service.
Thieu Lea20cbc22012-01-09 22:01:43 +0000348 virtual void NotifyDefaultServiceChanged(const Service *service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000349
350 // Notifies this object that |service| state has changed.
351 virtual void NotifyServiceStateChanged(const Service *service,
352 Service::ConnectState new_state);
353
Thieu Le67370f62012-02-14 23:01:42 +0000354 // Notifies this object that |service| has been disconnected.
355 void NotifyServiceDisconnect(const Service *service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000356
Thieu Leb84ba342012-03-02 15:15:19 -0800357 // Notifies this object of a power management state change.
358 void NotifyPowerStateChange(PowerManager::SuspendState new_state);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000359
Arman Ugurayab22c162012-10-08 19:08:38 -0700360 // Notifies this object that termination actions started executing.
361 void NotifyTerminationActionsStarted(TerminationActionReason reason);
362
363 // Notifies this object that termination actions have been completed.
364 // |success| is true, if the termination actions completed successfully.
365 void NotifyTerminationActionsCompleted(
366 TerminationActionReason reason, bool success);
367
Paul Stewartff845fc2012-08-07 07:28:44 -0700368 // Notifies this object of a failure in LinkMonitor.
369 void NotifyLinkMonitorFailure(
Paul Stewart0443aa52012-08-09 10:43:50 -0700370 Technology::Identifier technology,
371 LinkMonitorFailure failure,
Paul Stewartf1961f82012-09-11 20:45:39 -0700372 int seconds_to_failure,
373 int broadcast_error_count,
374 int unicast_error_count);
Paul Stewartff845fc2012-08-07 07:28:44 -0700375
376 // Notifies this object that LinkMonitor has added a response time sample
377 // for |connection| with a value of |response_time_milliseconds|.
378 void NotifyLinkMonitorResponseTimeSampleAdded(
379 Technology::Identifier technology,
Paul Stewartf1961f82012-09-11 20:45:39 -0700380 int response_time_milliseconds);
Paul Stewartff845fc2012-08-07 07:28:44 -0700381
Wade Guthried4977f22012-08-22 12:37:54 -0700382 // Notifies this object of WiFi disconnect.
383 void Notify80211Disconnect(WiFiDisconnectByWhom by_whom,
384 IEEE_80211::WiFiReasonCode reason);
385
Thieu Lec8078a62013-01-22 18:01:12 -0800386 // Registers a device with this object so the device can use the timers to
387 // track state transition metrics.
388 void RegisterDevice(int interface_index,
389 Technology::Identifier technology);
390
Thieu Le9abd6742013-01-23 23:35:37 -0800391 // Checks to see if the device has already been registered.
392 bool IsDeviceRegistered(int interface_index,
393 Technology::Identifier technology);
394
Thieu Lec8078a62013-01-22 18:01:12 -0800395 // Deregisters the device from this class. All state transition timers
396 // will be removed.
397 void DeregisterDevice(int interface_index);
398
399 // Notifies this object that a device has been initialized.
400 void NotifyDeviceInitialized(int interface_index);
401
Thieu Lece4483e2013-01-23 15:12:03 -0800402 // Notifies this object that a device has started the enable process.
403 void NotifyDeviceEnableStarted(int interface_index);
404
405 // Notifies this object that a device has completed the enable process.
406 void NotifyDeviceEnableFinished(int interface_index);
407
Thieu Lea2519bf2013-01-23 16:51:54 -0800408 // Notifies this object that a device has started the disable process.
409 void NotifyDeviceDisableStarted(int interface_index);
410
411 // Notifies this object that a device has completed the disable process.
412 void NotifyDeviceDisableFinished(int interface_index);
413
Thieu Le18c11072013-01-28 17:21:37 -0800414 // Notifies this object that a device has started the scanning process.
415 void NotifyDeviceScanStarted(int interface_index);
416
417 // Notifies this object that a device has completed the scanning process.
418 void NotifyDeviceScanFinished(int interface_index);
419
Thieu Lecdb5a212013-01-25 11:17:18 -0800420 // Notifies this object that a device has started the connect process.
Thieu Le7cf36b02013-01-30 17:15:56 -0800421 void NotifyDeviceConnectStarted(int interface_index,
422 bool is_auto_connecting);
Thieu Lecdb5a212013-01-25 11:17:18 -0800423
424 // Notifies this object that a device has completed the connect process.
425 void NotifyDeviceConnectFinished(int interface_index);
426
Thieu Le26fc01b2013-01-28 12:08:48 -0800427 // Notifies this object that a cellular device has been dropped by the
428 // network.
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800429 void NotifyCellularDeviceDrop(int interface_index,
430 const std::string &network_technology,
Thieu Le26fc01b2013-01-28 12:08:48 -0800431 uint16 signal_strength);
432
Thieu Leb7aa5f72013-01-31 15:57:48 -0800433 // Notifies this object about a cellular device failure code.
434 void NotifyCellularDeviceFailure(const Error &error);
435
Thieu Le5133b712013-02-19 14:47:21 -0800436 // Notifies this object about a corrupted profile.
437 virtual void NotifyCorruptedProfile();
438
Thieu Le48e6d6d2011-12-06 00:40:27 +0000439 // Sends linear histogram data to UMA.
Thieu Le85e050b2012-03-13 15:04:38 -0700440 virtual bool SendEnumToUMA(const std::string &name, int sample, int max);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000441
Thieu Lea20cbc22012-01-09 22:01:43 +0000442 // Send histogram data to UMA.
Thieu Le85e050b2012-03-13 15:04:38 -0700443 virtual bool SendToUMA(const std::string &name, int sample, int min,
444 int max, int num_buckets);
Thieu Lea20cbc22012-01-09 22:01:43 +0000445
Thieu Le48e6d6d2011-12-06 00:40:27 +0000446 private:
Thieu Le48e6d6d2011-12-06 00:40:27 +0000447 friend class MetricsTest;
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800448 FRIEND_TEST(MetricsTest, CellularDropsPerHour);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000449 FRIEND_TEST(MetricsTest, FrequencyToChannel);
Thieu Leb84ba342012-03-02 15:15:19 -0800450 FRIEND_TEST(MetricsTest, ServiceFailure);
Thieu Lea20cbc22012-01-09 22:01:43 +0000451 FRIEND_TEST(MetricsTest, TimeOnlineTimeToDrop);
Thieu Leb84ba342012-03-02 15:15:19 -0800452 FRIEND_TEST(MetricsTest, TimeToConfig);
453 FRIEND_TEST(MetricsTest, TimeToOnline);
454 FRIEND_TEST(MetricsTest, TimeToPortal);
Thieu Le18c11072013-01-28 17:21:37 -0800455 FRIEND_TEST(MetricsTest, TimeToScanIgnore);
Thieu Leb84ba342012-03-02 15:15:19 -0800456 FRIEND_TEST(MetricsTest, WiFiServiceChannel);
457 FRIEND_TEST(MetricsTest, WiFiServicePostReady);
Gaurav Shah6d2c72d2012-10-16 16:30:44 -0700458 FRIEND_TEST(WiFiMainTest, GetGeolocationObjects);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000459
460 typedef ScopedVector<chromeos_metrics::TimerReporter> TimerReporters;
461 typedef std::list<chromeos_metrics::TimerReporter *> TimerReportersList;
462 typedef std::map<Service::ConnectState, TimerReportersList>
463 TimerReportersByState;
464 struct ServiceMetrics {
465 ServiceMetrics() : service(NULL) {}
466 // The service is registered/deregistered in the Service
467 // constructor/destructor, therefore there is no need to keep a ref count.
468 const Service *service;
469 // All TimerReporter objects are stored in |timers| which owns the objects.
470 // |start_on_state| and |stop_on_state| contain pointers to the
471 // TimerReporter objects and control when to start and stop the timers.
472 TimerReporters timers;
473 TimerReportersByState start_on_state;
474 TimerReportersByState stop_on_state;
475 };
476 typedef std::map<const Service *, std::tr1::shared_ptr<ServiceMetrics> >
477 ServiceMetricsLookupMap;
478
Thieu Lec8078a62013-01-22 18:01:12 -0800479 struct DeviceMetrics {
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800480 DeviceMetrics() : auto_connect_tries(0), num_drops(0) {}
Thieu Le9abd6742013-01-23 23:35:37 -0800481 Technology::Identifier technology;
Thieu Lec8078a62013-01-22 18:01:12 -0800482 scoped_ptr<chromeos_metrics::TimerReporter> initialization_timer;
Thieu Lece4483e2013-01-23 15:12:03 -0800483 scoped_ptr<chromeos_metrics::TimerReporter> enable_timer;
Thieu Lea2519bf2013-01-23 16:51:54 -0800484 scoped_ptr<chromeos_metrics::TimerReporter> disable_timer;
Thieu Le18c11072013-01-28 17:21:37 -0800485 scoped_ptr<chromeos_metrics::TimerReporter> scan_timer;
Thieu Lecdb5a212013-01-25 11:17:18 -0800486 scoped_ptr<chromeos_metrics::TimerReporter> connect_timer;
Thieu Le7cf36b02013-01-30 17:15:56 -0800487 scoped_ptr<chromeos_metrics::TimerReporter> auto_connect_timer;
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800488 int auto_connect_tries;
489 int num_drops;
Thieu Lec8078a62013-01-22 18:01:12 -0800490 };
491 typedef std::map<const int, std::tr1::shared_ptr<DeviceMetrics> >
492 DeviceMetricsLookupMap;
493
Thieu Le48e6d6d2011-12-06 00:40:27 +0000494 static const uint16 kWiFiBandwidth5MHz;
495 static const uint16 kWiFiBandwidth20MHz;
496 static const uint16 kWiFiFrequency2412;
497 static const uint16 kWiFiFrequency2472;
498 static const uint16 kWiFiFrequency2484;
499 static const uint16 kWiFiFrequency5170;
500 static const uint16 kWiFiFrequency5180;
501 static const uint16 kWiFiFrequency5230;
502 static const uint16 kWiFiFrequency5240;
503 static const uint16 kWiFiFrequency5320;
504 static const uint16 kWiFiFrequency5500;
505 static const uint16 kWiFiFrequency5700;
506 static const uint16 kWiFiFrequency5745;
507 static const uint16 kWiFiFrequency5825;
508
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800509 static const int kHourlyTimeoutMilliseconds;
510
Thieu Le48e6d6d2011-12-06 00:40:27 +0000511 void InitializeCommonServiceMetrics(const Service *service);
512 void UpdateServiceStateTransitionMetrics(ServiceMetrics *service_metrics,
513 Service::ConnectState new_state);
514 void SendServiceFailure(const Service *service);
515
Thieu Le9abd6742013-01-23 23:35:37 -0800516 DeviceMetrics *GetDeviceMetrics (int interface_index) const;
Thieu Le7cf36b02013-01-30 17:15:56 -0800517 void AutoConnectMetricsReset(DeviceMetrics *device_metrics);
Thieu Lece4483e2013-01-23 15:12:03 -0800518
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800519 void HourlyTimeoutHandler();
520
Thieu Le48e6d6d2011-12-06 00:40:27 +0000521 // For unit test purposes.
522 void set_library(MetricsLibraryInterface *library);
Thieu Lea20cbc22012-01-09 22:01:43 +0000523 void set_time_online_timer(chromeos_metrics::Timer *timer) {
524 time_online_timer_.reset(timer); // Passes ownership
525 }
526 void set_time_to_drop_timer(chromeos_metrics::Timer *timer) {
527 time_to_drop_timer_.reset(timer); // Passes ownership
528 }
Thieu Leb84ba342012-03-02 15:15:19 -0800529 void set_time_resume_to_ready_timer(chromeos_metrics::Timer *timer) {
530 time_resume_to_ready_timer_.reset(timer); // Passes ownership
531 }
Arman Ugurayab22c162012-10-08 19:08:38 -0700532 void set_time_termination_actions_timer(
533 chromeos_metrics::Timer *timer) {
534 time_termination_actions_timer.reset(timer); // Passes ownership
535 }
Thieu Le18c11072013-01-28 17:21:37 -0800536 void set_time_to_scan_timer(int interface_index,
537 chromeos_metrics::TimerReporter *timer) {
538 DeviceMetrics *device_metrics = GetDeviceMetrics(interface_index);
539 device_metrics->scan_timer.reset(timer); // Passes ownership
540 }
Thieu Le48e6d6d2011-12-06 00:40:27 +0000541
542 // |library_| points to |metrics_library_| when shill runs normally.
543 // However, in order to allow for unit testing, we point |library_| to a
544 // MetricsLibraryMock object instead.
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800545 EventDispatcher *dispatcher_;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000546 MetricsLibrary metrics_library_;
547 MetricsLibraryInterface *library_;
548 ServiceMetricsLookupMap services_metrics_;
Thieu Lea20cbc22012-01-09 22:01:43 +0000549 Technology::Identifier last_default_technology_;
550 bool was_online_;
551 scoped_ptr<chromeos_metrics::Timer> time_online_timer_;
552 scoped_ptr<chromeos_metrics::Timer> time_to_drop_timer_;
Thieu Leb84ba342012-03-02 15:15:19 -0800553 scoped_ptr<chromeos_metrics::Timer> time_resume_to_ready_timer_;
Arman Ugurayab22c162012-10-08 19:08:38 -0700554 scoped_ptr<chromeos_metrics::Timer> time_termination_actions_timer;
Darin Petkov58f0b6d2012-06-12 12:52:30 +0200555 bool collect_bootstats_;
Thieu Lec8078a62013-01-22 18:01:12 -0800556 DeviceMetricsLookupMap devices_metrics_;
Thieu Le6c1e3bb2013-02-06 15:20:35 -0800557 base::CancelableClosure hourly_timeout_handler_;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000558
559 DISALLOW_COPY_AND_ASSIGN(Metrics);
560};
561
562} // namespace shill
563
564#endif // SHILL_METRICS_