Index: net/proxy/proxy_service.cc |
diff --git a/net/proxy/proxy_service.cc b/net/proxy/proxy_service.cc |
index b2fcc0e401c953cae4c38089582d667b3f46650f..e29fcc4e195f85c54101ce5d47694828062032f6 100644 |
--- a/net/proxy/proxy_service.cc |
+++ b/net/proxy/proxy_service.cc |
@@ -47,6 +47,7 @@ |
#if defined(SPDY_PROXY_AUTH_ORIGIN) |
#include "base/metrics/histogram.h" |
+#include "base/metrics/sparse_histogram.h" |
#endif |
using base::TimeDelta; |
@@ -1168,6 +1169,7 @@ void ProxyService::OnInitProxyResolverComplete(int result) { |
} |
int ProxyService::ReconsiderProxyAfterError(const GURL& url, |
+ int net_error, |
ProxyInfo* result, |
const CompletionCallback& callback, |
PacRequest** pac_request, |
@@ -1191,9 +1193,13 @@ int ProxyService::ReconsiderProxyAfterError(const GURL& url, |
if (result->proxy_server().isDataReductionProxy()) { |
RecordDataReductionProxyBypassInfo( |
true, result->proxy_server(), ERROR_BYPASS); |
+ RecordDataReductionProxyBypassOnNetworkError( |
+ true, result->proxy_server(), net_error); |
mef
2014/05/28 15:39:57
is |is_primary| expected to be |true| in both case
bengr
2014/05/29 16:09:48
No. Only in the first case: if (result->proxy_serv
|
} else if (result->proxy_server().isDataReductionProxyFallback()) { |
RecordDataReductionProxyBypassInfo( |
false, result->proxy_server(), ERROR_BYPASS); |
+ RecordDataReductionProxyBypassOnNetworkError( |
+ true, result->proxy_server(), net_error); |
} |
#endif |
@@ -1439,6 +1445,25 @@ void ProxyService::RecordDataReductionProxyBypassInfo( |
bypass_type, BYPASS_EVENT_TYPE_MAX); |
} |
} |
+ |
+void ProxyService::RecordDataReductionProxyBypassOnNetworkError( |
+ bool is_primary, |
+ const ProxyServer& proxy_server, |
+ int net_error) { |
+ // Only record UMA if the proxy isn't already on the retry list. |
+ if (proxy_retry_info_.find(proxy_server.ToURI()) != proxy_retry_info_.end()) |
+ return; |
+ |
+ if (is_primary) { |
+ UMA_HISTOGRAM_SPARSE_SLOWLY( |
+ "DataReductionProxy.BypassOnNetworkErrorPrimary", |
+ std::abs(net_error)); |
+ return; |
+ } |
+ UMA_HISTOGRAM_SPARSE_SLOWLY( |
+ "DataReductionProxy.BypassOnNetworkErrorFallback", |
+ std::abs(net_error)); |
+} |
#endif // defined(SPDY_PROXY_AUTH_ORIGIN) |
void ProxyService::OnProxyConfigChanged( |
@@ -1581,13 +1606,14 @@ int SyncProxyServiceHelper::ResolveProxy(const GURL& url, |
} |
int SyncProxyServiceHelper::ReconsiderProxyAfterError( |
- const GURL& url, ProxyInfo* proxy_info, const BoundNetLog& net_log) { |
+ const GURL& url, int net_error, ProxyInfo* proxy_info, |
+ const BoundNetLog& net_log) { |
DCHECK(io_message_loop_ != base::MessageLoop::current()); |
io_message_loop_->PostTask( |
FROM_HERE, |
base::Bind(&SyncProxyServiceHelper::StartAsyncReconsider, this, url, |
- net_log)); |
+ net_error, net_log)); |
event_.Wait(); |
@@ -1609,9 +1635,10 @@ void SyncProxyServiceHelper::StartAsyncResolve(const GURL& url, |
} |
void SyncProxyServiceHelper::StartAsyncReconsider(const GURL& url, |
+ int net_error, |
const BoundNetLog& net_log) { |
result_ = proxy_service_->ReconsiderProxyAfterError( |
- url, &proxy_info_, callback_, NULL, net_log); |
+ url, net_error, &proxy_info_, callback_, NULL, net_log); |
if (result_ != net::ERR_IO_PENDING) { |
OnCompletion(result_); |
} |