Index: chrome/browser/net/network_stats.cc |
=================================================================== |
--- chrome/browser/net/network_stats.cc (revision 135105) |
+++ chrome/browser/net/network_stats.cc (working copy) |
@@ -16,11 +16,13 @@ |
#include "base/tuple.h" |
#include "chrome/common/chrome_version_info.h" |
#include "content/public/browser/browser_thread.h" |
+#include "googleurl/src/gurl.h" |
#include "net/base/net_errors.h" |
#include "net/base/net_util.h" |
#include "net/base/network_change_notifier.h" |
#include "net/base/sys_addrinfo.h" |
#include "net/base/test_completion_callback.h" |
+#include "net/proxy/proxy_service.h" |
#include "net/socket/tcp_client_socket.h" |
#include "net/udp/udp_client_socket.h" |
#include "net/udp/udp_server_socket.h" |
@@ -94,6 +96,7 @@ |
: load_size_(0), |
bytes_to_read_(0), |
bytes_to_send_(0), |
+ has_proxy_server_(false), |
packets_to_send_(0), |
packets_sent_(0), |
base_packet_number_(0), |
@@ -108,13 +111,18 @@ |
bool NetworkStats::Start(net::HostResolver* host_resolver, |
const net::HostPortPair& server_host_port_pair, |
HistogramPortSelector histogram_port, |
+ bool has_proxy_server, |
uint32 bytes_to_send, |
uint32 packets_to_send, |
const net::CompletionCallback& finished_callback) { |
DCHECK(bytes_to_send); // We should have data to send. |
DCHECK_LE(packets_to_send, kMaximumPackets); |
- Initialize(bytes_to_send, histogram_port, packets_to_send, finished_callback); |
+ Initialize(bytes_to_send, |
+ histogram_port, |
+ has_proxy_server, |
+ packets_to_send, |
+ finished_callback); |
net::HostResolver::RequestInfo request(server_host_port_pair); |
int rv = host_resolver->Resolve( |
@@ -130,6 +138,7 @@ |
void NetworkStats::Initialize( |
uint32 bytes_to_send, |
HistogramPortSelector histogram_port, |
+ bool has_proxy_server, |
uint32 packets_to_send, |
const net::CompletionCallback& finished_callback) { |
DCHECK(bytes_to_send); // We should have data to send. |
@@ -140,6 +149,7 @@ |
packets_to_send_ = packets_to_send; |
histogram_port_ = histogram_port; |
+ has_proxy_server_ = has_proxy_server; |
finished_callback_ = finished_callback; |
} |
@@ -498,15 +508,20 @@ |
} |
// static |
-void NetworkStats::GetHistogramNames(const ProtocolValue& protocol, |
- HistogramPortSelector port, |
- uint32 load_size, |
- int result, |
- std::string* rtt_histogram_name, |
- std::string* status_histogram_name, |
- std::string* packet_loss_histogram_name) { |
- CHECK_GE(port, PORT_53); |
- CHECK_LE(port, HISTOGRAM_PORT_MAX); |
+void NetworkStats::GetHistogramNames( |
+ const ProtocolValue& protocol, |
+ HistogramPortSelector histogram_port, |
+ bool has_proxy_server, |
+ uint32 load_size, |
+ int result, |
+ std::string* rtt_histogram_name, |
+ std::string* rtt_no_proxy_histogram_name, |
+ std::string* status_histogram_name, |
+ std::string* status_no_proxy_histogram_name, |
+ std::string* packet_loss_histogram_name, |
+ std::string* packet_loss_no_proxy_histogram_name) { |
jar (doing other things)
2012/05/03 16:41:34
If you put ".NoProxy" at the end of the name, cons
ramant (doing other things)
2012/05/04 03:53:11
Done.
|
+ CHECK_GE(histogram_port, PORT_53); |
+ CHECK_LE(histogram_port, HISTOGRAM_PORT_MAX); |
// Build <protocol> string. |
const char* kTcpString = "TCP"; |
@@ -517,6 +532,8 @@ |
else |
protocol_string = kUdpString; |
+ int32 port = kPorts[histogram_port]; |
+ |
// Build <load_size> string. |
const char* kSmallLoadString = "100B"; |
const char* kLargeLoadString = "1K"; |
@@ -527,31 +544,62 @@ |
load_size_string = kLargeLoadString; |
// Build "NetConnectivity.<protocol>.Success.<port>.<load_size>.RTT" |
- // histogram name. Total number of histograms are 2*5*2. |
- if (result == net::OK) { |
+ // and "NetConnectivity.<protocol>.NoProxy.Success.<port>.<load_size>.RTT" |
+ // histogram names. Total number of histograms are 2*5*2*2. |
+ if (result != net::OK) { |
+ rtt_histogram_name->clear(); |
+ } else { |
*rtt_histogram_name = base::StringPrintf( |
"NetConnectivity.%s.Success.%d.%s.RTT", |
protocol_string, |
- kPorts[port], |
+ port, |
load_size_string); |
+ if (has_proxy_server) { |
+ rtt_no_proxy_histogram_name->clear(); |
+ } else { |
+ *rtt_no_proxy_histogram_name = base::StringPrintf( |
+ "NetConnectivity.%s.NoProxy.Success.%d.%s.RTT", |
+ protocol_string, |
+ port, |
+ load_size_string); |
+ } |
} |
- // Build "NetConnectivity.<protocol>.Status.<port>.<load_size>" histogram |
- // name. Total number of histograms are 2*5*2. |
- *status_histogram_name = base::StringPrintf( |
+ // Build "NetConnectivity.<protocol>.Status.<port>.<load_size>" and |
+ // "NetConnectivity.<protocol>.NoProxy.Status.<port>.<load_size>" histogram |
+ // name. Total number of histograms are 2*2*5*2. |
+ *status_histogram_name = base::StringPrintf( |
"NetConnectivity.%s.Status.%d.%s", |
protocol_string, |
- kPorts[port], |
+ port, |
load_size_string); |
+ if (has_proxy_server) { |
+ status_no_proxy_histogram_name->clear(); |
+ } else { |
+ *status_no_proxy_histogram_name = base::StringPrintf( |
+ "NetConnectivity.%s.NoProxy.Status.%d.%s", |
+ protocol_string, |
+ port, |
+ load_size_string); |
+ } |
// Build "NetConnectivity.<protocol>.PacketLoss.<port>.<load_size>" histogram |
// name. Total number of histograms are 5 (because we do this test for UDP |
// only). |
- *packet_loss_histogram_name = base::StringPrintf( |
+ *packet_loss_histogram_name = base::StringPrintf( |
"NetConnectivity.%s.PacketLoss.%d.%s", |
protocol_string, |
- kPorts[port], |
+ port, |
load_size_string); |
+ if (has_proxy_server) { |
+ packet_loss_no_proxy_histogram_name->clear(); |
+ } else { |
+ *packet_loss_no_proxy_histogram_name = base::StringPrintf( |
+ "NetConnectivity.%s.NoProxy.PacketLoss.%d.%s", |
+ protocol_string, |
+ port, |
+ load_size_string); |
+ } |
} |
void NetworkStats::RecordHistograms(const ProtocolValue& protocol, |
@@ -560,15 +608,22 @@ |
base::TimeDelta duration = base::TimeTicks::Now() - start_time(); |
std::string rtt_histogram_name; |
+ std::string rtt_no_proxy_histogram_name; |
std::string status_histogram_name; |
+ std::string status_no_proxy_histogram_name; |
std::string packet_loss_histogram_name; |
+ std::string packet_loss_no_proxy_histogram_name; |
GetHistogramNames(protocol, |
histogram_port_, |
+ has_proxy_server_, |
load_size_, |
result, |
&rtt_histogram_name, |
+ &rtt_no_proxy_histogram_name, |
&status_histogram_name, |
- &packet_loss_histogram_name); |
+ &status_no_proxy_histogram_name, |
+ &packet_loss_histogram_name, |
+ &packet_loss_no_proxy_histogram_name); |
// For packet loss test, just record packet loss data. |
if (packets_to_send_ > 1) { |
@@ -589,12 +644,28 @@ |
base::TimeDelta::FromSeconds(60), 50, |
base::Histogram::kUmaTargetedHistogramFlag); |
rtt_histogram->AddTime(duration); |
+ |
+ if (!has_proxy_server_) { |
+ base::Histogram* rtt_no_proxy_histogram = base::Histogram::FactoryTimeGet( |
+ rtt_no_proxy_histogram_name, |
+ base::TimeDelta::FromMilliseconds(10), |
+ base::TimeDelta::FromSeconds(60), 50, |
+ base::Histogram::kUmaTargetedHistogramFlag); |
+ rtt_no_proxy_histogram->AddTime(duration); |
+ } |
} |
base::Histogram* status_histogram = base::LinearHistogram::FactoryGet( |
status_histogram_name, 1, STATUS_MAX, STATUS_MAX+1, |
base::Histogram::kUmaTargetedHistogramFlag); |
status_histogram->Add(status); |
+ if (!has_proxy_server_) { |
+ base::Histogram* status_no_proxy_histogram = |
+ base::LinearHistogram::FactoryGet( |
+ status_no_proxy_histogram_name, 1, STATUS_MAX, STATUS_MAX+1, |
+ base::Histogram::kUmaTargetedHistogramFlag); |
+ status_no_proxy_histogram->Add(status); |
+ } |
} |
// UDPStatsClient methods and members. |
@@ -717,6 +788,98 @@ |
delete this; |
} |
+// ProxyClient methods and members. |
+ProxyClient::ProxyClient(const std::string& network_stats_server, |
+ NetworkStats::HistogramPortSelector histogram_port, |
+ IOThread* io_thread) |
+ : network_stats_server_(network_stats_server), |
+ histogram_port_(histogram_port), |
+ io_thread_(io_thread) { |
+} |
+ |
+ProxyClient::~ProxyClient() { |
+} |
+ |
+void ProxyClient::ResolveProxy() { |
+ std::string url = base::StringPrintf("https://%s:%d", |
+ network_stats_server_.c_str(), |
+ kPorts[histogram_port_]); |
+ GURL gurl(url); |
+ net::ProxyService* service = |
+ io_thread_->globals()->system_proxy_service.get(); |
+ |
+ int rv = service->ResolveProxy( |
+ gurl, |
+ &proxy_info_, |
+ base::Bind(&ProxyClient::OnResolveProxyComplete, |
+ base::Unretained(this)), |
+ NULL, |
+ net::BoundNetLog()); |
+ if (rv == net::OK) |
+ OnResolveProxyComplete(rv); |
+} |
+ |
+void ProxyClient::OnResolveProxyComplete(int result) { |
+ bool has_proxy_server = (proxy_info_.proxy_server().is_valid() && |
+ !proxy_info_.proxy_server().is_direct()); |
+ |
+ net::HostResolver* host_resolver = io_thread_->globals()->host_resolver.get(); |
+ DCHECK(host_resolver); |
+ |
+ DCHECK_GE(histogram_port_, NetworkStats::PORT_53); |
+ DCHECK_LE(histogram_port_, NetworkStats::PORT_8080); |
+ net::HostPortPair server_address(network_stats_server_, |
+ kPorts[histogram_port_]); |
+ |
+ int experiment_to_run = base::RandInt(1, 5); |
+ switch (experiment_to_run) { |
+ case 1: |
+ { |
+ UDPStatsClient* small_udp_stats = new UDPStatsClient(); |
+ small_udp_stats->Start( |
+ host_resolver, server_address, histogram_port_, has_proxy_server, |
+ kSmallTestBytesToSend, 1, net::CompletionCallback()); |
+ } |
+ break; |
+ |
+ case 2: |
+ { |
+ UDPStatsClient* large_udp_stats = new UDPStatsClient(); |
+ large_udp_stats->Start( |
+ host_resolver, server_address, histogram_port_, has_proxy_server, |
+ kLargeTestBytesToSend, 1, net::CompletionCallback()); |
+ } |
+ break; |
+ |
+ case 3: |
+ { |
+ TCPStatsClient* small_tcp_client = new TCPStatsClient(); |
+ small_tcp_client->Start( |
+ host_resolver, server_address, histogram_port_, has_proxy_server, |
+ kSmallTestBytesToSend, 1, net::CompletionCallback()); |
+ } |
+ break; |
+ |
+ case 4: |
+ { |
+ TCPStatsClient* large_tcp_client = new TCPStatsClient(); |
+ large_tcp_client->Start( |
+ host_resolver, server_address, histogram_port_, has_proxy_server, |
+ kLargeTestBytesToSend, 1, net::CompletionCallback()); |
+ } |
+ break; |
+ |
+ case 5: |
+ { |
+ UDPStatsClient* packet_loss_udp_stats = new UDPStatsClient(); |
+ packet_loss_udp_stats->Start( |
+ host_resolver, server_address, histogram_port_, has_proxy_server, |
+ kLargeTestBytesToSend, kMaximumPackets, net::CompletionCallback()); |
+ } |
+ break; |
+ } |
+} |
+ |
// static |
void CollectNetworkStats(const std::string& network_stats_server, |
IOThread* io_thread) { |
@@ -742,8 +905,6 @@ |
CR_DEFINE_STATIC_LOCAL(scoped_refptr<base::FieldTrial>, trial, ()); |
static bool collect_stats = false; |
- |
- static uint32 port; |
static NetworkStats::HistogramPortSelector histogram_port; |
if (!trial.get()) { |
@@ -782,7 +943,6 @@ |
base::RandInt(NetworkStats::PORT_53, NetworkStats::PORT_8080)); |
DCHECK_GE(histogram_port, NetworkStats::PORT_53); |
DCHECK_LE(histogram_port, NetworkStats::PORT_8080); |
- port = kPorts[histogram_port]; |
} |
} |
@@ -797,58 +957,9 @@ |
++number_of_tests_done; |
- net::HostResolver* host_resolver = io_thread->globals()->host_resolver.get(); |
- DCHECK(host_resolver); |
- |
- net::HostPortPair server_address(network_stats_server, port); |
- |
- int experiment_to_run = base::RandInt(1, 5); |
- switch (experiment_to_run) { |
- case 1: |
- { |
- UDPStatsClient* small_udp_stats = new UDPStatsClient(); |
- small_udp_stats->Start( |
- host_resolver, server_address, histogram_port, |
- kSmallTestBytesToSend, 1, net::CompletionCallback()); |
- } |
- break; |
- |
- case 2: |
- { |
- UDPStatsClient* large_udp_stats = new UDPStatsClient(); |
- large_udp_stats->Start( |
- host_resolver, server_address, histogram_port, |
- kLargeTestBytesToSend, 1, net::CompletionCallback()); |
- } |
- break; |
- |
- case 3: |
- { |
- TCPStatsClient* small_tcp_client = new TCPStatsClient(); |
- small_tcp_client->Start( |
- host_resolver, server_address, histogram_port, |
- kSmallTestBytesToSend, 1, net::CompletionCallback()); |
- } |
- break; |
- |
- case 4: |
- { |
- TCPStatsClient* large_tcp_client = new TCPStatsClient(); |
- large_tcp_client->Start( |
- host_resolver, server_address, histogram_port, |
- kLargeTestBytesToSend, 1, net::CompletionCallback()); |
- } |
- break; |
- |
- case 5: |
- { |
- UDPStatsClient* packet_loss_udp_stats = new UDPStatsClient(); |
- packet_loss_udp_stats->Start( |
- host_resolver, server_address, histogram_port, |
- kLargeTestBytesToSend, kMaximumPackets, net::CompletionCallback()); |
- } |
- break; |
- } |
+ ProxyClient* proxy_client = new ProxyClient( |
+ network_stats_server, histogram_port, io_thread); |
+ proxy_client->ResolveProxy(); |
} |
} // namespace chrome_browser_net |