Skip to content

Commit a16532d

Browse files
committed
TUN-8451: Log QUIC flow control frames and transport parameters received
1 parent 354a5bb commit a16532d

File tree

2 files changed

+65
-40
lines changed

2 files changed

+65
-40
lines changed

quic/metrics.go

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77

88
"github.com/prometheus/client_golang/prometheus"
99
"github.com/quic-go/quic-go/logging"
10+
"github.com/rs/zerolog"
1011
)
1112

1213
const (
@@ -18,6 +19,7 @@ var (
1819
clientMetrics = struct {
1920
totalConnections prometheus.Counter
2021
closedConnections prometheus.Counter
22+
maxUDPPayloadSize *prometheus.GaugeVec
2123
sentFrames *prometheus.CounterVec
2224
sentBytes *prometheus.CounterVec
2325
receivedFrames *prometheus.CounterVec
@@ -45,6 +47,15 @@ var (
4547
Help: "Number of connections that has been closed",
4648
},
4749
),
50+
maxUDPPayloadSize: prometheus.NewGaugeVec(
51+
prometheus.GaugeOpts{
52+
Namespace: namespace,
53+
Subsystem: "client",
54+
Name: "max_udp_payload",
55+
Help: "Maximum UDP payload size in bytes for a QUIC packet",
56+
},
57+
clientConnLabels,
58+
),
4859
sentFrames: prometheus.NewCounterVec(
4960
prometheus.CounterOpts{
5061
Namespace: namespace,
@@ -148,14 +159,16 @@ var (
148159
)
149160

150161
type clientCollector struct {
151-
index string
162+
index string
163+
logger *zerolog.Logger
152164
}
153165

154-
func newClientCollector(index uint8) *clientCollector {
166+
func newClientCollector(index string, logger *zerolog.Logger) *clientCollector {
155167
registerClient.Do(func() {
156168
prometheus.MustRegister(
157169
clientMetrics.totalConnections,
158170
clientMetrics.closedConnections,
171+
clientMetrics.maxUDPPayloadSize,
159172
clientMetrics.sentFrames,
160173
clientMetrics.sentBytes,
161174
clientMetrics.receivedFrames,
@@ -169,25 +182,32 @@ func newClientCollector(index uint8) *clientCollector {
169182
packetTooBigDropped,
170183
)
171184
})
185+
172186
return &clientCollector{
173-
index: uint8ToString(index),
187+
index: index,
188+
logger: logger,
174189
}
175190
}
176191

177192
func (cc *clientCollector) startedConnection() {
178193
clientMetrics.totalConnections.Inc()
179194
}
180195

181-
func (cc *clientCollector) closedConnection(err error) {
196+
func (cc *clientCollector) closedConnection(error) {
182197
clientMetrics.closedConnections.Inc()
183198
}
184199

200+
func (cc *clientCollector) receivedTransportParameters(params *logging.TransportParameters) {
201+
clientMetrics.maxUDPPayloadSize.WithLabelValues(cc.index).Set(float64(params.MaxUDPPayloadSize))
202+
cc.logger.Debug().Msgf("Received transport parameters: MaxUDPPayloadSize=%d, MaxIdleTimeout=%v, MaxDatagramFrameSize=%d", params.MaxUDPPayloadSize, params.MaxIdleTimeout, params.MaxDatagramFrameSize)
203+
}
204+
185205
func (cc *clientCollector) sentPackets(size logging.ByteCount, frames []logging.Frame) {
186-
cc.collectPackets(size, frames, clientMetrics.sentFrames, clientMetrics.sentBytes)
206+
cc.collectPackets(size, frames, clientMetrics.sentFrames, clientMetrics.sentBytes, sent)
187207
}
188208

189209
func (cc *clientCollector) receivedPackets(size logging.ByteCount, frames []logging.Frame) {
190-
cc.collectPackets(size, frames, clientMetrics.receivedFrames, clientMetrics.receivedBytes)
210+
cc.collectPackets(size, frames, clientMetrics.receivedFrames, clientMetrics.receivedBytes, received)
191211
}
192212

193213
func (cc *clientCollector) bufferedPackets(packetType logging.PacketType) {
@@ -212,8 +232,14 @@ func (cc *clientCollector) updatedRTT(rtt *logging.RTTStats) {
212232
clientMetrics.smoothedRTT.WithLabelValues(cc.index).Set(durationToPromGauge(rtt.SmoothedRTT()))
213233
}
214234

215-
func (cc *clientCollector) collectPackets(size logging.ByteCount, frames []logging.Frame, counter, bandwidth *prometheus.CounterVec) {
235+
func (cc *clientCollector) collectPackets(size logging.ByteCount, frames []logging.Frame, counter, bandwidth *prometheus.CounterVec, direction direction) {
216236
for _, frame := range frames {
237+
switch f := frame.(type) {
238+
case logging.DataBlockedFrame:
239+
cc.logger.Debug().Msgf("%s data_blocked frame", direction)
240+
case logging.StreamDataBlockedFrame:
241+
cc.logger.Debug().Int64("streamID", int64(f.StreamID)).Msgf("%s stream_data_blocked frame", direction)
242+
}
217243
counter.WithLabelValues(cc.index, frameName(frame)).Inc()
218244
}
219245
bandwidth.WithLabelValues(cc.index).Add(byteCountToPromCount(size))
@@ -227,3 +253,17 @@ func frameName(frame logging.Frame) string {
227253
return strings.TrimSuffix(name, "Frame")
228254
}
229255
}
256+
257+
type direction uint8
258+
259+
const (
260+
sent direction = iota
261+
received
262+
)
263+
264+
func (d direction) String() string {
265+
if d == sent {
266+
return "sent"
267+
}
268+
return "received"
269+
}

quic/tracing.go

Lines changed: 18 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,20 @@ import (
1010

1111
// QUICTracer is a wrapper to create new quicConnTracer
1212
type tracer struct {
13+
index string
1314
logger *zerolog.Logger
14-
config *tracerConfig
15-
}
16-
17-
type tracerConfig struct {
18-
index uint8
1915
}
2016

2117
func NewClientTracer(logger *zerolog.Logger, index uint8) func(context.Context, logging.Perspective, logging.ConnectionID) *logging.ConnectionTracer {
2218
t := &tracer{
19+
index: uint8ToString(index),
2320
logger: logger,
24-
config: &tracerConfig{
25-
index: index,
26-
},
2721
}
2822
return t.TracerForConnection
2923
}
3024

3125
func (t *tracer) TracerForConnection(_ctx context.Context, _p logging.Perspective, _odcid logging.ConnectionID) *logging.ConnectionTracer {
32-
return newConnTracer(newClientCollector(t.config.index))
26+
return newConnTracer(newClientCollector(t.index, t.logger))
3327
}
3428

3529
// connTracer collects connection level metrics
@@ -42,16 +36,17 @@ func newConnTracer(metricsCollector *clientCollector) *logging.ConnectionTracer
4236
metricsCollector: metricsCollector,
4337
}
4438
return &logging.ConnectionTracer{
45-
StartedConnection: tracer.StartedConnection,
46-
ClosedConnection: tracer.ClosedConnection,
47-
SentLongHeaderPacket: tracer.SentLongHeaderPacket,
48-
SentShortHeaderPacket: tracer.SentShortHeaderPacket,
49-
ReceivedLongHeaderPacket: tracer.ReceivedLongHeaderPacket,
50-
ReceivedShortHeaderPacket: tracer.ReceivedShortHeaderPacket,
51-
BufferedPacket: tracer.BufferedPacket,
52-
DroppedPacket: tracer.DroppedPacket,
53-
UpdatedMetrics: tracer.UpdatedMetrics,
54-
LostPacket: tracer.LostPacket,
39+
StartedConnection: tracer.StartedConnection,
40+
ClosedConnection: tracer.ClosedConnection,
41+
ReceivedTransportParameters: tracer.ReceivedTransportParameters,
42+
SentLongHeaderPacket: tracer.SentLongHeaderPacket,
43+
SentShortHeaderPacket: tracer.SentShortHeaderPacket,
44+
ReceivedLongHeaderPacket: tracer.ReceivedLongHeaderPacket,
45+
ReceivedShortHeaderPacket: tracer.ReceivedShortHeaderPacket,
46+
BufferedPacket: tracer.BufferedPacket,
47+
DroppedPacket: tracer.DroppedPacket,
48+
UpdatedMetrics: tracer.UpdatedMetrics,
49+
LostPacket: tracer.LostPacket,
5550
}
5651
}
5752

@@ -63,6 +58,10 @@ func (ct *connTracer) ClosedConnection(err error) {
6358
ct.metricsCollector.closedConnection(err)
6459
}
6560

61+
func (ct *connTracer) ReceivedTransportParameters(params *logging.TransportParameters) {
62+
ct.metricsCollector.receivedTransportParameters(params)
63+
}
64+
6665
func (ct *connTracer) BufferedPacket(pt logging.PacketType, size logging.ByteCount) {
6766
ct.metricsCollector.bufferedPackets(pt)
6867
}
@@ -94,17 +93,3 @@ func (ct *connTracer) ReceivedLongHeaderPacket(hdr *logging.ExtendedHeader, size
9493
func (ct *connTracer) ReceivedShortHeaderPacket(hdr *logging.ShortHeader, size logging.ByteCount, ecn logging.ECN, frames []logging.Frame) {
9594
ct.metricsCollector.receivedPackets(size, frames)
9695
}
97-
98-
type quicLogger struct {
99-
logger *zerolog.Logger
100-
connectionID string
101-
}
102-
103-
func (qt *quicLogger) Write(p []byte) (n int, err error) {
104-
qt.logger.Trace().Str("quicConnection", qt.connectionID).RawJSON("event", p).Msg("Quic event")
105-
return len(p), nil
106-
}
107-
108-
func (*quicLogger) Close() error {
109-
return nil
110-
}

0 commit comments

Comments
 (0)