34 lines
745 B
Go
34 lines
745 B
Go
package middleware
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"go.opentelemetry.io/otel"
|
|
"go.opentelemetry.io/otel/propagation"
|
|
"go.opentelemetry.io/otel/trace"
|
|
)
|
|
|
|
func NewTracingMiddleware(tracer trace.Tracer) gin.HandlerFunc {
|
|
prop := otel.GetTextMapPropagator()
|
|
|
|
return func(c *gin.Context) {
|
|
savedCtx := c.Request.Context()
|
|
defer func() {
|
|
c.Request = c.Request.WithContext(savedCtx)
|
|
}()
|
|
|
|
ctx := prop.Extract(savedCtx, propagation.HeaderCarrier(c.Request.Header))
|
|
|
|
ctx, span := tracer.Start(ctx, fmt.Sprintf("%s %s", c.Request.Method, c.Request.URL.Path))
|
|
defer span.End()
|
|
|
|
traceId := span.SpanContext().TraceID()
|
|
c.Header("X-Trace-Id", traceId.String())
|
|
|
|
c.Request = c.Request.WithContext(ctx)
|
|
|
|
c.Next()
|
|
}
|
|
}
|