From 5e141694d8a6007324e830e11fb2fc2a72cf8e28 Mon Sep 17 00:00:00 2001 From: Trevor Atkinson Date: Mon, 5 Jan 2026 22:54:21 -0700 Subject: [PATCH] teapot logger server --- cmd/server/main.go | 9 +++++++-- database/migrate/module.go | 18 +++++++++--------- database/module.go | 4 ++-- gateway/interceptors/log.go | 10 +++++----- gateway/interceptors/module.go | 4 ++-- gateway/module.go | 22 +++++++++++----------- go.mod | 2 ++ go.sum | 4 ++++ internal/routes/grpc.go | 20 ++++++++++---------- internal/routes/module.go | 4 ++-- internal/tunnel/grpc.go | 18 +++++++++--------- internal/tunnel/module.go | 4 ++-- logging/module.go | 27 +++++++++++++++++++++++---- proxy/http.go | 18 +++++++++--------- sessions/module.go | 4 ++-- sessions/mux.go | 14 +++++++------- tunnel/gateway/interceptors/module.go | 4 ++-- tunnel/gateway/interceptors/stream.go | 16 ++++++++-------- tunnel/gateway/module.go | 13 +++++-------- tunnel/rpc/server/grpc.go | 14 +++++++------- tunnel/rpc/server/module.go | 4 ++-- tunnel/sessions/module.go | 4 ++-- tunnel/sessions/mux.go | 14 ++++++-------- 23 files changed, 138 insertions(+), 113 deletions(-) diff --git a/cmd/server/main.go b/cmd/server/main.go index fa70081..aea8f4d 100644 --- a/cmd/server/main.go +++ b/cmd/server/main.go @@ -1,7 +1,10 @@ package main import ( + "github.com/structx/teapot" + teafx "github.com/structx/teapot/adapter/fx" "go.uber.org/fx" + "go.uber.org/fx/fxevent" "soft.structx.io/dino/auth" "soft.structx.io/dino/database" "soft.structx.io/dino/database/migrate" @@ -22,8 +25,10 @@ import ( ) var opts = fx.Options( - setup.Module, // server config - logging.Module, // uber/zap logger + setup.Module, // server config + logging.Module, fx.WithLogger(func(l *teapot.Logger) fxevent.Logger { + return teafx.New(l) + }), database.Module, // pgx connector auth.Module, // jwt authenticator verifier.Module, // jwt verifier diff --git a/database/migrate/module.go b/database/migrate/module.go index f0961fc..932a544 100644 --- a/database/migrate/module.go +++ b/database/migrate/module.go @@ -8,8 +8,8 @@ import ( "github.com/golang-migrate/migrate/v4" pgx "github.com/golang-migrate/migrate/v4/database/pgx/v5" "github.com/golang-migrate/migrate/v4/source/iofs" + "github.com/structx/teapot" "go.uber.org/fx" - "go.uber.org/zap" "soft.structx.io/dino/setup" ) @@ -17,28 +17,28 @@ import ( type Params struct { fx.In - Logger *zap.Logger + Logger *teapot.Logger Cfg *setup.DB EmbedFS []embed.FS `group:"migrations"` } -type zapAdapter struct { - logger *zap.Logger +type teaAdapter struct { + logger *teapot.Logger } // Printf implements migrate.Logger. -func (z *zapAdapter) Printf(format string, v ...interface{}) { - z.logger.Info(format, zap.Any("v", v)) +func (t *teaAdapter) Printf(format string, v ...interface{}) { + t.logger.Info(format, teapot.Any("v", v)) } // Verbose implements migrate.Logger. -func (z *zapAdapter) Verbose() bool { +func (t *teaAdapter) Verbose() bool { return true } -var _ migrate.Logger = (*zapAdapter)(nil) +var _ migrate.Logger = (*teaAdapter)(nil) // Module var Module = fx.Module("database_migrate", fx.Invoke(invokeModule)) @@ -65,7 +65,7 @@ func invokeModule(p Params) error { return fmt.Errorf("migrate.NewWithInstance: %w", err) } - m.Log = &zapAdapter{logger: p.Logger.Named("go_migrate")} + m.Log = &teaAdapter{logger: p.Logger} if err := m.Up(); err != nil && !errors.Is(err, migrate.ErrNoChange) { return fmt.Errorf("m.Up: %w", err) diff --git a/database/module.go b/database/module.go index e10b998..c4131bd 100644 --- a/database/module.go +++ b/database/module.go @@ -7,8 +7,8 @@ import ( "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgconn" "github.com/jackc/pgx/v5/pgxpool" + "github.com/structx/teapot" "go.uber.org/fx" - "go.uber.org/zap" "soft.structx.io/dino/setup" ) @@ -34,7 +34,7 @@ type DBTX interface { type Params struct { fx.In - Logger *zap.Logger + Logger *teapot.Logger Lc fx.Lifecycle diff --git a/gateway/interceptors/log.go b/gateway/interceptors/log.go index 8b82bd7..568a7e4 100644 --- a/gateway/interceptors/log.go +++ b/gateway/interceptors/log.go @@ -3,25 +3,25 @@ package interceptors import ( "context" - "go.uber.org/zap" + "github.com/structx/teapot" "google.golang.org/grpc" "soft.structx.io/dino/gateway" ) type loggerInterceptor struct { - logger *zap.Logger + l *teapot.Logger } -func newLoggerInterceptor(logger *zap.Logger) *loggerInterceptor { +func newLoggerInterceptor(logger *teapot.Logger) *loggerInterceptor { return &loggerInterceptor{ - logger: logger.Named("logging_interceptor"), + l: logger, } } // UnaryInterceptor func (li *loggerInterceptor) UnaryInterceptor() gateway.UnaryInterceptor { return func(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) { - li.logger.Debug("gRPC handler", zap.String("full_method", info.FullMethod)) + li.l.Debug("gRPC handler", teapot.String("full_method", info.FullMethod)) resp, err = handler(ctx, req) if err != nil { return nil, err diff --git a/gateway/interceptors/module.go b/gateway/interceptors/module.go index d6a9b25..32d5248 100644 --- a/gateway/interceptors/module.go +++ b/gateway/interceptors/module.go @@ -1,8 +1,8 @@ package interceptors import ( + "github.com/structx/teapot" "go.uber.org/fx" - "go.uber.org/zap" "soft.structx.io/dino/gateway" ) @@ -10,7 +10,7 @@ import ( type Params struct { fx.In - Logger *zap.Logger + Logger *teapot.Logger } // Result diff --git a/gateway/module.go b/gateway/module.go index 780f667..3879181 100644 --- a/gateway/module.go +++ b/gateway/module.go @@ -8,15 +8,13 @@ import ( "net/http" "time" + "github.com/structx/teapot" "go.uber.org/fx" "go.uber.org/multierr" - "go.uber.org/zap" - "go.uber.org/zap/zapgrpc" "golang.org/x/net/http2" "golang.org/x/net/http2/h2c" "google.golang.org/grpc" "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" "google.golang.org/grpc/status" "soft.structx.io/dino/setup" @@ -58,7 +56,7 @@ type Params struct { Lc fx.Lifecycle - Logger *zap.Logger + Logger *teapot.Logger ServerConfig *setup.Server ProxyConfig *setup.Proxy @@ -78,7 +76,7 @@ func invokeModule(p Params) error { hostAndPort := net.JoinHostPort(p.ServerConfig.Host, p.ServerConfig.Port) - p.Logger.Info("num transports", zap.Int("len", len(p.Transports))) + p.Logger.Info("num transports", teapot.Int("len", len(p.Transports))) gs := grpc.NewServer() for _, tr := range p.Transports { @@ -88,8 +86,10 @@ func invokeModule(p Params) error { healthcheck := health.NewServer() healthpb.RegisterHealthServer(gs, healthcheck) - rpcLogger := zapgrpc.NewLogger(p.Logger) - grpclog.SetLoggerV2(rpcLogger) + // TODO + // implement teapot grpc adapter + // rpcLogger := zapgrpc.NewLogger(p.Logger) + // grpclog.SetLoggerV2(rpcLogger) mux := http.NewServeMux() mux.HandleFunc("/", p.Proxy.ServeHTTP) @@ -118,17 +118,17 @@ func invokeModule(p Params) error { p.Lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { - p.Logger.Info("start http/1 proxy server", zap.String("server_addr", h1.Addr)) + p.Logger.Info("start http/1 proxy server", teapot.String("server_addr", h1.Addr)) go func() { if err := h1.ListenAndServe(); err != nil && errors.Is(err, http.ErrServerClosed) { - p.Logger.Fatal("start http/1 proxy server", zap.Error(err)) + p.Logger.Fatal("start http/1 proxy server", teapot.Error(err)) } }() - p.Logger.Info("start hls server", zap.String("server_addr", hls.Addr)) + p.Logger.Info("start hls server", teapot.String("server_addr", hls.Addr)) go func() { if err := hls.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { - p.Logger.Fatal("unable to start hls server", zap.Error(err)) + p.Logger.Fatal("unable to start hls server", teapot.Error(err)) } }() diff --git a/go.mod b/go.mod index f2a31ea..8082014 100644 --- a/go.mod +++ b/go.mod @@ -16,6 +16,8 @@ require ( github.com/sethvargo/go-envconfig v1.3.0 github.com/spf13/cobra v1.10.2 github.com/stretchr/testify v1.11.1 + github.com/structx/teapot v0.0.2 + github.com/structx/teapot/adapter/fx v0.0.0-20260106030448-6f5af56058f3 go.uber.org/fx v1.24.0 go.uber.org/mock v0.6.0 go.uber.org/multierr v1.11.0 diff --git a/go.sum b/go.sum index 8d47f35..3b44341 100644 --- a/go.sum +++ b/go.sum @@ -88,6 +88,10 @@ github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UV github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/structx/teapot v0.0.2 h1:Hq2oxcuYuhUgsNP47PkETOxwO7EpkfB/0srt2ZtVVdc= +github.com/structx/teapot v0.0.2/go.mod h1:2Okp2a8rEEbRWxrEf9zwGPeafR6s9iUGOH6699wLVnY= +github.com/structx/teapot/adapter/fx v0.0.0-20260106030448-6f5af56058f3 h1:Gnvi0gvAOQVQHVH8dPxwH8OS5SF4+TnyByXpxIIlMGk= +github.com/structx/teapot/adapter/fx v0.0.0-20260106030448-6f5af56058f3/go.mod h1:shtQXZlyUJ3LWkvoFNYQbMI8GqV6HcQTRdvPV5JSvB8= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 h1:ssfIgGNANqpVFCndZvcuyKbl0g+UAVcbBcqGkG28H0Y= diff --git a/internal/routes/grpc.go b/internal/routes/grpc.go index ba9bbf6..695d90a 100644 --- a/internal/routes/grpc.go +++ b/internal/routes/grpc.go @@ -4,7 +4,7 @@ import ( "context" "time" - "go.uber.org/zap" + "github.com/structx/teapot" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/timestamppb" @@ -14,20 +14,20 @@ import ( type routeServer struct { pb.UnimplementedRouteServiceServer - log *zap.Logger + log *teapot.Logger svc Service } -func newRouteServer(logger *zap.Logger, routeService Service) pb.RouteServiceServer { +func newRouteServer(logger *teapot.Logger, routeService Service) pb.RouteServiceServer { return &routeServer{ - log: logger.Named("route_server"), + log: logger, svc: routeService, } } // CreateRoute func (rs *routeServer) CreateRoute(ctx context.Context, in *pb.CreateRouteRequest) (*pb.CreateRouteResponse, error) { - rs.log.Debug("CreateRoute", zap.Any("request", in)) + rs.log.Debug("CreateRoute", teapot.Any("request", in)) args := RouteCreate{ Tunnel: in.Create.Tunnel, Hostname: in.Create.Hostname, @@ -38,7 +38,7 @@ func (rs *routeServer) CreateRoute(ctx context.Context, in *pb.CreateRouteReques route, err := rs.svc.Create(ctx, args) if err != nil { - rs.log.Error("create route", zap.Error(err)) + rs.log.Error("create route", teapot.Error(err)) return nil, status.Error(codes.Internal, codes.Internal.String()) } @@ -49,7 +49,7 @@ func (rs *routeServer) CreateRoute(ctx context.Context, in *pb.CreateRouteReques func (rs *routeServer) DeleteRoute(ctx context.Context, in *pb.DeleteRouteRequest) (*pb.DeleteRouteResponse, error) { err := rs.svc.Delete(ctx, in.Hostname) if err != nil { - rs.log.Error("delete route", zap.Error(err)) + rs.log.Error("delete route", teapot.Error(err)) return nil, status.Error(codes.Internal, codes.Internal.String()) } return newDeleteRouteResponse(), nil @@ -63,7 +63,7 @@ func newDeleteRouteResponse() *pb.DeleteRouteResponse { func (rs *routeServer) GetRoute(ctx context.Context, in *pb.GetRouteRequest) (*pb.GetRouteResponse, error) { route, err := rs.svc.Get(ctx, in.Hostname) if err != nil { - rs.log.Error("get route", zap.Error(err)) + rs.log.Error("get route", teapot.Error(err)) return nil, status.Error(codes.Internal, codes.Internal.String()) } return newGetRouteResponse(route), nil @@ -77,7 +77,7 @@ func (rs *routeServer) ListRoutes(ctx context.Context, in *pb.ListRoutesRequest) Offset: in.Offset, }) if err != nil { - rs.log.Error("list routes", zap.Error(err)) + rs.log.Error("list routes", teapot.Error(err)) return nil, status.Error(codes.Internal, codes.Internal.String()) } return newListRoutesResponse(partials), err @@ -97,7 +97,7 @@ func (rs *routeServer) UpdateRoute(ctx context.Context, in *pb.UpdateRouteReques route, err := rs.svc.Update(ctx, args) if err != nil { - rs.log.Error("update route", zap.Error(err)) + rs.log.Error("update route", teapot.Error(err)) return nil, status.Error(codes.Internal, codes.Internal.String()) } diff --git a/internal/routes/module.go b/internal/routes/module.go index 3e3b1c8..0809751 100644 --- a/internal/routes/module.go +++ b/internal/routes/module.go @@ -1,8 +1,8 @@ package routes import ( + "github.com/structx/teapot" "go.uber.org/fx" - "go.uber.org/zap" "soft.structx.io/dino/database" "soft.structx.io/dino/gateway" pb "soft.structx.io/dino/pb/routes/v1" @@ -13,7 +13,7 @@ import ( type Params struct { fx.In - Logger *zap.Logger + Logger *teapot.Logger DBTX database.DBTX diff --git a/internal/tunnel/grpc.go b/internal/tunnel/grpc.go index 2d17dc8..08d3e67 100644 --- a/internal/tunnel/grpc.go +++ b/internal/tunnel/grpc.go @@ -3,7 +3,7 @@ package tunnel import ( "context" - "go.uber.org/zap" + "github.com/structx/teapot" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/emptypb" @@ -15,7 +15,7 @@ import ( type grpcServer struct { pb.UnimplementedTunnelServiceServer - l *zap.Logger + l *teapot.Logger s Service a auth.Authenticator } @@ -23,7 +23,7 @@ type grpcServer struct { // interface compliance var _ pb.TunnelServiceServer = (*grpcServer)(nil) -func newGrpcServer(logger *zap.Logger, tunnelService Service, auth auth.Authenticator) pb.TunnelServiceServer { +func newGrpcServer(logger *teapot.Logger, tunnelService Service, auth auth.Authenticator) pb.TunnelServiceServer { return &grpcServer{ l: logger, s: tunnelService, @@ -39,13 +39,13 @@ func (g *grpcServer) CreateTunnel(ctx context.Context, in *pb.CreateTunnelReques tunnel, sharedSecret, err := g.s.Create(ctx, args) if err != nil { - g.l.Error("create tunnel", zap.Error(err)) + g.l.Error("create tunnel", teapot.Error(err)) return nil, status.Error(codes.Internal, codes.Internal.String()) } token, err := g.a.GenerateJWT(tunnel.Name, tunnel.ID, sharedSecret.Secret) if err != nil { - g.l.Error("generate jwt", zap.Error(err)) + g.l.Error("generate jwt", teapot.Error(err)) return nil, status.Error(codes.Internal, codes.Internal.String()) } @@ -56,7 +56,7 @@ func (g *grpcServer) CreateTunnel(ctx context.Context, in *pb.CreateTunnelReques func (g *grpcServer) DeleteTunnel(ctx context.Context, in *pb.DeleteTunnelRequest) (*pb.DeleteTunnelResponse, error) { err := g.s.Delete(ctx, in.GetName()) if err != nil { - g.l.Error("delete tunnel", zap.Error(err)) + g.l.Error("delete tunnel", teapot.Error(err)) return nil, status.Error(codes.Internal, codes.Internal.String()) } return newDeleteTunnelResponse(), nil @@ -66,7 +66,7 @@ func (g *grpcServer) DeleteTunnel(ctx context.Context, in *pb.DeleteTunnelReques func (g *grpcServer) GetTunnel(ctx context.Context, in *pb.GetTunnelRequest) (*pb.GetTunnelResponse, error) { tunnel, err := g.s.Get(ctx, in.GetName()) if err != nil { - g.l.Error("get tunnel", zap.Error(err)) + g.l.Error("get tunnel", teapot.Error(err)) return nil, status.Error(codes.Internal, codes.Internal.String()) } return newGetTunnelReply(tunnel), nil @@ -76,7 +76,7 @@ func (g *grpcServer) GetTunnel(ctx context.Context, in *pb.GetTunnelRequest) (*p func (g *grpcServer) ListTunnels(ctx context.Context, in *pb.ListTunnelsRequest) (*pb.ListTunnelsResponse, error) { partials, err := g.s.List(ctx, in.Limit, in.Offset) if err != nil { - g.l.Error("list tunnels", zap.Error(err)) + g.l.Error("list tunnels", teapot.Error(err)) return nil, status.Error(codes.Internal, codes.Internal.String()) } return newListTunnelsReply(partials), nil @@ -90,7 +90,7 @@ func (g *grpcServer) UpdateTunnel(ctx context.Context, in *pb.UpdateTunnelReques } tunnel, err := g.s.Update(ctx, args) if err != nil { - g.l.Error("update tunnel", zap.Error(err)) + g.l.Error("update tunnel", teapot.Error(err)) return nil, status.Error(codes.Internal, codes.Internal.String()) } return newUpdateTunnelResponse(tunnel), nil diff --git a/internal/tunnel/module.go b/internal/tunnel/module.go index 5ad371a..3988d95 100644 --- a/internal/tunnel/module.go +++ b/internal/tunnel/module.go @@ -1,8 +1,8 @@ package tunnel import ( + "github.com/structx/teapot" "go.uber.org/fx" - "go.uber.org/zap" "soft.structx.io/dino/auth" "soft.structx.io/dino/database" "soft.structx.io/dino/gateway" @@ -13,7 +13,7 @@ import ( type Params struct { fx.In - Logger *zap.Logger + Logger *teapot.Logger DB database.DBTX diff --git a/logging/module.go b/logging/module.go index e611ebf..a09f1ea 100644 --- a/logging/module.go +++ b/logging/module.go @@ -1,8 +1,11 @@ package logging import ( + "os" + "strings" + + "github.com/structx/teapot" "go.uber.org/fx" - "go.uber.org/zap" "soft.structx.io/dino/setup" ) @@ -19,14 +22,30 @@ type Params struct { type Result struct { fx.Out - Logger *zap.Logger + Logger *teapot.Logger } // Module -var Module = fx.Module("zap_logger", fx.Provide(newModule)) +var Module = fx.Module("teapot_logger", fx.Provide(newModule)) func newModule(p Params) Result { - log, _ := zap.NewDevelopment() + + var level teapot.Level + switch strings.ToLower(p.Cfg.Level) { + case "fatal": + level = teapot.FATAL + case "error": + level = teapot.ERROR + case "info": + level = teapot.INFO + default: + level = teapot.DEBUG + } + + log := teapot.New( + teapot.WithLevel(level), + teapot.WithWriter(os.Stdout), + ) return Result{ Logger: log, } diff --git a/proxy/http.go b/proxy/http.go index 1ab795a..d9b3963 100644 --- a/proxy/http.go +++ b/proxy/http.go @@ -6,8 +6,8 @@ import ( "net/http" "sync" + "github.com/structx/teapot" "go.uber.org/fx" - "go.uber.org/zap" "soft.structx.io/dino/internal/routes" "soft.structx.io/dino/sessions" ) @@ -21,7 +21,7 @@ type Handler interface { type Params struct { fx.In - Logger *zap.Logger + Logger *teapot.Logger Mux sessions.Multiplexer @@ -36,7 +36,7 @@ type Result struct { } type handler struct { - log *zap.Logger + log *teapot.Logger routeSvc routes.Service @@ -77,14 +77,14 @@ func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { host, _, err := net.SplitHostPort(hostname) if err != nil { - h.log.Error("split host and port", zap.Error(err)) + h.log.Error("split host and port", teapot.Error(err)) http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest) return } activeUID, err := h.routeSvc.Active(ctx, host) if err != nil { - h.log.Error("active route", zap.Error(err)) + h.log.Error("active route", teapot.Error(err)) http.Error(w, http.StatusText(http.StatusNotFound), http.StatusNotFound) return } @@ -99,7 +99,7 @@ func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { // hijack end user connection conn, buf, err := hijacker.Hijack() if err != nil { - h.log.Error("hijacker.Hijack", zap.Error(err)) + h.log.Error("hijacker.Hijack", teapot.Error(err)) http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) return } @@ -114,7 +114,7 @@ func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { defer cleanup() if err := r.Write(wc); err != nil { - h.log.Error("r.Write", zap.Error(err)) + h.log.Error("r.Write", teapot.Error(err)) http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) return } @@ -126,7 +126,7 @@ func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { defer wg.Done() go func() { if _, err := io.Copy(wc, buf); err != nil { - h.log.Error("io.Copy", zap.Error(err)) + h.log.Error("io.Copy", teapot.Error(err)) http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) return } @@ -136,7 +136,7 @@ func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { go func() { defer wg.Done() if _, err := io.Copy(conn, rc); err != nil { - h.log.Error("io.Copy", zap.Error(err)) + h.log.Error("io.Copy", teapot.Error(err)) http.Error(w, http.StatusText(http.StatusInternalServerError), http.StatusInternalServerError) return } diff --git a/sessions/module.go b/sessions/module.go index cd4453d..1b928b8 100644 --- a/sessions/module.go +++ b/sessions/module.go @@ -1,8 +1,8 @@ package sessions import ( + "github.com/structx/teapot" "go.uber.org/fx" - "go.uber.org/zap" "soft.structx.io/dino/internal/routes" "soft.structx.io/dino/internal/tunnel" "soft.structx.io/dino/pubsub" @@ -14,7 +14,7 @@ type Params struct { Lc fx.Lifecycle - Logger *zap.Logger + Logger *teapot.Logger TunnelService tunnel.Service `name:"tunnel_service"` RouteService routes.Service diff --git a/sessions/mux.go b/sessions/mux.go index 83a24ba..aebe79a 100644 --- a/sessions/mux.go +++ b/sessions/mux.go @@ -7,7 +7,7 @@ import ( "fmt" "sync" - "go.uber.org/zap" + "github.com/structx/teapot" "soft.structx.io/dino/internal/routes" "soft.structx.io/dino/internal/tunnel" "soft.structx.io/dino/pubsub" @@ -30,7 +30,7 @@ type sessionMultiplexer struct { ctx context.Context cancelFn context.CancelFunc - log *zap.Logger + log *teapot.Logger mtx sync.Mutex tunnels map[string]*activeTunnel @@ -42,7 +42,7 @@ type sessionMultiplexer struct { } func newMux( - logger *zap.Logger, + logger *teapot.Logger, broker pubsub.Broker, tsvc tunnel.Service, rsvc routes.Service, @@ -89,13 +89,13 @@ func (m *sessionMultiplexer) UnarySession(ctx context.Context, tunnelUID string) session := tunnel.registerSession() err := session.openConn() if err != nil { - m.log.Error("open session connection", zap.Error(err)) + m.log.Error("open session connection", teapot.Error(err)) return nil, nil, nil, false } cleanup := func() { if err := tunnel.deregisterSession(session.sessionID); err != nil { - m.log.Error("deregister session", zap.Error(err)) + m.log.Error("deregister session", teapot.Error(err)) } } @@ -158,7 +158,7 @@ func (m *sessionMultiplexer) subscription(ch chan string) { case msg := <-ch: rcfg, err := decodeMessge(msg) if err != nil { - m.log.Error("decode route config", zap.Error(err)) + m.log.Error("decode route config", teapot.Error(err)) continue } @@ -176,7 +176,7 @@ func (m *sessionMultiplexer) subscription(ch chan string) { IsDelete: rcfg.IsDelete, }, }); err != nil { - m.log.Error("write route config", zap.Error(err)) + m.log.Error("write route config", teapot.Error(err)) } } } diff --git a/tunnel/gateway/interceptors/module.go b/tunnel/gateway/interceptors/module.go index 533503e..85135d7 100644 --- a/tunnel/gateway/interceptors/module.go +++ b/tunnel/gateway/interceptors/module.go @@ -1,8 +1,8 @@ package interceptors import ( + "github.com/structx/teapot" "go.uber.org/fx" - "go.uber.org/zap" "soft.structx.io/dino/tunnel/gateway" "soft.structx.io/dino/tunnel/verifier" ) @@ -11,7 +11,7 @@ import ( type Params struct { fx.In - Logger *zap.Logger + Logger *teapot.Logger Verifier verifier.Verifier } diff --git a/tunnel/gateway/interceptors/stream.go b/tunnel/gateway/interceptors/stream.go index d364ba3..a9139eb 100644 --- a/tunnel/gateway/interceptors/stream.go +++ b/tunnel/gateway/interceptors/stream.go @@ -1,7 +1,7 @@ package interceptors import ( - "go.uber.org/zap" + "github.com/structx/teapot" "google.golang.org/grpc/metadata" "soft.structx.io/dino/gateway" tunnelgateway "soft.structx.io/dino/tunnel/gateway" @@ -14,22 +14,22 @@ const ( ) type serverInterceptor struct { - l *zap.Logger + l *teapot.Logger v verifier.Verifier } type wrappedStream struct { gateway.ServerStream - l *zap.Logger + l *teapot.Logger } -func newServerInterceptor(logger *zap.Logger, verifier verifier.Verifier) tunnelgateway.StreamServerInterceptor { +func newServerInterceptor(logger *teapot.Logger, verifier verifier.Verifier) tunnelgateway.StreamServerInterceptor { s := &serverInterceptor{l: logger, v: verifier} return s.StreamInterceptor } -func newWrappedStream(s gateway.ServerStream, logger *zap.Logger) gateway.ServerStream { +func newWrappedStream(s gateway.ServerStream, logger *teapot.Logger) gateway.ServerStream { return &wrappedStream{ l: logger, ServerStream: s, @@ -37,12 +37,12 @@ func newWrappedStream(s gateway.ServerStream, logger *zap.Logger) gateway.Server } func (w *wrappedStream) RecvMsg(m any) error { - w.l.Debug("recv msg", zap.Any("msg", m)) + w.l.Debug("recv msg", teapot.Any("msg", m)) return w.ServerStream.RecvMsg(m) } func (w *wrappedStream) SendMsg(m any) error { - w.l.Debug("send msg", zap.Any("msg", m)) + w.l.Debug("send msg", teapot.Any("msg", m)) return w.ServerStream.SendMsg(m) } @@ -71,7 +71,7 @@ func (si *serverInterceptor) StreamInterceptor(srv any, ss gateway.ServerStream, err := handler(srv, newWrappedStream(ss, si.l)) if err != nil { - si.l.Error("RPC failed with error", zap.Error(err)) + si.l.Error("RPC failed with error", teapot.Error(err)) } return err diff --git a/tunnel/gateway/module.go b/tunnel/gateway/module.go index d5ebaa8..07a5d2d 100644 --- a/tunnel/gateway/module.go +++ b/tunnel/gateway/module.go @@ -8,12 +8,10 @@ import ( "github.com/quic-go/quic-go" "github.com/quic-go/quic-go/qlog" + "github.com/structx/teapot" "go.uber.org/fx" "go.uber.org/multierr" - "go.uber.org/zap" - "go.uber.org/zap/zapgrpc" "google.golang.org/grpc" - "google.golang.org/grpc/grpclog" "soft.structx.io/dino/setup" "soft.structx.io/dino/tunnel/transport" ) @@ -33,7 +31,7 @@ type Params struct { Lc fx.Lifecycle - Logger *zap.Logger + Logger *teapot.Logger Cfg *setup.Server @@ -58,7 +56,7 @@ func invokeModule(p Params) error { s := grpc.NewServer() s.RegisterService(p.Transport.ServiceDesc, p.Transport.Service) - grpclog.SetLoggerV2(zapgrpc.NewLogger(p.Logger)) + // grpclog.SetLoggerV2(zapgrpc.NewLogger(p.Logger)) quicHostAndPort := net.JoinHostPort(p.Cfg.QuicHost, p.Cfg.QuicPort) quicListener, err := quic.ListenAddr(quicHostAndPort, tlsConfig, &quic.Config{ @@ -71,11 +69,10 @@ func invokeModule(p Params) error { p.Lc.Append(fx.Hook{ OnStart: func(ctx context.Context) error { - p.Logger.Info("start gRPC-QUIC server", zap.Any("server_addr", grpcQuicListener.Addr())) - p.Logger.Info("tls config", zap.Strings("next_protos", tlsConfig.NextProtos)) + p.Logger.Info("start gRPC-QUIC server", teapot.Any("server_addr", grpcQuicListener.Addr())) go func() { if err := s.Serve(grpcQuicListener); err != nil { - p.Logger.Fatal("unable to start gRPC-QUIC server", zap.Error(err)) + p.Logger.Fatal("unable to start gRPC-QUIC server", teapot.Error(err)) } }() return nil diff --git a/tunnel/rpc/server/grpc.go b/tunnel/rpc/server/grpc.go index 49f25c7..58a92cd 100644 --- a/tunnel/rpc/server/grpc.go +++ b/tunnel/rpc/server/grpc.go @@ -5,7 +5,7 @@ import ( "fmt" "io" - "go.uber.org/zap" + "github.com/structx/teapot" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" @@ -124,7 +124,7 @@ func (t tunnelConn) Close(sessionID string) error { type reverseTunnelServer struct { pb.UnimplementedReverseTunnelServiceServer - log *zap.Logger + log *teapot.Logger mux sessions.Multiplexer verifier verifier.Verifier @@ -134,9 +134,9 @@ type reverseTunnelServer struct { var _ pb.ReverseTunnelServiceServer = (*reverseTunnelServer)(nil) var _ tunnelnet.Conn = (*tunnelConn)(nil) -func newReverseTunnelServer(logger *zap.Logger, sessionMux sessions.Multiplexer, verifier verifier.Verifier) pb.ReverseTunnelServiceServer { +func newReverseTunnelServer(logger *teapot.Logger, sessionMux sessions.Multiplexer, verifier verifier.Verifier) pb.ReverseTunnelServiceServer { return &reverseTunnelServer{ - log: logger.Named("rtunnel_server"), + log: logger, mux: sessionMux, verifier: verifier, } @@ -167,18 +167,18 @@ func (rts *reverseTunnelServer) EstablishTunnel(stream grpc.BidiStreamingServer[ claims, err := rts.verifier.VerifyToken(ctx, ids[0], authorizations[0]) if err != nil { - rts.log.Error("failed to verify token", zap.Error(err)) + rts.log.Error("failed to verify token", teapot.Error(err)) return status.Error(codes.Unauthenticated, codes.Unauthenticated.String()) } tc := tunnelConn{str: stream} if err := rts.mux.RegisterTunnel(ctx, tc, claims.ID); err != nil { - rts.log.Error("sessionManager.RegisterTunnel", zap.Error(err)) + rts.log.Error("sessionManager.RegisterTunnel", teapot.Error(err)) return status.Error(codes.Internal, codes.Internal.String()) } if err := rts.mux.SyncRoutes(ctx, ids[0]); err != nil { - rts.log.Error("session manager sync routes", zap.Error(err)) + rts.log.Error("session manager sync routes", teapot.Error(err)) return status.Error(codes.Internal, codes.Internal.String()) } diff --git a/tunnel/rpc/server/module.go b/tunnel/rpc/server/module.go index 5f683df..4beb626 100644 --- a/tunnel/rpc/server/module.go +++ b/tunnel/rpc/server/module.go @@ -1,8 +1,8 @@ package server import ( + "github.com/structx/teapot" "go.uber.org/fx" - "go.uber.org/zap" pb "soft.structx.io/dino/pb/rtunnel/v1" "soft.structx.io/dino/sessions" "soft.structx.io/dino/tunnel/gateway" @@ -13,7 +13,7 @@ import ( type Params struct { fx.In - Logger *zap.Logger + Logger *teapot.Logger Mux sessions.Multiplexer Verifier verifier.Verifier diff --git a/tunnel/sessions/module.go b/tunnel/sessions/module.go index 69599af..c0d4e9a 100644 --- a/tunnel/sessions/module.go +++ b/tunnel/sessions/module.go @@ -1,8 +1,8 @@ package sessions import ( + "github.com/structx/teapot" "go.uber.org/fx" - "go.uber.org/zap" ) // Params @@ -11,7 +11,7 @@ type Params struct { Lc fx.Lifecycle - Logger *zap.Logger + Logger *teapot.Logger } // Result diff --git a/tunnel/sessions/mux.go b/tunnel/sessions/mux.go index 6961932..ea33ad7 100644 --- a/tunnel/sessions/mux.go +++ b/tunnel/sessions/mux.go @@ -9,8 +9,8 @@ import ( "net/netip" "sync" + "github.com/structx/teapot" "go.uber.org/multierr" - "go.uber.org/zap" tunnelnet "soft.structx.io/dino/tunnel/net" ) @@ -67,7 +67,7 @@ type Mux interface { } type sessionMultiplexer struct { - log *zap.Logger + log *teapot.Logger mtx sync.RWMutex actors map[string]actor @@ -77,9 +77,9 @@ type sessionMultiplexer struct { // interface compliance var _ Mux = (*sessionMultiplexer)(nil) -func newMux(logger *zap.Logger) Mux { +func newMux(logger *teapot.Logger) Mux { return &sessionMultiplexer{ - log: logger.Named("session_multiplexer"), + log: logger, mtx: sync.RWMutex{}, errCh: make(chan error), actors: map[string]actor{}, @@ -158,7 +158,7 @@ func (s *sessionMultiplexer) InitSession(conn tunnelnet.Conn, sessionID, protoco Status: 1, }, }); err != nil { - s.log.Error("conn.Write", zap.Error(err)) + s.log.Error("conn.Write", teapot.Error(err)) } }, } @@ -175,8 +175,6 @@ func (s *sessionMultiplexer) start(_ context.Context) error { } func (s *sessionMultiplexer) stop(_ context.Context) error { - // TODO - // implement stop functionality var result error for _, a := range s.actors { if err := a.close(); err != nil { @@ -189,7 +187,7 @@ func (s *sessionMultiplexer) stop(_ context.Context) error { func (s *sessionMultiplexer) worker() { for err := range s.errCh { - s.log.Error("session error occurred", zap.Error(err)) + s.log.Error("session error occurred", teapot.Error(err)) } }