OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/quic_connection_logger.h" | 5 #include "net/quic/quic_connection_logger.h" |
6 | 6 |
7 #include <algorithm> | |
8 #include <string> | |
9 | |
7 #include "base/bind.h" | 10 #include "base/bind.h" |
8 #include "base/callback.h" | 11 #include "base/callback.h" |
9 #include "base/metrics/histogram.h" | 12 #include "base/metrics/histogram.h" |
10 #include "base/metrics/sparse_histogram.h" | 13 #include "base/metrics/sparse_histogram.h" |
11 #include "base/strings/string_number_conversions.h" | 14 #include "base/strings/string_number_conversions.h" |
12 #include "base/values.h" | 15 #include "base/values.h" |
13 #include "net/base/net_log.h" | 16 #include "net/base/net_log.h" |
14 #include "net/quic/crypto/crypto_handshake_message.h" | 17 #include "net/quic/crypto/crypto_handshake_message.h" |
15 #include "net/quic/crypto/crypto_protocol.h" | 18 #include "net/quic/crypto/crypto_protocol.h" |
16 #include "net/quic/quic_address_mismatch.h" | 19 #include "net/quic/quic_address_mismatch.h" |
17 #include "net/quic/quic_socket_address_coder.h" | 20 #include "net/quic/quic_socket_address_coder.h" |
18 | 21 |
19 using base::StringPiece; | 22 using base::StringPiece; |
20 using std::string; | 23 using std::string; |
21 | 24 |
22 namespace net { | 25 namespace net { |
23 | 26 |
24 namespace { | 27 namespace { |
28 // The number of packets for which status is recorded. | |
29 const size_t MAX_PACKET_STATUS = 100; | |
Ryan Hamilton
2014/03/05 03:48:00
nit: kMaxPacketStatus, I think, right?
jar (doing other things)
2014/03/06 03:34:17
Chromium style guide seems to ask for this format:
Ryan Hamilton
2014/03/06 04:47:43
Do you mean this line:
Though the Google C++ Styl
jar (doing other things)
2014/03/07 17:11:48
Done.
| |
25 | 30 |
26 base::Value* NetLogQuicPacketCallback(const IPEndPoint* self_address, | 31 base::Value* NetLogQuicPacketCallback(const IPEndPoint* self_address, |
27 const IPEndPoint* peer_address, | 32 const IPEndPoint* peer_address, |
28 size_t packet_size, | 33 size_t packet_size, |
29 NetLog::LogLevel /* log_level */) { | 34 NetLog::LogLevel /* log_level */) { |
30 base::DictionaryValue* dict = new base::DictionaryValue(); | 35 base::DictionaryValue* dict = new base::DictionaryValue(); |
31 dict->SetString("self_address", self_address->ToString()); | 36 dict->SetString("self_address", self_address->ToString()); |
32 dict->SetString("peer_address", peer_address->ToString()); | 37 dict->SetString("peer_address", peer_address->ToString()); |
33 dict->SetInteger("size", packet_size); | 38 dict->SetInteger("size", packet_size); |
34 return dict; | 39 return dict; |
(...skipping 13 matching lines...) Expand all Loading... | |
48 if (result.status != WRITE_STATUS_OK) { | 53 if (result.status != WRITE_STATUS_OK) { |
49 dict->SetInteger("net_error", result.error_code); | 54 dict->SetInteger("net_error", result.error_code); |
50 } | 55 } |
51 return dict; | 56 return dict; |
52 } | 57 } |
53 | 58 |
54 base::Value* NetLogQuicPacketRetransmittedCallback( | 59 base::Value* NetLogQuicPacketRetransmittedCallback( |
55 QuicPacketSequenceNumber old_sequence_number, | 60 QuicPacketSequenceNumber old_sequence_number, |
56 QuicPacketSequenceNumber new_sequence_number, | 61 QuicPacketSequenceNumber new_sequence_number, |
57 NetLog::LogLevel /* log_level */) { | 62 NetLog::LogLevel /* log_level */) { |
58 base::DictionaryValue* dict = new base::DictionaryValue(); | 63 base::DictionaryValue* dict = new base::DictionaryValue(); |
59 dict->SetString("old_packet_sequence_number", | 64 dict->SetString("old_packet_sequence_number", |
60 base::Uint64ToString(old_sequence_number)); | 65 base::Uint64ToString(old_sequence_number)); |
61 dict->SetString("new_packet_sequence_number", | 66 dict->SetString("new_packet_sequence_number", |
62 base::Uint64ToString(new_sequence_number)); | 67 base::Uint64ToString(new_sequence_number)); |
63 return dict; | 68 return dict; |
64 } | 69 } |
65 | 70 |
66 base::Value* NetLogQuicPacketHeaderCallback(const QuicPacketHeader* header, | 71 base::Value* NetLogQuicPacketHeaderCallback(const QuicPacketHeader* header, |
67 NetLog::LogLevel /* log_level */) { | 72 NetLog::LogLevel /* log_level */) { |
68 base::DictionaryValue* dict = new base::DictionaryValue(); | 73 base::DictionaryValue* dict = new base::DictionaryValue(); |
69 dict->SetString("guid", | 74 dict->SetString("guid", |
70 base::Uint64ToString(header->public_header.guid)); | 75 base::Uint64ToString(header->public_header.guid)); |
71 dict->SetInteger("reset_flag", header->public_header.reset_flag); | 76 dict->SetInteger("reset_flag", header->public_header.reset_flag); |
72 dict->SetInteger("version_flag", header->public_header.version_flag); | 77 dict->SetInteger("version_flag", header->public_header.version_flag); |
73 dict->SetString("packet_sequence_number", | 78 dict->SetString("packet_sequence_number", |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
117 NetLog::LogLevel /* log_level */) { | 122 NetLog::LogLevel /* log_level */) { |
118 base::DictionaryValue* dict = new base::DictionaryValue(); | 123 base::DictionaryValue* dict = new base::DictionaryValue(); |
119 switch (frame->type) { | 124 switch (frame->type) { |
120 case kInterArrival: { | 125 case kInterArrival: { |
121 dict->SetString("type", "InterArrival"); | 126 dict->SetString("type", "InterArrival"); |
122 base::ListValue* received = new base::ListValue(); | 127 base::ListValue* received = new base::ListValue(); |
123 dict->Set("received_packets", received); | 128 dict->Set("received_packets", received); |
124 for (TimeMap::const_iterator it = | 129 for (TimeMap::const_iterator it = |
125 frame->inter_arrival.received_packet_times.begin(); | 130 frame->inter_arrival.received_packet_times.begin(); |
126 it != frame->inter_arrival.received_packet_times.end(); ++it) { | 131 it != frame->inter_arrival.received_packet_times.end(); ++it) { |
127 std::string value = base::Uint64ToString(it->first) + "@" + | 132 string value = base::Uint64ToString(it->first) + "@" + |
128 base::Uint64ToString(it->second.ToDebuggingValue()); | 133 base::Uint64ToString(it->second.ToDebuggingValue()); |
129 received->AppendString(value); | 134 received->AppendString(value); |
130 } | 135 } |
131 break; | 136 break; |
132 } | 137 } |
133 case kFixRate: | 138 case kFixRate: |
134 dict->SetString("type", "FixRate"); | 139 dict->SetString("type", "FixRate"); |
135 dict->SetInteger("bitrate_in_bytes_per_second", | 140 dict->SetInteger("bitrate_in_bytes_per_second", |
136 frame->fix_rate.bitrate.ToBytesPerSecond()); | 141 frame->fix_rate.bitrate.ToBytesPerSecond()); |
137 break; | 142 break; |
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
214 | 219 |
215 } // namespace | 220 } // namespace |
216 | 221 |
217 QuicConnectionLogger::QuicConnectionLogger(const BoundNetLog& net_log) | 222 QuicConnectionLogger::QuicConnectionLogger(const BoundNetLog& net_log) |
218 : net_log_(net_log), | 223 : net_log_(net_log), |
219 last_received_packet_sequence_number_(0), | 224 last_received_packet_sequence_number_(0), |
220 largest_received_packet_sequence_number_(0), | 225 largest_received_packet_sequence_number_(0), |
221 largest_received_missing_packet_sequence_number_(0), | 226 largest_received_missing_packet_sequence_number_(0), |
222 out_of_order_recieved_packet_count_(0), | 227 out_of_order_recieved_packet_count_(0), |
223 num_truncated_acks_sent_(0), | 228 num_truncated_acks_sent_(0), |
224 num_truncated_acks_received_(0) { | 229 num_truncated_acks_received_(0), |
230 packets_received_(MAX_PACKET_STATUS) { | |
225 } | 231 } |
226 | 232 |
227 QuicConnectionLogger::~QuicConnectionLogger() { | 233 QuicConnectionLogger::~QuicConnectionLogger() { |
228 UMA_HISTOGRAM_COUNTS("Net.QuicSession.OutOfOrderPacketsReceived", | 234 UMA_HISTOGRAM_COUNTS("Net.QuicSession.OutOfOrderPacketsReceived", |
229 out_of_order_recieved_packet_count_); | 235 out_of_order_recieved_packet_count_); |
230 UMA_HISTOGRAM_COUNTS("Net.QuicSession.TruncatedAcksSent", | 236 UMA_HISTOGRAM_COUNTS("Net.QuicSession.TruncatedAcksSent", |
231 num_truncated_acks_sent_); | 237 num_truncated_acks_sent_); |
232 UMA_HISTOGRAM_COUNTS("Net.QuicSession.TruncatedAcksReceived", | 238 UMA_HISTOGRAM_COUNTS("Net.QuicSession.TruncatedAcksReceived", |
233 num_truncated_acks_received_); | 239 num_truncated_acks_received_); |
240 | |
241 const size_t last_index = std::min<size_t>(MAX_PACKET_STATUS - 1, | |
Ryan Hamilton
2014/03/05 03:48:00
nit: We typically just say min(foo, bar); Is the
jar (doing other things)
2014/03/06 03:34:17
I think the code may have been wrong, since it was
| |
242 largest_received_packet_sequence_number_); | |
243 // We never get packet 0, so it is just a sentinel. | |
244 for (size_t i = 1; i <= last_index; ++i) { | |
245 if (packets_received_[i]) { | |
246 UMA_HISTOGRAM_ENUMERATION("Net.QuicSessionPacketReceivedAck", i - 1, | |
Ryan Hamilton
2014/03/05 03:48:00
Interesting! I didn't realize ENUMERATION was app
jar (doing other things)
2014/03/06 03:34:17
Yes... it works nicely when what you really want i
| |
247 MAX_PACKET_STATUS); | |
248 } else { | |
249 UMA_HISTOGRAM_ENUMERATION("Net.QuicSessionPacketReceivedNack", i - 1, | |
250 MAX_PACKET_STATUS); | |
251 } | |
252 } | |
234 } | 253 } |
235 | 254 |
236 void QuicConnectionLogger::OnFrameAddedToPacket(const QuicFrame& frame) { | 255 void QuicConnectionLogger::OnFrameAddedToPacket(const QuicFrame& frame) { |
237 switch (frame.type) { | 256 switch (frame.type) { |
238 case PADDING_FRAME: | 257 case PADDING_FRAME: |
239 break; | 258 break; |
240 case STREAM_FRAME: | 259 case STREAM_FRAME: |
241 net_log_.AddEvent( | 260 net_log_.AddEvent( |
242 NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_SENT, | 261 NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_SENT, |
243 base::Bind(&NetLogQuicStreamFrameCallback, frame.stream_frame)); | 262 base::Bind(&NetLogQuicStreamFrameCallback, frame.stream_frame)); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
318 header.packet_sequence_number) { | 337 header.packet_sequence_number) { |
319 QuicPacketSequenceNumber delta = header.packet_sequence_number - | 338 QuicPacketSequenceNumber delta = header.packet_sequence_number - |
320 largest_received_packet_sequence_number_; | 339 largest_received_packet_sequence_number_; |
321 if (delta > 1) { | 340 if (delta > 1) { |
322 // There is a gap between the largest packet previously received and | 341 // There is a gap between the largest packet previously received and |
323 // the current packet. This indicates either loss, or out-of-order | 342 // the current packet. This indicates either loss, or out-of-order |
324 // delivery. | 343 // delivery. |
325 UMA_HISTOGRAM_COUNTS("Net.QuicSession.PacketGapReceived", delta - 1); | 344 UMA_HISTOGRAM_COUNTS("Net.QuicSession.PacketGapReceived", delta - 1); |
326 } | 345 } |
327 largest_received_packet_sequence_number_ = header.packet_sequence_number; | 346 largest_received_packet_sequence_number_ = header.packet_sequence_number; |
347 if (largest_received_packet_sequence_number_ < MAX_PACKET_STATUS) { | |
348 // We never get a packet of zero, but it is safer to handle this in | |
349 // production and avoiding reporting data from the 0th entry in the | |
350 // array. | |
351 DCHECK_GT(largest_received_packet_sequence_number_, 0); | |
352 packets_received_[largest_received_packet_sequence_number_] = true; | |
Ryan Hamilton
2014/03/05 03:48:00
nit: i think the style guide says that DCHECK is o
Ryan Hamilton
2014/03/05 03:48:00
It looks like this code only records packets that
jar (doing other things)
2014/03/06 03:34:17
I moved around the DCHECK, and it now just checks
jar (doing other things)
2014/03/06 03:34:17
No. That was not intended... I messed this up in m
| |
353 } | |
328 } | 354 } |
329 if (header.packet_sequence_number < last_received_packet_sequence_number_) { | 355 if (header.packet_sequence_number < last_received_packet_sequence_number_) { |
330 ++out_of_order_recieved_packet_count_; | 356 ++out_of_order_recieved_packet_count_; |
331 UMA_HISTOGRAM_COUNTS("Net.QuicSession.OutOfOrderGapReceived", | 357 UMA_HISTOGRAM_COUNTS("Net.QuicSession.OutOfOrderGapReceived", |
332 last_received_packet_sequence_number_ - | 358 last_received_packet_sequence_number_ - |
333 header.packet_sequence_number); | 359 header.packet_sequence_number); |
334 } | 360 } |
335 last_received_packet_sequence_number_ = header.packet_sequence_number; | 361 last_received_packet_sequence_number_ = header.packet_sequence_number; |
336 } | 362 } |
337 | 363 |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
460 } | 486 } |
461 | 487 |
462 void QuicConnectionLogger::OnSuccessfulVersionNegotiation( | 488 void QuicConnectionLogger::OnSuccessfulVersionNegotiation( |
463 const QuicVersion& version) { | 489 const QuicVersion& version) { |
464 string quic_version = QuicVersionToString(version); | 490 string quic_version = QuicVersionToString(version); |
465 net_log_.AddEvent(NetLog::TYPE_QUIC_SESSION_VERSION_NEGOTIATED, | 491 net_log_.AddEvent(NetLog::TYPE_QUIC_SESSION_VERSION_NEGOTIATED, |
466 NetLog::StringCallback("version", &quic_version)); | 492 NetLog::StringCallback("version", &quic_version)); |
467 } | 493 } |
468 | 494 |
469 } // namespace net | 495 } // namespace net |
OLD | NEW |