From 662f0a0bc2f16ce544097602abb88130b371481c Mon Sep 17 00:00:00 2001 From: fmyAgi7 Date: Fri, 13 Feb 2026 17:31:36 +0800 Subject: [PATCH 1/4] feat: add tracing information to log events --- log/impl.log.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/log/impl.log.go b/log/impl.log.go index 66c4001b..5c8ec5e1 100644 --- a/log/impl.log.go +++ b/log/impl.log.go @@ -8,9 +8,16 @@ import ( "github.com/pubgo/funk/errors" "github.com/pubgo/funk/stack" "github.com/rs/zerolog" + "go.opentelemetry.io/otel/trace" "google.golang.org/protobuf/encoding/prototext" ) +const ( + traceIDKey = "trace_id" + spanIDKey = "span_id" + traceFlagsKey = "trace_flags" +) + var _ Logger = (*loggerImpl)(nil) type loggerImpl struct { @@ -142,7 +149,7 @@ func (l *loggerImpl) Err(err error, ctxL ...context.Context) *zerolog.Event { return nil } - var fn = func(e *zerolog.Event) { + fn := func(e *zerolog.Event) { if id := errors.GetErrorId(err); id != "" { e.Str("error_id", id) } @@ -219,6 +226,14 @@ func (l *loggerImpl) newEvent(ctx context.Context, e *zerolog.Event) *zerolog.Ev if ctx != nil { ctx = createFieldCtx(ctx, l.fields) e = e.Ctx(ctx) + + span := trace.SpanFromContext(ctx) + spanCtx := span.SpanContext() + if spanCtx.IsValid() { + e.Any(spanIDKey, spanCtx.SpanID()) + e.Any(traceIDKey, spanCtx.TraceID()) + e.Any(traceFlagsKey, spanCtx.TraceFlags()) + } } return mergeEvent(e, getEventFromCtx(ctx), l.content) From 65f5fd2044c5f0bd75f187be725a92d8193ae58e Mon Sep 17 00:00:00 2001 From: fmyAgi7 Date: Fri, 13 Feb 2026 18:02:31 +0800 Subject: [PATCH 2/4] feat: enhance logging with trace context information --- log/impl.log.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/log/impl.log.go b/log/impl.log.go index 5c8ec5e1..fef9d9b7 100644 --- a/log/impl.log.go +++ b/log/impl.log.go @@ -219,21 +219,21 @@ func (l *loggerImpl) newEvent(ctx context.Context, e *zerolog.Event) *zerolog.Ev e = e.CallerSkipFrame(l.callerSkip) } - if l.fields != nil && len(l.fields) > 0 { + if len(l.fields) > 0 { e = e.Fields(l.fields) } if ctx != nil { ctx = createFieldCtx(ctx, l.fields) e = e.Ctx(ctx) + } - span := trace.SpanFromContext(ctx) - spanCtx := span.SpanContext() - if spanCtx.IsValid() { - e.Any(spanIDKey, spanCtx.SpanID()) - e.Any(traceIDKey, spanCtx.TraceID()) - e.Any(traceFlagsKey, spanCtx.TraceFlags()) - } + span := trace.SpanFromContext(e.GetCtx()) + spanCtx := span.SpanContext() + if spanCtx.IsValid() { + e.Any(spanIDKey, spanCtx.SpanID()) + e.Any(traceIDKey, spanCtx.TraceID()) + e.Any(traceFlagsKey, spanCtx.TraceFlags()) } return mergeEvent(e, getEventFromCtx(ctx), l.content) From a51d6648f927f96066569d8b6f5a2d99523e96fb Mon Sep 17 00:00:00 2001 From: fmyAgi7 Date: Fri, 13 Feb 2026 18:03:40 +0800 Subject: [PATCH 3/4] feat: add OpenTelemetry trace package to dependencies --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 656a549a..3cee4f9b 100644 --- a/go.mod +++ b/go.mod @@ -49,6 +49,7 @@ require ( github.com/valyala/fasttemplate v1.2.2 go.etcd.io/bbolt v1.3.7 go.etcd.io/etcd/client/v3 v3.5.9 + go.opentelemetry.io/otel/trace v1.26.0 go.uber.org/atomic v1.10.0 golang.org/x/crypto v0.24.0 golang.org/x/exp v0.0.0-20230811145659-89c5cff77bcb @@ -142,7 +143,6 @@ require ( go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect go.opentelemetry.io/otel v1.26.0 // indirect go.opentelemetry.io/otel/metric v1.26.0 // indirect - go.opentelemetry.io/otel/trace v1.26.0 // indirect go.uber.org/multierr v1.6.0 // indirect go.uber.org/zap v1.17.0 // indirect golang.org/x/mod v0.17.0 // indirect From d021e0b5199124b3a3498a8e5e18d059bbe7bfc2 Mon Sep 17 00:00:00 2001 From: fmyAgi7 Date: Fri, 13 Feb 2026 18:05:26 +0800 Subject: [PATCH 4/4] feat: update logging to use string representation for trace context fields --- log/impl.log.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/log/impl.log.go b/log/impl.log.go index fef9d9b7..02cf3bc2 100644 --- a/log/impl.log.go +++ b/log/impl.log.go @@ -231,9 +231,9 @@ func (l *loggerImpl) newEvent(ctx context.Context, e *zerolog.Event) *zerolog.Ev span := trace.SpanFromContext(e.GetCtx()) spanCtx := span.SpanContext() if spanCtx.IsValid() { - e.Any(spanIDKey, spanCtx.SpanID()) - e.Any(traceIDKey, spanCtx.TraceID()) - e.Any(traceFlagsKey, spanCtx.TraceFlags()) + e.Str(spanIDKey, spanCtx.SpanID().String()) + e.Str(traceIDKey, spanCtx.TraceID().String()) + e.Str(traceFlagsKey, spanCtx.TraceFlags().String()) } return mergeEvent(e, getEventFromCtx(ctx), l.content)