| Index: net/http/bidirectional_stream.cc
|
| diff --git a/net/http/bidirectional_stream.cc b/net/http/bidirectional_stream.cc
|
| index e4260e27ef7503523c0a3c85ed6445c39c932dc1..cc1edf0dcacc7e63537fbd3527a5c1cd92eac60a 100644
|
| --- a/net/http/bidirectional_stream.cc
|
| +++ b/net/http/bidirectional_stream.cc
|
| @@ -92,6 +92,10 @@ BidirectionalStream::BidirectionalStream(
|
| DCHECK(delegate_);
|
| DCHECK(request_info_);
|
|
|
| + // Start time should be measured before connect.
|
| + load_timing_info_.request_start_time = base::Time::Now();
|
| + load_timing_info_.request_start = base::TimeTicks::Now();
|
| +
|
| if (net_log_.IsCapturing()) {
|
| net_log_.BeginEvent(
|
| NetLogEventType::BIDIRECTIONAL_STREAM_ALIVE,
|
| @@ -216,6 +220,11 @@ int64_t BidirectionalStream::GetTotalSentBytes() const {
|
| return stream_impl_->GetTotalSentBytes();
|
| }
|
|
|
| +void BidirectionalStream::GetLoadTimingInfo(
|
| + LoadTimingInfo* load_timing_info) const {
|
| + *load_timing_info = load_timing_info_;
|
| +}
|
| +
|
| void BidirectionalStream::OnStreamReady(bool request_headers_sent) {
|
| request_headers_sent_ = request_headers_sent;
|
| if (net_log_.IsCapturing()) {
|
| @@ -223,8 +232,8 @@ void BidirectionalStream::OnStreamReady(bool request_headers_sent) {
|
| NetLogEventType::BIDIRECTIONAL_STREAM_READY,
|
| NetLog::BoolCallback("request_headers_sent", request_headers_sent));
|
| }
|
| - send_start_time_ = base::TimeTicks::Now();
|
| - send_end_time_ = send_start_time_;
|
| + load_timing_info_.send_start = base::TimeTicks::Now();
|
| + load_timing_info_.send_end = load_timing_info_.send_start;
|
| delegate_->OnStreamReady(request_headers_sent);
|
| }
|
|
|
| @@ -240,8 +249,17 @@ void BidirectionalStream::OnHeadersReceived(
|
| net_log_.AddEvent(NetLogEventType::BIDIRECTIONAL_STREAM_RECV_HEADERS,
|
| base::Bind(&NetLogHeadersCallback, &response_headers));
|
| }
|
| - read_start_time_ = base::TimeTicks::Now();
|
| - read_end_time_ = read_start_time_;
|
| + // Impl should only provide |connect_timing| and |socket_reused| info,
|
| + // so use a copy to get these information only.
|
| + LoadTimingInfo impl_load_timing_info;
|
| + bool has_load_timing =
|
| + stream_impl_->GetLoadTimingInfo(&impl_load_timing_info);
|
| + if (has_load_timing) {
|
| + load_timing_info_.connect_timing = impl_load_timing_info.connect_timing;
|
| + load_timing_info_.socket_reused = impl_load_timing_info.socket_reused;
|
| + }
|
| + load_timing_info_.receive_headers_end = base::TimeTicks::Now();
|
| + read_end_time_ = load_timing_info_.receive_headers_end;
|
| session_->http_stream_factory()->ProcessAlternativeServices(
|
| session_, response_info.headers.get(),
|
| url::SchemeHostPort(request_info_->url));
|
| @@ -282,7 +300,7 @@ void BidirectionalStream::OnDataSent() {
|
| NetLogEventType::BIDIRECTIONAL_STREAM_BYTES_SENT_COALESCED);
|
| }
|
| }
|
| - send_end_time_ = base::TimeTicks::Now();
|
| + load_timing_info_.send_end = base::TimeTicks::Now();
|
| write_buffer_list_.clear();
|
| write_buffer_len_list_.clear();
|
| delegate_->OnDataSent();
|
| @@ -317,7 +335,6 @@ void BidirectionalStream::OnBidirectionalStreamImplReady(
|
| BidirectionalStreamImpl* stream) {
|
| DCHECK(!stream_impl_);
|
|
|
| - start_time_ = base::TimeTicks::Now();
|
| stream_request_.reset();
|
| stream_impl_.reset(stream);
|
| stream_impl_->Start(request_info_.get(), net_log_,
|
| @@ -387,33 +404,40 @@ void BidirectionalStream::NotifyFailed(int error) {
|
| void BidirectionalStream::UpdateHistograms() {
|
| // If the request failed before response is started, treat the metrics as
|
| // bogus and skip logging.
|
| - if (start_time_.is_null() || read_start_time_.is_null() ||
|
| - read_end_time_.is_null() || send_start_time_.is_null() ||
|
| - send_end_time_.is_null()) {
|
| + if (load_timing_info_.request_start.is_null() ||
|
| + load_timing_info_.receive_headers_end.is_null() ||
|
| + read_end_time_.is_null() || load_timing_info_.send_start.is_null() ||
|
| + load_timing_info_.send_end.is_null()) {
|
| return;
|
| }
|
| if (GetProtocol() == kProtoHTTP2) {
|
| UMA_HISTOGRAM_TIMES("Net.BidirectionalStream.TimeToReadStart.HTTP2",
|
| - read_start_time_ - start_time_);
|
| + load_timing_info_.receive_headers_end -
|
| + load_timing_info_.request_start);
|
| UMA_HISTOGRAM_TIMES("Net.BidirectionalStream.TimeToReadEnd.HTTP2",
|
| - read_end_time_ - start_time_);
|
| - UMA_HISTOGRAM_TIMES("Net.BidirectionalStream.TimeToSendStart.HTTP2",
|
| - send_start_time_ - start_time_);
|
| - UMA_HISTOGRAM_TIMES("Net.BidirectionalStream.TimeToSendEnd.HTTP2",
|
| - send_end_time_ - start_time_);
|
| + read_end_time_ - load_timing_info_.request_start);
|
| + UMA_HISTOGRAM_TIMES(
|
| + "Net.BidirectionalStream.TimeToSendStart.HTTP2",
|
| + load_timing_info_.send_start - load_timing_info_.request_start);
|
| + UMA_HISTOGRAM_TIMES(
|
| + "Net.BidirectionalStream.TimeToSendEnd.HTTP2",
|
| + load_timing_info_.send_end - load_timing_info_.request_start);
|
| UMA_HISTOGRAM_COUNTS("Net.BidirectionalStream.ReceivedBytes.HTTP2",
|
| stream_impl_->GetTotalReceivedBytes());
|
| UMA_HISTOGRAM_COUNTS("Net.BidirectionalStream.SentBytes.HTTP2",
|
| stream_impl_->GetTotalSentBytes());
|
| } else if (GetProtocol() == kProtoQUIC1SPDY3) {
|
| UMA_HISTOGRAM_TIMES("Net.BidirectionalStream.TimeToReadStart.QUIC",
|
| - read_start_time_ - start_time_);
|
| + load_timing_info_.receive_headers_end -
|
| + load_timing_info_.request_start);
|
| UMA_HISTOGRAM_TIMES("Net.BidirectionalStream.TimeToReadEnd.QUIC",
|
| - read_end_time_ - start_time_);
|
| - UMA_HISTOGRAM_TIMES("Net.BidirectionalStream.TimeToSendStart.QUIC",
|
| - send_start_time_ - start_time_);
|
| - UMA_HISTOGRAM_TIMES("Net.BidirectionalStream.TimeToSendEnd.QUIC",
|
| - send_end_time_ - start_time_);
|
| + read_end_time_ - load_timing_info_.request_start);
|
| + UMA_HISTOGRAM_TIMES(
|
| + "Net.BidirectionalStream.TimeToSendStart.QUIC",
|
| + load_timing_info_.send_start - load_timing_info_.request_start);
|
| + UMA_HISTOGRAM_TIMES(
|
| + "Net.BidirectionalStream.TimeToSendEnd.QUIC",
|
| + load_timing_info_.send_end - load_timing_info_.request_start);
|
| UMA_HISTOGRAM_COUNTS("Net.BidirectionalStream.ReceivedBytes.QUIC",
|
| stream_impl_->GetTotalReceivedBytes());
|
| UMA_HISTOGRAM_COUNTS("Net.BidirectionalStream.SentBytes.QUIC",
|
|
|