Chromium Code Reviews| Index: net/quic/quic_connection_logger.cc |
| diff --git a/net/quic/quic_connection_logger.cc b/net/quic/quic_connection_logger.cc |
| index d52debe1faef89f99e2e39c4edfae149fc47a183..f0b1d0b5e9aa06a74294569b57465ba857a1f783 100644 |
| --- a/net/quic/quic_connection_logger.cc |
| +++ b/net/quic/quic_connection_logger.cc |
| @@ -4,6 +4,9 @@ |
| #include "net/quic/quic_connection_logger.h" |
| +#include <algorithm> |
| +#include <string> |
| + |
| #include "base/bind.h" |
| #include "base/callback.h" |
| #include "base/metrics/histogram.h" |
| @@ -22,7 +25,6 @@ using std::string; |
| namespace net { |
| namespace { |
| - |
|
Ryan Hamilton
2014/03/07 17:47:05
nit: can you add this blank line back?
jar (doing other things)
2014/03/07 18:01:11
Done.
|
| base::Value* NetLogQuicPacketCallback(const IPEndPoint* self_address, |
| const IPEndPoint* peer_address, |
| size_t packet_size, |
| @@ -55,12 +57,12 @@ base::Value* NetLogQuicPacketRetransmittedCallback( |
| QuicPacketSequenceNumber old_sequence_number, |
| QuicPacketSequenceNumber new_sequence_number, |
| NetLog::LogLevel /* log_level */) { |
| - base::DictionaryValue* dict = new base::DictionaryValue(); |
| - dict->SetString("old_packet_sequence_number", |
| - base::Uint64ToString(old_sequence_number)); |
| - dict->SetString("new_packet_sequence_number", |
| - base::Uint64ToString(new_sequence_number)); |
| - return dict; |
| + base::DictionaryValue* dict = new base::DictionaryValue(); |
| + dict->SetString("old_packet_sequence_number", |
| + base::Uint64ToString(old_sequence_number)); |
| + dict->SetString("new_packet_sequence_number", |
| + base::Uint64ToString(new_sequence_number)); |
| + return dict; |
| } |
| base::Value* NetLogQuicPacketHeaderCallback(const QuicPacketHeader* header, |
| @@ -124,7 +126,7 @@ base::Value* NetLogQuicCongestionFeedbackFrameCallback( |
| for (TimeMap::const_iterator it = |
| frame->inter_arrival.received_packet_times.begin(); |
| it != frame->inter_arrival.received_packet_times.end(); ++it) { |
| - std::string value = base::Uint64ToString(it->first) + "@" + |
| + string value = base::Uint64ToString(it->first) + "@" + |
| base::Uint64ToString(it->second.ToDebuggingValue()); |
| received->AppendString(value); |
| } |
| @@ -221,7 +223,8 @@ QuicConnectionLogger::QuicConnectionLogger(const BoundNetLog& net_log) |
| largest_received_missing_packet_sequence_number_(0), |
| out_of_order_recieved_packet_count_(0), |
| num_truncated_acks_sent_(0), |
| - num_truncated_acks_received_(0) { |
| + num_truncated_acks_received_(0), |
| + connection_type_(NetworkChangeNotifier::GetConnectionType()) { |
| } |
| QuicConnectionLogger::~QuicConnectionLogger() { |
| @@ -231,6 +234,8 @@ QuicConnectionLogger::~QuicConnectionLogger() { |
| num_truncated_acks_sent_); |
| UMA_HISTOGRAM_COUNTS("Net.QuicSession.TruncatedAcksReceived", |
| num_truncated_acks_received_); |
| + |
| + RecordAckNackHistograms(); |
| } |
| void QuicConnectionLogger::OnFrameAddedToPacket(const QuicFrame& frame) { |
| @@ -326,6 +331,8 @@ void QuicConnectionLogger::OnPacketHeader(const QuicPacketHeader& header) { |
| } |
| largest_received_packet_sequence_number_ = header.packet_sequence_number; |
| } |
| + if (header.packet_sequence_number <= kMaxPacketStatus) |
| + packets_received_[header.packet_sequence_number] = true; |
| if (header.packet_sequence_number < last_received_packet_sequence_number_) { |
| ++out_of_order_recieved_packet_count_; |
| UMA_HISTOGRAM_COUNTS("Net.QuicSession.OutOfOrderGapReceived", |
| @@ -466,4 +473,32 @@ void QuicConnectionLogger::OnSuccessfulVersionNegotiation( |
| NetLog::StringCallback("version", &quic_version)); |
| } |
| +base::HistogramBase* QuicConnectionLogger::GetAckHistogram( |
| + const char* ack_or_nack) { |
| + std::string prefix("Net.QuicSession.PacketReceived_"); |
|
Ryan Hamilton
2014/03/07 17:47:05
nit: since we're "using std::string", I think you
jar (doing other things)
2014/03/07 18:01:11
Done.
|
| + const char* suffix = NetworkChangeNotifier::ConnectionTypeToString( |
| + connection_type_); |
| + return base::LinearHistogram::FactoryGet(prefix + ack_or_nack + suffix, 1, |
| + kMaxPacketStatus + 1, kMaxPacketStatus + 2, |
| + base::HistogramBase::kUmaTargetedHistogramFlag); |
| +} |
| + |
| +void QuicConnectionLogger::RecordAckNackHistograms() { |
| + if (largest_received_packet_sequence_number_ == 0) |
| + return; // Connection was never used. |
| + base::HistogramBase* packet_ack_histogram = GetAckHistogram("Ack_"); |
| + base::HistogramBase* packet_nack_histogram = GetAckHistogram("Nack_"); |
| + const QuicPacketSequenceNumber last_index = |
| + std::min<QuicPacketSequenceNumber>( |
| + kMaxPacketStatus, largest_received_packet_sequence_number_); |
| + // Zero is an invalid packet sequence number. |
| + DCHECK(!packets_received_[0]); |
| + for (size_t i = 1; i <= last_index; ++i) { |
| + if (packets_received_[i]) |
| + packet_ack_histogram->Add(i); |
| + else |
| + packet_nack_histogram->Add(i); |
| + } |
| +} |
| + |
| } // namespace net |