OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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/data_use_measurement/core/data_use_measurement.h" | 5 #include "components/data_use_measurement/core/data_use_measurement.h" |
6 | 6 |
7 #include "base/metrics/histogram_macros.h" | 7 #include "base/metrics/histogram_macros.h" |
8 #include "base/metrics/sparse_histogram.h" | 8 #include "base/metrics/sparse_histogram.h" |
9 #include "base/strings/stringprintf.h" | 9 #include "base/strings/stringprintf.h" |
10 #include "build/build_config.h" | 10 #include "build/build_config.h" |
| 11 #include "components/data_use_measurement/core/data_use_ascriber.h" |
| 12 #include "components/data_use_measurement/core/data_use_recorder.h" |
11 #include "components/data_use_measurement/core/data_use_user_data.h" | 13 #include "components/data_use_measurement/core/data_use_user_data.h" |
12 #include "components/data_use_measurement/core/url_request_classifier.h" | 14 #include "components/data_use_measurement/core/url_request_classifier.h" |
13 #include "components/domain_reliability/uploader.h" | 15 #include "components/domain_reliability/uploader.h" |
14 #include "net/base/network_change_notifier.h" | 16 #include "net/base/network_change_notifier.h" |
15 #include "net/base/upload_data_stream.h" | 17 #include "net/base/upload_data_stream.h" |
16 #include "net/http/http_response_headers.h" | 18 #include "net/http/http_response_headers.h" |
17 #include "net/url_request/url_request.h" | 19 #include "net/url_request/url_request.h" |
18 | 20 |
19 #if defined(OS_ANDROID) | 21 #if defined(OS_ANDROID) |
20 #include "net/android/traffic_stats.h" | 22 #include "net/android/traffic_stats.h" |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
59 50, // Bucket count. | 61 50, // Bucket count. |
60 base::HistogramBase::kUmaTargetedHistogramFlag); | 62 base::HistogramBase::kUmaTargetedHistogramFlag); |
61 histogram_pointer->AddCount(latency.InMilliseconds(), count); | 63 histogram_pointer->AddCount(latency.InMilliseconds(), count); |
62 } | 64 } |
63 #endif | 65 #endif |
64 | 66 |
65 } // namespace | 67 } // namespace |
66 | 68 |
67 DataUseMeasurement::DataUseMeasurement( | 69 DataUseMeasurement::DataUseMeasurement( |
68 std::unique_ptr<URLRequestClassifier> url_request_classifier, | 70 std::unique_ptr<URLRequestClassifier> url_request_classifier, |
69 const metrics::UpdateUsagePrefCallbackType& metrics_data_use_forwarder) | 71 const metrics::UpdateUsagePrefCallbackType& metrics_data_use_forwarder, |
| 72 DataUseAscriber* ascriber) |
70 : url_request_classifier_(std::move(url_request_classifier)), | 73 : url_request_classifier_(std::move(url_request_classifier)), |
71 metrics_data_use_forwarder_(metrics_data_use_forwarder) | 74 metrics_data_use_forwarder_(metrics_data_use_forwarder), |
| 75 ascriber_(ascriber) |
72 #if defined(OS_ANDROID) | 76 #if defined(OS_ANDROID) |
73 , | 77 , |
74 app_state_(base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES), | 78 app_state_(base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES), |
75 app_listener_(new base::android::ApplicationStatusListener( | 79 app_listener_(new base::android::ApplicationStatusListener( |
76 base::Bind(&DataUseMeasurement::OnApplicationStateChange, | 80 base::Bind(&DataUseMeasurement::OnApplicationStateChange, |
77 base::Unretained(this)))), | 81 base::Unretained(this)))), |
78 rx_bytes_os_(0), | 82 rx_bytes_os_(0), |
79 tx_bytes_os_(0), | 83 tx_bytes_os_(0), |
80 bytes_transferred_since_last_traffic_stats_query_(0), | 84 bytes_transferred_since_last_traffic_stats_query_(0), |
81 no_reads_since_background_(false) | 85 no_reads_since_background_(false) |
82 #endif | 86 #endif |
83 { | 87 { |
| 88 DCHECK(ascriber_); |
84 DCHECK(url_request_classifier_); | 89 DCHECK(url_request_classifier_); |
85 } | 90 } |
86 | 91 |
87 DataUseMeasurement::~DataUseMeasurement(){}; | 92 DataUseMeasurement::~DataUseMeasurement(){}; |
88 | 93 |
89 void DataUseMeasurement::OnBeforeURLRequest(net::URLRequest* request) { | 94 void DataUseMeasurement::OnBeforeURLRequest(net::URLRequest* request) { |
90 DataUseUserData* data_use_user_data = reinterpret_cast<DataUseUserData*>( | 95 DataUseUserData* data_use_user_data = reinterpret_cast<DataUseUserData*>( |
91 request->GetUserData(DataUseUserData::kUserDataKey)); | 96 request->GetUserData(DataUseUserData::kUserDataKey)); |
92 if (!data_use_user_data) { | 97 if (!data_use_user_data) { |
93 DataUseUserData::ServiceName service_name = | 98 DataUseUserData::ServiceName service_name = |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
183 time_since_background, bytes); | 188 time_since_background, bytes); |
184 if (no_reads_since_background_) { | 189 if (no_reads_since_background_) { |
185 no_reads_since_background_ = false; | 190 no_reads_since_background_ = false; |
186 IncrementLatencyHistogramByCount( | 191 IncrementLatencyHistogramByCount( |
187 is_user_traffic ? "DataUse.BackgroundToFirstDownstream.User" | 192 is_user_traffic ? "DataUse.BackgroundToFirstDownstream.User" |
188 : "DataUse.BackgroundToFirstDownstream.System", | 193 : "DataUse.BackgroundToFirstDownstream.System", |
189 time_since_background, 1); | 194 time_since_background, 1); |
190 } | 195 } |
191 } | 196 } |
192 #endif | 197 #endif |
| 198 |
| 199 if (is_user_traffic) { |
| 200 const DataUseRecorder* recorder = ascriber_->GetDataUseRecorder(request); |
| 201 if (recorder) { |
| 202 RecordTabStateHistogram(dir, new_app_state, recorder->is_visible(), |
| 203 bytes); |
| 204 } |
| 205 } |
193 } | 206 } |
194 | 207 |
195 void DataUseMeasurement::UpdateDataUsePrefs( | 208 void DataUseMeasurement::UpdateDataUsePrefs( |
196 const net::URLRequest& request) const { | 209 const net::URLRequest& request) const { |
197 bool is_connection_cellular = | 210 bool is_connection_cellular = |
198 net::NetworkChangeNotifier::IsConnectionCellular( | 211 net::NetworkChangeNotifier::IsConnectionCellular( |
199 net::NetworkChangeNotifier::GetConnectionType()); | 212 net::NetworkChangeNotifier::GetConnectionType()); |
200 | 213 |
201 DataUseUserData* attached_service_data = static_cast<DataUseUserData*>( | 214 DataUseUserData* attached_service_data = static_cast<DataUseUserData*>( |
202 request.GetUserData(DataUseUserData::kUserDataKey)); | 215 request.GetUserData(DataUseUserData::kUserDataKey)); |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 "DataUse.MessageSize." + DataUseUserData::GetServiceNameAsString(service), | 336 "DataUse.MessageSize." + DataUseUserData::GetServiceNameAsString(service), |
324 message_size); | 337 message_size); |
325 if (message_size > 0) { | 338 if (message_size > 0) { |
326 IncreaseSparseHistogramByValue( | 339 IncreaseSparseHistogramByValue( |
327 GetHistogramName("DataUse.MessageSize.AllServices", dir, app_state, | 340 GetHistogramName("DataUse.MessageSize.AllServices", dir, app_state, |
328 is_connection_cellular), | 341 is_connection_cellular), |
329 service, message_size); | 342 service, message_size); |
330 } | 343 } |
331 } | 344 } |
332 | 345 |
| 346 void DataUseMeasurement::RecordTabStateHistogram( |
| 347 TrafficDirection dir, |
| 348 DataUseUserData::AppState app_state, |
| 349 bool is_tab_visible, |
| 350 int64_t bytes) { |
| 351 if (app_state == DataUseUserData::UNKNOWN) |
| 352 return; |
| 353 |
| 354 std::string histogram_name = "DataUse.AppTabState."; |
| 355 histogram_name.append(dir == UPSTREAM ? "Upstream." : "Downstream."); |
| 356 if (app_state == DataUseUserData::BACKGROUND) { |
| 357 histogram_name.append("AppBackground"); |
| 358 } else if (is_tab_visible) { |
| 359 histogram_name.append("AppForeground.TabForeground"); |
| 360 } else { |
| 361 histogram_name.append("AppForeground.TabBackground"); |
| 362 } |
| 363 RecordUMAHistogramCount(histogram_name, bytes); |
| 364 } |
| 365 |
333 } // namespace data_use_measurement | 366 } // namespace data_use_measurement |
OLD | NEW |