Merge pull request #127053 from dashpole/tracing_context_propagation
APIServerTracing: Respect trace context only for privileged users Kubernetes-commit: b2b6c4d0235085d090ca73b62a1361302db81afd
This commit is contained in:
commit
26bd744afc
|
|
@ -24,6 +24,7 @@ import (
|
||||||
"go.opentelemetry.io/otel/trace"
|
"go.opentelemetry.io/otel/trace"
|
||||||
"k8s.io/apiserver/pkg/endpoints/request"
|
"k8s.io/apiserver/pkg/endpoints/request"
|
||||||
|
|
||||||
|
"k8s.io/apiserver/pkg/authentication/user"
|
||||||
tracing "k8s.io/component-base/tracing"
|
tracing "k8s.io/component-base/tracing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -31,7 +32,7 @@ import (
|
||||||
func WithTracing(handler http.Handler, tp trace.TracerProvider) http.Handler {
|
func WithTracing(handler http.Handler, tp trace.TracerProvider) http.Handler {
|
||||||
opts := []otelhttp.Option{
|
opts := []otelhttp.Option{
|
||||||
otelhttp.WithPropagators(tracing.Propagators()),
|
otelhttp.WithPropagators(tracing.Propagators()),
|
||||||
otelhttp.WithPublicEndpoint(),
|
otelhttp.WithPublicEndpointFn(notSystemPrivilegedGroup),
|
||||||
otelhttp.WithTracerProvider(tp),
|
otelhttp.WithTracerProvider(tp),
|
||||||
otelhttp.WithSpanNameFormatter(func(operation string, r *http.Request) string {
|
otelhttp.WithSpanNameFormatter(func(operation string, r *http.Request) string {
|
||||||
ctx := r.Context()
|
ctx := r.Context()
|
||||||
|
|
@ -43,6 +44,11 @@ func WithTracing(handler http.Handler, tp trace.TracerProvider) http.Handler {
|
||||||
}),
|
}),
|
||||||
}
|
}
|
||||||
wrappedHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
wrappedHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
// Adjust otelhttp tracing start time to match the start time used
|
||||||
|
// for Prometheus metrics.
|
||||||
|
if startTime, ok := request.ReceivedTimestampFrom(r.Context()); ok {
|
||||||
|
r = r.WithContext(otelhttp.ContextWithStartTime(r.Context(), startTime))
|
||||||
|
}
|
||||||
// Add the http.target attribute to the otelhttp span
|
// Add the http.target attribute to the otelhttp span
|
||||||
// Workaround for https://github.com/open-telemetry/opentelemetry-go-contrib/issues/3743
|
// Workaround for https://github.com/open-telemetry/opentelemetry-go-contrib/issues/3743
|
||||||
if r.URL != nil {
|
if r.URL != nil {
|
||||||
|
|
@ -73,3 +79,14 @@ func getSpanNameFromRequestInfo(info *request.RequestInfo, r *http.Request) stri
|
||||||
}
|
}
|
||||||
return r.Method + " " + spanName
|
return r.Method + " " + spanName
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func notSystemPrivilegedGroup(req *http.Request) bool {
|
||||||
|
if u, ok := request.UserFrom(req.Context()); ok {
|
||||||
|
for _, group := range u.GetGroups() {
|
||||||
|
if group == user.SystemPrivilegedGroup || group == user.MonitoringGroup {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1039,6 +1039,11 @@ func DefaultBuildHandlerChain(apiHandler http.Handler, c *Config) http.Handler {
|
||||||
failedHandler := genericapifilters.Unauthorized(c.Serializer)
|
failedHandler := genericapifilters.Unauthorized(c.Serializer)
|
||||||
failedHandler = genericapifilters.WithFailedAuthenticationAudit(failedHandler, c.AuditBackend, c.AuditPolicyRuleEvaluator)
|
failedHandler = genericapifilters.WithFailedAuthenticationAudit(failedHandler, c.AuditBackend, c.AuditPolicyRuleEvaluator)
|
||||||
|
|
||||||
|
// WithTracing comes after authentication so we can allow authenticated
|
||||||
|
// clients to influence sampling.
|
||||||
|
if c.FeatureGate.Enabled(genericfeatures.APIServerTracing) {
|
||||||
|
handler = genericapifilters.WithTracing(handler, c.TracerProvider)
|
||||||
|
}
|
||||||
failedHandler = filterlatency.TrackCompleted(failedHandler)
|
failedHandler = filterlatency.TrackCompleted(failedHandler)
|
||||||
handler = filterlatency.TrackCompleted(handler)
|
handler = filterlatency.TrackCompleted(handler)
|
||||||
handler = genericapifilters.WithAuthentication(handler, c.Authentication.Authenticator, failedHandler, c.Authentication.APIAudiences, c.Authentication.RequestHeaderConfig)
|
handler = genericapifilters.WithAuthentication(handler, c.Authentication.Authenticator, failedHandler, c.Authentication.APIAudiences, c.Authentication.RequestHeaderConfig)
|
||||||
|
|
@ -1069,9 +1074,6 @@ func DefaultBuildHandlerChain(apiHandler http.Handler, c *Config) http.Handler {
|
||||||
handler = genericfilters.WithRetryAfter(handler, c.lifecycleSignals.NotAcceptingNewRequest.Signaled())
|
handler = genericfilters.WithRetryAfter(handler, c.lifecycleSignals.NotAcceptingNewRequest.Signaled())
|
||||||
}
|
}
|
||||||
handler = genericfilters.WithHTTPLogging(handler)
|
handler = genericfilters.WithHTTPLogging(handler)
|
||||||
if c.FeatureGate.Enabled(genericfeatures.APIServerTracing) {
|
|
||||||
handler = genericapifilters.WithTracing(handler, c.TracerProvider)
|
|
||||||
}
|
|
||||||
handler = genericapifilters.WithLatencyTrackers(handler)
|
handler = genericapifilters.WithLatencyTrackers(handler)
|
||||||
// WithRoutine will execute future handlers in a separate goroutine and serving
|
// WithRoutine will execute future handlers in a separate goroutine and serving
|
||||||
// handler in current goroutine to minimize the stack memory usage. It must be
|
// handler in current goroutine to minimize the stack memory usage. It must be
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue