package http import ( "net/http" "go.opentelemetry.io/otel/trace" "go.uber.org/zap" ) type LoggingMiddleware struct { logger *zap.Logger } func NewLoggingMiddleware(logger *zap.Logger) *LoggingMiddleware { return &LoggingMiddleware{ logger: logger, } } func (m *LoggingMiddleware) Handler(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { fields := []zap.Field{ zap.String("proto", r.Proto), zap.String("uri", r.RequestURI), zap.String("method", r.Method), zap.String("remote", r.RemoteAddr), zap.String("user-agent", r.UserAgent()), } spanCtx := trace.SpanContextFromContext(r.Context()) if spanCtx.HasTraceID() { fields = append(fields, zap.String("trace_id", spanCtx.TraceID().String())) } m.logger.Debug( "request started", fields..., ) next.ServeHTTP(w, r) }) }