1 /* 2 * Copyright (c) Facebook, Inc. and its affiliates. 3 * 4 * This source code is licensed under the MIT license found in the 5 * LICENSE file in the root directory of this source tree. 6 * 7 */ 8 9 #pragma once 10 11 #include <glog/logging.h> 12 #include <quic/codec/Types.h> 13 #include <quic/state/QuicTransportStatsCallback.h> 14 #include "quic/QuicConstants.h" 15 #include "quic/QuicException.h" 16 17 namespace quic { 18 namespace samples { 19 class LogQuicStats : public quic::QuicTransportStatsCallback { 20 public: LogQuicStats(const std::string & prefix)21 explicit LogQuicStats(const std::string& prefix) : prefix_(prefix + " ") {} 22 23 ~LogQuicStats() override = default; 24 onPacketReceived()25 void onPacketReceived() override { 26 VLOG(2) << prefix_ << "onPacketReceived"; 27 } 28 onDuplicatedPacketReceived()29 void onDuplicatedPacketReceived() override { 30 VLOG(2) << prefix_ << "onDuplicatedPacketReceived"; 31 } 32 onOutOfOrderPacketReceived()33 void onOutOfOrderPacketReceived() override { 34 VLOG(2) << prefix_ << "onOutOfOrderPacketReceived"; 35 } 36 onPacketProcessed()37 void onPacketProcessed() override { 38 VLOG(2) << prefix_ << "onPacketProcessed"; 39 } 40 onPacketSent()41 void onPacketSent() override { 42 VLOG(2) << prefix_ << "onPacketSent"; 43 } 44 onPacketRetransmission()45 void onPacketRetransmission() override { 46 VLOG(2) << prefix_ << "onPacketRetransmission"; 47 } 48 onPacketLoss()49 void onPacketLoss() override { 50 VLOG(2) << prefix_ << "onPacketLoss"; 51 } 52 onPacketSpuriousLoss()53 void onPacketSpuriousLoss() override { 54 VLOG(2) << prefix_ << "onPacketSpuriousLoss"; 55 } 56 onPersistentCongestion()57 void onPersistentCongestion() override { 58 VLOG(2) << prefix_ << "onPersistentCongestion"; 59 } 60 onPacketDropped(PacketDropReason reason)61 void onPacketDropped(PacketDropReason reason) override { 62 VLOG(2) << prefix_ << "onPacketDropped reason=" << toString(reason); 63 } 64 onPacketForwarded()65 void onPacketForwarded() override { 66 VLOG(2) << prefix_ << "onPacketForwarded"; 67 } 68 onForwardedPacketReceived()69 void onForwardedPacketReceived() override { 70 VLOG(2) << prefix_ << "onForwardedPacketReceived"; 71 } 72 onForwardedPacketProcessed()73 void onForwardedPacketProcessed() override { 74 VLOG(2) << prefix_ << "onForwardedPacketProcessed"; 75 } 76 onClientInitialReceived(QuicVersion version)77 void onClientInitialReceived(QuicVersion version) override { 78 VLOG(2) << prefix_ 79 << "onClientInitialReceived, version: " << quic::toString(version); 80 } 81 onConnectionRateLimited()82 void onConnectionRateLimited() override { 83 VLOG(2) << prefix_ << "onConnectionRateLimited"; 84 } 85 86 // connection level metrics: onNewConnection()87 void onNewConnection() override { 88 VLOG(2) << prefix_ << "onNewConnection"; 89 } 90 91 void onConnectionClose( 92 folly::Optional<QuicErrorCode> code = folly::none) override { 93 VLOG(2) << prefix_ << "onConnectionClose reason=" 94 << quic::toString(code.value_or(LocalErrorCode::NO_ERROR)); 95 } 96 97 // stream level metrics onNewQuicStream()98 void onNewQuicStream() override { 99 VLOG(2) << prefix_ << "onNewQuicStream"; 100 } 101 onQuicStreamClosed()102 void onQuicStreamClosed() override { 103 VLOG(2) << prefix_ << "onQuicStreamClosed"; 104 } 105 onQuicStreamReset(QuicErrorCode code)106 void onQuicStreamReset(QuicErrorCode code) override { 107 VLOG(2) << prefix_ << "onQuicStreamReset reason=" << quic::toString(code); 108 } 109 110 // flow control / congestion control / loss recovery related metrics onConnFlowControlUpdate()111 void onConnFlowControlUpdate() override { 112 VLOG(2) << prefix_ << "onConnFlowControlUpdate"; 113 } 114 onConnFlowControlBlocked()115 void onConnFlowControlBlocked() override { 116 VLOG(2) << prefix_ << "onConnFlowControlBlocked"; 117 } 118 onStatelessReset()119 void onStatelessReset() override { 120 VLOG(2) << prefix_ << "onStatelessReset"; 121 } 122 onStreamFlowControlUpdate()123 void onStreamFlowControlUpdate() override { 124 VLOG(2) << prefix_ << "onStreamFlowControlUpdate"; 125 } 126 onStreamFlowControlBlocked()127 void onStreamFlowControlBlocked() override { 128 VLOG(2) << prefix_ << "onStreamFlowControlBlocked"; 129 } 130 onCwndBlocked()131 void onCwndBlocked() override { 132 VLOG(2) << prefix_ << "onCwndBlocked"; 133 } 134 onNewCongestionController(CongestionControlType type)135 void onNewCongestionController(CongestionControlType type) override { 136 VLOG(2) << prefix_ << "onNewCongestionController type=" 137 << congestionControlTypeToString(type); 138 } 139 140 // Probe timeout counter (aka loss timeout counter) onPTO()141 void onPTO() override { 142 VLOG(2) << prefix_ << "onPTO"; 143 } 144 145 // metrics to track bytes read from / written to wire onRead(size_t bufSize)146 void onRead(size_t bufSize) override { 147 VLOG(2) << prefix_ << "onRead size=" << bufSize; 148 } 149 onWrite(size_t bufSize)150 void onWrite(size_t bufSize) override { 151 VLOG(2) << prefix_ << "onWrite size=" << bufSize; 152 } 153 onUDPSocketWriteError(SocketErrorType errorType)154 void onUDPSocketWriteError(SocketErrorType errorType) override { 155 VLOG(2) << prefix_ 156 << "onUDPSocketWriteError errorType=" << toString(errorType); 157 } 158 onConnectionD6DStarted()159 void onConnectionD6DStarted() override { 160 VLOG(2) << prefix_ << "onConnectionD6DStarted"; 161 } 162 onConnectionPMTURaised()163 void onConnectionPMTURaised() override { 164 VLOG(2) << prefix_ << "onConnectionPMTURaised"; 165 } 166 onConnectionPMTUBlackholeDetected()167 void onConnectionPMTUBlackholeDetected() override { 168 VLOG(2) << prefix_ << "onConnectionPMTUBlackholeDetected"; 169 } 170 onConnectionPMTUUpperBoundDetected()171 void onConnectionPMTUUpperBoundDetected() override { 172 VLOG(2) << prefix_ << "onConnectionPMTUUpperBoundDetected"; 173 } 174 onTransportKnobApplied(TransportKnobType knobType)175 void onTransportKnobApplied(TransportKnobType knobType) override { 176 VLOG(2) << prefix_ 177 << "onTransportKnobApplied knobType=" << toString(knobType); 178 } 179 onTransportKnobError(TransportKnobType knobType)180 void onTransportKnobError(TransportKnobType knobType) override { 181 VLOG(2) << prefix_ 182 << "onTransportKnboError knobType=" << toString(knobType); 183 } 184 onServerUnfinishedHandshake()185 void onServerUnfinishedHandshake() override { 186 VLOG(2) << prefix_ << "onServerUnfinishedHandshake"; 187 } 188 onZeroRttBuffered()189 void onZeroRttBuffered() override { 190 VLOG(2) << prefix_ << "onZeroRttBuffered"; 191 } 192 onZeroRttBufferedPruned()193 void onZeroRttBufferedPruned() override { 194 VLOG(2) << prefix_ << "onZeroRttBufferedPruned"; 195 } 196 onZeroRttAccepted()197 void onZeroRttAccepted() override { 198 VLOG(2) << prefix_ << "onZeroRttAccepted"; 199 } 200 onZeroRttRejected()201 void onZeroRttRejected() override { 202 VLOG(2) << prefix_ << "onZeroRttRejected"; 203 } 204 205 private: 206 std::string prefix_; 207 }; 208 209 class LogQuicStatsFactory : public QuicTransportStatsCallbackFactory { 210 public: 211 ~LogQuicStatsFactory() override = default; 212 make()213 std::unique_ptr<QuicTransportStatsCallback> make() override { 214 return std::make_unique<LogQuicStats>("server"); 215 } 216 }; 217 218 } // namespace samples 219 } // namespace quic 220