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

Side by Side Diff: components/metrics/net/network_metrics_provider.cc

Issue 2605553002: Add EffectiveConnectionType enum to the system profile proto (Closed)
Patch Set: asvitkine comments Created 3 years, 11 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
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium 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 #include "components/metrics/net/network_metrics_provider.h" 5 #include "components/metrics/net/network_metrics_provider.h"
6 6
7 #include <stdint.h> 7 #include <stdint.h>
8 8
9 #include <string> 9 #include <string>
10 #include <vector> 10 #include <vector>
11 11
12 #include "base/bind_helpers.h"
13 #include "base/callback_forward.h"
12 #include "base/compiler_specific.h" 14 #include "base/compiler_specific.h"
13 #include "base/metrics/histogram_macros.h" 15 #include "base/metrics/histogram_macros.h"
14 #include "base/metrics/sparse_histogram.h" 16 #include "base/metrics/sparse_histogram.h"
15 #include "base/strings/string_number_conversions.h" 17 #include "base/strings/string_number_conversions.h"
16 #include "base/strings/string_split.h" 18 #include "base/strings/string_split.h"
17 #include "base/strings/string_util.h" 19 #include "base/strings/string_util.h"
18 #include "base/task_runner_util.h" 20 #include "base/task_runner_util.h"
19 #include "build/build_config.h" 21 #include "build/build_config.h"
20 #include "net/base/net_errors.h" 22 #include "net/base/net_errors.h"
23 #include "net/nqe/network_quality_estimator.h"
21 24
22 #if defined(OS_CHROMEOS) 25 #if defined(OS_CHROMEOS)
23 #include "components/metrics/net/wifi_access_point_info_provider_chromeos.h" 26 #include "components/metrics/net/wifi_access_point_info_provider_chromeos.h"
24 #endif // OS_CHROMEOS 27 #endif // OS_CHROMEOS
25 28
26 namespace metrics { 29 namespace metrics {
27 30
31 // Listens to the changes in the effective conection type.
32 class NetworkMetricsProvider::EffectiveConnectionTypeObserver
33 : public net::NetworkQualityEstimator::EffectiveConnectionTypeObserver {
34 public:
35 // |network_quality_estimator| is used to provide the network quality
36 // estimates. Guaranteed to be non-null. |callback| is run on
37 // |callback_task_runner|, and provides notifications about the changes in the
38 // effective connection type.
39 EffectiveConnectionTypeObserver(
40 base::Callback<void(net::EffectiveConnectionType)> callback,
41 const scoped_refptr<base::SequencedTaskRunner>& callback_task_runner)
42 : network_quality_estimator_(nullptr),
43 callback_(callback),
44 callback_task_runner_(callback_task_runner) {
45 DCHECK(callback_);
46 DCHECK(callback_task_runner_);
47 // |this| is initialized and used on the IO thread using
48 // |network_quality_task_runner_|.
49 thread_checker_.DetachFromThread();
50 }
51
52 ~EffectiveConnectionTypeObserver() override {
53 DCHECK(thread_checker_.CalledOnValidThread());
54 if (network_quality_estimator_)
55 network_quality_estimator_->RemoveEffectiveConnectionTypeObserver(this);
56 }
57
58 // Initializes |this| on IO thread using |network_quality_task_runner_|. This
59 // is the same thread on which |network_quality_estimator| lives.
60 void Init(net::NetworkQualityEstimator* network_quality_estimator) {
61 network_quality_estimator_ = network_quality_estimator;
62 if (network_quality_estimator_)
63 network_quality_estimator_->AddEffectiveConnectionTypeObserver(this);
64 }
65
66 private:
67 // net::EffectiveConnectionTypeObserver implementation:
68 void OnEffectiveConnectionTypeChanged(
69 net::EffectiveConnectionType type) override {
70 DCHECK(thread_checker_.CalledOnValidThread());
71 callback_task_runner_->PostTask(FROM_HERE, base::Bind(callback_, type));
72 }
73
74 // Notifies |this| when there is a change in the effective connection type.
75 net::NetworkQualityEstimator* network_quality_estimator_;
76
77 // Called when the effective connection type is changed.
78 base::Callback<void(net::EffectiveConnectionType)> callback_;
79
80 // Task runner on which |callback_| is run.
81 scoped_refptr<base::SequencedTaskRunner> callback_task_runner_;
82
83 base::ThreadChecker thread_checker_;
84
85 DISALLOW_COPY_AND_ASSIGN(EffectiveConnectionTypeObserver);
86 };
87
28 NetworkMetricsProvider::NetworkMetricsProvider(base::TaskRunner* io_task_runner) 88 NetworkMetricsProvider::NetworkMetricsProvider(base::TaskRunner* io_task_runner)
89 : NetworkMetricsProvider(nullptr, io_task_runner) {}
90
91 NetworkMetricsProvider::NetworkMetricsProvider(
92 std::unique_ptr<NetworkQualityEstimatorProvider>
93 network_quality_estimator_provider,
94 base::TaskRunner* io_task_runner)
29 : io_task_runner_(io_task_runner), 95 : io_task_runner_(io_task_runner),
30 connection_type_is_ambiguous_(false), 96 connection_type_is_ambiguous_(false),
31 wifi_phy_layer_protocol_is_ambiguous_(false), 97 wifi_phy_layer_protocol_is_ambiguous_(false),
32 wifi_phy_layer_protocol_(net::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN), 98 wifi_phy_layer_protocol_(net::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN),
33 total_aborts_(0), 99 total_aborts_(0),
34 total_codes_(0), 100 total_codes_(0),
101 network_quality_estimator_provider_(
102 std::move(network_quality_estimator_provider)),
103 effective_connection_type_(net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN),
104 effective_connection_type_is_ambiguous_(false),
35 weak_ptr_factory_(this) { 105 weak_ptr_factory_(this) {
36 net::NetworkChangeNotifier::AddConnectionTypeObserver(this); 106 net::NetworkChangeNotifier::AddConnectionTypeObserver(this);
37 connection_type_ = net::NetworkChangeNotifier::GetConnectionType(); 107 connection_type_ = net::NetworkChangeNotifier::GetConnectionType();
38 ProbeWifiPHYLayerProtocol(); 108 ProbeWifiPHYLayerProtocol();
109
110 if (network_quality_estimator_provider_) {
111 network_quality_task_runner_ =
112 network_quality_estimator_provider_->GetTaskRunner();
113 DCHECK(network_quality_task_runner_);
114 effective_connection_type_observer_.reset(
115 new EffectiveConnectionTypeObserver(
116 base::Bind(
117 &NetworkMetricsProvider::OnEffectiveConnectionTypeChanged,
118 base::Unretained(this)),
119 base::ThreadTaskRunnerHandle::Get()));
120
121 // Get the network quality estimator and initialize
122 // |effective_connection_type_observer_| on the same task runner on which
123 // the network quality estimator lives. It is safe to use base::Unretained
124 // here since both |network_quality_estimator_provider_| and
125 // |effective_connection_type_observer_| are owned by |this|, and are
126 // deleted on the |network_quality_task_runner_|.
127 network_quality_task_runner_->PostTask(
128 FROM_HERE,
129 base::Bind(&NetworkQualityEstimatorProvider::ProvideEstimator,
130 base::Unretained(network_quality_estimator_provider_.get()),
131 base::Bind(&EffectiveConnectionTypeObserver::Init,
132 base::Unretained(
133 effective_connection_type_observer_.get()))));
134 }
39 } 135 }
40 136
41 NetworkMetricsProvider::~NetworkMetricsProvider() { 137 NetworkMetricsProvider::~NetworkMetricsProvider() {
138 DCHECK(thread_checker_.CalledOnValidThread());
42 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this); 139 net::NetworkChangeNotifier::RemoveConnectionTypeObserver(this);
140 if (effective_connection_type_observer_ &&
141 !network_quality_task_runner_->DeleteSoon(
142 FROM_HERE, effective_connection_type_observer_.release())) {
143 NOTREACHED() << " ECT observer was not deleted successfully";
144 }
145 if (network_quality_estimator_provider_ &&
146 !network_quality_task_runner_->DeleteSoon(
147 FROM_HERE, network_quality_estimator_provider_.release())) {
148 NOTREACHED()
149 << " Network quality estimate provider was not deleted successfully";
150 }
43 } 151 }
44 152
45 void NetworkMetricsProvider::ProvideGeneralMetrics( 153 void NetworkMetricsProvider::ProvideGeneralMetrics(
46 ChromeUserMetricsExtension*) { 154 ChromeUserMetricsExtension*) {
155 DCHECK(thread_checker_.CalledOnValidThread());
47 // ProvideGeneralMetrics is called on the main thread, at the time a metrics 156 // ProvideGeneralMetrics is called on the main thread, at the time a metrics
48 // record is being finalized. 157 // record is being finalized.
49 net::NetworkChangeNotifier::FinalizingMetricsLogRecord(); 158 net::NetworkChangeNotifier::FinalizingMetricsLogRecord();
50 LogAggregatedMetrics(); 159 LogAggregatedMetrics();
51 } 160 }
52 161
53 void NetworkMetricsProvider::ProvideSystemProfileMetrics( 162 void NetworkMetricsProvider::ProvideSystemProfileMetrics(
54 SystemProfileProto* system_profile) { 163 SystemProfileProto* system_profile) {
164 DCHECK(thread_checker_.CalledOnValidThread());
55 SystemProfileProto::Network* network = system_profile->mutable_network(); 165 SystemProfileProto::Network* network = system_profile->mutable_network();
56 network->set_connection_type_is_ambiguous(connection_type_is_ambiguous_); 166 network->set_connection_type_is_ambiguous(connection_type_is_ambiguous_);
57 network->set_connection_type(GetConnectionType()); 167 network->set_connection_type(GetConnectionType());
58 network->set_wifi_phy_layer_protocol_is_ambiguous( 168 network->set_wifi_phy_layer_protocol_is_ambiguous(
59 wifi_phy_layer_protocol_is_ambiguous_); 169 wifi_phy_layer_protocol_is_ambiguous_);
60 network->set_wifi_phy_layer_protocol(GetWifiPHYLayerProtocol()); 170 network->set_wifi_phy_layer_protocol(GetWifiPHYLayerProtocol());
171 network->set_effective_connection_type(GetEffectiveConnectionType());
61 172
62 // Update the connection type. Note that this is necessary to set the network 173 // Update the connection type. Note that this is necessary to set the network
63 // type to "none" if there is no network connection for an entire UMA logging 174 // type to "none" if there is no network connection for an entire UMA logging
64 // window, since OnConnectionTypeChanged() ignores transitions to the "none" 175 // window, since OnConnectionTypeChanged() ignores transitions to the "none"
65 // state. 176 // state.
66 connection_type_ = net::NetworkChangeNotifier::GetConnectionType(); 177 connection_type_ = net::NetworkChangeNotifier::GetConnectionType();
67 // Reset the "ambiguous" flags, since a new metrics log session has started. 178 // Reset the "ambiguous" flags, since a new metrics log session has started.
68 connection_type_is_ambiguous_ = false; 179 connection_type_is_ambiguous_ = false;
69 wifi_phy_layer_protocol_is_ambiguous_ = false; 180 wifi_phy_layer_protocol_is_ambiguous_ = false;
181 effective_connection_type_is_ambiguous_ = false;
70 182
71 if (!wifi_access_point_info_provider_.get()) { 183 if (!wifi_access_point_info_provider_.get()) {
72 #if defined(OS_CHROMEOS) 184 #if defined(OS_CHROMEOS)
73 wifi_access_point_info_provider_.reset( 185 wifi_access_point_info_provider_.reset(
74 new WifiAccessPointInfoProviderChromeos()); 186 new WifiAccessPointInfoProviderChromeos());
75 #else 187 #else
76 wifi_access_point_info_provider_.reset( 188 wifi_access_point_info_provider_.reset(
77 new WifiAccessPointInfoProvider()); 189 new WifiAccessPointInfoProvider());
78 #endif // OS_CHROMEOS 190 #endif // OS_CHROMEOS
79 } 191 }
80 192
81 // Connected wifi access point information. 193 // Connected wifi access point information.
82 WifiAccessPointInfoProvider::WifiAccessPointInfo info; 194 WifiAccessPointInfoProvider::WifiAccessPointInfo info;
83 if (wifi_access_point_info_provider_->GetInfo(&info)) 195 if (wifi_access_point_info_provider_->GetInfo(&info))
84 WriteWifiAccessPointProto(info, network); 196 WriteWifiAccessPointProto(info, network);
85 } 197 }
86 198
87 void NetworkMetricsProvider::OnConnectionTypeChanged( 199 void NetworkMetricsProvider::OnConnectionTypeChanged(
88 net::NetworkChangeNotifier::ConnectionType type) { 200 net::NetworkChangeNotifier::ConnectionType type) {
201 DCHECK(thread_checker_.CalledOnValidThread());
89 // To avoid reporting an ambiguous connection type for users on flaky 202 // To avoid reporting an ambiguous connection type for users on flaky
90 // connections, ignore transitions to the "none" state. Note that the 203 // connections, ignore transitions to the "none" state. Note that the
91 // connection type is refreshed in ProvideSystemProfileMetrics() each time a 204 // connection type is refreshed in ProvideSystemProfileMetrics() each time a
92 // new UMA logging window begins, so users who genuinely transition to offline 205 // new UMA logging window begins, so users who genuinely transition to offline
93 // mode for an extended duration will still be at least partially represented 206 // mode for an extended duration will still be at least partially represented
94 // in the metrics logs. 207 // in the metrics logs.
95 if (type == net::NetworkChangeNotifier::CONNECTION_NONE) 208 if (type == net::NetworkChangeNotifier::CONNECTION_NONE)
96 return; 209 return;
97 210
98 if (type != connection_type_ && 211 if (type != connection_type_ &&
99 connection_type_ != net::NetworkChangeNotifier::CONNECTION_NONE) { 212 connection_type_ != net::NetworkChangeNotifier::CONNECTION_NONE) {
100 connection_type_is_ambiguous_ = true; 213 connection_type_is_ambiguous_ = true;
101 } 214 }
102 connection_type_ = type; 215 connection_type_ = type;
103 216
104 ProbeWifiPHYLayerProtocol(); 217 ProbeWifiPHYLayerProtocol();
105 } 218 }
106 219
107 SystemProfileProto::Network::ConnectionType 220 SystemProfileProto::Network::ConnectionType
108 NetworkMetricsProvider::GetConnectionType() const { 221 NetworkMetricsProvider::GetConnectionType() const {
222 DCHECK(thread_checker_.CalledOnValidThread());
109 switch (connection_type_) { 223 switch (connection_type_) {
110 case net::NetworkChangeNotifier::CONNECTION_NONE: 224 case net::NetworkChangeNotifier::CONNECTION_NONE:
111 return SystemProfileProto::Network::CONNECTION_NONE; 225 return SystemProfileProto::Network::CONNECTION_NONE;
112 case net::NetworkChangeNotifier::CONNECTION_UNKNOWN: 226 case net::NetworkChangeNotifier::CONNECTION_UNKNOWN:
113 return SystemProfileProto::Network::CONNECTION_UNKNOWN; 227 return SystemProfileProto::Network::CONNECTION_UNKNOWN;
114 case net::NetworkChangeNotifier::CONNECTION_ETHERNET: 228 case net::NetworkChangeNotifier::CONNECTION_ETHERNET:
115 return SystemProfileProto::Network::CONNECTION_ETHERNET; 229 return SystemProfileProto::Network::CONNECTION_ETHERNET;
116 case net::NetworkChangeNotifier::CONNECTION_WIFI: 230 case net::NetworkChangeNotifier::CONNECTION_WIFI:
117 return SystemProfileProto::Network::CONNECTION_WIFI; 231 return SystemProfileProto::Network::CONNECTION_WIFI;
118 case net::NetworkChangeNotifier::CONNECTION_2G: 232 case net::NetworkChangeNotifier::CONNECTION_2G:
119 return SystemProfileProto::Network::CONNECTION_2G; 233 return SystemProfileProto::Network::CONNECTION_2G;
120 case net::NetworkChangeNotifier::CONNECTION_3G: 234 case net::NetworkChangeNotifier::CONNECTION_3G:
121 return SystemProfileProto::Network::CONNECTION_3G; 235 return SystemProfileProto::Network::CONNECTION_3G;
122 case net::NetworkChangeNotifier::CONNECTION_4G: 236 case net::NetworkChangeNotifier::CONNECTION_4G:
123 return SystemProfileProto::Network::CONNECTION_4G; 237 return SystemProfileProto::Network::CONNECTION_4G;
124 case net::NetworkChangeNotifier::CONNECTION_BLUETOOTH: 238 case net::NetworkChangeNotifier::CONNECTION_BLUETOOTH:
125 return SystemProfileProto::Network::CONNECTION_BLUETOOTH; 239 return SystemProfileProto::Network::CONNECTION_BLUETOOTH;
126 } 240 }
127 NOTREACHED(); 241 NOTREACHED();
128 return SystemProfileProto::Network::CONNECTION_UNKNOWN; 242 return SystemProfileProto::Network::CONNECTION_UNKNOWN;
129 } 243 }
130 244
131 SystemProfileProto::Network::WifiPHYLayerProtocol 245 SystemProfileProto::Network::WifiPHYLayerProtocol
132 NetworkMetricsProvider::GetWifiPHYLayerProtocol() const { 246 NetworkMetricsProvider::GetWifiPHYLayerProtocol() const {
247 DCHECK(thread_checker_.CalledOnValidThread());
133 switch (wifi_phy_layer_protocol_) { 248 switch (wifi_phy_layer_protocol_) {
134 case net::WIFI_PHY_LAYER_PROTOCOL_NONE: 249 case net::WIFI_PHY_LAYER_PROTOCOL_NONE:
135 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_NONE; 250 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_NONE;
136 case net::WIFI_PHY_LAYER_PROTOCOL_ANCIENT: 251 case net::WIFI_PHY_LAYER_PROTOCOL_ANCIENT:
137 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_ANCIENT; 252 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_ANCIENT;
138 case net::WIFI_PHY_LAYER_PROTOCOL_A: 253 case net::WIFI_PHY_LAYER_PROTOCOL_A:
139 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_A; 254 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_A;
140 case net::WIFI_PHY_LAYER_PROTOCOL_B: 255 case net::WIFI_PHY_LAYER_PROTOCOL_B:
141 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_B; 256 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_B;
142 case net::WIFI_PHY_LAYER_PROTOCOL_G: 257 case net::WIFI_PHY_LAYER_PROTOCOL_G:
143 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_G; 258 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_G;
144 case net::WIFI_PHY_LAYER_PROTOCOL_N: 259 case net::WIFI_PHY_LAYER_PROTOCOL_N:
145 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_N; 260 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_N;
146 case net::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN: 261 case net::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN:
147 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN; 262 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN;
148 } 263 }
149 NOTREACHED(); 264 NOTREACHED();
150 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN; 265 return SystemProfileProto::Network::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN;
151 } 266 }
152 267
268 SystemProfileProto::Network::EffectiveConnectionType
269 NetworkMetricsProvider::GetEffectiveConnectionType() const {
270 DCHECK(thread_checker_.CalledOnValidThread());
271
272 if (effective_connection_type_is_ambiguous_)
273 return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_AMBIGUOUS;
274
275 switch (effective_connection_type_) {
276 case net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN:
277 return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
278 case net::EFFECTIVE_CONNECTION_TYPE_OFFLINE:
279 return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_OFFLINE;
280 case net::EFFECTIVE_CONNECTION_TYPE_SLOW_2G:
281 return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_SLOW_2G;
282 case net::EFFECTIVE_CONNECTION_TYPE_2G:
283 return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_2G;
284 case net::EFFECTIVE_CONNECTION_TYPE_3G:
285 return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_3G;
286 case net::EFFECTIVE_CONNECTION_TYPE_4G:
287 return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_4G;
288 case net::EFFECTIVE_CONNECTION_TYPE_LAST:
289 NOTREACHED();
290 return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
291 }
292 NOTREACHED();
293 return SystemProfileProto::Network::EFFECTIVE_CONNECTION_TYPE_UNKNOWN;
294 }
295
153 void NetworkMetricsProvider::ProbeWifiPHYLayerProtocol() { 296 void NetworkMetricsProvider::ProbeWifiPHYLayerProtocol() {
297 DCHECK(thread_checker_.CalledOnValidThread());
154 PostTaskAndReplyWithResult( 298 PostTaskAndReplyWithResult(
155 io_task_runner_, 299 io_task_runner_,
156 FROM_HERE, 300 FROM_HERE,
157 base::Bind(&net::GetWifiPHYLayerProtocol), 301 base::Bind(&net::GetWifiPHYLayerProtocol),
158 base::Bind(&NetworkMetricsProvider::OnWifiPHYLayerProtocolResult, 302 base::Bind(&NetworkMetricsProvider::OnWifiPHYLayerProtocolResult,
159 weak_ptr_factory_.GetWeakPtr())); 303 weak_ptr_factory_.GetWeakPtr()));
160 } 304 }
161 305
162 void NetworkMetricsProvider::OnWifiPHYLayerProtocolResult( 306 void NetworkMetricsProvider::OnWifiPHYLayerProtocolResult(
163 net::WifiPHYLayerProtocol mode) { 307 net::WifiPHYLayerProtocol mode) {
308 DCHECK(thread_checker_.CalledOnValidThread());
164 if (wifi_phy_layer_protocol_ != net::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN && 309 if (wifi_phy_layer_protocol_ != net::WIFI_PHY_LAYER_PROTOCOL_UNKNOWN &&
165 mode != wifi_phy_layer_protocol_) { 310 mode != wifi_phy_layer_protocol_) {
166 wifi_phy_layer_protocol_is_ambiguous_ = true; 311 wifi_phy_layer_protocol_is_ambiguous_ = true;
167 } 312 }
168 wifi_phy_layer_protocol_ = mode; 313 wifi_phy_layer_protocol_ = mode;
169 } 314 }
170 315
171 void NetworkMetricsProvider::WriteWifiAccessPointProto( 316 void NetworkMetricsProvider::WriteWifiAccessPointProto(
172 const WifiAccessPointInfoProvider::WifiAccessPointInfo& info, 317 const WifiAccessPointInfoProvider::WifiAccessPointInfo& info,
173 SystemProfileProto::Network* network_proto) { 318 SystemProfileProto::Network* network_proto) {
319 DCHECK(thread_checker_.CalledOnValidThread());
174 SystemProfileProto::Network::WifiAccessPoint* access_point_info = 320 SystemProfileProto::Network::WifiAccessPoint* access_point_info =
175 network_proto->mutable_access_point_info(); 321 network_proto->mutable_access_point_info();
176 SystemProfileProto::Network::WifiAccessPoint::SecurityMode security = 322 SystemProfileProto::Network::WifiAccessPoint::SecurityMode security =
177 SystemProfileProto::Network::WifiAccessPoint::SECURITY_UNKNOWN; 323 SystemProfileProto::Network::WifiAccessPoint::SECURITY_UNKNOWN;
178 switch (info.security) { 324 switch (info.security) {
179 case WifiAccessPointInfoProvider::WIFI_SECURITY_NONE: 325 case WifiAccessPointInfoProvider::WIFI_SECURITY_NONE:
180 security = SystemProfileProto::Network::WifiAccessPoint::SECURITY_NONE; 326 security = SystemProfileProto::Network::WifiAccessPoint::SECURITY_NONE;
181 break; 327 break;
182 case WifiAccessPointInfoProvider::WIFI_SECURITY_WPA: 328 case WifiAccessPointInfoProvider::WIFI_SECURITY_WPA:
183 security = SystemProfileProto::Network::WifiAccessPoint::SECURITY_WPA; 329 security = SystemProfileProto::Network::WifiAccessPoint::SECURITY_WPA;
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
239 info.oui_list, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) { 385 info.oui_list, " ", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) {
240 uint32_t oui; 386 uint32_t oui;
241 if (base::HexStringToUInt(oui_str, &oui)) 387 if (base::HexStringToUInt(oui_str, &oui))
242 vendor->add_element_identifier(oui); 388 vendor->add_element_identifier(oui);
243 else 389 else
244 NOTREACHED(); 390 NOTREACHED();
245 } 391 }
246 } 392 }
247 393
248 void NetworkMetricsProvider::LogAggregatedMetrics() { 394 void NetworkMetricsProvider::LogAggregatedMetrics() {
395 DCHECK(thread_checker_.CalledOnValidThread());
249 base::HistogramBase* error_codes = base::SparseHistogram::FactoryGet( 396 base::HistogramBase* error_codes = base::SparseHistogram::FactoryGet(
250 "Net.ErrorCodesForMainFrame3", 397 "Net.ErrorCodesForMainFrame3",
251 base::HistogramBase::kUmaTargetedHistogramFlag); 398 base::HistogramBase::kUmaTargetedHistogramFlag);
252 std::unique_ptr<base::HistogramSamples> samples = 399 std::unique_ptr<base::HistogramSamples> samples =
253 error_codes->SnapshotSamples(); 400 error_codes->SnapshotSamples();
254 base::HistogramBase::Count new_aborts = 401 base::HistogramBase::Count new_aborts =
255 samples->GetCount(-net::ERR_ABORTED) - total_aborts_; 402 samples->GetCount(-net::ERR_ABORTED) - total_aborts_;
256 base::HistogramBase::Count new_codes = samples->TotalCount() - total_codes_; 403 base::HistogramBase::Count new_codes = samples->TotalCount() - total_codes_;
257 if (new_codes > 0) { 404 if (new_codes > 0) {
258 UMA_HISTOGRAM_COUNTS("Net.ErrAborted.CountPerUpload", new_aborts); 405 UMA_HISTOGRAM_COUNTS("Net.ErrAborted.CountPerUpload", new_aborts);
259 UMA_HISTOGRAM_PERCENTAGE("Net.ErrAborted.ProportionPerUpload", 406 UMA_HISTOGRAM_PERCENTAGE("Net.ErrAborted.ProportionPerUpload",
260 (100 * new_aborts) / new_codes); 407 (100 * new_aborts) / new_codes);
261 total_codes_ += new_codes; 408 total_codes_ += new_codes;
262 total_aborts_ += new_aborts; 409 total_aborts_ += new_aborts;
263 } 410 }
264 } 411 }
265 412
413 void NetworkMetricsProvider::OnEffectiveConnectionTypeChanged(
414 net::EffectiveConnectionType type) {
415 DCHECK(thread_checker_.CalledOnValidThread());
416 if (effective_connection_type_ != type &&
417 type != net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN &&
418 effective_connection_type_ != net::EFFECTIVE_CONNECTION_TYPE_UNKNOWN) {
419 effective_connection_type_is_ambiguous_ = true;
420 }
421 effective_connection_type_ = type;
422 }
423
266 } // namespace metrics 424 } // namespace metrics
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698