Files
opencloud/services/proxy/pkg/middleware/tracing.go
Jörn Friedrich Dreyer b07b5a1149 use plain pkg module
Signed-off-by: Jörn Friedrich Dreyer <jfd@butonic.de>
2025-01-13 16:42:19 +01:00

54 lines
1.3 KiB
Go

package middleware
import (
"fmt"
"net/http"
chimiddleware "github.com/go-chi/chi/v5/middleware"
pkgtrace "github.com/opencloud-eu/opencloud/pkg/tracing"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/trace"
)
// Tracer provides a middleware to start traces
func Tracer(tp trace.TracerProvider) func(next http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return &tracer{
next: next,
traceProvider: tp,
}
}
}
type tracer struct {
next http.Handler
traceProvider trace.TracerProvider
}
func (m tracer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
var (
ctx = r.Context()
span trace.Span
)
ctx = pkgtrace.Propagator.Extract(ctx, propagation.HeaderCarrier(r.Header))
tracer := m.traceProvider.Tracer("proxy")
spanOpts := []trace.SpanStartOption{
trace.WithSpanKind(trace.SpanKindServer),
}
ctx, span = tracer.Start(ctx, fmt.Sprintf("%s %v", r.Method, r.URL.Path), spanOpts...)
defer span.End()
span.SetAttributes(
attribute.KeyValue{
Key: "x-request-id",
Value: attribute.StringValue(chimiddleware.GetReqID(r.Context())),
})
pkgtrace.Propagator.Inject(ctx, propagation.HeaderCarrier(r.Header))
m.next.ServeHTTP(w, r.WithContext(ctx))
}