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

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

Issue 2595503002: Record the data use by content type (Closed)
Patch Set: Add enum Created 3 years, 12 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/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"
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 base::HistogramBase* histogram_pointer = base::Histogram::FactoryTimeGet( 57 base::HistogramBase* histogram_pointer = base::Histogram::FactoryTimeGet(
58 name, 58 name,
59 base::TimeDelta::FromMilliseconds(1), // Minimum sample 59 base::TimeDelta::FromMilliseconds(1), // Minimum sample
60 base::TimeDelta::FromHours(1), // Maximum sample 60 base::TimeDelta::FromHours(1), // Maximum sample
61 50, // Bucket count. 61 50, // Bucket count.
62 base::HistogramBase::kUmaTargetedHistogramFlag); 62 base::HistogramBase::kUmaTargetedHistogramFlag);
63 histogram_pointer->AddCount(latency.InMilliseconds(), count); 63 histogram_pointer->AddCount(latency.InMilliseconds(), count);
64 } 64 }
65 #endif 65 #endif
66 66
67 // Data use broken by content type. This enum must remain synchronized
68 // with the enum of the same name in metrics/histograms/histograms.xml.
69 enum DataUseContenType {
RyanSturm 2016/12/20 19:37:52 nit: This seems duplicative. Maybe you could conso
Raj 2016/12/22 18:44:38 Done.
70 MAIN_FRAME_HTML = 0,
71 NON_MAIN_FRAME_HTML,
72 CSS,
73 IMAGE,
74 JAVASCRIPT,
75 FONT,
76 AUDIO_APPBACKGROUND,
77 AUDIO_TABBACKGROUND,
78 AUDIO_TABFOREGROUND,
79 VIDEO_APPBACKGROUND,
80 VIDEO_TABBACKGROUND,
81 VIDEO_TABFOREGROUND,
82 OTHER,
83 TYPE_MAX,
84 };
85
86 DataUseContenType GetDataUseContentType(
87 DataUseUserData::ContentType content_type,
88 bool is_app_foreground,
89 bool is_tab_visible) {
90 switch (content_type) {
91 case DataUseUserData::ContentType::MAIN_FRAME_HTML:
92 return MAIN_FRAME_HTML;
93 case DataUseUserData::ContentType::NON_MAIN_FRAME_HTML:
94 return NON_MAIN_FRAME_HTML;
95 case DataUseUserData::ContentType::CSS:
96 return CSS;
97 case DataUseUserData::ContentType::IMAGE:
98 return IMAGE;
99 case DataUseUserData::ContentType::FONT:
100 return FONT;
101 case DataUseUserData::ContentType::AUDIO:
102 return !is_app_foreground
103 ? AUDIO_APPBACKGROUND
104 : (is_tab_visible ? AUDIO_TABFOREGROUND : AUDIO_TABBACKGROUND);
105 case DataUseUserData::ContentType::VIDEO:
106 return !is_app_foreground
107 ? VIDEO_APPBACKGROUND
108 : (is_tab_visible ? VIDEO_TABFOREGROUND : VIDEO_TABBACKGROUND);
109 case DataUseUserData::ContentType::OTHER:
110 return OTHER;
111 default:
112 NOTREACHED();
113 }
114 return OTHER;
115 }
116
67 } // namespace 117 } // namespace
68 118
69 DataUseMeasurement::DataUseMeasurement( 119 DataUseMeasurement::DataUseMeasurement(
70 std::unique_ptr<URLRequestClassifier> url_request_classifier, 120 std::unique_ptr<URLRequestClassifier> url_request_classifier,
71 const metrics::UpdateUsagePrefCallbackType& metrics_data_use_forwarder, 121 const metrics::UpdateUsagePrefCallbackType& metrics_data_use_forwarder,
72 DataUseAscriber* ascriber) 122 DataUseAscriber* ascriber)
73 : url_request_classifier_(std::move(url_request_classifier)), 123 : url_request_classifier_(std::move(url_request_classifier)),
74 metrics_data_use_forwarder_(metrics_data_use_forwarder), 124 metrics_data_use_forwarder_(metrics_data_use_forwarder),
75 ascriber_(ascriber) 125 ascriber_(ascriber)
76 #if defined(OS_ANDROID) 126 #if defined(OS_ANDROID)
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 } 162 }
113 163
114 void DataUseMeasurement::OnBeforeRedirect(const net::URLRequest& request, 164 void DataUseMeasurement::OnBeforeRedirect(const net::URLRequest& request,
115 const GURL& new_location) { 165 const GURL& new_location) {
116 // Recording data use of request on redirects. 166 // Recording data use of request on redirects.
117 // TODO(rajendrant): May not be needed when http://crbug/651957 is fixed. 167 // TODO(rajendrant): May not be needed when http://crbug/651957 is fixed.
118 UpdateDataUsePrefs(request); 168 UpdateDataUsePrefs(request);
119 ReportServicesMessageSizeUMA(request); 169 ReportServicesMessageSizeUMA(request);
120 } 170 }
121 171
172 void DataUseMeasurement::OnHeadersReceived(
173 net::URLRequest* request,
174 const net::HttpResponseHeaders* response_headers) {
175 DataUseUserData* data_use_user_data = reinterpret_cast<DataUseUserData*>(
176 request->GetUserData(DataUseUserData::kUserDataKey));
177 if (data_use_user_data) {
178 data_use_user_data->set_content_type(
179 url_request_classifier_->GetContentType(*request, *response_headers));
180 }
181 }
182
122 void DataUseMeasurement::OnNetworkBytesReceived(const net::URLRequest& request, 183 void DataUseMeasurement::OnNetworkBytesReceived(const net::URLRequest& request,
123 int64_t bytes_received) { 184 int64_t bytes_received) {
124 UMA_HISTOGRAM_COUNTS("DataUse.BytesReceived.Delegate", bytes_received); 185 UMA_HISTOGRAM_COUNTS("DataUse.BytesReceived.Delegate", bytes_received);
125 ReportDataUseUMA(request, DOWNSTREAM, bytes_received); 186 ReportDataUseUMA(request, DOWNSTREAM, bytes_received);
126 #if defined(OS_ANDROID) 187 #if defined(OS_ANDROID)
127 bytes_transferred_since_last_traffic_stats_query_ += bytes_received; 188 bytes_transferred_since_last_traffic_stats_query_ += bytes_received;
128 #endif 189 #endif
129 } 190 }
130 191
131 void DataUseMeasurement::OnNetworkBytesSent(const net::URLRequest& request, 192 void DataUseMeasurement::OnNetworkBytesSent(const net::URLRequest& request,
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 if (no_reads_since_background_) { 250 if (no_reads_since_background_) {
190 no_reads_since_background_ = false; 251 no_reads_since_background_ = false;
191 IncrementLatencyHistogramByCount( 252 IncrementLatencyHistogramByCount(
192 is_user_traffic ? "DataUse.BackgroundToFirstDownstream.User" 253 is_user_traffic ? "DataUse.BackgroundToFirstDownstream.User"
193 : "DataUse.BackgroundToFirstDownstream.System", 254 : "DataUse.BackgroundToFirstDownstream.System",
194 time_since_background, 1); 255 time_since_background, 1);
195 } 256 }
196 } 257 }
197 #endif 258 #endif
198 259
260 bool is_tab_visible = false;
261
199 if (is_user_traffic) { 262 if (is_user_traffic) {
200 const DataUseRecorder* recorder = ascriber_->GetDataUseRecorder(request); 263 const DataUseRecorder* recorder = ascriber_->GetDataUseRecorder(request);
201 if (recorder) { 264 if (recorder) {
265 is_tab_visible = recorder->is_visible();
202 RecordTabStateHistogram(dir, new_app_state, recorder->is_visible(), 266 RecordTabStateHistogram(dir, new_app_state, recorder->is_visible(),
203 bytes); 267 bytes);
204 } 268 }
205 } 269 }
270 if (attached_service_data && dir == DOWNSTREAM &&
271 new_app_state != DataUseUserData::UNKNOWN) {
272 RecordContentTypeHistogram(attached_service_data->content_type(),
RyanSturm 2016/12/20 19:37:52 nit: I just noticed now that these are sort of str
Raj 2016/12/22 18:44:37 Yes. That case is handled as follows. These UMA ar
RyanSturm 2016/12/22 20:00:42 Awesome. Sounds like good enough granularity (FG->
273 is_user_traffic, new_app_state, is_tab_visible,
274 bytes);
275 }
206 } 276 }
207 277
208 void DataUseMeasurement::UpdateDataUsePrefs( 278 void DataUseMeasurement::UpdateDataUsePrefs(
209 const net::URLRequest& request) const { 279 const net::URLRequest& request) const {
210 bool is_connection_cellular = 280 bool is_connection_cellular =
211 net::NetworkChangeNotifier::IsConnectionCellular( 281 net::NetworkChangeNotifier::IsConnectionCellular(
212 net::NetworkChangeNotifier::GetConnectionType()); 282 net::NetworkChangeNotifier::GetConnectionType());
213 283
214 DataUseUserData* attached_service_data = static_cast<DataUseUserData*>( 284 DataUseUserData* attached_service_data = static_cast<DataUseUserData*>(
215 request.GetUserData(DataUseUserData::kUserDataKey)); 285 request.GetUserData(DataUseUserData::kUserDataKey));
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
356 if (app_state == DataUseUserData::BACKGROUND) { 426 if (app_state == DataUseUserData::BACKGROUND) {
357 histogram_name.append("AppBackground"); 427 histogram_name.append("AppBackground");
358 } else if (is_tab_visible) { 428 } else if (is_tab_visible) {
359 histogram_name.append("AppForeground.TabForeground"); 429 histogram_name.append("AppForeground.TabForeground");
360 } else { 430 } else {
361 histogram_name.append("AppForeground.TabBackground"); 431 histogram_name.append("AppForeground.TabBackground");
362 } 432 }
363 RecordUMAHistogramCount(histogram_name, bytes); 433 RecordUMAHistogramCount(histogram_name, bytes);
364 } 434 }
365 435
436 void DataUseMeasurement::RecordContentTypeHistogram(
437 DataUseUserData::ContentType content_type,
438 bool is_user_traffic,
439 DataUseUserData::AppState app_state,
440 bool is_tab_visible,
441 int64_t bytes) {
442 DataUseContenType data_use_content_type = GetDataUseContentType(
443 content_type, app_state == DataUseUserData::FOREGROUND, is_tab_visible);
444 if (is_user_traffic) {
445 UMA_HISTOGRAM_ENUMERATION("DataUse.ContentType.UserTraffic",
446 data_use_content_type,
447 DataUseContenType::TYPE_MAX);
448 } else {
449 UMA_HISTOGRAM_ENUMERATION("DataUse.ContentType.Services",
450 data_use_content_type,
451 DataUseContenType::TYPE_MAX);
452 }
453 }
454
366 } // namespace data_use_measurement 455 } // namespace data_use_measurement
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698