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