From 96663639fbc639f129f5a98537112be5152cf06f Mon Sep 17 00:00:00 2001 From: Ishank Arora Date: Tue, 16 Nov 2021 16:26:50 +0100 Subject: [PATCH 1/2] Add trace ID to middleware loggers --- changelog/unreleased/logger-traceid.md | 3 +++ internal/grpc/interceptors/appctx/appctx.go | 23 +++++++++++++++++++-- internal/http/interceptors/appctx/appctx.go | 12 ++++++++++- pkg/eosclient/eosbinary/eosbinary.go | 6 +++--- 4 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 changelog/unreleased/logger-traceid.md diff --git a/changelog/unreleased/logger-traceid.md b/changelog/unreleased/logger-traceid.md new file mode 100644 index 0000000000..6fb0b48f55 --- /dev/null +++ b/changelog/unreleased/logger-traceid.md @@ -0,0 +1,3 @@ +Enhancement: Add trace ID to middleware loggers + +https://github.com/cs3org/reva/pull/2286 \ No newline at end of file diff --git a/internal/grpc/interceptors/appctx/appctx.go b/internal/grpc/interceptors/appctx/appctx.go index 2ff8e92e59..1bb8238c46 100644 --- a/internal/grpc/interceptors/appctx/appctx.go +++ b/internal/grpc/interceptors/appctx/appctx.go @@ -22,14 +22,23 @@ import ( "context" "github.com/cs3org/reva/pkg/appctx" + rtrace "github.com/cs3org/reva/pkg/trace" "github.com/rs/zerolog" + "go.opentelemetry.io/otel/trace" "google.golang.org/grpc" ) // NewUnary returns a new unary interceptor that creates the application context. func NewUnary(log zerolog.Logger) grpc.UnaryServerInterceptor { interceptor := func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { - ctx = appctx.WithLogger(ctx, &log) + span := trace.SpanFromContext(ctx) + defer span.End() + if !span.SpanContext().HasTraceID() { + ctx, span = rtrace.Provider.Tracer("grpc").Start(ctx, "grpc unary") + } + + sub := log.With().Str("traceid", span.SpanContext().TraceID().String()).Logger() + ctx = appctx.WithLogger(ctx, &sub) res, err := handler(ctx, req) return res, err } @@ -40,7 +49,17 @@ func NewUnary(log zerolog.Logger) grpc.UnaryServerInterceptor { // that creates the application context. func NewStream(log zerolog.Logger) grpc.StreamServerInterceptor { interceptor := func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { - ctx := appctx.WithLogger(ss.Context(), &log) + ctx := ss.Context() + span := trace.SpanFromContext(ctx) + defer span.End() + + if !span.SpanContext().HasTraceID() { + ctx, span = rtrace.Provider.Tracer("grpc").Start(ctx, "grpc stream") + } + + sub := log.With().Str("traceid", span.SpanContext().TraceID().String()).Logger() + ctx = appctx.WithLogger(ctx, &sub) + wrapped := newWrappedServerStream(ctx, ss) err := handler(srv, wrapped) return err diff --git a/internal/http/interceptors/appctx/appctx.go b/internal/http/interceptors/appctx/appctx.go index b3277bf7f1..cbd5116fd2 100644 --- a/internal/http/interceptors/appctx/appctx.go +++ b/internal/http/interceptors/appctx/appctx.go @@ -25,7 +25,9 @@ import ( "net/http" "github.com/cs3org/reva/pkg/appctx" + rtrace "github.com/cs3org/reva/pkg/trace" "github.com/rs/zerolog" + "go.opentelemetry.io/otel/trace" ) // New returns a new HTTP middleware that stores the log @@ -40,7 +42,15 @@ func New(log zerolog.Logger) func(http.Handler) http.Handler { func handler(log zerolog.Logger, h http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ctx := appctx.WithLogger(r.Context(), &log) + ctx := r.Context() + span := trace.SpanFromContext(ctx) + defer span.End() + if !span.SpanContext().HasTraceID() { + ctx, span = rtrace.Provider.Tracer("grpc").Start(ctx, "grpc unary") + } + + sub := log.With().Str("traceid", span.SpanContext().TraceID().String()).Logger() + ctx = appctx.WithLogger(ctx, &sub) r = r.WithContext(ctx) h.ServeHTTP(w, r) }) diff --git a/pkg/eosclient/eosbinary/eosbinary.go b/pkg/eosclient/eosbinary/eosbinary.go index 582c4a63dd..41203ea75c 100644 --- a/pkg/eosclient/eosbinary/eosbinary.go +++ b/pkg/eosclient/eosbinary/eosbinary.go @@ -39,7 +39,7 @@ import ( "github.com/cs3org/reva/pkg/storage/utils/acl" "github.com/google/uuid" "github.com/pkg/errors" - "go.opencensus.io/trace" + "go.opentelemetry.io/otel/trace" ) const ( @@ -249,8 +249,8 @@ func (c *Client) executeEOS(ctx context.Context, cmdArgs []string, auth eosclien cmd.Args = append(cmd.Args, cmdArgs...) - trace := trace.FromContext(ctx).SpanContext().TraceID.String() - cmd.Args = append(cmd.Args, "--comment", trace) + span := trace.SpanFromContext(ctx) + cmd.Args = append(cmd.Args, "--comment", span.SpanContext().TraceID().String()) err := cmd.Run() From a57aaccc87c809de4fa549f27dd0e8d9483cfab9 Mon Sep 17 00:00:00 2001 From: Ishank Arora Date: Wed, 17 Nov 2021 09:17:09 +0100 Subject: [PATCH 2/2] Fix span name --- internal/http/interceptors/appctx/appctx.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/http/interceptors/appctx/appctx.go b/internal/http/interceptors/appctx/appctx.go index cbd5116fd2..9d34a78981 100644 --- a/internal/http/interceptors/appctx/appctx.go +++ b/internal/http/interceptors/appctx/appctx.go @@ -46,7 +46,7 @@ func handler(log zerolog.Logger, h http.Handler) http.Handler { span := trace.SpanFromContext(ctx) defer span.End() if !span.SpanContext().HasTraceID() { - ctx, span = rtrace.Provider.Tracer("grpc").Start(ctx, "grpc unary") + ctx, span = rtrace.Provider.Tracer("http").Start(ctx, "http interceptor") } sub := log.With().Str("traceid", span.SpanContext().TraceID().String()).Logger()