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

Side by Side Diff: components/data_use_measurement/content/data_use_measurement.cc

Issue 2399783003: Split the data use into foreground, background and unknown (Closed)
Patch Set: Addressed kundaji comments Created 4 years, 2 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 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/content/data_use_measurement.h" 5 #include "components/data_use_measurement/content/data_use_measurement.h"
6 6
7 #include "base/metrics/histogram.h" 7 #include "base/metrics/histogram.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"
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
73 if (!data_use_user_data) { 73 if (!data_use_user_data) {
74 data_use_user_data = new DataUseUserData( 74 data_use_user_data = new DataUseUserData(
75 DataUseUserData::ServiceName::NOT_TAGGED, CurrentAppState()); 75 DataUseUserData::ServiceName::NOT_TAGGED, CurrentAppState());
76 request->SetUserData(DataUseUserData::kUserDataKey, data_use_user_data); 76 request->SetUserData(DataUseUserData::kUserDataKey, data_use_user_data);
77 } 77 }
78 } 78 }
79 79
80 void DataUseMeasurement::OnBeforeRedirect(const net::URLRequest& request, 80 void DataUseMeasurement::OnBeforeRedirect(const net::URLRequest& request,
81 const GURL& new_location) { 81 const GURL& new_location) {
82 // Recording data use of request on redirects. 82 // Recording data use of request on redirects.
83 ReportDataUseUMA(request); 83 // TODO(rajendrant): May not be needed when http://crbug/651957 is fixed.
84 UpdateDataUsePrefs(request);
84 } 85 }
85 86
86 void DataUseMeasurement::OnNetworkBytesReceived(const net::URLRequest& request, 87 void DataUseMeasurement::OnNetworkBytesReceived(const net::URLRequest& request,
87 int64_t bytes_received) { 88 int64_t bytes_received) {
88 UMA_HISTOGRAM_COUNTS("DataUse.BytesReceived.Delegate", bytes_received); 89 UMA_HISTOGRAM_COUNTS("DataUse.BytesReceived.Delegate", bytes_received);
90 ReportDataUseUMA(request, DOWNSTREAM, bytes_received);
89 #if defined(OS_ANDROID) 91 #if defined(OS_ANDROID)
90 bytes_transferred_since_last_traffic_stats_query_ += bytes_received; 92 bytes_transferred_since_last_traffic_stats_query_ += bytes_received;
91 #endif 93 #endif
92 } 94 }
93 95
94 void DataUseMeasurement::OnNetworkBytesSent(const net::URLRequest& request, 96 void DataUseMeasurement::OnNetworkBytesSent(const net::URLRequest& request,
95 int64_t bytes_sent) { 97 int64_t bytes_sent) {
96 UMA_HISTOGRAM_COUNTS("DataUse.BytesSent.Delegate", bytes_sent); 98 UMA_HISTOGRAM_COUNTS("DataUse.BytesSent.Delegate", bytes_sent);
99 ReportDataUseUMA(request, UPSTREAM, bytes_sent);
97 #if defined(OS_ANDROID) 100 #if defined(OS_ANDROID)
98 bytes_transferred_since_last_traffic_stats_query_ += bytes_sent; 101 bytes_transferred_since_last_traffic_stats_query_ += bytes_sent;
99 #endif 102 #endif
100 } 103 }
101 104
102 void DataUseMeasurement::OnCompleted(const net::URLRequest& request, 105 void DataUseMeasurement::OnCompleted(const net::URLRequest& request,
103 bool started) { 106 bool started) {
104 // TODO(amohammadkhan): Verify that there is no double recording in data use 107 // TODO(amohammadkhan): Verify that there is no double recording in data use
105 // of redirected requests. 108 // of redirected requests.
106 ReportDataUseUMA(request); 109 UpdateDataUsePrefs(request);
107 #if defined(OS_ANDROID) 110 #if defined(OS_ANDROID)
108 MaybeRecordNetworkBytesOS(); 111 MaybeRecordNetworkBytesOS();
109 #endif 112 #endif
110 } 113 }
111 114
112 void DataUseMeasurement::ReportDataUseUMA( 115 void DataUseMeasurement::ReportDataUseUMA(
113 const net::URLRequest& request) const { 116 const net::URLRequest& request,
114 // Counts rely on URLRequest::GetTotalReceivedBytes() and 117 TrafficDirection dir,
115 // URLRequest::GetTotalSentBytes(), which does not include the send path, 118 int64_t bytes) const {
116 // network layer overhead, TLS overhead, and DNS.
117 // TODO(amohammadkhan): Make these measured bytes more in line with number of
118 // bytes in lower levels.
119 int64_t total_upload_bytes = request.GetTotalSentBytes();
120 int64_t total_received_bytes = request.GetTotalReceivedBytes();
121 bool is_user_traffic = IsUserInitiatedRequest(request); 119 bool is_user_traffic = IsUserInitiatedRequest(request);
122
123 bool is_connection_cellular = 120 bool is_connection_cellular =
124 net::NetworkChangeNotifier::IsConnectionCellular( 121 net::NetworkChangeNotifier::IsConnectionCellular(
125 net::NetworkChangeNotifier::GetConnectionType()); 122 net::NetworkChangeNotifier::GetConnectionType());
126 123
127 DataUseUserData* attached_service_data = reinterpret_cast<DataUseUserData*>( 124 DataUseUserData* attached_service_data = static_cast<DataUseUserData*>(
125 request.GetUserData(DataUseUserData::kUserDataKey));
126 DataUseUserData::ServiceName service_name = DataUseUserData::NOT_TAGGED;
127 DataUseUserData::AppState old_app_state = DataUseUserData::FOREGROUND;
128 DataUseUserData::AppState new_app_state = DataUseUserData::UNKNOWN;
129
130 if (attached_service_data) {
131 service_name = attached_service_data->service_name();
132 old_app_state = attached_service_data->app_state();
133 }
134 if (old_app_state == CurrentAppState())
135 new_app_state = old_app_state;
136
137 if (attached_service_data && old_app_state != new_app_state)
138 attached_service_data->set_app_state(CurrentAppState());
139
140 RecordUMAHistogramCount(
141 GetHistogramName(is_user_traffic ? "DataUse.TrafficSize.User"
142 : "DataUse.TrafficSize.System",
143 dir, new_app_state, is_connection_cellular),
144 bytes);
145
146 if (!is_user_traffic) {
147 ReportDataUsageServices(service_name, dir, new_app_state,
148 is_connection_cellular, bytes);
149 }
150 }
151
152 void DataUseMeasurement::UpdateDataUsePrefs(
153 const net::URLRequest& request) const {
154 bool is_connection_cellular =
155 net::NetworkChangeNotifier::IsConnectionCellular(
156 net::NetworkChangeNotifier::GetConnectionType());
157
158 DataUseUserData* attached_service_data = static_cast<DataUseUserData*>(
128 request.GetUserData(DataUseUserData::kUserDataKey)); 159 request.GetUserData(DataUseUserData::kUserDataKey));
129 DataUseUserData::ServiceName service_name = 160 DataUseUserData::ServiceName service_name =
130 attached_service_data ? attached_service_data->service_name() 161 attached_service_data ? attached_service_data->service_name()
131 : DataUseUserData::NOT_TAGGED; 162 : DataUseUserData::NOT_TAGGED;
132 bool started_in_foreground =
133 attached_service_data
134 ? attached_service_data->app_state() == DataUseUserData::FOREGROUND
135 : CurrentAppState() == DataUseUserData::FOREGROUND;
136
137 RecordUMAHistogramCount(
138 GetHistogramName(is_user_traffic ? "DataUse.TrafficSize.User"
139 : "DataUse.TrafficSize.System",
140 UPSTREAM, started_in_foreground, is_connection_cellular),
141 total_upload_bytes);
142 RecordUMAHistogramCount(
143 GetHistogramName(is_user_traffic ? "DataUse.TrafficSize.User"
144 : "DataUse.TrafficSize.System",
145 DOWNSTREAM, started_in_foreground,
146 is_connection_cellular),
147 total_received_bytes);
148
149 if (!is_user_traffic) {
150 ReportDataUsageServices(service_name, UPSTREAM, started_in_foreground,
151 is_connection_cellular, total_upload_bytes);
152 ReportDataUsageServices(service_name, DOWNSTREAM, started_in_foreground,
153 is_connection_cellular, total_received_bytes);
154 }
155 163
156 // Update data use prefs for cellular connections. 164 // Update data use prefs for cellular connections.
157 if (!metrics_data_use_forwarder_.is_null()) { 165 if (!metrics_data_use_forwarder_.is_null()) {
158 metrics_data_use_forwarder_.Run( 166 metrics_data_use_forwarder_.Run(
159 attached_service_data->GetServiceNameAsString(service_name), 167 DataUseUserData::GetServiceNameAsString(service_name),
160 total_upload_bytes + total_received_bytes, is_connection_cellular); 168 request.GetTotalSentBytes() + request.GetTotalReceivedBytes(),
169 is_connection_cellular);
161 } 170 }
162 } 171 }
163 172
164 // static 173 // static
165 bool DataUseMeasurement::IsUserInitiatedRequest( 174 bool DataUseMeasurement::IsUserInitiatedRequest(
166 const net::URLRequest& request) { 175 const net::URLRequest& request) {
167 // Having ResourceRequestInfo in the URL request is a sign that the request is 176 // Having ResourceRequestInfo in the URL request is a sign that the request is
168 // for a web content from user. For now we could add a condition to check 177 // for a web content from user. For now we could add a condition to check
169 // ProcessType in info is content::PROCESS_TYPE_RENDERER, but it won't be 178 // ProcessType in info is content::PROCESS_TYPE_RENDERER, but it won't be
170 // compatible with upcoming PlzNavigate architecture. So just existence of 179 // compatible with upcoming PlzNavigate architecture. So just existence of
(...skipping 16 matching lines...) Expand all
187 if (app_state_ != base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES) 196 if (app_state_ != base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES)
188 return DataUseUserData::BACKGROUND; 197 return DataUseUserData::BACKGROUND;
189 #endif 198 #endif
190 // If the OS is not Android, all the requests are considered Foreground. 199 // If the OS is not Android, all the requests are considered Foreground.
191 return DataUseUserData::FOREGROUND; 200 return DataUseUserData::FOREGROUND;
192 } 201 }
193 202
194 std::string DataUseMeasurement::GetHistogramName( 203 std::string DataUseMeasurement::GetHistogramName(
195 const char* prefix, 204 const char* prefix,
196 TrafficDirection dir, 205 TrafficDirection dir,
197 bool started_in_foreground, 206 DataUseUserData::AppState app_state,
198 bool is_connection_cellular) const { 207 bool is_connection_cellular) const {
199 return base::StringPrintf( 208 return base::StringPrintf(
200 "%s.%s.%s.%s", prefix, dir == UPSTREAM ? "Upstream" : "Downstream", 209 "%s.%s.%s.%s", prefix, dir == UPSTREAM ? "Upstream" : "Downstream",
201 started_in_foreground ? "Foreground" : "Background", 210 app_state == DataUseUserData::UNKNOWN
211 ? "Unknown"
212 : (app_state == DataUseUserData::FOREGROUND ? "Foreground"
213 : "Background"),
202 is_connection_cellular ? "Cellular" : "NotCellular"); 214 is_connection_cellular ? "Cellular" : "NotCellular");
203 } 215 }
204 216
205 #if defined(OS_ANDROID) 217 #if defined(OS_ANDROID)
206 void DataUseMeasurement::OnApplicationStateChange( 218 void DataUseMeasurement::OnApplicationStateChange(
207 base::android::ApplicationState application_state) { 219 base::android::ApplicationState application_state) {
208 app_state_ = application_state; 220 app_state_ = application_state;
209 if (app_state_ != base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES) 221 if (app_state_ != base::android::APPLICATION_STATE_HAS_RUNNING_ACTIVITIES)
210 MaybeRecordNetworkBytesOS(); 222 MaybeRecordNetworkBytesOS();
211 } 223 }
(...skipping 27 matching lines...) Expand all
239 UMA_HISTOGRAM_COUNTS("DataUse.BytesSent.OS", bytes - tx_bytes_os_); 251 UMA_HISTOGRAM_COUNTS("DataUse.BytesSent.OS", bytes - tx_bytes_os_);
240 } 252 }
241 tx_bytes_os_ = bytes; 253 tx_bytes_os_ = bytes;
242 } 254 }
243 } 255 }
244 #endif 256 #endif
245 257
246 void DataUseMeasurement::ReportDataUsageServices( 258 void DataUseMeasurement::ReportDataUsageServices(
247 DataUseUserData::ServiceName service, 259 DataUseUserData::ServiceName service,
248 TrafficDirection dir, 260 TrafficDirection dir,
249 bool started_in_foreground, 261 DataUseUserData::AppState app_state,
250 bool is_connection_cellular, 262 bool is_connection_cellular,
251 int64_t message_size) const { 263 int64_t message_size) const {
252 RecordUMAHistogramCount( 264 RecordUMAHistogramCount(
253 "DataUse.MessageSize." + DataUseUserData::GetServiceNameAsString(service), 265 "DataUse.MessageSize." + DataUseUserData::GetServiceNameAsString(service),
254 message_size); 266 message_size);
255 if (message_size > 0) { 267 if (message_size > 0) {
256 IncreaseSparseHistogramByValue( 268 IncreaseSparseHistogramByValue(
257 GetHistogramName("DataUse.MessageSize.AllServices", dir, 269 GetHistogramName("DataUse.MessageSize.AllServices", dir, app_state,
258 started_in_foreground, is_connection_cellular), 270 is_connection_cellular),
259 service, message_size); 271 service, message_size);
260 } 272 }
261 } 273 }
262 274
263 } // namespace data_use_measurement 275 } // namespace data_use_measurement
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698