Index: components/data_reduction_proxy/browser/data_reduction_proxy_usage_stats.cc |
diff --git a/components/data_reduction_proxy/browser/data_reduction_proxy_usage_stats.cc b/components/data_reduction_proxy/browser/data_reduction_proxy_usage_stats.cc |
index adda1d3746ef8a2c2259d72cc08cd2877898e4ca..a7426f564aa2f52108810a20e8f119c043b35cf3 100644 |
--- a/components/data_reduction_proxy/browser/data_reduction_proxy_usage_stats.cc |
+++ b/components/data_reduction_proxy/browser/data_reduction_proxy_usage_stats.cc |
@@ -9,8 +9,11 @@ |
#include "base/message_loop/message_loop_proxy.h" |
#include "base/metrics/histogram.h" |
#include "base/metrics/sparse_histogram.h" |
+#include "base/prefs/pref_member.h" |
#include "components/data_reduction_proxy/common/data_reduction_proxy_headers.h" |
#include "net/base/net_errors.h" |
+#include "net/http/http_response_headers.h" |
+#include "net/http/http_status_code.h" |
#include "net/proxy/proxy_retry_info.h" |
#include "net/proxy/proxy_server.h" |
#include "net/proxy/proxy_service.h" |
@@ -76,6 +79,26 @@ void DataReductionProxyUsageStats::RecordDataReductionProxyBypassInfo( |
} |
} |
+// static |
+void DataReductionProxyUsageStats::DetectAndRecordMissingViaHeaderResponseCode( |
+ bool is_primary, |
+ const net::HttpResponseHeaders* headers) { |
+ if (HasDataReductionProxyViaHeader(headers, NULL)) { |
+ // The data reduction proxy via header is present, so don't record anything. |
+ return; |
+ } |
+ |
+ if (is_primary) { |
+ UMA_HISTOGRAM_SPARSE_SLOWLY( |
+ "DataReductionProxy.MissingViaHeader.ResponseCode.Primary", |
+ headers->response_code()); |
+ } else { |
+ UMA_HISTOGRAM_SPARSE_SLOWLY( |
+ "DataReductionProxy.MissingViaHeader.ResponseCode.Fallback", |
+ headers->response_code()); |
+ } |
+} |
+ |
DataReductionProxyUsageStats::DataReductionProxyUsageStats( |
DataReductionProxyParams* params, |
const scoped_refptr<MessageLoopProxy>& ui_thread_proxy) |
@@ -145,22 +168,31 @@ void DataReductionProxyUsageStats::SetBypassType( |
triggering_request_ = true; |
} |
+void DataReductionProxyUsageStats::RecordBytesHistograms( |
+ net::URLRequest* request, |
+ const BooleanPrefMember& data_reduction_proxy_enabled, |
+ const net::ProxyConfig& data_reduction_proxy_config) { |
+ RecordBypassedBytesHistograms(request, data_reduction_proxy_enabled, |
+ data_reduction_proxy_config); |
+ RecordMissingViaHeaderBytes(request); |
+} |
+ |
void DataReductionProxyUsageStats::RecordBypassedBytesHistograms( |
- net::URLRequest& request, |
+ net::URLRequest* request, |
const BooleanPrefMember& data_reduction_proxy_enabled, |
const net::ProxyConfig& data_reduction_proxy_config) { |
- int64 content_length = request.received_response_content_length(); |
+ int64 content_length = request->received_response_content_length(); |
if (data_reduction_proxy_enabled.GetValue() && |
!data_reduction_proxy_config.Equals( |
- request.context()->proxy_service()->config())) { |
+ request->context()->proxy_service()->config())) { |
RecordBypassedBytes(last_bypass_type_, |
DataReductionProxyUsageStats::MANAGED_PROXY_CONFIG, |
content_length); |
return; |
} |
- if (data_reduction_proxy_params_->WasDataReductionProxyUsed(&request, NULL)) { |
+ if (data_reduction_proxy_params_->WasDataReductionProxyUsed(request, NULL)) { |
RecordBypassedBytes(last_bypass_type_, |
DataReductionProxyUsageStats::NOT_BYPASSED, |
content_length); |
@@ -168,7 +200,7 @@ void DataReductionProxyUsageStats::RecordBypassedBytesHistograms( |
} |
if (data_reduction_proxy_enabled.GetValue() && |
- request.url().SchemeIs(url::kHttpsScheme)) { |
+ request->url().SchemeIs(url::kHttpsScheme)) { |
RecordBypassedBytes(last_bypass_type_, |
DataReductionProxyUsageStats::SSL, |
content_length); |
@@ -177,7 +209,7 @@ void DataReductionProxyUsageStats::RecordBypassedBytesHistograms( |
if (data_reduction_proxy_enabled.GetValue() && |
data_reduction_proxy_params_->IsBypassedByDataReductionProxyLocalRules( |
- request, data_reduction_proxy_config)) { |
+ *request, data_reduction_proxy_config)) { |
RecordBypassedBytes(last_bypass_type_, |
DataReductionProxyUsageStats::LOCAL_BYPASS_RULES, |
content_length); |
@@ -191,7 +223,7 @@ void DataReductionProxyUsageStats::RecordBypassedBytesHistograms( |
last_bypass_type_ == BYPASS_EVENT_TYPE_MEDIUM || |
last_bypass_type_ == BYPASS_EVENT_TYPE_LONG)) { |
std::string mime_type; |
- request.GetMimeType(&mime_type); |
+ request->GetMimeType(&mime_type); |
// MIME types are named by <media-type>/<subtype>. Check to see if the |
// media type is audio or video. Only record when triggered by short bypass, |
// there isn't an audio or video bucket for medium or long bypasses. |
@@ -218,7 +250,7 @@ void DataReductionProxyUsageStats::RecordBypassedBytesHistograms( |
return; |
} |
- if (data_reduction_proxy_params_->AreDataReductionProxiesBypassed(request, |
+ if (data_reduction_proxy_params_->AreDataReductionProxiesBypassed(*request, |
NULL)) { |
RecordBypassedBytes(last_bypass_type_, |
DataReductionProxyUsageStats::NETWORK_ERROR, |
@@ -378,6 +410,30 @@ void DataReductionProxyUsageStats::RecordBypassedBytes( |
} |
} |
+void DataReductionProxyUsageStats::RecordMissingViaHeaderBytes( |
+ URLRequest* request) { |
+ // Responses that were served from cache should have been filtered out |
+ // already. |
+ DCHECK(!request->was_cached()); |
+ |
+ if (!data_reduction_proxy_params_->WasDataReductionProxyUsed(request, NULL) || |
+ HasDataReductionProxyViaHeader(request->response_headers(), NULL)) { |
+ // Only track requests that used the data reduction proxy and had responses |
+ // that were missing the data reduction proxy via header. |
+ return; |
+ } |
+ |
+ if (request->GetResponseCode() >= net::HTTP_BAD_REQUEST && |
+ request->GetResponseCode() < net::HTTP_INTERNAL_SERVER_ERROR) { |
+ // Track 4xx responses that are missing via headers separately. |
+ UMA_HISTOGRAM_COUNTS("DataReductionProxy.MissingViaHeader.Bytes.4xx", |
+ request->received_response_content_length()); |
+ } else { |
+ UMA_HISTOGRAM_COUNTS("DataReductionProxy.MissingViaHeader.Bytes.Other", |
+ request->received_response_content_length()); |
+ } |
+} |
+ |
} // namespace data_reduction_proxy |