Chromium Code Reviews| Index: net/http/http_basic_stream.cc |
| =================================================================== |
| --- net/http/http_basic_stream.cc (revision 88995) |
| +++ net/http/http_basic_stream.cc (working copy) |
| @@ -4,6 +4,8 @@ |
| #include "net/http/http_basic_stream.h" |
| +#include "base/format_macros.h" |
| +#include "base/metrics/histogram.h" |
| #include "base/stringprintf.h" |
| #include "net/base/io_buffer.h" |
| #include "net/base/net_errors.h" |
| @@ -12,6 +14,7 @@ |
| #include "net/http/http_stream_parser.h" |
| #include "net/http/http_util.h" |
| #include "net/socket/client_socket_handle.h" |
| +#include "net/socket/client_socket_pool_base.h" |
| namespace net { |
| @@ -34,6 +37,7 @@ |
| request_info_ = request_info; |
| parser_.reset(new HttpStreamParser(connection_.get(), request_info, |
| read_buf_, net_log)); |
| + bytes_read_offset_ = connection_->socket()->NumBytesRead(); |
| return OK; |
| } |
| @@ -50,6 +54,7 @@ |
| request_line_ = base::StringPrintf("%s %s HTTP/1.1\r\n", |
| request_info_->method.c_str(), |
| path.c_str()); |
| + response_ = response; |
| return parser_->SendRequest(request_line_, headers, request_body, response, |
| callback); |
| } |
| @@ -119,4 +124,49 @@ |
| return false; |
| } |
| +void HttpBasicStream::LogNumRttVsBytesMetrics() const { |
| + int socket_reuse_policy = GetSocketReusePolicy(); |
| + DCHECK_GE(socket_reuse_policy, 0); |
| + DCHECK_LE(socket_reuse_policy, 2); |
| + if (socket_reuse_policy > 2 || socket_reuse_policy < 0) { |
| + LOG(ERROR) << "Invalid socket reuse policy"; |
| + return; |
| + } |
| + |
| + int64 total_bytes_read = connection_->socket()->NumBytesRead(); |
| + int64 bytes_received = total_bytes_read - bytes_read_offset_; |
| + int64 num_kb = bytes_received / 1024; |
| + double rtt = connection_->socket()->GetConnectTimeMicros(); |
| + rtt /= 1000.0; |
| + |
| + if (num_kb < 1024 && rtt > 0) { // Ignore responses > 1MB |
| + base::TimeDelta duration = base::Time::Now() - |
| + response_->request_time; |
| + double num_rtt = static_cast<double>(duration.InMilliseconds()) / rtt; |
| + int64 num_rtt_scaled = (4 * num_rtt); |
| + |
| + static const char* const kGroups[] = { |
| + "warmest_socket", "warm_socket", "last_accessed_socket" |
| + }; |
| + int bucket = (num_kb / 5) * 5; |
| + const std::string histogram(StringPrintf("Net.Num_RTT_vs_KB_%s_%dKB", |
| + kGroups[socket_reuse_policy], |
| + bucket)); |
| + base::Histogram* counter = base::Histogram::FactoryGet( |
| + histogram, 0, 1000, 2, base::Histogram::kUmaTargetedHistogramFlag); |
| + DCHECK_EQ(histogram, counter->histogram_name()); |
| + counter->Add(num_rtt_scaled); |
| + |
| + if (VLOG_IS_ON(2)) { |
|
willchan no longer on Chromium
2011/06/16 09:52:44
Why aren't you just doing VLOG(2) <<
Gagan
2011/06/16 11:49:29
I thought this would be more efficient since it di
|
| + LOG(INFO) << StringPrintf("%s\nrtt = %f\tnum_rtt = %f\t" |
| + "num_kb = %" PRId64 "\t" |
| + "total bytes = %" PRId64 "\t" |
| + "histogram = %s", |
| + request_line_.data(), |
| + rtt, num_rtt, num_kb, total_bytes_read, |
| + histogram.data()); |
| + } |
| + } |
| +} |
| + |
| } // namespace net |