pomerium/internal/telemetry/trace/middleware.go
2024-12-04 03:38:08 +00:00

43 lines
1.2 KiB
Go

package trace
import (
"fmt"
"net/http"
"github.com/gorilla/mux"
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/propagation"
)
func NewHTTPMiddleware(opts ...otelhttp.Option) func(http.Handler) http.Handler {
return func(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
routeStr := ""
route := mux.CurrentRoute(r)
if route != nil {
var err error
routeStr, err = route.GetPathTemplate()
if err != nil {
routeStr, err = route.GetPathRegexp()
if err != nil {
routeStr = ""
}
}
}
traceparent := r.Header.Get("Traceparent")
if traceparent != "" {
xPomeriumTraceparent := r.Header.Get("X-Pomerium-Traceparent")
if xPomeriumTraceparent != "" {
sc, err := ParseTraceparent(xPomeriumTraceparent)
if err == nil {
r.Header.Set("Traceparent", ReplaceTraceID(traceparent, sc.TraceID()))
ctx := otel.GetTextMapPropagator().Extract(r.Context(), propagation.HeaderCarrier(r.Header))
r = r.WithContext(ctx)
}
}
}
otelhttp.NewHandler(next, fmt.Sprintf("Server: %s %s", r.Method, routeStr), opts...).ServeHTTP(w, r)
})
}
}