mirror of
https://github.com/pomerium/pomerium.git
synced 2025-06-30 16:38:11 +02:00
43 lines
1.2 KiB
Go
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)
|
|
})
|
|
}
|
|
}
|