| OLD | NEW |
| 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/data_reduction_proxy/core/browser/data_reduction_proxy_usag
e_stats.h" | 5 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_bypa
ss_stats.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "base/metrics/histogram.h" | 9 #include "base/metrics/histogram.h" |
| 10 #include "base/metrics/sparse_histogram.h" | 10 #include "base/metrics/sparse_histogram.h" |
| 11 #include "base/prefs/pref_member.h" | 11 #include "base/prefs/pref_member.h" |
| 12 #include "base/single_thread_task_runner.h" | 12 #include "base/single_thread_task_runner.h" |
| 13 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_conf
ig.h" | 13 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_conf
ig.h" |
| 14 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_tamp
er_detection.h" | 14 #include "components/data_reduction_proxy/core/browser/data_reduction_proxy_tamp
er_detection.h" |
| 15 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_heade
rs.h" | 15 #include "components/data_reduction_proxy/core/common/data_reduction_proxy_heade
rs.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 return; | 51 return; |
| 52 } | 52 } |
| 53 UMA_HISTOGRAM_SPARSE_SLOWLY( | 53 UMA_HISTOGRAM_SPARSE_SLOWLY( |
| 54 "DataReductionProxy.BypassOnNetworkErrorFallback", | 54 "DataReductionProxy.BypassOnNetworkErrorFallback", |
| 55 std::abs(net_error)); | 55 std::abs(net_error)); |
| 56 } | 56 } |
| 57 | 57 |
| 58 } // namespace | 58 } // namespace |
| 59 | 59 |
| 60 // static | 60 // static |
| 61 void DataReductionProxyUsageStats::RecordDataReductionProxyBypassInfo( | 61 void DataReductionProxyBypassStats::RecordDataReductionProxyBypassInfo( |
| 62 bool is_primary, | 62 bool is_primary, |
| 63 bool bypass_all, | 63 bool bypass_all, |
| 64 const net::ProxyServer& proxy_server, | 64 const net::ProxyServer& proxy_server, |
| 65 DataReductionProxyBypassType bypass_type) { | 65 DataReductionProxyBypassType bypass_type) { |
| 66 if (bypass_all) { | 66 if (bypass_all) { |
| 67 if (is_primary) { | 67 if (is_primary) { |
| 68 UMA_HISTOGRAM_ENUMERATION("DataReductionProxy.BlockTypePrimary", | 68 UMA_HISTOGRAM_ENUMERATION("DataReductionProxy.BlockTypePrimary", |
| 69 bypass_type, BYPASS_EVENT_TYPE_MAX); | 69 bypass_type, BYPASS_EVENT_TYPE_MAX); |
| 70 } else { | 70 } else { |
| 71 UMA_HISTOGRAM_ENUMERATION("DataReductionProxy.BlockTypeFallback", | 71 UMA_HISTOGRAM_ENUMERATION("DataReductionProxy.BlockTypeFallback", |
| 72 bypass_type, BYPASS_EVENT_TYPE_MAX); | 72 bypass_type, BYPASS_EVENT_TYPE_MAX); |
| 73 } | 73 } |
| 74 } else { | 74 } else { |
| 75 if (is_primary) { | 75 if (is_primary) { |
| 76 UMA_HISTOGRAM_ENUMERATION("DataReductionProxy.BypassTypePrimary", | 76 UMA_HISTOGRAM_ENUMERATION("DataReductionProxy.BypassTypePrimary", |
| 77 bypass_type, BYPASS_EVENT_TYPE_MAX); | 77 bypass_type, BYPASS_EVENT_TYPE_MAX); |
| 78 } else { | 78 } else { |
| 79 UMA_HISTOGRAM_ENUMERATION("DataReductionProxy.BypassTypeFallback", | 79 UMA_HISTOGRAM_ENUMERATION("DataReductionProxy.BypassTypeFallback", |
| 80 bypass_type, BYPASS_EVENT_TYPE_MAX); | 80 bypass_type, BYPASS_EVENT_TYPE_MAX); |
| 81 } | 81 } |
| 82 } | 82 } |
| 83 } | 83 } |
| 84 | 84 |
| 85 // static | 85 // static |
| 86 void DataReductionProxyUsageStats::DetectAndRecordMissingViaHeaderResponseCode( | 86 void DataReductionProxyBypassStats::DetectAndRecordMissingViaHeaderResponseCode( |
| 87 bool is_primary, | 87 bool is_primary, |
| 88 const net::HttpResponseHeaders* headers) { | 88 const net::HttpResponseHeaders* headers) { |
| 89 if (HasDataReductionProxyViaHeader(headers, NULL)) { | 89 if (HasDataReductionProxyViaHeader(headers, NULL)) { |
| 90 // The data reduction proxy via header is present, so don't record anything. | 90 // The data reduction proxy via header is present, so don't record anything. |
| 91 return; | 91 return; |
| 92 } | 92 } |
| 93 | 93 |
| 94 if (is_primary) { | 94 if (is_primary) { |
| 95 UMA_HISTOGRAM_SPARSE_SLOWLY( | 95 UMA_HISTOGRAM_SPARSE_SLOWLY( |
| 96 "DataReductionProxy.MissingViaHeader.ResponseCode.Primary", | 96 "DataReductionProxy.MissingViaHeader.ResponseCode.Primary", |
| 97 headers->response_code()); | 97 headers->response_code()); |
| 98 } else { | 98 } else { |
| 99 UMA_HISTOGRAM_SPARSE_SLOWLY( | 99 UMA_HISTOGRAM_SPARSE_SLOWLY( |
| 100 "DataReductionProxy.MissingViaHeader.ResponseCode.Fallback", | 100 "DataReductionProxy.MissingViaHeader.ResponseCode.Fallback", |
| 101 headers->response_code()); | 101 headers->response_code()); |
| 102 } | 102 } |
| 103 } | 103 } |
| 104 | 104 |
| 105 DataReductionProxyUsageStats::DataReductionProxyUsageStats( | 105 DataReductionProxyBypassStats::DataReductionProxyBypassStats( |
| 106 DataReductionProxyConfig* config, | 106 DataReductionProxyConfig* config, |
| 107 UnreachableCallback unreachable_callback, | 107 UnreachableCallback unreachable_callback, |
| 108 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner) | 108 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner) |
| 109 : data_reduction_proxy_config_(config), | 109 : data_reduction_proxy_config_(config), |
| 110 unreachable_callback_(unreachable_callback), | 110 unreachable_callback_(unreachable_callback), |
| 111 last_bypass_type_(BYPASS_EVENT_TYPE_MAX), | 111 last_bypass_type_(BYPASS_EVENT_TYPE_MAX), |
| 112 triggering_request_(true), | 112 triggering_request_(true), |
| 113 ui_task_runner_(ui_task_runner), | 113 ui_task_runner_(ui_task_runner), |
| 114 successful_requests_through_proxy_count_(0), | 114 successful_requests_through_proxy_count_(0), |
| 115 proxy_net_errors_count_(0), | 115 proxy_net_errors_count_(0), |
| 116 unavailable_(false) { | 116 unavailable_(false) { |
| 117 DCHECK(config); | 117 DCHECK(config); |
| 118 NetworkChangeNotifier::AddNetworkChangeObserver(this); | 118 NetworkChangeNotifier::AddNetworkChangeObserver(this); |
| 119 }; | 119 }; |
| 120 | 120 |
| 121 DataReductionProxyUsageStats::~DataReductionProxyUsageStats() { | 121 DataReductionProxyBypassStats::~DataReductionProxyBypassStats() { |
| 122 NetworkChangeNotifier::RemoveNetworkChangeObserver(this); | 122 NetworkChangeNotifier::RemoveNetworkChangeObserver(this); |
| 123 }; | 123 }; |
| 124 | 124 |
| 125 void DataReductionProxyUsageStats::OnUrlRequestCompleted( | 125 void DataReductionProxyBypassStats::OnUrlRequestCompleted( |
| 126 const net::URLRequest* request, bool started) { | 126 const net::URLRequest* request, bool started) { |
| 127 DCHECK(thread_checker_.CalledOnValidThread()); | 127 DCHECK(thread_checker_.CalledOnValidThread()); |
| 128 | 128 |
| 129 DataReductionProxyTypeInfo proxy_info; | 129 DataReductionProxyTypeInfo proxy_info; |
| 130 // Ignore requests that did not use the data reduction proxy. The check for | 130 // Ignore requests that did not use the data reduction proxy. The check for |
| 131 // LOAD_BYPASS_PROXY is necessary because the proxy_server() in the |request| | 131 // LOAD_BYPASS_PROXY is necessary because the proxy_server() in the |request| |
| 132 // might still be set to the data reduction proxy if |request| was retried | 132 // might still be set to the data reduction proxy if |request| was retried |
| 133 // over direct and a network error occurred while retrying it. | 133 // over direct and a network error occurred while retrying it. |
| 134 if (data_reduction_proxy_config_->WasDataReductionProxyUsed(request, | 134 if (data_reduction_proxy_config_->WasDataReductionProxyUsed(request, |
| 135 &proxy_info) && | 135 &proxy_info) && |
| (...skipping 20 matching lines...) Expand all Loading... |
| 156 std::abs(request->status().error())); | 156 std::abs(request->status().error())); |
| 157 if (request->load_flags() & net::LOAD_MAIN_FRAME) { | 157 if (request->load_flags() & net::LOAD_MAIN_FRAME) { |
| 158 UMA_HISTOGRAM_SPARSE_SLOWLY( | 158 UMA_HISTOGRAM_SPARSE_SLOWLY( |
| 159 "DataReductionProxy.RequestCompletionErrorCodes.MainFrame.Fallback", | 159 "DataReductionProxy.RequestCompletionErrorCodes.MainFrame.Fallback", |
| 160 std::abs(request->status().error())); | 160 std::abs(request->status().error())); |
| 161 } | 161 } |
| 162 } | 162 } |
| 163 } | 163 } |
| 164 } | 164 } |
| 165 | 165 |
| 166 void DataReductionProxyUsageStats::SetBypassType( | 166 void DataReductionProxyBypassStats::SetBypassType( |
| 167 DataReductionProxyBypassType type) { | 167 DataReductionProxyBypassType type) { |
| 168 last_bypass_type_ = type; | 168 last_bypass_type_ = type; |
| 169 triggering_request_ = true; | 169 triggering_request_ = true; |
| 170 } | 170 } |
| 171 | 171 |
| 172 DataReductionProxyBypassType | 172 DataReductionProxyBypassType |
| 173 DataReductionProxyUsageStats::GetBypassType() const { | 173 DataReductionProxyBypassStats::GetBypassType() const { |
| 174 return last_bypass_type_; | 174 return last_bypass_type_; |
| 175 } | 175 } |
| 176 | 176 |
| 177 void DataReductionProxyUsageStats::RecordBytesHistograms( | 177 void DataReductionProxyBypassStats::RecordBytesHistograms( |
| 178 const net::URLRequest& request, | 178 const net::URLRequest& request, |
| 179 const BooleanPrefMember& data_reduction_proxy_enabled, | 179 const BooleanPrefMember& data_reduction_proxy_enabled, |
| 180 const net::ProxyConfig& data_reduction_proxy_config) { | 180 const net::ProxyConfig& data_reduction_proxy_config) { |
| 181 RecordBypassedBytesHistograms(request, data_reduction_proxy_enabled, | 181 RecordBypassedBytesHistograms(request, data_reduction_proxy_enabled, |
| 182 data_reduction_proxy_config); | 182 data_reduction_proxy_config); |
| 183 RecordMissingViaHeaderBytes(request); | 183 RecordMissingViaHeaderBytes(request); |
| 184 } | 184 } |
| 185 | 185 |
| 186 void DataReductionProxyUsageStats::OnProxyFallback( | 186 void DataReductionProxyBypassStats::OnProxyFallback( |
| 187 const net::ProxyServer& bypassed_proxy, | 187 const net::ProxyServer& bypassed_proxy, |
| 188 int net_error) { | 188 int net_error) { |
| 189 DataReductionProxyTypeInfo data_reduction_proxy_info; | 189 DataReductionProxyTypeInfo data_reduction_proxy_info; |
| 190 if (bypassed_proxy.is_valid() && !bypassed_proxy.is_direct() && | 190 if (bypassed_proxy.is_valid() && !bypassed_proxy.is_direct() && |
| 191 data_reduction_proxy_config_->IsDataReductionProxy( | 191 data_reduction_proxy_config_->IsDataReductionProxy( |
| 192 bypassed_proxy.host_port_pair(), &data_reduction_proxy_info)) { | 192 bypassed_proxy.host_port_pair(), &data_reduction_proxy_info)) { |
| 193 if (data_reduction_proxy_info.is_ssl) | 193 if (data_reduction_proxy_info.is_ssl) |
| 194 return; | 194 return; |
| 195 | 195 |
| 196 proxy_net_errors_count_++; | 196 proxy_net_errors_count_++; |
| 197 | 197 |
| 198 // To account for the case when the proxy is reachable for sometime, and | 198 // To account for the case when the proxy is reachable for sometime, and |
| 199 // then gets blocked, we reset counts when number of errors exceed | 199 // then gets blocked, we reset counts when number of errors exceed |
| 200 // the threshold. | 200 // the threshold. |
| 201 if (proxy_net_errors_count_ >= kMaxFailedRequestsBeforeReset && | 201 if (proxy_net_errors_count_ >= kMaxFailedRequestsBeforeReset && |
| 202 successful_requests_through_proxy_count_ > | 202 successful_requests_through_proxy_count_ > |
| (...skipping 10 matching lines...) Expand all Loading... |
| 213 true, bypassed_proxy, net_error); | 213 true, bypassed_proxy, net_error); |
| 214 } else { | 214 } else { |
| 215 RecordDataReductionProxyBypassInfo( | 215 RecordDataReductionProxyBypassInfo( |
| 216 false, false, bypassed_proxy, BYPASS_EVENT_TYPE_NETWORK_ERROR); | 216 false, false, bypassed_proxy, BYPASS_EVENT_TYPE_NETWORK_ERROR); |
| 217 RecordDataReductionProxyBypassOnNetworkError( | 217 RecordDataReductionProxyBypassOnNetworkError( |
| 218 false, bypassed_proxy, net_error); | 218 false, bypassed_proxy, net_error); |
| 219 } | 219 } |
| 220 } | 220 } |
| 221 } | 221 } |
| 222 | 222 |
| 223 void DataReductionProxyUsageStats::OnConnectComplete( | 223 void DataReductionProxyBypassStats::OnConnectComplete( |
| 224 const net::HostPortPair& proxy_server, | 224 const net::HostPortPair& proxy_server, |
| 225 int net_error) { | 225 int net_error) { |
| 226 if (data_reduction_proxy_config_->IsDataReductionProxy(proxy_server, NULL)) { | 226 if (data_reduction_proxy_config_->IsDataReductionProxy(proxy_server, NULL)) { |
| 227 UMA_HISTOGRAM_SPARSE_SLOWLY( | 227 UMA_HISTOGRAM_SPARSE_SLOWLY( |
| 228 "DataReductionProxy.HTTPConnectCompleted", | 228 "DataReductionProxy.HTTPConnectCompleted", |
| 229 std::abs(net_error)); | 229 std::abs(net_error)); |
| 230 } | 230 } |
| 231 } | 231 } |
| 232 | 232 |
| 233 void DataReductionProxyUsageStats::RecordBypassedBytesHistograms( | 233 void DataReductionProxyBypassStats::RecordBypassedBytesHistograms( |
| 234 const net::URLRequest& request, | 234 const net::URLRequest& request, |
| 235 const BooleanPrefMember& data_reduction_proxy_enabled, | 235 const BooleanPrefMember& data_reduction_proxy_enabled, |
| 236 const net::ProxyConfig& data_reduction_proxy_config) { | 236 const net::ProxyConfig& data_reduction_proxy_config) { |
| 237 int64 content_length = request.received_response_content_length(); | 237 int64 content_length = request.received_response_content_length(); |
| 238 | 238 |
| 239 // Only record histograms when the data reduction proxy is enabled. | 239 // Only record histograms when the data reduction proxy is enabled. |
| 240 if (!data_reduction_proxy_enabled.GetValue()) | 240 if (!data_reduction_proxy_enabled.GetValue()) |
| 241 return; | 241 return; |
| 242 | 242 |
| 243 // TODO(bengr): Add histogram(s) for byte counts of unsupported schemes, e.g., | 243 // TODO(bengr): Add histogram(s) for byte counts of unsupported schemes, e.g., |
| 244 // ws and wss. | 244 // ws and wss. |
| 245 if (!request.url().SchemeIsHTTPOrHTTPS()) | 245 if (!request.url().SchemeIsHTTPOrHTTPS()) |
| 246 return; | 246 return; |
| 247 | 247 |
| 248 DataReductionProxyTypeInfo data_reduction_proxy_type_info; | 248 DataReductionProxyTypeInfo data_reduction_proxy_type_info; |
| 249 if (data_reduction_proxy_config_->WasDataReductionProxyUsed( | 249 if (data_reduction_proxy_config_->WasDataReductionProxyUsed( |
| 250 &request, &data_reduction_proxy_type_info)) { | 250 &request, &data_reduction_proxy_type_info)) { |
| 251 RecordBypassedBytes(last_bypass_type_, | 251 RecordBypassedBytes(last_bypass_type_, |
| 252 DataReductionProxyUsageStats::NOT_BYPASSED, | 252 DataReductionProxyBypassStats::NOT_BYPASSED, |
| 253 content_length); | 253 content_length); |
| 254 | 254 |
| 255 // If non-empty, |proxy_server.first| is the proxy that this request used. | 255 // If non-empty, |proxy_server.first| is the proxy that this request used. |
| 256 const net::ProxyServer& first = | 256 const net::ProxyServer& first = |
| 257 data_reduction_proxy_type_info.proxy_servers.first; | 257 data_reduction_proxy_type_info.proxy_servers.first; |
| 258 if (first.is_valid() && !first.host_port_pair().IsEmpty()) { | 258 if (first.is_valid() && !first.host_port_pair().IsEmpty()) { |
| 259 DataReductionProxyTamperDetection::DetectAndReport( | 259 DataReductionProxyTamperDetection::DetectAndReport( |
| 260 request.response_info().headers.get(), | 260 request.response_info().headers.get(), |
| 261 first.is_https() || first.is_quic(), content_length); | 261 first.is_https() || first.is_quic(), content_length); |
| 262 } | 262 } |
| 263 return; | 263 return; |
| 264 } | 264 } |
| 265 | 265 |
| 266 if (request.url().SchemeIs(url::kHttpsScheme)) { | 266 if (request.url().SchemeIs(url::kHttpsScheme)) { |
| 267 RecordBypassedBytes(last_bypass_type_, | 267 RecordBypassedBytes(last_bypass_type_, |
| 268 DataReductionProxyUsageStats::SSL, | 268 DataReductionProxyBypassStats::SSL, |
| 269 content_length); | 269 content_length); |
| 270 return; | 270 return; |
| 271 } | 271 } |
| 272 | 272 |
| 273 // Now that the data reduction proxy is a best effort proxy, if the effective | 273 // Now that the data reduction proxy is a best effort proxy, if the effective |
| 274 // proxy configuration resolves to anything other than direct:// for a URL, | 274 // proxy configuration resolves to anything other than direct:// for a URL, |
| 275 // the data reduction proxy will not be used. | 275 // the data reduction proxy will not be used. |
| 276 DCHECK(!data_reduction_proxy_type_info.proxy_servers.first.is_valid()); | 276 DCHECK(!data_reduction_proxy_type_info.proxy_servers.first.is_valid()); |
| 277 if (!request.proxy_server().IsEmpty()) { | 277 if (!request.proxy_server().IsEmpty()) { |
| 278 RecordBypassedBytes(last_bypass_type_, | 278 RecordBypassedBytes(last_bypass_type_, |
| 279 DataReductionProxyUsageStats::PROXY_OVERRIDDEN, | 279 DataReductionProxyBypassStats::PROXY_OVERRIDDEN, |
| 280 content_length); | 280 content_length); |
| 281 return; | 281 return; |
| 282 } | 282 } |
| 283 | 283 |
| 284 if (data_reduction_proxy_config_->IsBypassedByDataReductionProxyLocalRules( | 284 if (data_reduction_proxy_config_->IsBypassedByDataReductionProxyLocalRules( |
| 285 request, data_reduction_proxy_config)) { | 285 request, data_reduction_proxy_config)) { |
| 286 RecordBypassedBytes(last_bypass_type_, | 286 RecordBypassedBytes(last_bypass_type_, |
| 287 DataReductionProxyUsageStats::LOCAL_BYPASS_RULES, | 287 DataReductionProxyBypassStats::LOCAL_BYPASS_RULES, |
| 288 content_length); | 288 content_length); |
| 289 return; | 289 return; |
| 290 } | 290 } |
| 291 | 291 |
| 292 // Only record separate triggering request UMA for short, medium, and long | 292 // Only record separate triggering request UMA for short, medium, and long |
| 293 // bypass events. | 293 // bypass events. |
| 294 if (triggering_request_ && | 294 if (triggering_request_ && |
| 295 (last_bypass_type_ == BYPASS_EVENT_TYPE_SHORT || | 295 (last_bypass_type_ == BYPASS_EVENT_TYPE_SHORT || |
| 296 last_bypass_type_ == BYPASS_EVENT_TYPE_MEDIUM || | 296 last_bypass_type_ == BYPASS_EVENT_TYPE_MEDIUM || |
| 297 last_bypass_type_ == BYPASS_EVENT_TYPE_LONG)) { | 297 last_bypass_type_ == BYPASS_EVENT_TYPE_LONG)) { |
| 298 std::string mime_type; | 298 std::string mime_type; |
| 299 request.GetMimeType(&mime_type); | 299 request.GetMimeType(&mime_type); |
| 300 // MIME types are named by <media-type>/<subtype>. Check to see if the | 300 // MIME types are named by <media-type>/<subtype>. Check to see if the |
| 301 // media type is audio or video. Only record when triggered by short bypass, | 301 // media type is audio or video. Only record when triggered by short bypass, |
| 302 // there isn't an audio or video bucket for medium or long bypasses. | 302 // there isn't an audio or video bucket for medium or long bypasses. |
| 303 if (last_bypass_type_ == BYPASS_EVENT_TYPE_SHORT && | 303 if (last_bypass_type_ == BYPASS_EVENT_TYPE_SHORT && |
| 304 (mime_type.compare(0, 6, "audio/") == 0 || | 304 (mime_type.compare(0, 6, "audio/") == 0 || |
| 305 mime_type.compare(0, 6, "video/") == 0)) { | 305 mime_type.compare(0, 6, "video/") == 0)) { |
| 306 RecordBypassedBytes(last_bypass_type_, | 306 RecordBypassedBytes(last_bypass_type_, |
| 307 DataReductionProxyUsageStats::AUDIO_VIDEO, | 307 DataReductionProxyBypassStats::AUDIO_VIDEO, |
| 308 content_length); | 308 content_length); |
| 309 return; | 309 return; |
| 310 } | 310 } |
| 311 | 311 |
| 312 RecordBypassedBytes(last_bypass_type_, | 312 RecordBypassedBytes(last_bypass_type_, |
| 313 DataReductionProxyUsageStats::TRIGGERING_REQUEST, | 313 DataReductionProxyBypassStats::TRIGGERING_REQUEST, |
| 314 content_length); | 314 content_length); |
| 315 triggering_request_ = false; | 315 triggering_request_ = false; |
| 316 return; | 316 return; |
| 317 } | 317 } |
| 318 | 318 |
| 319 if (last_bypass_type_ != BYPASS_EVENT_TYPE_MAX) { | 319 if (last_bypass_type_ != BYPASS_EVENT_TYPE_MAX) { |
| 320 RecordBypassedBytes(last_bypass_type_, | 320 RecordBypassedBytes(last_bypass_type_, |
| 321 DataReductionProxyUsageStats::BYPASSED_BYTES_TYPE_MAX, | 321 DataReductionProxyBypassStats::BYPASSED_BYTES_TYPE_MAX, |
| 322 content_length); | 322 content_length); |
| 323 return; | 323 return; |
| 324 } | 324 } |
| 325 | 325 |
| 326 if (data_reduction_proxy_config_->AreDataReductionProxiesBypassed( | 326 if (data_reduction_proxy_config_->AreDataReductionProxiesBypassed( |
| 327 request, data_reduction_proxy_config, NULL)) { | 327 request, data_reduction_proxy_config, NULL)) { |
| 328 RecordBypassedBytes(last_bypass_type_, | 328 RecordBypassedBytes(last_bypass_type_, |
| 329 DataReductionProxyUsageStats::NETWORK_ERROR, | 329 DataReductionProxyBypassStats::NETWORK_ERROR, |
| 330 content_length); | 330 content_length); |
| 331 } | 331 } |
| 332 } | 332 } |
| 333 | 333 |
| 334 void DataReductionProxyUsageStats::RecordMissingViaHeaderBytes( | 334 void DataReductionProxyBypassStats::RecordMissingViaHeaderBytes( |
| 335 const URLRequest& request) { | 335 const URLRequest& request) { |
| 336 // Responses that were served from cache should have been filtered out | 336 // Responses that were served from cache should have been filtered out |
| 337 // already. | 337 // already. |
| 338 DCHECK(!request.was_cached()); | 338 DCHECK(!request.was_cached()); |
| 339 | 339 |
| 340 if (!data_reduction_proxy_config_->WasDataReductionProxyUsed(&request, | 340 if (!data_reduction_proxy_config_->WasDataReductionProxyUsed(&request, |
| 341 NULL) || | 341 NULL) || |
| 342 HasDataReductionProxyViaHeader(request.response_headers(), NULL)) { | 342 HasDataReductionProxyViaHeader(request.response_headers(), NULL)) { |
| 343 // Only track requests that used the data reduction proxy and had responses | 343 // Only track requests that used the data reduction proxy and had responses |
| 344 // that were missing the data reduction proxy via header. | 344 // that were missing the data reduction proxy via header. |
| 345 return; | 345 return; |
| 346 } | 346 } |
| 347 | 347 |
| 348 if (request.GetResponseCode() >= net::HTTP_BAD_REQUEST && | 348 if (request.GetResponseCode() >= net::HTTP_BAD_REQUEST && |
| 349 request.GetResponseCode() < net::HTTP_INTERNAL_SERVER_ERROR) { | 349 request.GetResponseCode() < net::HTTP_INTERNAL_SERVER_ERROR) { |
| 350 // Track 4xx responses that are missing via headers separately. | 350 // Track 4xx responses that are missing via headers separately. |
| 351 UMA_HISTOGRAM_COUNTS("DataReductionProxy.MissingViaHeader.Bytes.4xx", | 351 UMA_HISTOGRAM_COUNTS("DataReductionProxy.MissingViaHeader.Bytes.4xx", |
| 352 request.received_response_content_length()); | 352 request.received_response_content_length()); |
| 353 } else { | 353 } else { |
| 354 UMA_HISTOGRAM_COUNTS("DataReductionProxy.MissingViaHeader.Bytes.Other", | 354 UMA_HISTOGRAM_COUNTS("DataReductionProxy.MissingViaHeader.Bytes.Other", |
| 355 request.received_response_content_length()); | 355 request.received_response_content_length()); |
| 356 } | 356 } |
| 357 } | 357 } |
| 358 | 358 |
| 359 void DataReductionProxyUsageStats::OnNetworkChanged( | 359 void DataReductionProxyBypassStats::OnNetworkChanged( |
| 360 NetworkChangeNotifier::ConnectionType type) { | 360 NetworkChangeNotifier::ConnectionType type) { |
| 361 DCHECK(thread_checker_.CalledOnValidThread()); | 361 DCHECK(thread_checker_.CalledOnValidThread()); |
| 362 ClearRequestCounts(); | 362 ClearRequestCounts(); |
| 363 } | 363 } |
| 364 | 364 |
| 365 void DataReductionProxyUsageStats::ClearRequestCounts() { | 365 void DataReductionProxyBypassStats::ClearRequestCounts() { |
| 366 DCHECK(thread_checker_.CalledOnValidThread()); | 366 DCHECK(thread_checker_.CalledOnValidThread()); |
| 367 successful_requests_through_proxy_count_ = 0; | 367 successful_requests_through_proxy_count_ = 0; |
| 368 proxy_net_errors_count_ = 0; | 368 proxy_net_errors_count_ = 0; |
| 369 } | 369 } |
| 370 | 370 |
| 371 void DataReductionProxyUsageStats::NotifyUnavailabilityIfChanged() { | 371 void DataReductionProxyBypassStats::NotifyUnavailabilityIfChanged() { |
| 372 bool prev_unavailable = unavailable_; | 372 bool prev_unavailable = unavailable_; |
| 373 unavailable_ = | 373 unavailable_ = |
| 374 (proxy_net_errors_count_ >= kMinFailedRequestsWhenUnavailable && | 374 (proxy_net_errors_count_ >= kMinFailedRequestsWhenUnavailable && |
| 375 successful_requests_through_proxy_count_ <= | 375 successful_requests_through_proxy_count_ <= |
| 376 kMaxSuccessfulRequestsWhenUnavailable); | 376 kMaxSuccessfulRequestsWhenUnavailable); |
| 377 if (prev_unavailable != unavailable_) { | 377 if (prev_unavailable != unavailable_) { |
| 378 ui_task_runner_->PostTask(FROM_HERE, base::Bind( | 378 ui_task_runner_->PostTask(FROM_HERE, base::Bind( |
| 379 &DataReductionProxyUsageStats::NotifyUnavailabilityOnUIThread, | 379 &DataReductionProxyBypassStats::NotifyUnavailabilityOnUIThread, |
| 380 base::Unretained(this), | 380 base::Unretained(this), |
| 381 unavailable_)); | 381 unavailable_)); |
| 382 } | 382 } |
| 383 } | 383 } |
| 384 | 384 |
| 385 void DataReductionProxyUsageStats::NotifyUnavailabilityOnUIThread( | 385 void DataReductionProxyBypassStats::NotifyUnavailabilityOnUIThread( |
| 386 bool unavailable) { | 386 bool unavailable) { |
| 387 DCHECK(ui_task_runner_->BelongsToCurrentThread()); | 387 DCHECK(ui_task_runner_->BelongsToCurrentThread()); |
| 388 unreachable_callback_.Run(unavailable); | 388 unreachable_callback_.Run(unavailable); |
| 389 } | 389 } |
| 390 | 390 |
| 391 void DataReductionProxyUsageStats::RecordBypassedBytes( | 391 void DataReductionProxyBypassStats::RecordBypassedBytes( |
| 392 DataReductionProxyBypassType bypass_type, | 392 DataReductionProxyBypassType bypass_type, |
| 393 DataReductionProxyUsageStats::BypassedBytesType bypassed_bytes_type, | 393 DataReductionProxyBypassStats::BypassedBytesType bypassed_bytes_type, |
| 394 int64 content_length) { | 394 int64 content_length) { |
| 395 // Individual histograms are needed to count the bypassed bytes for each | 395 // Individual histograms are needed to count the bypassed bytes for each |
| 396 // bypass type so that we can see the size of requests. This helps us | 396 // bypass type so that we can see the size of requests. This helps us |
| 397 // remove outliers that would skew the sum of bypassed bytes for each type. | 397 // remove outliers that would skew the sum of bypassed bytes for each type. |
| 398 switch (bypassed_bytes_type) { | 398 switch (bypassed_bytes_type) { |
| 399 case DataReductionProxyUsageStats::NOT_BYPASSED: | 399 case DataReductionProxyBypassStats::NOT_BYPASSED: |
| 400 UMA_HISTOGRAM_COUNTS( | 400 UMA_HISTOGRAM_COUNTS( |
| 401 "DataReductionProxy.BypassedBytes.NotBypassed", content_length); | 401 "DataReductionProxy.BypassedBytes.NotBypassed", content_length); |
| 402 break; | 402 break; |
| 403 case DataReductionProxyUsageStats::SSL: | 403 case DataReductionProxyBypassStats::SSL: |
| 404 UMA_HISTOGRAM_COUNTS( | 404 UMA_HISTOGRAM_COUNTS( |
| 405 "DataReductionProxy.BypassedBytes.SSL", content_length); | 405 "DataReductionProxy.BypassedBytes.SSL", content_length); |
| 406 break; | 406 break; |
| 407 case DataReductionProxyUsageStats::LOCAL_BYPASS_RULES: | 407 case DataReductionProxyBypassStats::LOCAL_BYPASS_RULES: |
| 408 UMA_HISTOGRAM_COUNTS( | 408 UMA_HISTOGRAM_COUNTS( |
| 409 "DataReductionProxy.BypassedBytes.LocalBypassRules", | 409 "DataReductionProxy.BypassedBytes.LocalBypassRules", |
| 410 content_length); | 410 content_length); |
| 411 break; | 411 break; |
| 412 case DataReductionProxyUsageStats::PROXY_OVERRIDDEN: | 412 case DataReductionProxyBypassStats::PROXY_OVERRIDDEN: |
| 413 UMA_HISTOGRAM_COUNTS( | 413 UMA_HISTOGRAM_COUNTS( |
| 414 "DataReductionProxy.BypassedBytes.ProxyOverridden", | 414 "DataReductionProxy.BypassedBytes.ProxyOverridden", |
| 415 content_length); | 415 content_length); |
| 416 break; | 416 break; |
| 417 case DataReductionProxyUsageStats::AUDIO_VIDEO: | 417 case DataReductionProxyBypassStats::AUDIO_VIDEO: |
| 418 if (last_bypass_type_ == BYPASS_EVENT_TYPE_SHORT) { | 418 if (last_bypass_type_ == BYPASS_EVENT_TYPE_SHORT) { |
| 419 UMA_HISTOGRAM_COUNTS( | 419 UMA_HISTOGRAM_COUNTS( |
| 420 "DataReductionProxy.BypassedBytes.ShortAudioVideo", | 420 "DataReductionProxy.BypassedBytes.ShortAudioVideo", |
| 421 content_length); | 421 content_length); |
| 422 } | 422 } |
| 423 break; | 423 break; |
| 424 case DataReductionProxyUsageStats::TRIGGERING_REQUEST: | 424 case DataReductionProxyBypassStats::TRIGGERING_REQUEST: |
| 425 switch (bypass_type) { | 425 switch (bypass_type) { |
| 426 case BYPASS_EVENT_TYPE_SHORT: | 426 case BYPASS_EVENT_TYPE_SHORT: |
| 427 UMA_HISTOGRAM_COUNTS( | 427 UMA_HISTOGRAM_COUNTS( |
| 428 "DataReductionProxy.BypassedBytes.ShortTriggeringRequest", | 428 "DataReductionProxy.BypassedBytes.ShortTriggeringRequest", |
| 429 content_length); | 429 content_length); |
| 430 break; | 430 break; |
| 431 case BYPASS_EVENT_TYPE_MEDIUM: | 431 case BYPASS_EVENT_TYPE_MEDIUM: |
| 432 UMA_HISTOGRAM_COUNTS( | 432 UMA_HISTOGRAM_COUNTS( |
| 433 "DataReductionProxy.BypassedBytes.MediumTriggeringRequest", | 433 "DataReductionProxy.BypassedBytes.MediumTriggeringRequest", |
| 434 content_length); | 434 content_length); |
| 435 break; | 435 break; |
| 436 case BYPASS_EVENT_TYPE_LONG: | 436 case BYPASS_EVENT_TYPE_LONG: |
| 437 UMA_HISTOGRAM_COUNTS( | 437 UMA_HISTOGRAM_COUNTS( |
| 438 "DataReductionProxy.BypassedBytes.LongTriggeringRequest", | 438 "DataReductionProxy.BypassedBytes.LongTriggeringRequest", |
| 439 content_length); | 439 content_length); |
| 440 break; | 440 break; |
| 441 default: | 441 default: |
| 442 break; | 442 break; |
| 443 } | 443 } |
| 444 break; | 444 break; |
| 445 case DataReductionProxyUsageStats::NETWORK_ERROR: | 445 case DataReductionProxyBypassStats::NETWORK_ERROR: |
| 446 UMA_HISTOGRAM_COUNTS( | 446 UMA_HISTOGRAM_COUNTS( |
| 447 "DataReductionProxy.BypassedBytes.NetworkErrorOther", | 447 "DataReductionProxy.BypassedBytes.NetworkErrorOther", |
| 448 content_length); | 448 content_length); |
| 449 break; | 449 break; |
| 450 case DataReductionProxyUsageStats::BYPASSED_BYTES_TYPE_MAX: | 450 case DataReductionProxyBypassStats::BYPASSED_BYTES_TYPE_MAX: |
| 451 switch (bypass_type) { | 451 switch (bypass_type) { |
| 452 case BYPASS_EVENT_TYPE_CURRENT: | 452 case BYPASS_EVENT_TYPE_CURRENT: |
| 453 UMA_HISTOGRAM_COUNTS("DataReductionProxy.BypassedBytes.Current", | 453 UMA_HISTOGRAM_COUNTS("DataReductionProxy.BypassedBytes.Current", |
| 454 content_length); | 454 content_length); |
| 455 break; | 455 break; |
| 456 case BYPASS_EVENT_TYPE_SHORT: | 456 case BYPASS_EVENT_TYPE_SHORT: |
| 457 UMA_HISTOGRAM_COUNTS("DataReductionProxy.BypassedBytes.ShortAll", | 457 UMA_HISTOGRAM_COUNTS("DataReductionProxy.BypassedBytes.ShortAll", |
| 458 content_length); | 458 content_length); |
| 459 break; | 459 break; |
| 460 case BYPASS_EVENT_TYPE_MEDIUM: | 460 case BYPASS_EVENT_TYPE_MEDIUM: |
| (...skipping 10 matching lines...) Expand all Loading... |
| 471 content_length); | 471 content_length); |
| 472 break; | 472 break; |
| 473 case BYPASS_EVENT_TYPE_MISSING_VIA_HEADER_OTHER: | 473 case BYPASS_EVENT_TYPE_MISSING_VIA_HEADER_OTHER: |
| 474 UMA_HISTOGRAM_COUNTS( | 474 UMA_HISTOGRAM_COUNTS( |
| 475 "DataReductionProxy.BypassedBytes.MissingViaHeaderOther", | 475 "DataReductionProxy.BypassedBytes.MissingViaHeaderOther", |
| 476 content_length); | 476 content_length); |
| 477 break; | 477 break; |
| 478 case BYPASS_EVENT_TYPE_MALFORMED_407: | 478 case BYPASS_EVENT_TYPE_MALFORMED_407: |
| 479 UMA_HISTOGRAM_COUNTS("DataReductionProxy.BypassedBytes.Malformed407", | 479 UMA_HISTOGRAM_COUNTS("DataReductionProxy.BypassedBytes.Malformed407", |
| 480 content_length); | 480 content_length); |
| 481 break; | 481 break; |
| 482 case BYPASS_EVENT_TYPE_STATUS_500_HTTP_INTERNAL_SERVER_ERROR: | 482 case BYPASS_EVENT_TYPE_STATUS_500_HTTP_INTERNAL_SERVER_ERROR: |
| 483 UMA_HISTOGRAM_COUNTS( | 483 UMA_HISTOGRAM_COUNTS( |
| 484 "DataReductionProxy.BypassedBytes." | 484 "DataReductionProxy.BypassedBytes." |
| 485 "Status500HttpInternalServerError", | 485 "Status500HttpInternalServerError", |
| 486 content_length); | 486 content_length); |
| 487 break; | 487 break; |
| 488 case BYPASS_EVENT_TYPE_STATUS_502_HTTP_BAD_GATEWAY: | 488 case BYPASS_EVENT_TYPE_STATUS_502_HTTP_BAD_GATEWAY: |
| 489 UMA_HISTOGRAM_COUNTS( | 489 UMA_HISTOGRAM_COUNTS( |
| 490 "DataReductionProxy.BypassedBytes.Status502HttpBadGateway", | 490 "DataReductionProxy.BypassedBytes.Status502HttpBadGateway", |
| 491 content_length); | 491 content_length); |
| 492 break; | 492 break; |
| 493 case BYPASS_EVENT_TYPE_STATUS_503_HTTP_SERVICE_UNAVAILABLE: | 493 case BYPASS_EVENT_TYPE_STATUS_503_HTTP_SERVICE_UNAVAILABLE: |
| 494 UMA_HISTOGRAM_COUNTS( | 494 UMA_HISTOGRAM_COUNTS( |
| 495 "DataReductionProxy.BypassedBytes." | 495 "DataReductionProxy.BypassedBytes." |
| 496 "Status503HttpServiceUnavailable", | 496 "Status503HttpServiceUnavailable", |
| 497 content_length); | 497 content_length); |
| 498 break; | 498 break; |
| 499 default: | 499 default: |
| 500 break; | 500 break; |
| 501 } | 501 } |
| 502 break; | 502 break; |
| 503 } | 503 } |
| 504 } | 504 } |
| 505 | 505 |
| 506 } // namespace data_reduction_proxy | 506 } // namespace data_reduction_proxy |
| 507 | |
| 508 | |
| OLD | NEW |