package httpapi import ( "errors" "net/http" "github.com/go-chi/chi/v5" "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" "go.opentelemetry.io/otel/metric" "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/trace" ) type Endpoints struct { Metadata http.Handler Token http.Handler JWKS http.Handler Health http.Handler Ready http.Handler } type Telemetry struct { TracerProvider trace.TracerProvider MeterProvider metric.MeterProvider Propagators propagation.TextMapPropagator } func NewRouter(endpoints Endpoints, telemetry Telemetry) (http.Handler, error) { if endpoints.Metadata == nil || endpoints.Token == nil || endpoints.JWKS == nil || endpoints.Health == nil || endpoints.Ready == nil { return nil, errors.New("all HTTP endpoints are required") } router := chi.NewRouter() router.Get("/.well-known/oauth-authorization-server", endpoints.Metadata.ServeHTTP) router.Post("/oauth2/token", endpoints.Token.ServeHTTP) router.Get("/oauth2/jwks", endpoints.JWKS.ServeHTTP) router.Get("/healthz", endpoints.Health.ServeHTTP) router.Get("/readyz", endpoints.Ready.ServeHTTP) options := make([]otelhttp.Option, 0, 3) if telemetry.TracerProvider != nil { options = append(options, otelhttp.WithTracerProvider(telemetry.TracerProvider)) } if telemetry.MeterProvider != nil { options = append(options, otelhttp.WithMeterProvider(telemetry.MeterProvider)) } if telemetry.Propagators != nil { options = append(options, otelhttp.WithPropagators(telemetry.Propagators)) } return otelhttp.NewHandler(router, "workload-sts.http", options...), nil }