blob: c33a7a559ee5159cdcb25d15f28d2f9e39c32c03 [file] [log] [blame]
Thieu Le48e6d6d2011-12-06 00:40:27 +00001// Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
2// 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
10#include <base/lazy_instance.h>
11#include <base/memory/scoped_vector.h>
12#include <metrics/metrics_library.h>
13#include <metrics/timer.h>
14
15#include "shill/refptr_types.h"
16#include "shill/service.h"
17
18namespace shill {
19
20class WiFiService;
21
22class Metrics {
23 public:
24 enum WiFiChannel {
25 kWiFiChannelUndef = 0,
26 kWiFiChannel2412 = 1,
27 kWiFiChannel2417 = 2,
28 kWiFiChannel2422 = 3,
29 kWiFiChannel2427 = 4,
30 kWiFiChannel2432 = 5,
31 kWiFiChannel2437 = 6,
32 kWiFiChannel2442 = 7,
33 kWiFiChannel2447 = 8,
34 kWiFiChannel2452 = 9,
35 kWiFiChannel2457 = 10,
36 kWiFiChannel2462 = 11,
37 kWiFiChannel2467 = 12,
38 kWiFiChannel2472 = 13,
39 kWiFiChannel2484 = 14,
40
41 kWiFiChannel5180 = 15,
42 kWiFiChannel5200 = 16,
43 kWiFiChannel5220 = 17,
44 kWiFiChannel5240 = 18,
45 kWiFiChannel5260 = 19,
46 kWiFiChannel5280 = 20,
47 kWiFiChannel5300 = 21,
48 kWiFiChannel5320 = 22,
49
50 kWiFiChannel5500 = 23,
51 kWiFiChannel5520 = 24,
52 kWiFiChannel5540 = 25,
53 kWiFiChannel5560 = 26,
54 kWiFiChannel5580 = 27,
55 kWiFiChannel5600 = 28,
56 kWiFiChannel5620 = 29,
57 kWiFiChannel5640 = 30,
58 kWiFiChannel5660 = 31,
59 kWiFiChannel5680 = 32,
60 kWiFiChannel5700 = 33,
61
62 kWiFiChannel5745 = 34,
63 kWiFiChannel5765 = 35,
64 kWiFiChannel5785 = 36,
65 kWiFiChannel5805 = 37,
66 kWiFiChannel5825 = 38,
67
68 kWiFiChannel5170 = 39,
69 kWiFiChannel5190 = 40,
70 kWiFiChannel5210 = 41,
71 kWiFiChannel5230 = 42,
72
73 /* NB: ignore old 11b bands 2312..2372 and 2512..2532 */
74 /* NB: ignore regulated bands 4920..4980 and 5020..5160 */
75 kWiFiChannelMax
76 };
77
78 static const char kMetricNetworkChannel[];
79 static const int kMetricNetworkChannelMax;
80 static const char kMetricNetworkServiceErrors[];
81 static const int kMetricNetworkServiceErrorsMax;
82 static const char kMetricTimeToConfigMilliseconds[];
83 static const char kMetricTimeToJoinMilliseconds[];
84 static const char kMetricTimeToOnlineMilliseconds[];
85 static const char kMetricTimeToPortalMilliseconds[];
86 static const int kTimerHistogramMaxMilliseconds;
87 static const int kTimerHistogramMinMilliseconds;
88 static const int kTimerHistogramNumBuckets;
89
90 virtual ~Metrics();
91
92 // This is a singleton -- use Metrics::GetInstance()->Foo()
93 static Metrics *GetInstance();
94
95 // Converts the WiFi frequency into the associated UMA channel enumerator.
96 static WiFiChannel WiFiFrequencyToChannel(uint16 frequency);
97
98 // Registers a service with this object so it can use the timers to track
99 // state transition metrics.
100 void RegisterService(const Service *service);
101
102 // Deregisters the service from this class. All state transition timers
103 // will be removed.
104 void DeregisterService(const Service *service);
105
106 // Tracks the time it takes |service| to go from |start_state| to
107 // |stop_state|. When |stop_state| is reached, the time is sent to UMA.
108 void AddServiceStateTransitionTimer(const Service *service,
109 const std::string &histogram_name,
110 Service::ConnectState start_state,
111 Service::ConnectState stop_state);
112
113 // Specializes |metric_name| for the specified |technology_id|.
114 std::string GetFullMetricName(const char *metric_name,
115 Technology::Identifier technology_id);
116
117 // Notifies this object that the default service has changed.
118 // |service| is the new default service.
119 void NotifyDefaultServiceChanged(const Service *service);
120
121 // Notifies this object that |service| state has changed.
122 virtual void NotifyServiceStateChanged(const Service *service,
123 Service::ConnectState new_state);
124
125 // Notifies this object that |service| has been disconnected and whether
126 // the disconnect was requested by the user or not.
127 void NotifyServiceDisconnect(const Service *service,
128 bool manual_disconnect);
129
130 // Notifies this object of a power management event.
131 void NotifyPower();
132
133 // Sends linear histogram data to UMA.
134 bool SendEnumToUMA(const std::string &name, int sample, int max);
135
136 private:
137 friend struct base::DefaultLazyInstanceTraits<Metrics>;
138 friend class MetricsTest;
139 FRIEND_TEST(MetricsTest, TimeToConfig);
140 FRIEND_TEST(MetricsTest, TimeToPortal);
141 FRIEND_TEST(MetricsTest, TimeToOnline);
142 FRIEND_TEST(MetricsTest, ServiceFailure);
143 FRIEND_TEST(MetricsTest, WiFiServiceChannel);
144 FRIEND_TEST(MetricsTest, FrequencyToChannel);
145
146 typedef ScopedVector<chromeos_metrics::TimerReporter> TimerReporters;
147 typedef std::list<chromeos_metrics::TimerReporter *> TimerReportersList;
148 typedef std::map<Service::ConnectState, TimerReportersList>
149 TimerReportersByState;
150 struct ServiceMetrics {
151 ServiceMetrics() : service(NULL) {}
152 // The service is registered/deregistered in the Service
153 // constructor/destructor, therefore there is no need to keep a ref count.
154 const Service *service;
155 // All TimerReporter objects are stored in |timers| which owns the objects.
156 // |start_on_state| and |stop_on_state| contain pointers to the
157 // TimerReporter objects and control when to start and stop the timers.
158 TimerReporters timers;
159 TimerReportersByState start_on_state;
160 TimerReportersByState stop_on_state;
161 };
162 typedef std::map<const Service *, std::tr1::shared_ptr<ServiceMetrics> >
163 ServiceMetricsLookupMap;
164
165 static const uint16 kWiFiBandwidth5MHz;
166 static const uint16 kWiFiBandwidth20MHz;
167 static const uint16 kWiFiFrequency2412;
168 static const uint16 kWiFiFrequency2472;
169 static const uint16 kWiFiFrequency2484;
170 static const uint16 kWiFiFrequency5170;
171 static const uint16 kWiFiFrequency5180;
172 static const uint16 kWiFiFrequency5230;
173 static const uint16 kWiFiFrequency5240;
174 static const uint16 kWiFiFrequency5320;
175 static const uint16 kWiFiFrequency5500;
176 static const uint16 kWiFiFrequency5700;
177 static const uint16 kWiFiFrequency5745;
178 static const uint16 kWiFiFrequency5825;
179
180 Metrics();
181
182 void InitializeCommonServiceMetrics(const Service *service);
183 void UpdateServiceStateTransitionMetrics(ServiceMetrics *service_metrics,
184 Service::ConnectState new_state);
185 void SendServiceFailure(const Service *service);
186
187 // For unit test purposes.
188 void set_library(MetricsLibraryInterface *library);
189
190 // |library_| points to |metrics_library_| when shill runs normally.
191 // However, in order to allow for unit testing, we point |library_| to a
192 // MetricsLibraryMock object instead.
193 MetricsLibrary metrics_library_;
194 MetricsLibraryInterface *library_;
195 ServiceMetricsLookupMap services_metrics_;
196
197 DISALLOW_COPY_AND_ASSIGN(Metrics);
198};
199
200} // namespace shill
201
202#endif // SHILL_METRICS_