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

Unified Diff: chrome/browser/net/network_stats.cc

Issue 10206035: NetConnectivity - Collect stats for TCP/UDP network (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: Created 8 years, 8 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698