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> | 7 #include <algorithm> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 TransmissionType transmission_type, | 51 TransmissionType transmission_type, |
52 size_t packet_size, | 52 size_t packet_size, |
53 QuicTime sent_time, | 53 QuicTime sent_time, |
54 NetLog::LogLevel /* log_level */) { | 54 NetLog::LogLevel /* log_level */) { |
55 base::DictionaryValue* dict = new base::DictionaryValue(); | 55 base::DictionaryValue* dict = new base::DictionaryValue(); |
56 dict->SetInteger("encryption_level", level); | 56 dict->SetInteger("encryption_level", level); |
57 dict->SetInteger("transmission_type", transmission_type); | 57 dict->SetInteger("transmission_type", transmission_type); |
58 dict->SetString("packet_sequence_number", | 58 dict->SetString("packet_sequence_number", |
59 base::Uint64ToString(serialized_packet.sequence_number)); | 59 base::Uint64ToString(serialized_packet.sequence_number)); |
60 dict->SetInteger("size", packet_size); | 60 dict->SetInteger("size", packet_size); |
61 dict->SetInteger("sent_time_us", sent_time.ToDebuggingValue()); | 61 dict->SetInteger("sent_time_us", |
| 62 static_cast<int>(sent_time.ToDebuggingValue())); |
62 return dict; | 63 return dict; |
63 } | 64 } |
64 | 65 |
65 base::Value* NetLogQuicPacketRetransmittedCallback( | 66 base::Value* NetLogQuicPacketRetransmittedCallback( |
66 QuicPacketSequenceNumber old_sequence_number, | 67 QuicPacketSequenceNumber old_sequence_number, |
67 QuicPacketSequenceNumber new_sequence_number, | 68 QuicPacketSequenceNumber new_sequence_number, |
68 NetLog::LogLevel /* log_level */) { | 69 NetLog::LogLevel /* log_level */) { |
69 base::DictionaryValue* dict = new base::DictionaryValue(); | 70 base::DictionaryValue* dict = new base::DictionaryValue(); |
70 dict->SetString("old_packet_sequence_number", | 71 dict->SetString("old_packet_sequence_number", |
71 base::Uint64ToString(old_sequence_number)); | 72 base::Uint64ToString(old_sequence_number)); |
72 dict->SetString("new_packet_sequence_number", | 73 dict->SetString("new_packet_sequence_number", |
73 base::Uint64ToString(new_sequence_number)); | 74 base::Uint64ToString(new_sequence_number)); |
74 return dict; | 75 return dict; |
75 } | 76 } |
76 | 77 |
77 base::Value* NetLogQuicPacketHeaderCallback(const QuicPacketHeader* header, | 78 base::Value* NetLogQuicPacketHeaderCallback(const QuicPacketHeader* header, |
78 NetLog::LogLevel /* log_level */) { | 79 NetLog::LogLevel /* log_level */) { |
79 base::DictionaryValue* dict = new base::DictionaryValue(); | 80 base::DictionaryValue* dict = new base::DictionaryValue(); |
80 dict->SetString("connection_id", | 81 dict->SetString("connection_id", |
81 base::Uint64ToString(header->public_header.connection_id)); | 82 base::Uint64ToString(header->public_header.connection_id)); |
82 dict->SetInteger("reset_flag", header->public_header.reset_flag); | 83 dict->SetInteger("reset_flag", header->public_header.reset_flag); |
83 dict->SetInteger("version_flag", header->public_header.version_flag); | 84 dict->SetInteger("version_flag", header->public_header.version_flag); |
84 dict->SetString("packet_sequence_number", | 85 dict->SetString("packet_sequence_number", |
85 base::Uint64ToString(header->packet_sequence_number)); | 86 base::Uint64ToString(header->packet_sequence_number)); |
86 dict->SetInteger("entropy_flag", header->entropy_flag); | 87 dict->SetInteger("entropy_flag", header->entropy_flag); |
87 dict->SetInteger("fec_flag", header->fec_flag); | 88 dict->SetInteger("fec_flag", header->fec_flag); |
88 dict->SetInteger("fec_group", header->fec_group); | 89 dict->SetInteger("fec_group", static_cast<int>(header->fec_group)); |
89 return dict; | 90 return dict; |
90 } | 91 } |
91 | 92 |
92 base::Value* NetLogQuicStreamFrameCallback(const QuicStreamFrame* frame, | 93 base::Value* NetLogQuicStreamFrameCallback(const QuicStreamFrame* frame, |
93 NetLog::LogLevel /* log_level */) { | 94 NetLog::LogLevel /* log_level */) { |
94 base::DictionaryValue* dict = new base::DictionaryValue(); | 95 base::DictionaryValue* dict = new base::DictionaryValue(); |
95 dict->SetInteger("stream_id", frame->stream_id); | 96 dict->SetInteger("stream_id", frame->stream_id); |
96 dict->SetBoolean("fin", frame->fin); | 97 dict->SetBoolean("fin", frame->fin); |
97 dict->SetString("offset", base::Uint64ToString(frame->offset)); | 98 dict->SetString("offset", base::Uint64ToString(frame->offset)); |
98 dict->SetInteger("length", frame->data.TotalBufferSize()); | 99 dict->SetInteger("length", frame->data.TotalBufferSize()); |
99 return dict; | 100 return dict; |
100 } | 101 } |
101 | 102 |
102 base::Value* NetLogQuicAckFrameCallback(const QuicAckFrame* frame, | 103 base::Value* NetLogQuicAckFrameCallback(const QuicAckFrame* frame, |
103 NetLog::LogLevel /* log_level */) { | 104 NetLog::LogLevel /* log_level */) { |
104 base::DictionaryValue* dict = new base::DictionaryValue(); | 105 base::DictionaryValue* dict = new base::DictionaryValue(); |
105 dict->SetString("largest_observed", | 106 dict->SetString("largest_observed", |
106 base::Uint64ToString(frame->largest_observed)); | 107 base::Uint64ToString(frame->largest_observed)); |
107 dict->SetInteger("delta_time_largest_observed_us", | 108 dict->SetInteger( |
108 frame->delta_time_largest_observed.ToMicroseconds()); | 109 "delta_time_largest_observed_us", |
| 110 static_cast<int>(frame->delta_time_largest_observed.ToMicroseconds())); |
109 dict->SetInteger("entropy_hash", | 111 dict->SetInteger("entropy_hash", |
110 frame->entropy_hash); | 112 frame->entropy_hash); |
111 dict->SetBoolean("truncated", frame->is_truncated); | 113 dict->SetBoolean("truncated", frame->is_truncated); |
112 | 114 |
113 base::ListValue* missing = new base::ListValue(); | 115 base::ListValue* missing = new base::ListValue(); |
114 dict->Set("missing_packets", missing); | 116 dict->Set("missing_packets", missing); |
115 const SequenceNumberSet& missing_packets = frame->missing_packets; | 117 const SequenceNumberSet& missing_packets = frame->missing_packets; |
116 for (SequenceNumberSet::const_iterator it = missing_packets.begin(); | 118 for (SequenceNumberSet::const_iterator it = missing_packets.begin(); |
117 it != missing_packets.end(); ++it) { | 119 it != missing_packets.end(); ++it) { |
118 missing->AppendString(base::Uint64ToString(*it)); | 120 missing->AppendString(base::Uint64ToString(*it)); |
119 } | 121 } |
120 | 122 |
121 base::ListValue* revived = new base::ListValue(); | 123 base::ListValue* revived = new base::ListValue(); |
122 dict->Set("revived_packets", revived); | 124 dict->Set("revived_packets", revived); |
123 const SequenceNumberSet& revived_packets = frame->revived_packets; | 125 const SequenceNumberSet& revived_packets = frame->revived_packets; |
124 for (SequenceNumberSet::const_iterator it = revived_packets.begin(); | 126 for (SequenceNumberSet::const_iterator it = revived_packets.begin(); |
125 it != revived_packets.end(); ++it) { | 127 it != revived_packets.end(); ++it) { |
126 revived->AppendString(base::Uint64ToString(*it)); | 128 revived->AppendString(base::Uint64ToString(*it)); |
127 } | 129 } |
128 | 130 |
129 base::ListValue* received = new base::ListValue(); | 131 base::ListValue* received = new base::ListValue(); |
130 dict->Set("received_packet_times", received); | 132 dict->Set("received_packet_times", received); |
131 const PacketTimeList& received_times = frame->received_packet_times; | 133 const PacketTimeList& received_times = frame->received_packet_times; |
132 for (PacketTimeList::const_iterator it = received_times.begin(); | 134 for (PacketTimeList::const_iterator it = received_times.begin(); |
133 it != received_times.end(); ++it) { | 135 it != received_times.end(); ++it) { |
134 base::DictionaryValue* info = new base::DictionaryValue(); | 136 base::DictionaryValue* info = new base::DictionaryValue(); |
135 info->SetInteger("sequence_number", it->first); | 137 info->SetInteger("sequence_number", static_cast<int>(it->first)); |
136 info->SetInteger("received", it->second.ToDebuggingValue()); | 138 info->SetInteger("received", |
| 139 static_cast<int>(it->second.ToDebuggingValue())); |
137 received->Append(info); | 140 received->Append(info); |
138 } | 141 } |
139 | 142 |
140 return dict; | 143 return dict; |
141 } | 144 } |
142 | 145 |
143 base::Value* NetLogQuicCongestionFeedbackFrameCallback( | 146 base::Value* NetLogQuicCongestionFeedbackFrameCallback( |
144 const QuicCongestionFeedbackFrame* frame, | 147 const QuicCongestionFeedbackFrame* frame, |
145 NetLog::LogLevel /* log_level */) { | 148 NetLog::LogLevel /* log_level */) { |
146 base::DictionaryValue* dict = new base::DictionaryValue(); | 149 base::DictionaryValue* dict = new base::DictionaryValue(); |
147 switch (frame->type) { | 150 switch (frame->type) { |
148 case kTCP: | 151 case kTCP: |
149 dict->SetString("type", "TCP"); | 152 dict->SetString("type", "TCP"); |
150 dict->SetInteger("receive_window", frame->tcp.receive_window); | 153 dict->SetInteger("receive_window", |
| 154 static_cast<int>(frame->tcp.receive_window)); |
151 break; | 155 break; |
152 } | 156 } |
153 | 157 |
154 return dict; | 158 return dict; |
155 } | 159 } |
156 | 160 |
157 base::Value* NetLogQuicRstStreamFrameCallback( | 161 base::Value* NetLogQuicRstStreamFrameCallback( |
158 const QuicRstStreamFrame* frame, | 162 const QuicRstStreamFrame* frame, |
159 NetLog::LogLevel /* log_level */) { | 163 NetLog::LogLevel /* log_level */) { |
160 base::DictionaryValue* dict = new base::DictionaryValue(); | 164 base::DictionaryValue* dict = new base::DictionaryValue(); |
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
545 base::Bind(&NetLogQuicPacketHeaderCallback, &header)); | 549 base::Bind(&NetLogQuicPacketHeaderCallback, &header)); |
546 ++num_packets_received_; | 550 ++num_packets_received_; |
547 if (largest_received_packet_sequence_number_ < | 551 if (largest_received_packet_sequence_number_ < |
548 header.packet_sequence_number) { | 552 header.packet_sequence_number) { |
549 QuicPacketSequenceNumber delta = header.packet_sequence_number - | 553 QuicPacketSequenceNumber delta = header.packet_sequence_number - |
550 largest_received_packet_sequence_number_; | 554 largest_received_packet_sequence_number_; |
551 if (delta > 1) { | 555 if (delta > 1) { |
552 // There is a gap between the largest packet previously received and | 556 // There is a gap between the largest packet previously received and |
553 // the current packet. This indicates either loss, or out-of-order | 557 // the current packet. This indicates either loss, or out-of-order |
554 // delivery. | 558 // delivery. |
555 UMA_HISTOGRAM_COUNTS("Net.QuicSession.PacketGapReceived", delta - 1); | 559 UMA_HISTOGRAM_COUNTS("Net.QuicSession.PacketGapReceived", |
| 560 static_cast<base::HistogramBase::Sample>(delta - 1)); |
556 } | 561 } |
557 largest_received_packet_sequence_number_ = header.packet_sequence_number; | 562 largest_received_packet_sequence_number_ = header.packet_sequence_number; |
558 } | 563 } |
559 if (header.packet_sequence_number < received_packets_.size()) | 564 if (header.packet_sequence_number < received_packets_.size()) { |
560 received_packets_[header.packet_sequence_number] = true; | 565 received_packets_[static_cast<size_t>(header.packet_sequence_number)] = |
| 566 true; |
| 567 } |
561 if (header.packet_sequence_number < last_received_packet_sequence_number_) { | 568 if (header.packet_sequence_number < last_received_packet_sequence_number_) { |
562 ++num_out_of_order_received_packets_; | 569 ++num_out_of_order_received_packets_; |
563 UMA_HISTOGRAM_COUNTS("Net.QuicSession.OutOfOrderGapReceived", | 570 UMA_HISTOGRAM_COUNTS( |
564 last_received_packet_sequence_number_ - | 571 "Net.QuicSession.OutOfOrderGapReceived", |
565 header.packet_sequence_number); | 572 static_cast<base::HistogramBase::Sample>( |
| 573 last_received_packet_sequence_number_ - |
| 574 header.packet_sequence_number)); |
566 } | 575 } |
567 last_received_packet_sequence_number_ = header.packet_sequence_number; | 576 last_received_packet_sequence_number_ = header.packet_sequence_number; |
568 } | 577 } |
569 | 578 |
570 void QuicConnectionLogger::OnStreamFrame(const QuicStreamFrame& frame) { | 579 void QuicConnectionLogger::OnStreamFrame(const QuicStreamFrame& frame) { |
571 net_log_.AddEvent( | 580 net_log_.AddEvent( |
572 NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED, | 581 NetLog::TYPE_QUIC_SESSION_STREAM_FRAME_RECEIVED, |
573 base::Bind(&NetLogQuicStreamFrameCallback, &frame)); | 582 base::Bind(&NetLogQuicStreamFrameCallback, &frame)); |
574 } | 583 } |
575 | 584 |
576 void QuicConnectionLogger::OnAckFrame(const QuicAckFrame& frame) { | 585 void QuicConnectionLogger::OnAckFrame(const QuicAckFrame& frame) { |
577 net_log_.AddEvent( | 586 net_log_.AddEvent( |
578 NetLog::TYPE_QUIC_SESSION_ACK_FRAME_RECEIVED, | 587 NetLog::TYPE_QUIC_SESSION_ACK_FRAME_RECEIVED, |
579 base::Bind(&NetLogQuicAckFrameCallback, &frame)); | 588 base::Bind(&NetLogQuicAckFrameCallback, &frame)); |
580 | 589 |
581 const size_t kApproximateLargestSoloAckBytes = 100; | 590 const size_t kApproximateLargestSoloAckBytes = 100; |
582 if (last_received_packet_sequence_number_ < received_acks_.size() && | 591 if (last_received_packet_sequence_number_ < received_acks_.size() && |
583 last_received_packet_size_ < kApproximateLargestSoloAckBytes) | 592 last_received_packet_size_ < kApproximateLargestSoloAckBytes) { |
584 received_acks_[last_received_packet_sequence_number_] = true; | 593 received_acks_[static_cast<size_t>(last_received_packet_sequence_number_)] = |
| 594 true; |
| 595 } |
585 | 596 |
586 if (frame.is_truncated) | 597 if (frame.is_truncated) |
587 ++num_truncated_acks_received_; | 598 ++num_truncated_acks_received_; |
588 | 599 |
589 if (frame.missing_packets.empty()) | 600 if (frame.missing_packets.empty()) |
590 return; | 601 return; |
591 | 602 |
592 SequenceNumberSet missing_packets = frame.missing_packets; | 603 SequenceNumberSet missing_packets = frame.missing_packets; |
593 SequenceNumberSet::const_iterator it = missing_packets.lower_bound( | 604 SequenceNumberSet::const_iterator it = missing_packets.lower_bound( |
594 largest_received_missing_packet_sequence_number_); | 605 largest_received_missing_packet_sequence_number_); |
(...skipping 237 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
832 QuicPacketSequenceNumber divisor = largest_received_packet_sequence_number_; | 843 QuicPacketSequenceNumber divisor = largest_received_packet_sequence_number_; |
833 QuicPacketSequenceNumber numerator = divisor - num_packets_received_; | 844 QuicPacketSequenceNumber numerator = divisor - num_packets_received_; |
834 if (divisor < 100000) | 845 if (divisor < 100000) |
835 numerator *= 1000; | 846 numerator *= 1000; |
836 else | 847 else |
837 divisor /= 1000; | 848 divisor /= 1000; |
838 string prefix("Net.QuicSession.PacketLossRate_"); | 849 string prefix("Net.QuicSession.PacketLossRate_"); |
839 base::HistogramBase* histogram = base::Histogram::FactoryGet( | 850 base::HistogramBase* histogram = base::Histogram::FactoryGet( |
840 prefix + connection_description_, 1, 1000, 75, | 851 prefix + connection_description_, 1, 1000, 75, |
841 base::HistogramBase::kUmaTargetedHistogramFlag); | 852 base::HistogramBase::kUmaTargetedHistogramFlag); |
842 histogram->Add(numerator / divisor); | 853 histogram->Add(static_cast<base::HistogramBase::Sample>(numerator / divisor)); |
843 } | 854 } |
844 | 855 |
845 void QuicConnectionLogger::RecordLossHistograms() const { | 856 void QuicConnectionLogger::RecordLossHistograms() const { |
846 if (largest_received_packet_sequence_number_ == 0) | 857 if (largest_received_packet_sequence_number_ == 0) |
847 return; // Connection was never used. | 858 return; // Connection was never used. |
848 RecordAggregatePacketLossRate(); | 859 RecordAggregatePacketLossRate(); |
849 | 860 |
850 base::HistogramBase* is_not_ack_histogram = | 861 base::HistogramBase* is_not_ack_histogram = |
851 GetPacketSequenceNumberHistogram("IsNotAck_"); | 862 GetPacketSequenceNumberHistogram("IsNotAck_"); |
852 base::HistogramBase* is_an_ack_histogram = | 863 base::HistogramBase* is_an_ack_histogram = |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
908 continue; | 919 continue; |
909 } | 920 } |
910 // Record some overlapping patterns, to get a better picture, since this is | 921 // Record some overlapping patterns, to get a better picture, since this is |
911 // not very expensive. | 922 // not very expensive. |
912 if (i % 3 == 0) | 923 if (i % 3 == 0) |
913 six_packet_histogram->Add(recent_6_mask); | 924 six_packet_histogram->Add(recent_6_mask); |
914 } | 925 } |
915 } | 926 } |
916 | 927 |
917 } // namespace net | 928 } // namespace net |
OLD | NEW |