blob: 9e7ea0eca6dd43326fbb1d52ede924480d76cefe [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 Le85e050b2012-03-13 15:04:38 -070014#include "shill/portal_detector.h"
Thieu Leb84ba342012-03-02 15:15:19 -080015#include "shill/power_manager.h"
Thieu Le48e6d6d2011-12-06 00:40:27 +000016#include "shill/refptr_types.h"
17#include "shill/service.h"
18
19namespace shill {
20
21class WiFiService;
22
23class Metrics {
24 public:
25 enum WiFiChannel {
26 kWiFiChannelUndef = 0,
27 kWiFiChannel2412 = 1,
28 kWiFiChannel2417 = 2,
29 kWiFiChannel2422 = 3,
30 kWiFiChannel2427 = 4,
31 kWiFiChannel2432 = 5,
32 kWiFiChannel2437 = 6,
33 kWiFiChannel2442 = 7,
34 kWiFiChannel2447 = 8,
35 kWiFiChannel2452 = 9,
36 kWiFiChannel2457 = 10,
37 kWiFiChannel2462 = 11,
38 kWiFiChannel2467 = 12,
39 kWiFiChannel2472 = 13,
40 kWiFiChannel2484 = 14,
41
42 kWiFiChannel5180 = 15,
43 kWiFiChannel5200 = 16,
44 kWiFiChannel5220 = 17,
45 kWiFiChannel5240 = 18,
46 kWiFiChannel5260 = 19,
47 kWiFiChannel5280 = 20,
48 kWiFiChannel5300 = 21,
49 kWiFiChannel5320 = 22,
50
51 kWiFiChannel5500 = 23,
52 kWiFiChannel5520 = 24,
53 kWiFiChannel5540 = 25,
54 kWiFiChannel5560 = 26,
55 kWiFiChannel5580 = 27,
56 kWiFiChannel5600 = 28,
57 kWiFiChannel5620 = 29,
58 kWiFiChannel5640 = 30,
59 kWiFiChannel5660 = 31,
60 kWiFiChannel5680 = 32,
61 kWiFiChannel5700 = 33,
62
63 kWiFiChannel5745 = 34,
64 kWiFiChannel5765 = 35,
65 kWiFiChannel5785 = 36,
66 kWiFiChannel5805 = 37,
67 kWiFiChannel5825 = 38,
68
69 kWiFiChannel5170 = 39,
70 kWiFiChannel5190 = 40,
71 kWiFiChannel5210 = 41,
72 kWiFiChannel5230 = 42,
73
74 /* NB: ignore old 11b bands 2312..2372 and 2512..2532 */
75 /* NB: ignore regulated bands 4920..4980 and 5020..5160 */
76 kWiFiChannelMax
77 };
78
Thieu Lead1ec2c2012-01-05 23:39:48 +000079 enum WiFiNetworkPhyMode {
80 kWiFiNetworkPhyModeUndef = 0, // Unknown/undefined
81 kWiFiNetworkPhyMode11a = 1, // 802.11a
82 kWiFiNetworkPhyMode11b = 2, // 802.11b
83 kWiFiNetworkPhyMode11g = 3, // 802.11g
84 kWiFiNetworkPhyMode11n = 4, // 802.11n
85 kWiFiNetworkPhyModeHalf = 5, // PSB Half-width
86 kWiFiNetworkPhyModeQuarter = 6, // PSB Quarter-width
87 kWiFiNetworkPhyModeTurbo = 7, // Atheros Turbo mode
88
89 kWiFiNetworkPhyModeMax
90 };
91
92 enum WiFiSecurity {
93 kWiFiSecurityUnknown = 0,
94 kWiFiSecurityNone = 1,
95 kWiFiSecurityWep = 2,
96 kWiFiSecurityWpa = 3,
97 kWiFiSecurityRsn = 4,
98 kWiFiSecurity8021x = 5,
99 kWiFiSecurityPsk = 6,
100
101 kWiFiSecurityMax
102 };
103
Thieu Le85e050b2012-03-13 15:04:38 -0700104 enum PortalResult {
105 kPortalResultSuccess = 0,
106 kPortalResultDNSFailure = 1,
107 kPortalResultDNSTimeout = 2,
108 kPortalResultConnectionFailure = 3,
109 kPortalResultConnectionTimeout = 4,
110 kPortalResultHTTPFailure = 5,
111 kPortalResultHTTPTimeout = 6,
112 kPortalResultContentFailure = 7,
113 kPortalResultContentTimeout = 8,
114 kPortalResultUnknown = 9,
115
116 kPortalResultMax
117 };
118
Paul Stewartff845fc2012-08-07 07:28:44 -0700119 enum LinkMonitorFailure {
120 kLinkMonitorMacAddressNotFound = 0,
121 kLinkMonitorClientStartFailure = 1,
122 kLinkMonitorTransmitFailure = 2,
123 kLinkMonitorFailureThresholdReached = 3,
124
125 kLinkMonitorFailureMax
126 };
127
Thieu Le67370f62012-02-14 23:01:42 +0000128 static const char kMetricDisconnect[];
129 static const int kMetricDisconnectMax;
130 static const int kMetricDisconnectMin;
131 static const int kMetricDisconnectNumBuckets;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000132 static const char kMetricNetworkChannel[];
133 static const int kMetricNetworkChannelMax;
Thieu Lead1ec2c2012-01-05 23:39:48 +0000134 static const char kMetricNetworkPhyMode[];
135 static const int kMetricNetworkPhyModeMax;
136 static const char kMetricNetworkSecurity[];
137 static const int kMetricNetworkSecurityMax;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000138 static const char kMetricNetworkServiceErrors[];
139 static const int kMetricNetworkServiceErrorsMax;
Thieu Lea20cbc22012-01-09 22:01:43 +0000140 static const char kMetricTimeOnlineSeconds[];
141 static const int kMetricTimeOnlineSecondsMax;
142 static const int kMetricTimeOnlineSecondsMin;
143 static const int kMetricTimeOnlineSecondsNumBuckets;
Thieu Leb84ba342012-03-02 15:15:19 -0800144 static const char kMetricTimeResumeToReadyMilliseconds[];
Thieu Le48e6d6d2011-12-06 00:40:27 +0000145 static const char kMetricTimeToConfigMilliseconds[];
Thieu Lea20cbc22012-01-09 22:01:43 +0000146 static const char kMetricTimeToDropSeconds[];
147 static const int kMetricTimeToDropSecondsMax;
148 static const int kMetricTimeToDropSecondsMin;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000149 static const char kMetricTimeToJoinMilliseconds[];
150 static const char kMetricTimeToOnlineMilliseconds[];
151 static const char kMetricTimeToPortalMilliseconds[];
Thieu Lea20cbc22012-01-09 22:01:43 +0000152 static const int kTimerHistogramMillisecondsMax;
153 static const int kTimerHistogramMillisecondsMin;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000154 static const int kTimerHistogramNumBuckets;
155
Thieu Le85e050b2012-03-13 15:04:38 -0700156 // The number of portal detections attempted for each pass.
157 // This includes both failure/timeout attempts and successful attempt
158 // (if any).
159 static const char kMetricPortalAttempts[];
160 static const int kMetricPortalAttemptsMax;
161 static const int kMetricPortalAttemptsMin;
162 static const int kMetricPortalAttemptsNumBuckets;
163
164 // The total number of portal detections attempted between the Connected
165 // state and the Online state. This includes both failure/timeout attempts
166 // and the final successful attempt.
167 static const char kMetricPortalAttemptsToOnline[];
168 static const int kMetricPortalAttemptsToOnlineMax;
169 static const int kMetricPortalAttemptsToOnlineMin;
170 static const int kMetricPortalAttemptsToOnlineNumBuckets;
171
172 // The result of the portal detection.
173 static const char kMetricPortalResult[];
174
Thieu Leb84ba342012-03-02 15:15:19 -0800175 static const char kMetricPowerManagerKey[];
176
Paul Stewartff845fc2012-08-07 07:28:44 -0700177 // LinkMonitor statistics.
178 static const char kMetricLinkMonitorFailure[];
179 static const char kMetricLinkMonitorResponseTimeSample[];
Paul Stewart0443aa52012-08-09 10:43:50 -0700180 static const unsigned int kMetricLinkMonitorResponseTimeSampleMin;
181 static const unsigned int kMetricLinkMonitorResponseTimeSampleMax;
Paul Stewartff845fc2012-08-07 07:28:44 -0700182 static const int kMetricLinkMonitorResponseTimeSampleNumBuckets;
Paul Stewart0443aa52012-08-09 10:43:50 -0700183 static const char kMetricLinkMonitorSecondsToFailure[];
184 static const unsigned int kMetricLinkMonitorSecondsToFailureMin;
185 static const unsigned int kMetricLinkMonitorSecondsToFailureMax;
186 static const int kMetricLinkMonitorSecondsToFailureNumBuckets;
187 static const char kMetricLinkMonitorBroadcastErrorsAtFailure[];
188 static const char kMetricLinkMonitorUnicastErrorsAtFailure[];
189 static const unsigned int kMetricLinkMonitorErrorCountMin;
190 static const unsigned int kMetricLinkMonitorErrorCountMax;
191 static const int kMetricLinkMonitorErrorCountNumBuckets;
Paul Stewartff845fc2012-08-07 07:28:44 -0700192
Thieu Le3426c8f2012-01-11 17:35:11 -0800193 Metrics();
Thieu Le48e6d6d2011-12-06 00:40:27 +0000194 virtual ~Metrics();
195
Thieu Le48e6d6d2011-12-06 00:40:27 +0000196 // Converts the WiFi frequency into the associated UMA channel enumerator.
197 static WiFiChannel WiFiFrequencyToChannel(uint16 frequency);
198
Thieu Lead1ec2c2012-01-05 23:39:48 +0000199 // Converts a flimflam security string into its UMA security enumerator.
200 static WiFiSecurity WiFiSecurityStringToEnum(const std::string &security);
201
Thieu Le85e050b2012-03-13 15:04:38 -0700202 // Converts portal detection result to UMA portal result enumerator.
203 static PortalResult PortalDetectionResultToEnum(
204 const PortalDetector::Result &result);
205
Thieu Le48e6d6d2011-12-06 00:40:27 +0000206 // Registers a service with this object so it can use the timers to track
207 // state transition metrics.
208 void RegisterService(const Service *service);
209
210 // Deregisters the service from this class. All state transition timers
211 // will be removed.
212 void DeregisterService(const Service *service);
213
214 // Tracks the time it takes |service| to go from |start_state| to
215 // |stop_state|. When |stop_state| is reached, the time is sent to UMA.
216 void AddServiceStateTransitionTimer(const Service *service,
217 const std::string &histogram_name,
218 Service::ConnectState start_state,
219 Service::ConnectState stop_state);
220
221 // Specializes |metric_name| for the specified |technology_id|.
222 std::string GetFullMetricName(const char *metric_name,
223 Technology::Identifier technology_id);
224
225 // Notifies this object that the default service has changed.
226 // |service| is the new default service.
Thieu Lea20cbc22012-01-09 22:01:43 +0000227 virtual void NotifyDefaultServiceChanged(const Service *service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000228
229 // Notifies this object that |service| state has changed.
230 virtual void NotifyServiceStateChanged(const Service *service,
231 Service::ConnectState new_state);
232
Thieu Le67370f62012-02-14 23:01:42 +0000233 // Notifies this object that |service| has been disconnected.
234 void NotifyServiceDisconnect(const Service *service);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000235
Thieu Leb84ba342012-03-02 15:15:19 -0800236 // Notifies this object of a power management state change.
237 void NotifyPowerStateChange(PowerManager::SuspendState new_state);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000238
Paul Stewartff845fc2012-08-07 07:28:44 -0700239 // Notifies this object of a failure in LinkMonitor.
240 void NotifyLinkMonitorFailure(
Paul Stewart0443aa52012-08-09 10:43:50 -0700241 Technology::Identifier technology,
242 LinkMonitorFailure failure,
243 unsigned int seconds_to_failure,
244 unsigned int broadcast_error_count,
245 unsigned int unicast_error_count);
Paul Stewartff845fc2012-08-07 07:28:44 -0700246
247 // Notifies this object that LinkMonitor has added a response time sample
248 // for |connection| with a value of |response_time_milliseconds|.
249 void NotifyLinkMonitorResponseTimeSampleAdded(
250 Technology::Identifier technology,
251 unsigned int response_time_milliseconds);
252
Thieu Le48e6d6d2011-12-06 00:40:27 +0000253 // Sends linear histogram data to UMA.
Thieu Le85e050b2012-03-13 15:04:38 -0700254 virtual bool SendEnumToUMA(const std::string &name, int sample, int max);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000255
Thieu Lea20cbc22012-01-09 22:01:43 +0000256 // Send histogram data to UMA.
Thieu Le85e050b2012-03-13 15:04:38 -0700257 virtual bool SendToUMA(const std::string &name, int sample, int min,
258 int max, int num_buckets);
Thieu Lea20cbc22012-01-09 22:01:43 +0000259
Thieu Le48e6d6d2011-12-06 00:40:27 +0000260 private:
Thieu Le48e6d6d2011-12-06 00:40:27 +0000261 friend class MetricsTest;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000262 FRIEND_TEST(MetricsTest, FrequencyToChannel);
Thieu Leb84ba342012-03-02 15:15:19 -0800263 FRIEND_TEST(MetricsTest, ServiceFailure);
Thieu Lea20cbc22012-01-09 22:01:43 +0000264 FRIEND_TEST(MetricsTest, TimeOnlineTimeToDrop);
Thieu Leb84ba342012-03-02 15:15:19 -0800265 FRIEND_TEST(MetricsTest, TimeToConfig);
266 FRIEND_TEST(MetricsTest, TimeToOnline);
267 FRIEND_TEST(MetricsTest, TimeToPortal);
268 FRIEND_TEST(MetricsTest, WiFiServiceChannel);
269 FRIEND_TEST(MetricsTest, WiFiServicePostReady);
Thieu Le48e6d6d2011-12-06 00:40:27 +0000270
271 typedef ScopedVector<chromeos_metrics::TimerReporter> TimerReporters;
272 typedef std::list<chromeos_metrics::TimerReporter *> TimerReportersList;
273 typedef std::map<Service::ConnectState, TimerReportersList>
274 TimerReportersByState;
275 struct ServiceMetrics {
276 ServiceMetrics() : service(NULL) {}
277 // The service is registered/deregistered in the Service
278 // constructor/destructor, therefore there is no need to keep a ref count.
279 const Service *service;
280 // All TimerReporter objects are stored in |timers| which owns the objects.
281 // |start_on_state| and |stop_on_state| contain pointers to the
282 // TimerReporter objects and control when to start and stop the timers.
283 TimerReporters timers;
284 TimerReportersByState start_on_state;
285 TimerReportersByState stop_on_state;
286 };
287 typedef std::map<const Service *, std::tr1::shared_ptr<ServiceMetrics> >
288 ServiceMetricsLookupMap;
289
290 static const uint16 kWiFiBandwidth5MHz;
291 static const uint16 kWiFiBandwidth20MHz;
292 static const uint16 kWiFiFrequency2412;
293 static const uint16 kWiFiFrequency2472;
294 static const uint16 kWiFiFrequency2484;
295 static const uint16 kWiFiFrequency5170;
296 static const uint16 kWiFiFrequency5180;
297 static const uint16 kWiFiFrequency5230;
298 static const uint16 kWiFiFrequency5240;
299 static const uint16 kWiFiFrequency5320;
300 static const uint16 kWiFiFrequency5500;
301 static const uint16 kWiFiFrequency5700;
302 static const uint16 kWiFiFrequency5745;
303 static const uint16 kWiFiFrequency5825;
304
Thieu Le48e6d6d2011-12-06 00:40:27 +0000305 void InitializeCommonServiceMetrics(const Service *service);
306 void UpdateServiceStateTransitionMetrics(ServiceMetrics *service_metrics,
307 Service::ConnectState new_state);
308 void SendServiceFailure(const Service *service);
309
310 // For unit test purposes.
311 void set_library(MetricsLibraryInterface *library);
Thieu Lea20cbc22012-01-09 22:01:43 +0000312 void set_time_online_timer(chromeos_metrics::Timer *timer) {
313 time_online_timer_.reset(timer); // Passes ownership
314 }
315 void set_time_to_drop_timer(chromeos_metrics::Timer *timer) {
316 time_to_drop_timer_.reset(timer); // Passes ownership
317 }
Thieu Leb84ba342012-03-02 15:15:19 -0800318 void set_time_resume_to_ready_timer(chromeos_metrics::Timer *timer) {
319 time_resume_to_ready_timer_.reset(timer); // Passes ownership
320 }
Thieu Le48e6d6d2011-12-06 00:40:27 +0000321
322 // |library_| points to |metrics_library_| when shill runs normally.
323 // However, in order to allow for unit testing, we point |library_| to a
324 // MetricsLibraryMock object instead.
325 MetricsLibrary metrics_library_;
326 MetricsLibraryInterface *library_;
327 ServiceMetricsLookupMap services_metrics_;
Thieu Lea20cbc22012-01-09 22:01:43 +0000328 Technology::Identifier last_default_technology_;
329 bool was_online_;
330 scoped_ptr<chromeos_metrics::Timer> time_online_timer_;
331 scoped_ptr<chromeos_metrics::Timer> time_to_drop_timer_;
Thieu Leb84ba342012-03-02 15:15:19 -0800332 scoped_ptr<chromeos_metrics::Timer> time_resume_to_ready_timer_;
Darin Petkov58f0b6d2012-06-12 12:52:30 +0200333 bool collect_bootstats_;
Thieu Le48e6d6d2011-12-06 00:40:27 +0000334
335 DISALLOW_COPY_AND_ASSIGN(Metrics);
336};
337
338} // namespace shill
339
340#endif // SHILL_METRICS_