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..4bbc516b9ca691d506b8130c5e417e934615f5c7 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" |
@@ -55,12 +58,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 +127,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 +224,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 +235,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 +332,8 @@ void QuicConnectionLogger::OnPacketHeader(const QuicPacketHeader& header) { |
} |
largest_received_packet_sequence_number_ = header.packet_sequence_number; |
} |
+ if (header.packet_sequence_number < packets_received_.size()) |
+ 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 +474,33 @@ void QuicConnectionLogger::OnSuccessfulVersionNegotiation( |
NetLog::StringCallback("version", &quic_version)); |
} |
+base::HistogramBase* QuicConnectionLogger::GetAckHistogram( |
+ const char* ack_or_nack) { |
+ string prefix("Net.QuicSession.PacketReceived_"); |
+ const char* suffix = NetworkChangeNotifier::ConnectionTypeToString( |
+ connection_type_); |
+ return base::LinearHistogram::FactoryGet(prefix + ack_or_nack + suffix, 1, |
+ packets_received_.size(), packets_received_.size() + 1, |
+ 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>( |
+ packets_received_.size() - 1, |
+ 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 |