diff --git a/pkg/middlewares/accesslog/logger.go b/pkg/middlewares/accesslog/logger.go index dec5b2900..e0c2582bc 100644 --- a/pkg/middlewares/accesslog/logger.go +++ b/pkg/middlewares/accesslog/logger.go @@ -24,6 +24,7 @@ import ( traefiktls "github.com/traefik/traefik/v3/pkg/tls" "github.com/traefik/traefik/v3/pkg/types" "go.opentelemetry.io/contrib/bridges/otellogrus" + "go.opentelemetry.io/otel/trace" ) type key string @@ -209,6 +210,12 @@ func (h *Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request, next http }, } + if span := trace.SpanFromContext(req.Context()); span != nil { + spanContext := span.SpanContext() + logDataTable.Core[TraceID] = spanContext.TraceID().String() + logDataTable.Core[SpanID] = spanContext.SpanID().String() + } + reqWithDataTable := req.WithContext(context.WithValue(req.Context(), DataTableKey, logDataTable)) core[RequestCount] = nextRequestCount() diff --git a/pkg/middlewares/accesslog/logger_test.go b/pkg/middlewares/accesslog/logger_test.go index 43cec0901..f7721966f 100644 --- a/pkg/middlewares/accesslog/logger_test.go +++ b/pkg/middlewares/accesslog/logger_test.go @@ -28,6 +28,7 @@ import ( "github.com/traefik/traefik/v3/pkg/types" "go.opentelemetry.io/collector/pdata/plog/plogotlp" "go.opentelemetry.io/otel/trace" + "go.opentelemetry.io/otel/trace/noop" ) const delta float64 = 1e-10 @@ -409,6 +410,8 @@ func TestLoggerJSON(t *testing.T) { "time": assertNotEmpty(), "StartLocal": assertNotEmpty(), "StartUTC": assertNotEmpty(), + TraceID: assertNotEmpty(), + SpanID: assertNotEmpty(), }, }, { @@ -452,6 +455,8 @@ func TestLoggerJSON(t *testing.T) { "time": assertNotEmpty(), StartLocal: assertNotEmpty(), StartUTC: assertNotEmpty(), + TraceID: assertNotEmpty(), + SpanID: assertNotEmpty(), }, }, { @@ -627,6 +632,8 @@ func TestLogger_AbortedRequest(t *testing.T) { "downstream_Content-Type": assertString("text/plain"), "downstream_Transfer-Encoding": assertString("chunked"), "downstream_Cache-Control": assertString("no-cache"), + TraceID: assertNotEmpty(), + SpanID: assertNotEmpty(), } config := &types.AccessLog{ @@ -945,6 +952,10 @@ func doLoggingTLSOpt(t *testing.T, config *types.AccessLog, enableTLS bool) { } } + tracer := noop.Tracer{} + spanCtx, _ := tracer.Start(req.Context(), "test") + req = req.WithContext(spanCtx) + chain := alice.New() chain = chain.Append(capture.Wrap) chain = chain.Append(WrapHandler(logger)) diff --git a/pkg/middlewares/observability/entrypoint.go b/pkg/middlewares/observability/entrypoint.go index 8b356b03b..64b89b921 100644 --- a/pkg/middlewares/observability/entrypoint.go +++ b/pkg/middlewares/observability/entrypoint.go @@ -8,7 +8,6 @@ import ( "github.com/containous/alice" "github.com/rs/zerolog/log" "github.com/traefik/traefik/v3/pkg/middlewares" - "github.com/traefik/traefik/v3/pkg/middlewares/accesslog" "github.com/traefik/traefik/v3/pkg/tracing" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace" @@ -63,12 +62,6 @@ func (e *entryPointTracing) ServeHTTP(rw http.ResponseWriter, req *http.Request) e.tracer.CaptureServerRequest(span, req) - if logData := accesslog.GetLogData(req); logData != nil { - spanContext := span.SpanContext() - logData.Core[accesslog.TraceID] = spanContext.TraceID().String() - logData.Core[accesslog.SpanID] = spanContext.SpanID().String() - } - recorder := newStatusCodeRecorder(rw, http.StatusOK) e.next.ServeHTTP(recorder, req) diff --git a/pkg/middlewares/observability/entrypoint_test.go b/pkg/middlewares/observability/entrypoint_test.go index 0b94f5fd5..d39d3b842 100644 --- a/pkg/middlewares/observability/entrypoint_test.go +++ b/pkg/middlewares/observability/entrypoint_test.go @@ -7,7 +7,6 @@ import ( "testing" "github.com/stretchr/testify/assert" - "github.com/traefik/traefik/v3/pkg/middlewares/accesslog" "github.com/traefik/traefik/v3/pkg/tracing" "go.opentelemetry.io/otel/attribute" ) @@ -79,27 +78,3 @@ func TestEntryPointMiddleware_tracing(t *testing.T) { }) } } - -func TestEntryPointMiddleware_tracingInfoIntoLog(t *testing.T) { - req := httptest.NewRequest(http.MethodGet, "http://www.test.com/", http.NoBody) - req = req.WithContext( - context.WithValue( - req.Context(), - accesslog.DataTableKey, - &accesslog.LogData{Core: accesslog.CoreLogData{}}, - ), - ) - - next := http.HandlerFunc(func(rw http.ResponseWriter, _ *http.Request) {}) - - tracer := &mockTracer{} - - handler := newEntryPoint(context.Background(), tracing.NewTracer(tracer, []string{}, []string{}, []string{}), "test", next) - handler.ServeHTTP(httptest.NewRecorder(), req) - - expectedSpanCtx := tracer.spans[0].SpanContext() - - logData := accesslog.GetLogData(req) - assert.Equal(t, expectedSpanCtx.TraceID().String(), logData.Core[accesslog.TraceID]) - assert.Equal(t, expectedSpanCtx.SpanID().String(), logData.Core[accesslog.SpanID]) -}