diff --git a/.circleci/config.yml b/.circleci/config.yml index 7cc9e9bc..ef312c85 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -41,8 +41,8 @@ jobs: name: "Run self integration tests with race detector" command: ginkgo -race -v -randomizeAllSpecs -trace integrationtests/self - run: - name: "Run self integration tests with qlog" - command: ginkgo -v -randomizeAllSpecs -trace integrationtests/self -- -qlog + name: "Run self integration tests with qlog and metrics" + command: ginkgo -v -randomizeAllSpecs -trace integrationtests/self -- -qlog -metrics go114: <<: *test interop-build: diff --git a/integrationtests/self/self_suite_test.go b/integrationtests/self/self_suite_test.go index 68f18f9a..8c58761b 100644 --- a/integrationtests/self/self_suite_test.go +++ b/integrationtests/self/self_suite_test.go @@ -22,6 +22,7 @@ import ( "github.com/lucas-clemente/quic-go" "github.com/lucas-clemente/quic-go/internal/utils" "github.com/lucas-clemente/quic-go/logging" + "github.com/lucas-clemente/quic-go/metrics" "github.com/lucas-clemente/quic-go/qlog" . "github.com/onsi/ginkgo" @@ -82,27 +83,16 @@ func (b *syncedBuffer) Reset() { } var ( - logFileName string // the log file set in the ginkgo flags - logBufOnce sync.Once - logBuf *syncedBuffer - enableQlog bool + logFileName string // the log file set in the ginkgo flags + logBufOnce sync.Once + logBuf *syncedBuffer + enableQlog bool + enableMetrics bool tlsConfig *tls.Config tlsConfigLongChain *tls.Config tlsClientConfig *tls.Config - - tracer = qlog.NewTracer(func(p logging.Perspective, connectionID []byte) io.WriteCloser { - role := "server" - if p == logging.PerspectiveClient { - role = "client" - } - filename := fmt.Sprintf("log_%x_%s.qlog", connectionID, role) - fmt.Fprintf(GinkgoWriter, "Creating %s.\n", filename) - f, err := os.Create(filename) - Expect(err).ToNot(HaveOccurred()) - bw := bufio.NewWriter(f) - return utils.NewBufferedWriteCloser(bw, f) - }) + tracer logging.Tracer ) // read the logfile command line flag @@ -110,6 +100,8 @@ var ( func init() { flag.StringVar(&logFileName, "logfile", "", "log file") flag.BoolVar(&enableQlog, "qlog", false, "enable qlog") + // metrics won't be accessible anywhere, but it's useful to exercise the code + flag.BoolVar(&enableMetrics, "metrics", false, "enable metrics") ca, caPrivateKey, err := generateCA() if err != nil { @@ -138,6 +130,33 @@ func init() { RootCAs: root, NextProtos: []string{alpn}, } + + var qlogTracer, metricsTracer logging.Tracer + if enableQlog { + qlogTracer = qlog.NewTracer(func(p logging.Perspective, connectionID []byte) io.WriteCloser { + role := "server" + if p == logging.PerspectiveClient { + role = "client" + } + filename := fmt.Sprintf("log_%x_%s.qlog", connectionID, role) + fmt.Fprintf(GinkgoWriter, "Creating %s.\n", filename) + f, err := os.Create(filename) + Expect(err).ToNot(HaveOccurred()) + bw := bufio.NewWriter(f) + return utils.NewBufferedWriteCloser(bw, f) + }) + } + if enableMetrics { + metricsTracer = metrics.NewTracer() + } + + if enableQlog && enableMetrics { + tracer = logging.NewMultiplexedTracer(qlogTracer, metricsTracer) + } else if enableQlog { + tracer = qlogTracer + } else if enableMetrics { + tracer = metricsTracer + } } func generateCA() (*x509.Certificate, *rsa.PrivateKey, error) { @@ -263,9 +282,6 @@ func getQuicConfig(conf *quic.Config) *quic.Config { } else { conf = conf.Clone() } - if !enableQlog { - return conf - } conf.Tracer = tracer return conf }