From a830ba07581a4a57f7d88451720b668e69c68ed2 Mon Sep 17 00:00:00 2001 From: Mateusz Urbanek Date: Thu, 19 Oct 2023 20:03:58 +0200 Subject: [PATCH] feat: configure OTEL logger (#57) Signed-off-by: Mateusz Urbanek --- .github/PULL_REQUEST_TEMPLATE.md | 4 ++-- cmd/bootstrap/template/main.go.tpl | 2 +- endpoint.go | 16 ++++++++-------- gocosi.go | 17 +++++++++++------ grpc/handlers/handlers.go | 4 ++-- healthz.go | 2 +- {grpc => internal}/log/log.go | 12 ++++++++++-- options.go | 2 +- 8 files changed, 36 insertions(+), 23 deletions(-) rename {grpc => internal}/log/log.go (81%) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 62b2685..3347509 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,7 +1,7 @@ ## What this PR does / why we need it: diff --git a/cmd/bootstrap/template/main.go.tpl b/cmd/bootstrap/template/main.go.tpl index 3859fd4..d3b7152 100644 --- a/cmd/bootstrap/template/main.go.tpl +++ b/cmd/bootstrap/template/main.go.tpl @@ -47,7 +47,7 @@ func main() { gocosi.SetLogger(log) if err := realMain(context.Background()); err != nil { - log.Error(err, "critical failure") + log.Error(err, "Critical failure.") os.Exit(1) } } diff --git a/endpoint.go b/endpoint.go index 3599404..475ef0b 100644 --- a/endpoint.go +++ b/endpoint.go @@ -133,11 +133,11 @@ func (e *Endpoint) getCOSIEndpoint() { u, err := url.Parse(env) if err != nil { - log.Error(err, "failed to parse COSI Endpoint from environment") + log.Error(err, "Failed to parse COSI Endpoint from environment.") return } - log.V(8).Info("replacing default", EnvCOSIEndpoint, env) + log.V(8).Info("Replacing default.", EnvCOSIEndpoint, env) e.address = u } @@ -160,11 +160,11 @@ func (e *Endpoint) getCOSIEndpointUser() { } if err != nil { - log.Error(err, "failed to parse COSI Endpoint Permissions from environment") + log.Error(err, "Failed to parse COSI Endpoint Permissions from environment.") return } - log.V(8).Info("replacing default", EnvCOSIEndpointUser, env) + log.V(8).Info("Replacing default.", EnvCOSIEndpointUser, env) e.user = newUser } @@ -187,11 +187,11 @@ func (e *Endpoint) getCOSIEndpointGroup() { } if err != nil { - log.Error(err, "failed to parse COSI Endpoint Permissions from environment") + log.Error(err, "Failed to parse COSI Endpoint Permissions from environment.") return } - log.V(8).Info("replacing default", EnvCOSIEndpointGroup, env) + log.V(8).Info("Replacing default.", EnvCOSIEndpointGroup, env) e.group = newGroup } @@ -204,11 +204,11 @@ func (e *Endpoint) getCOSIEndpointPermissions() { perms, err := strconv.ParseInt(env, 0, 0) if err != nil { - log.Error(err, "failed to parse COSI Endpoint Permissions from environment") + log.Error(err, "Failed to parse COSI Endpoint Permissions from environment.") return } - log.V(8).Info("replacing default", EnvCOSIEndpointPerms, env) + log.V(8).Info("Replacing default.", EnvCOSIEndpointPerms, env) e.permissions = os.FileMode(perms) } diff --git a/gocosi.go b/gocosi.go index 53e78b3..a82ebbe 100644 --- a/gocosi.go +++ b/gocosi.go @@ -22,9 +22,11 @@ import ( "net/url" "time" + ilog "github.com/doomshrine/gocosi/internal/log" "github.com/doomshrine/must" "github.com/go-logr/logr" "github.com/hellofresh/health-go/v5" + "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/sdk/resource" "google.golang.org/grpc" cosi "sigs.k8s.io/container-object-storage-interface-spec" @@ -96,6 +98,9 @@ func New(identity cosi.IdentityServer, provisioner cosi.ProvisionerServer, res * // SetLogger is used to set the default global logger for the gocosi library. func SetLogger(l logr.Logger) { log = l + + otel.SetLogger(l) + otel.SetErrorHandler(&ilog.Logger{LoggerImpl: log}) } // Run starts the COSI driver and serves requests. @@ -115,7 +120,7 @@ func (d *Driver) Run(ctx context.Context) error { go shutdown(ctx, srv, d.server) - log.V(4).Info("starting driver", "address", lis.Addr()) + log.V(4).Info("Starting driver.", "address", lis.Addr()) err = srv.Serve(lis) if err != nil { @@ -126,9 +131,9 @@ func (d *Driver) Run(ctx context.Context) error { } func shutdown(ctx context.Context, g *grpc.Server, h *http.Server) { - log.V(8).Info("shutdown watcher started") + log.V(8).Info("Shutdown watcher started.") <-ctx.Done() - log.Info("starting shutdown") + log.Info("Starting shutdown.") if g != nil { go g.GracefulStop() @@ -141,18 +146,18 @@ func shutdown(ctx context.Context, g *grpc.Server, h *http.Server) { go func() { err := h.Shutdown(shutdownCtx) if err != nil { - log.Error(err, "error during HTTP server shutdown") + log.Error(err, "Error during HTTP server shutdown.") } }() } } func (d *Driver) serveHTTP() { - log.V(8).Info("http server started", "address", d.server.Addr) + log.V(8).Info("HTTP server started.", "address", d.server.Addr) err := d.server.ListenAndServe() if err != nil && !errors.Is(err, http.ErrServerClosed) { - log.Error(err, "failed to serve HTTP server", "address", d.server.Addr) + log.Error(err, "Failed to serve HTTP server.", "address", d.server.Addr) } } diff --git a/grpc/handlers/handlers.go b/grpc/handlers/handlers.go index 7dc9a4f..a30533e 100644 --- a/grpc/handlers/handlers.go +++ b/grpc/handlers/handlers.go @@ -19,7 +19,7 @@ import ( "context" "runtime/debug" - "github.com/doomshrine/gocosi/grpc/log" + "github.com/doomshrine/gocosi/internal/log" "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/recovery" ) @@ -35,7 +35,7 @@ func PanicRecovery(logger *log.Logger, callbacks ...func(context.Context)) recov if logger != nil { logger.Log(ctx, 0, - "recovered from panic", + "Recovered from panic.", "panic", p, "stack", debug.Stack()) } diff --git a/healthz.go b/healthz.go index a54a27e..c36b2b4 100644 --- a/healthz.go +++ b/healthz.go @@ -37,7 +37,7 @@ func HealthcheckFunc(ctx context.Context, addr string) error { return fmt.Errorf("unable to decode healthcheck response: %w", err) } - log.Info("healthcheck finished", + log.Info("Healthcheck finished.", "status", c.Status, "system", c.System, "failures", c.Failures, diff --git a/grpc/log/log.go b/internal/log/log.go similarity index 81% rename from grpc/log/log.go rename to internal/log/log.go index 8397bca..138cff5 100644 --- a/grpc/log/log.go +++ b/internal/log/log.go @@ -19,15 +19,23 @@ import ( "github.com/go-logr/logr" "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" + "go.opentelemetry.io/otel" ) type Logger struct { LoggerImpl logr.Logger } -// Interface guard. -var _ logging.Logger = (*Logger)(nil) +// Interface guards. +var ( + _ logging.Logger = (*Logger)(nil) + _ otel.ErrorHandler = (*Logger)(nil) +) func (l *Logger) Log(_ context.Context, level logging.Level, msg string, keysAndValues ...any) { l.LoggerImpl.V(int(level)).Info(msg, keysAndValues...) } + +func (l *Logger) Handle(err error) { + l.LoggerImpl.Error(err, "Caught error.") +} diff --git a/options.go b/options.go index 60f0459..6c984f4 100644 --- a/options.go +++ b/options.go @@ -23,7 +23,7 @@ import ( "os/user" grpchandlers "github.com/doomshrine/gocosi/grpc/handlers" - grpclog "github.com/doomshrine/gocosi/grpc/log" + grpclog "github.com/doomshrine/gocosi/internal/log" "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging" "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/recovery" "github.com/hellofresh/health-go/v5"