| Index: net/http/http_basic_stream.cc
 | 
| ===================================================================
 | 
| --- net/http/http_basic_stream.cc	(revision 90217)
 | 
| +++ 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,45 @@
 | 
|    return false;
 | 
|  }
 | 
|  
 | 
| +void HttpBasicStream::LogNumRttVsBytesMetrics() const {
 | 
| +  int socket_reuse_policy = GetSocketReusePolicy();
 | 
| +  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().ToInternalValue();
 | 
| +  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);
 | 
| +
 | 
| +    VLOG(2) << 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
 | 
| 
 |