Skip to content

Commit 60ee484

Browse files
authored
feat: qlog trace (#693)
# Description Support `YOMO_QLOG_TRACE=true` environment to enable `source/sfn` qlog trace. also, Close #688 , #687
1 parent 893a20a commit 60ee484

17 files changed

Lines changed: 685 additions & 61 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ node_modules/
2323
package-lock.json
2424

2525
*.log
26+
*.qlog
2627

2728
# tls generated files
2829
scripts/tls/

core/client.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ func NewClient(appName, zipperAddr string, clientType ClientType, opts ...Client
5050
for _, o := range opts {
5151
o(option)
5252
}
53+
54+
if qlogTraceEnabled() && option.quicConfig != nil {
55+
option.quicConfig.Tracer = qlogTracer
56+
}
57+
5358
clientID := id.New()
5459

5560
logger := option.logger

core/client_options.go

Lines changed: 41 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
11
package core
22

33
import (
4+
"context"
45
"crypto/tls"
6+
"fmt"
7+
"log"
8+
"os"
9+
"strings"
510
"time"
611

712
"github.com/quic-go/quic-go"
13+
"github.com/quic-go/quic-go/logging"
14+
"github.com/quic-go/quic-go/qlog"
815
"github.com/yomorun/yomo/core/auth"
916
"github.com/yomorun/yomo/core/frame"
1017
"github.com/yomorun/yomo/core/ylog"
@@ -28,27 +35,26 @@ type clientOptions struct {
2835
tracerProvider trace.TracerProvider
2936
}
3037

31-
func defaultClientOption() *clientOptions {
32-
logger := ylog.Default()
33-
34-
defaultQuicConfig := &quic.Config{
35-
Versions: []quic.VersionNumber{quic.Version1, quic.Version2},
36-
MaxIdleTimeout: time.Second * 40,
37-
KeepAlivePeriod: time.Second * 20,
38-
MaxIncomingStreams: 1000,
39-
MaxIncomingUniStreams: 1000,
40-
HandshakeIdleTimeout: time.Second * 3,
41-
InitialStreamReceiveWindow: 1024 * 1024 * 2,
42-
InitialConnectionReceiveWindow: 1024 * 1024 * 2,
43-
TokenStore: quic.NewLRUTokenStore(10, 5),
44-
}
38+
// DefaultClientQuicConfig be used when the `quicConfig` of client is nil.
39+
var DefaultClientQuicConfig = &quic.Config{
40+
Versions: []quic.VersionNumber{quic.Version1, quic.Version2},
41+
MaxIdleTimeout: time.Second * 40,
42+
KeepAlivePeriod: time.Second * 20,
43+
MaxIncomingStreams: 1000,
44+
MaxIncomingUniStreams: 1000,
45+
HandshakeIdleTimeout: time.Second * 3,
46+
InitialStreamReceiveWindow: 1024 * 1024 * 2,
47+
InitialConnectionReceiveWindow: 1024 * 1024 * 2,
48+
TokenStore: quic.NewLRUTokenStore(10, 5),
49+
}
4550

51+
func defaultClientOption() *clientOptions {
4652
opts := &clientOptions{
4753
observeDataTags: make([]frame.Tag, 0),
48-
quicConfig: defaultQuicConfig,
54+
quicConfig: DefaultClientQuicConfig,
4955
tlsConfig: pkgtls.MustCreateClientTLSConfig(),
5056
credential: auth.NewCredential(""),
51-
logger: logger,
57+
logger: ylog.Default(),
5258
}
5359

5460
return opts
@@ -104,3 +110,22 @@ func WithTracerProvider(tp trace.TracerProvider) ClientOption {
104110
o.tracerProvider = tp
105111
}
106112
}
113+
114+
// qlog helps developers to debug quic protocol.
115+
// See more: https://github.com/quic-go/quic-go?tab=readme-ov-file#quic-event-logging-using-qlog
116+
func qlogTraceEnabled() bool {
117+
return strings.ToLower(os.Getenv("YOMO_QLOG_TRACE")) == "true"
118+
}
119+
120+
func qlogTracer(ctx context.Context, p logging.Perspective, connID quic.ConnectionID) *logging.ConnectionTracer {
121+
role := "server"
122+
if p == logging.PerspectiveClient {
123+
role = "client"
124+
}
125+
filename := fmt.Sprintf("./log_%s_%s.qlog", connID, role)
126+
f, err := os.Create(filename)
127+
if err != nil {
128+
log.Fatalf("qlog trace error: %s\n", err)
129+
}
130+
return qlog.NewConnectionTracer(f, p, connID)
131+
}

core/client_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func TestFrameRoundTrip(t *testing.T) {
5050

5151
server := NewServer("zipper",
5252
WithAuth("token", "auth-token"),
53-
WithServerQuicConfig(DefalutQuicConfig),
53+
WithServerQuicConfig(DefaultQuicConfig),
5454
WithServerTLSConfig(nil),
5555
WithServerLogger(discardingLogger),
5656
WithConnMiddleware(ht.connMiddleware),
@@ -77,7 +77,7 @@ func TestFrameRoundTrip(t *testing.T) {
7777
testaddr,
7878
ClientTypeSource,
7979
WithCredential("token:auth-token"),
80-
WithClientQuicConfig(DefalutQuicConfig),
80+
WithClientQuicConfig(DefaultClientQuicConfig),
8181
WithClientTLSConfig(nil),
8282
WithLogger(discardingLogger),
8383
WithReConnect(),

core/server_options.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ import (
1111
"golang.org/x/exp/slog"
1212
)
1313

14-
// DefalutQuicConfig be used when `quicConfig` is nil.
15-
var DefalutQuicConfig = &quic.Config{
14+
// DefaultQuicConfig be used when `quicConfig` is nil.
15+
var DefaultQuicConfig = &quic.Config{
1616
Versions: []quic.VersionNumber{quic.Version1, quic.Version2},
1717
MaxIdleTimeout: time.Second * 5,
1818
KeepAlivePeriod: time.Second * 2,
@@ -42,7 +42,7 @@ func defaultServerOptions() *serverOptions {
4242
logger := ylog.Default()
4343

4444
opts := &serverOptions{
45-
quicConfig: DefalutQuicConfig,
45+
quicConfig: DefaultQuicConfig,
4646
tlsConfig: nil,
4747
auths: map[string]auth.Authentication{},
4848
logger: logger,

example/1-pipeline/go.mod

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ require github.com/yomorun/yomo v0.0.0
99
require (
1010
github.com/caarlos0/env/v6 v6.10.1 // indirect
1111
github.com/cenkalti/backoff/v4 v4.2.1 // indirect
12+
github.com/francoispqt/gojay v1.2.13 // indirect
1213
github.com/go-logr/logr v1.3.0 // indirect
1314
github.com/go-logr/stdr v1.2.2 // indirect
1415
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
@@ -18,7 +19,7 @@ require (
1819
github.com/matoous/go-nanoid/v2 v2.0.0 // indirect
1920
github.com/onsi/ginkgo/v2 v2.13.1 // indirect
2021
github.com/quic-go/qtls-go1-20 v0.4.1 // indirect
21-
github.com/quic-go/quic-go v0.40.0 // indirect
22+
github.com/quic-go/quic-go v0.40.1 // indirect
2223
github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect
2324
github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect
2425
github.com/yomorun/y3 v1.0.5 // indirect
@@ -33,10 +34,10 @@ require (
3334
golang.org/x/crypto v0.17.0 // indirect
3435
golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa // indirect
3536
golang.org/x/mod v0.14.0 // indirect
36-
golang.org/x/net v0.18.0 // indirect
37+
golang.org/x/net v0.19.0 // indirect
3738
golang.org/x/sys v0.15.0 // indirect
3839
golang.org/x/text v0.14.0 // indirect
39-
golang.org/x/tools v0.15.0 // indirect
40+
golang.org/x/tools v0.16.1 // indirect
4041
google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect
4142
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect
4243
google.golang.org/grpc v1.59.0 // indirect

0 commit comments

Comments
 (0)