From b12ac0abc64adb71d97fbde12f373b1424631f20 Mon Sep 17 00:00:00 2001 From: Joe Betz Date: Fri, 6 Mar 2020 16:11:21 -0800 Subject: [PATCH] Enable nested tracing, add request filter chain tracing incl. authn/authz tracing --- pkg/scheduler/core/BUILD | 1 + pkg/scheduler/core/generic_scheduler.go | 3 +- .../pkg/apiserver/conversion/BUILD | 1 + .../apiserver/conversion/webhook_converter.go | 5 +- .../admission/plugin/webhook/mutating/BUILD | 1 + .../plugin/webhook/mutating/dispatcher.go | 3 +- .../admission/plugin/webhook/validating/BUILD | 1 + .../plugin/webhook/validating/dispatcher.go | 3 +- .../src/k8s.io/apiserver/pkg/endpoints/BUILD | 1 + .../apiserver/pkg/endpoints/filters/BUILD | 3 + .../pkg/endpoints/filters/authentication.go | 1 + .../pkg/endpoints/filters/authorization.go | 1 + .../pkg/endpoints/filters/impersonation.go | 2 +- .../apiserver/pkg/endpoints/filters/trace.go | 69 +++++++++++++++++++ .../apiserver/pkg/endpoints/handlers/BUILD | 5 +- .../pkg/endpoints/handlers/create.go | 4 +- .../pkg/endpoints/handlers/delete.go | 6 +- .../apiserver/pkg/endpoints/handlers/get.go | 6 +- .../apiserver/pkg/endpoints/handlers/patch.go | 6 +- .../apiserver/pkg/endpoints/handlers/rest.go | 8 +++ .../pkg/endpoints/handlers/update.go | 4 +- .../apiserver/pkg/endpoints/internal/BUILD | 31 +++++++++ .../{handlers => internal}/helpers.go | 24 +++---- .../{handlers => internal}/helpers_test.go | 15 ++-- .../apiserver/pkg/endpoints/request/BUILD | 1 + .../pkg/endpoints/request/context.go | 18 +++++ .../src/k8s.io/apiserver/pkg/server/config.go | 1 + .../k8s.io/apiserver/pkg/storage/cacher/BUILD | 1 + .../apiserver/pkg/storage/cacher/cacher.go | 5 +- .../k8s.io/apiserver/pkg/storage/etcd3/BUILD | 1 + .../apiserver/pkg/storage/etcd3/store.go | 7 +- vendor/modules.txt | 1 + 32 files changed, 196 insertions(+), 43 deletions(-) create mode 100644 staging/src/k8s.io/apiserver/pkg/endpoints/filters/trace.go create mode 100644 staging/src/k8s.io/apiserver/pkg/endpoints/internal/BUILD rename staging/src/k8s.io/apiserver/pkg/endpoints/{handlers => internal}/helpers.go (71%) rename staging/src/k8s.io/apiserver/pkg/endpoints/{handlers => internal}/helpers_test.go (85%) diff --git a/pkg/scheduler/core/BUILD b/pkg/scheduler/core/BUILD index 738289a2d8a..c3fc638f039 100644 --- a/pkg/scheduler/core/BUILD +++ b/pkg/scheduler/core/BUILD @@ -23,6 +23,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", "//staging/src/k8s.io/client-go/listers/core/v1:go_default_library", "//staging/src/k8s.io/client-go/rest:go_default_library", diff --git a/pkg/scheduler/core/generic_scheduler.go b/pkg/scheduler/core/generic_scheduler.go index 491d6a3eaa5..af278bfbc91 100644 --- a/pkg/scheduler/core/generic_scheduler.go +++ b/pkg/scheduler/core/generic_scheduler.go @@ -30,6 +30,7 @@ import ( v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + genericapirequest "k8s.io/apiserver/pkg/endpoints/request" utilfeature "k8s.io/apiserver/pkg/util/feature" corelisters "k8s.io/client-go/listers/core/v1" extenderv1 "k8s.io/kube-scheduler/extender/v1" @@ -136,7 +137,7 @@ func (g *genericScheduler) snapshot() error { // If it succeeds, it will return the name of the node. // If it fails, it will return a FitError error with reasons. func (g *genericScheduler) Schedule(ctx context.Context, prof *profile.Profile, state *framework.CycleState, pod *v1.Pod) (result ScheduleResult, err error) { - trace := utiltrace.New("Scheduling", utiltrace.Field{Key: "namespace", Value: pod.Namespace}, utiltrace.Field{Key: "name", Value: pod.Name}) + ctx, trace := genericapirequest.WithTrace(ctx, "Scheduling", utiltrace.Field{Key: "namespace", Value: pod.Namespace}, utiltrace.Field{Key: "name", Value: pod.Name}) defer trace.LogIfLong(100 * time.Millisecond) if err := podPassesBasicChecks(pod, g.pvcLister); err != nil { diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/BUILD b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/BUILD index f1a6b656c0e..06a49fd2c8a 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/BUILD +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/BUILD @@ -24,6 +24,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/uuid:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", "//staging/src/k8s.io/client-go/rest:go_default_library", diff --git a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/webhook_converter.go b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/webhook_converter.go index 0651f411a95..7eed43e7c27 100644 --- a/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/webhook_converter.go +++ b/staging/src/k8s.io/apiextensions-apiserver/pkg/apiserver/conversion/webhook_converter.go @@ -34,6 +34,7 @@ import ( "k8s.io/apimachinery/pkg/types" "k8s.io/apimachinery/pkg/util/uuid" "k8s.io/apimachinery/pkg/util/validation/field" + genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/util/webhook" "k8s.io/client-go/rest" utiltrace "k8s.io/utils/trace" @@ -259,7 +260,7 @@ func (c *webhookConverter) Convert(in runtime.Object, toGV schema.GroupVersion) return out, nil } - trace := utiltrace.New("Call conversion webhook", + ctx, trace := genericapirequest.WithTrace(context.TODO(), "Call conversion webhook", utiltrace.Field{"custom-resource-definition", c.name}, utiltrace.Field{"desired-api-version", desiredAPIVersion}, utiltrace.Field{"object-count", objCount}, @@ -269,8 +270,6 @@ func (c *webhookConverter) Convert(in runtime.Object, toGV schema.GroupVersion) // the conversion request on the apiserver side (~4ms per object). defer trace.LogIfLong(time.Duration(50+8*objCount) * time.Millisecond) - // TODO: Figure out if adding one second timeout make sense here. - ctx := context.TODO() r := c.restClient.Post().Body(request).Do(ctx) if err := r.Into(response); err != nil { // TODO: Return a webhook specific error to be able to convert it to meta.Status diff --git a/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/BUILD b/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/BUILD index 98ce8877106..c6e0191cbc0 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/BUILD @@ -29,6 +29,7 @@ go_library( "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/generic:go_default_library", "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/request:go_default_library", "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", "//staging/src/k8s.io/apiserver/pkg/warning:go_default_library", "//vendor/github.com/evanphx/json-patch:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/dispatcher.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/dispatcher.go index 1fbe9d718b7..cab96342f2f 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/dispatcher.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/mutating/dispatcher.go @@ -42,6 +42,7 @@ import ( "k8s.io/apiserver/pkg/admission/plugin/webhook/generic" webhookrequest "k8s.io/apiserver/pkg/admission/plugin/webhook/request" auditinternal "k8s.io/apiserver/pkg/apis/audit" + genericapirequest "k8s.io/apiserver/pkg/endpoints/request" webhookutil "k8s.io/apiserver/pkg/util/webhook" "k8s.io/apiserver/pkg/warning" utiltrace "k8s.io/utils/trace" @@ -221,7 +222,7 @@ func (a *mutatingDispatcher) callAttrMutatingHook(ctx context.Context, h *admiss if err != nil { return false, &webhookutil.ErrCallingWebhook{WebhookName: h.Name, Reason: err} } - trace := utiltrace.New("Call mutating webhook", + ctx, trace := genericapirequest.WithTrace(ctx, "Call mutating webhook", utiltrace.Field{"configuration", configurationName}, utiltrace.Field{"webhook", h.Name}, utiltrace.Field{"resource", attr.GetResource()}, diff --git a/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/BUILD b/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/BUILD index b6a59f7a69e..04238177e83 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/BUILD @@ -22,6 +22,7 @@ go_library( "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/errors:go_default_library", "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/generic:go_default_library", "//staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/request:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/webhook:go_default_library", "//staging/src/k8s.io/apiserver/pkg/warning:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/dispatcher.go b/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/dispatcher.go index f065cdf5014..01c38eec48a 100644 --- a/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/dispatcher.go +++ b/staging/src/k8s.io/apiserver/pkg/admission/plugin/webhook/validating/dispatcher.go @@ -32,6 +32,7 @@ import ( webhookerrors "k8s.io/apiserver/pkg/admission/plugin/webhook/errors" "k8s.io/apiserver/pkg/admission/plugin/webhook/generic" webhookrequest "k8s.io/apiserver/pkg/admission/plugin/webhook/request" + genericapirequest "k8s.io/apiserver/pkg/endpoints/request" webhookutil "k8s.io/apiserver/pkg/util/webhook" "k8s.io/apiserver/pkg/warning" "k8s.io/klog/v2" @@ -181,7 +182,7 @@ func (d *validatingDispatcher) callHook(ctx context.Context, h *v1.ValidatingWeb if err != nil { return &webhookutil.ErrCallingWebhook{WebhookName: h.Name, Reason: err} } - trace := utiltrace.New("Call validating webhook", + ctx, trace := genericapirequest.WithTrace(ctx, "Call validating webhook", utiltrace.Field{"configuration", invocation.Webhook.GetConfigurationName()}, utiltrace.Field{"webhook", h.Name}, utiltrace.Field{"resource", attr.GetResource()}, diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/BUILD index 57e43d4daea..b52cc209b17 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/BUILD @@ -112,6 +112,7 @@ filegroup( "//staging/src/k8s.io/apiserver/pkg/endpoints/discovery:all-srcs", "//staging/src/k8s.io/apiserver/pkg/endpoints/filters:all-srcs", "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers:all-srcs", + "//staging/src/k8s.io/apiserver/pkg/endpoints/internal:all-srcs", "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:all-srcs", "//staging/src/k8s.io/apiserver/pkg/endpoints/openapi:all-srcs", "//staging/src/k8s.io/apiserver/pkg/endpoints/request:all-srcs", diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/BUILD index 6810eec1168..1f0e4999f71 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/BUILD @@ -55,6 +55,7 @@ go_library( "impersonation.go", "metrics.go", "requestinfo.go", + "trace.go", "warning.go", ], importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints/filters", @@ -76,12 +77,14 @@ go_library( "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", "//staging/src/k8s.io/apiserver/pkg/authorization/authorizer:go_default_library", "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/internal:go_default_library", "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//staging/src/k8s.io/apiserver/pkg/server/httplog:go_default_library", "//staging/src/k8s.io/apiserver/pkg/warning:go_default_library", "//staging/src/k8s.io/component-base/metrics:go_default_library", "//staging/src/k8s.io/component-base/metrics/legacyregistry:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library", + "//vendor/k8s.io/utils/trace:go_default_library", ], ) diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/authentication.go b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/authentication.go index e88e7ad28d6..2af72f458f3 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/authentication.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/authentication.go @@ -47,6 +47,7 @@ func WithAuthentication(handler http.Handler, auth authenticator.Request, failed req = req.WithContext(authenticator.WithAudiences(req.Context(), apiAuds)) } resp, ok, err := auth.AuthenticateRequest(req) + traceFilterStep(req.Context(), "Authenticate check done") defer recordAuthMetrics(resp, ok, err, apiAuds, authenticationStart) if err != nil || !ok { if err != nil { diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/authorization.go b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/authorization.go index 8d115ff0910..7689aa4b81c 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/authorization.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/authorization.go @@ -57,6 +57,7 @@ func WithAuthorization(handler http.Handler, a authorizer.Authorizer, s runtime. return } authorized, reason, err := a.Authorize(ctx, attributes) + traceFilterStep(ctx, "Authorize check done") // an authorizer like RBAC could encounter evaluation errors and still allow the request, so authorizer decision is checked before error here. if authorized == authorizer.DecisionAllow { audit.LogAnnotation(ae, decisionAnnotationKey, decisionAllow) diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/impersonation.go b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/impersonation.go index ab767695fee..68382be3646 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/impersonation.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/impersonation.go @@ -110,6 +110,7 @@ func WithImpersonation(handler http.Handler, a authorizer.Authorizer, s runtime. } decision, reason, err := a.Authorize(ctx, actingAsAttributes) + traceFilterStep(ctx, "Impersonation authorize check done") if err != nil || decision != authorizer.DecisionAllow { klog.V(4).Infof("Forbidden: %#v, Reason: %s, Error: %v", req.RequestURI, reason, err) responsewriters.Forbidden(ctx, actingAsAttributes, w, req, reason, s) @@ -144,7 +145,6 @@ func WithImpersonation(handler http.Handler, a authorizer.Authorizer, s runtime. req.Header.Del(headerName) } } - handler.ServeHTTP(w, req) }) } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/filters/trace.go b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/trace.go new file mode 100644 index 00000000000..6cefe4aa6ee --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/filters/trace.go @@ -0,0 +1,69 @@ +/* +Copyright 2020 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package filters + +import ( + "context" + "net/http" + "time" + + utiltrace "k8s.io/utils/trace" + + "k8s.io/apiserver/pkg/endpoints/internal" + genericapirequest "k8s.io/apiserver/pkg/endpoints/request" +) + +// WithTrace decorates a http.Handler with tracing for all the non-long running +// requests coming to the server. +func WithTrace(handler http.Handler, longRunningCheck genericapirequest.LongRunningRequestCheck) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { + ri, ok := genericapirequest.RequestInfoFrom(req.Context()) + isLongRunning := false + if longRunningCheck != nil { + if ok && longRunningCheck(req, ri) { + isLongRunning = true + } + } + + if isLongRunning { + handler.ServeHTTP(w, req) + return + } + ctx, trace := genericapirequest.WithTrace(req.Context(), "HTTP Request", + utiltrace.Field{Key: "method", Value: req.Method}, + utiltrace.Field{Key: "url", Value: req.URL.Path}, + utiltrace.Field{Key: "verb", Value: ri.Verb}, + utiltrace.Field{Key: "name", Value: ri.Name}, + utiltrace.Field{Key: "resource", Value: ri.Resource}, + utiltrace.Field{Key: "subresource", Value: ri.Subresource}, + utiltrace.Field{Key: "namespace", Value: ri.Namespace}, + utiltrace.Field{Key: "api-group", Value: ri.APIGroup}, + utiltrace.Field{Key: "api-version", Value: ri.APIVersion}, + utiltrace.Field{Key: "user-agent", Value: &internal.LazyTruncatedUserAgent{req}}, + utiltrace.Field{Key: "client", Value: &internal.LazyClientIP{req}}) + req = req.Clone(ctx) + // Set trace as root trace in context for nested tracing + defer trace.LogIfLong(30 * time.Second) + handler.ServeHTTP(w, req) + }) +} + +func traceFilterStep(ctx context.Context, msg string, field ...utiltrace.Field) { + if trace, ok := genericapirequest.TraceFrom(ctx); ok { + trace.Step(msg, field...) + } +} diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/BUILD index 6d6ef4a97be..2a0ae1533ef 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/BUILD @@ -10,7 +10,6 @@ go_test( name = "go_default_test", srcs = [ "create_test.go", - "helpers_test.go", "namer_test.go", "response_test.go", "rest_test.go", @@ -42,7 +41,6 @@ go_test( "//staging/src/k8s.io/client-go/kubernetes/scheme:go_default_library", "//vendor/github.com/evanphx/json-patch:go_default_library", "//vendor/github.com/google/gofuzz:go_default_library", - "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/utils/trace:go_default_library", ], ) @@ -54,7 +52,6 @@ go_library( "delete.go", "doc.go", "get.go", - "helpers.go", "namer.go", "patch.go", "response.go", @@ -82,7 +79,6 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/types:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/json:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/mergepatch:go_default_library", - "//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/sets:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/strategicpatch:go_default_library", @@ -94,6 +90,7 @@ go_library( "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager:go_default_library", "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/negotiation:go_default_library", "//staging/src/k8s.io/apiserver/pkg/endpoints/handlers/responsewriters:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/internal:go_default_library", "//staging/src/k8s.io/apiserver/pkg/endpoints/metrics:go_default_library", "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/create.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/create.go index 653c1ff82a8..ef578d5672b 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/create.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/create.go @@ -33,9 +33,11 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/validation" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/audit" "k8s.io/apiserver/pkg/endpoints/handlers/negotiation" + "k8s.io/apiserver/pkg/endpoints/internal" "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/features" "k8s.io/apiserver/pkg/registry/rest" @@ -47,7 +49,7 @@ import ( func createHandler(r rest.NamedCreater, scope *RequestScope, admit admission.Interface, includeName bool) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { // For performance tracking purposes. - trace := utiltrace.New("Create", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &lazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &lazyClientIP{req}}) + req, trace := requestWithTrace(req, "Create", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &internal.LazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &internal.LazyClientIP{req}}) defer trace.LogIfLong(500 * time.Millisecond) if isDryRun(req.URL) && !utilfeature.DefaultFeatureGate.Enabled(features.DryRun) { diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/delete.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/delete.go index 0e2650ae9ac..56cbbb35b0f 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/delete.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/delete.go @@ -30,9 +30,11 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/validation" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/audit" "k8s.io/apiserver/pkg/endpoints/handlers/negotiation" + "k8s.io/apiserver/pkg/endpoints/internal" "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/features" "k8s.io/apiserver/pkg/registry/rest" @@ -46,7 +48,7 @@ import ( func DeleteResource(r rest.GracefulDeleter, allowsOptions bool, scope *RequestScope, admit admission.Interface) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { // For performance tracking purposes. - trace := utiltrace.New("Delete", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &lazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &lazyClientIP{req}}) + req, trace := requestWithTrace(req, "Delete", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &internal.LazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &internal.LazyClientIP{req}}) defer trace.LogIfLong(500 * time.Millisecond) if isDryRun(req.URL) && !utilfeature.DefaultFeatureGate.Enabled(features.DryRun) { @@ -164,7 +166,7 @@ func DeleteResource(r rest.GracefulDeleter, allowsOptions bool, scope *RequestSc // DeleteCollection returns a function that will handle a collection deletion func DeleteCollection(r rest.CollectionDeleter, checkBody bool, scope *RequestScope, admit admission.Interface) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { - trace := utiltrace.New("Delete", utiltrace.Field{"url", req.URL.Path}) + req, trace := requestWithTrace(req, "Delete", utiltrace.Field{"url", req.URL.Path}) defer trace.LogIfLong(500 * time.Millisecond) if isDryRun(req.URL) && !utilfeature.DefaultFeatureGate.Enabled(features.DryRun) { diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/get.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/get.go index c3f6e4cbe13..076394527ce 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/get.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/get.go @@ -36,7 +36,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/fields" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apiserver/pkg/endpoints/handlers/negotiation" + "k8s.io/apiserver/pkg/endpoints/internal" "k8s.io/apiserver/pkg/endpoints/metrics" "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/registry/rest" @@ -51,7 +53,7 @@ type getterFunc func(ctx context.Context, name string, req *http.Request, trace // passed-in getterFunc to perform the actual get. func getResourceHandler(scope *RequestScope, getter getterFunc) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { - trace := utiltrace.New("Get", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &lazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &lazyClientIP{req}}) + req, trace := requestWithTrace(req, "Get", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &internal.LazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &internal.LazyClientIP{req}}) defer trace.LogIfLong(500 * time.Millisecond) namespace, name, err := scope.Namer.Name(req) @@ -168,7 +170,7 @@ func getRequestOptions(req *http.Request, scope *RequestScope, into runtime.Obje func ListResource(r rest.Lister, rw rest.Watcher, scope *RequestScope, forceWatch bool, minRequestTimeout time.Duration) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { // For performance tracking purposes. - trace := utiltrace.New("List", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &lazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &lazyClientIP{req}}) + req, trace := requestWithTrace(req, "List", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &internal.LazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &internal.LazyClientIP{req}}) namespace, err := scope.Namer.Namespace(req) if err != nil { diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/patch.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/patch.go index c295d0aa659..711455aa5c5 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/patch.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/patch.go @@ -38,18 +38,20 @@ import ( "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apimachinery/pkg/util/strategicpatch" "k8s.io/apimachinery/pkg/util/validation/field" + "sigs.k8s.io/yaml" + "k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/audit" "k8s.io/apiserver/pkg/authorization/authorizer" "k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager" "k8s.io/apiserver/pkg/endpoints/handlers/negotiation" + "k8s.io/apiserver/pkg/endpoints/internal" "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/features" "k8s.io/apiserver/pkg/registry/rest" "k8s.io/apiserver/pkg/util/dryrun" utilfeature "k8s.io/apiserver/pkg/util/feature" utiltrace "k8s.io/utils/trace" - "sigs.k8s.io/yaml" ) const ( @@ -61,7 +63,7 @@ const ( func PatchResource(r rest.Patcher, scope *RequestScope, admit admission.Interface, patchTypes []string) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { // For performance tracking purposes. - trace := utiltrace.New("Patch", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &lazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &lazyClientIP{req}}) + req, trace := requestWithTrace(req, "Patch", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &internal.LazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &internal.LazyClientIP{req}}) defer trace.LogIfLong(500 * time.Millisecond) if isDryRun(req.URL) && !utilfeature.DefaultFeatureGate.Enabled(features.DryRun) { diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest.go index 073a32109b7..92748c01f17 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/rest.go @@ -47,6 +47,7 @@ import ( "k8s.io/apiserver/pkg/registry/rest" utilfeature "k8s.io/apiserver/pkg/util/feature" "k8s.io/klog/v2" + utiltrace "k8s.io/utils/trace" ) // RequestScope encapsulates common fields across all RESTful handler methods. @@ -445,3 +446,10 @@ func isTooLargeError(err error) bool { } return false } + +// requestWithTrace returns a new trace using the provided msg and fields, nested within any trace already in the +//context of the provided req. Also returns a request with the new trace in the context. +func requestWithTrace(req *http.Request, msg string, fields ...utiltrace.Field) (*http.Request, *utiltrace.Trace) { + ctx, trace := request.WithTrace(req.Context(), msg, fields...) + return req.Clone(ctx), trace +} diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/update.go b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/update.go index 91b909ea6d1..5ec67d86a61 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/update.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/update.go @@ -30,10 +30,12 @@ import ( "k8s.io/apimachinery/pkg/apis/meta/v1/validation" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apiserver/pkg/admission" "k8s.io/apiserver/pkg/audit" "k8s.io/apiserver/pkg/authorization/authorizer" "k8s.io/apiserver/pkg/endpoints/handlers/negotiation" + "k8s.io/apiserver/pkg/endpoints/internal" "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/features" "k8s.io/apiserver/pkg/registry/rest" @@ -46,7 +48,7 @@ import ( func UpdateResource(r rest.Updater, scope *RequestScope, admit admission.Interface) http.HandlerFunc { return func(w http.ResponseWriter, req *http.Request) { // For performance tracking purposes. - trace := utiltrace.New("Update", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &lazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &lazyClientIP{req}}) + req, trace := requestWithTrace(req, "Update", utiltrace.Field{Key: "url", Value: req.URL.Path}, utiltrace.Field{Key: "user-agent", Value: &internal.LazyTruncatedUserAgent{req}}, utiltrace.Field{Key: "client", Value: &internal.LazyClientIP{req}}) defer trace.LogIfLong(500 * time.Millisecond) if isDryRun(req.URL) && !utilfeature.DefaultFeatureGate.Enabled(features.DryRun) { diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/internal/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/internal/BUILD new file mode 100644 index 00000000000..7b4317c03fe --- /dev/null +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/internal/BUILD @@ -0,0 +1,31 @@ +load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test") + +go_library( + name = "go_default_library", + srcs = ["helpers.go"], + importmap = "k8s.io/kubernetes/vendor/k8s.io/apiserver/pkg/endpoints/internal", + importpath = "k8s.io/apiserver/pkg/endpoints/internal", + visibility = ["//staging/src/k8s.io/apiserver/pkg/endpoints:__subpackages__"], + deps = ["//staging/src/k8s.io/apimachinery/pkg/util/net:go_default_library"], +) + +go_test( + name = "go_default_test", + srcs = ["helpers_test.go"], + embed = [":go_default_library"], + deps = ["//vendor/github.com/stretchr/testify/assert:go_default_library"], +) + +filegroup( + name = "package-srcs", + srcs = glob(["**"]), + tags = ["automanaged"], + visibility = ["//visibility:private"], +) + +filegroup( + name = "all-srcs", + srcs = [":package-srcs"], + tags = ["automanaged"], + visibility = ["//visibility:public"], +) diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/helpers.go b/staging/src/k8s.io/apiserver/pkg/endpoints/internal/helpers.go similarity index 71% rename from staging/src/k8s.io/apiserver/pkg/endpoints/handlers/helpers.go rename to staging/src/k8s.io/apiserver/pkg/endpoints/internal/helpers.go index 82170e050ec..d97a5b4565d 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/helpers.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/internal/helpers.go @@ -14,7 +14,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -package handlers +package internal import ( "net/http" @@ -27,16 +27,16 @@ const ( userAgentTruncateSuffix = "...TRUNCATED" ) -// lazyTruncatedUserAgent implements String() string and it will +// LazyTruncatedUserAgent implements String() string and it will // return user-agent which may be truncated. -type lazyTruncatedUserAgent struct { - req *http.Request +type LazyTruncatedUserAgent struct { + Req *http.Request } -func (lazy *lazyTruncatedUserAgent) String() string { +func (lazy *LazyTruncatedUserAgent) String() string { ua := "unknown" - if lazy.req != nil { - ua = utilnet.GetHTTPClient(lazy.req) + if lazy.Req != nil { + ua = utilnet.GetHTTPClient(lazy.Req) if len(ua) > maxUserAgentLength { ua = ua[:maxUserAgentLength] + userAgentTruncateSuffix } @@ -46,13 +46,13 @@ func (lazy *lazyTruncatedUserAgent) String() string { // LazyClientIP implements String() string and it will // calls GetClientIP() lazily only when required. -type lazyClientIP struct { - req *http.Request +type LazyClientIP struct { + Req *http.Request } -func (lazy *lazyClientIP) String() string { - if lazy.req != nil { - if ip := utilnet.GetClientIP(lazy.req); ip != nil { +func (lazy *LazyClientIP) String() string { + if lazy.Req != nil { + if ip := utilnet.GetClientIP(lazy.Req); ip != nil { return ip.String() } } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/helpers_test.go b/staging/src/k8s.io/apiserver/pkg/endpoints/internal/helpers_test.go similarity index 85% rename from staging/src/k8s.io/apiserver/pkg/endpoints/handlers/helpers_test.go rename to staging/src/k8s.io/apiserver/pkg/endpoints/internal/helpers_test.go index e55b40a1c45..2a68409599c 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/handlers/helpers_test.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/internal/helpers_test.go @@ -14,13 +14,14 @@ See the License for the specific language governing permissions and limitations under the License. */ -package handlers +package internal import ( "fmt" - "github.com/stretchr/testify/assert" "net/http" "testing" + + "github.com/stretchr/testify/assert" ) func TestLazyTruncatedUserAgent(t *testing.T) { @@ -29,7 +30,7 @@ func TestLazyTruncatedUserAgent(t *testing.T) { ua := "short-agent" req.Header.Set("User-Agent", ua) - uaNotTruncated := &lazyTruncatedUserAgent{req} + uaNotTruncated := &LazyTruncatedUserAgent{req} assert.Equal(t, ua, fmt.Sprintf("%v", uaNotTruncated)) ua = "" @@ -37,10 +38,10 @@ func TestLazyTruncatedUserAgent(t *testing.T) { ua = ua + "a" } req.Header.Set("User-Agent", ua) - uaTruncated := &lazyTruncatedUserAgent{req} + uaTruncated := &LazyTruncatedUserAgent{req} assert.NotEqual(t, ua, fmt.Sprintf("%v", uaTruncated)) - usUnknown := &lazyTruncatedUserAgent{} + usUnknown := &LazyTruncatedUserAgent{} assert.Equal(t, "unknown", fmt.Sprintf("%v", usUnknown)) } @@ -51,9 +52,9 @@ func TestLazyClientIP(t *testing.T) { ip := "127.0.0.1" req.Header.Set("X-Forwarded-For", ip) - clientIPWithReq := &lazyClientIP{req} + clientIPWithReq := &LazyClientIP{req} assert.Equal(t, ip, fmt.Sprintf("%v", clientIPWithReq)) - clientIPWithoutReq := &lazyClientIP{} + clientIPWithoutReq := &LazyClientIP{} assert.Equal(t, "unknown", fmt.Sprintf("%v", clientIPWithoutReq)) } diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/request/BUILD b/staging/src/k8s.io/apiserver/pkg/endpoints/request/BUILD index 6965fc19f6d..f751de98ea0 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/request/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/request/BUILD @@ -38,6 +38,7 @@ go_library( "//staging/src/k8s.io/apiserver/pkg/apis/audit:go_default_library", "//staging/src/k8s.io/apiserver/pkg/authentication/user:go_default_library", "//vendor/k8s.io/klog/v2:go_default_library", + "//vendor/k8s.io/utils/trace:go_default_library", ], ) diff --git a/staging/src/k8s.io/apiserver/pkg/endpoints/request/context.go b/staging/src/k8s.io/apiserver/pkg/endpoints/request/context.go index fe3ae38edcd..1d37c0e2e66 100644 --- a/staging/src/k8s.io/apiserver/pkg/endpoints/request/context.go +++ b/staging/src/k8s.io/apiserver/pkg/endpoints/request/context.go @@ -22,6 +22,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apiserver/pkg/apis/audit" "k8s.io/apiserver/pkg/authentication/user" + utiltrace "k8s.io/utils/trace" ) // The key type is unexported to prevent collisions @@ -39,6 +40,9 @@ const ( // audiencesKey is the context key for request audiences. audiencesKey + + // traceKey is the context key for nested tracing. + traceKey ) // NewContext instantiates a base context object for request flows. @@ -94,3 +98,17 @@ func AuditEventFrom(ctx context.Context) *audit.Event { ev, _ := ctx.Value(auditKey).(*audit.Event) return ev } + +// TraceFrom returns the value of the trace key on the ctx +func TraceFrom(ctx context.Context) (*utiltrace.Trace, bool) { + trace, ok := ctx.Value(traceKey).(*utiltrace.Trace) + return trace, ok +} + +// WithTrace returns a new trace using the provided msg and fields, nested within any trace already in the +// provided context. Also returns a context containing the new trace +func WithTrace(ctx context.Context, msg string, fields ...utiltrace.Field) (context.Context, *utiltrace.Trace) { + parent, _ := TraceFrom(ctx) // ignore ok since Nest can be called with a nil receiver to create root traces + trace := parent.Nest(msg, fields...) + return context.WithValue(ctx, traceKey, trace), trace +} diff --git a/staging/src/k8s.io/apiserver/pkg/server/config.go b/staging/src/k8s.io/apiserver/pkg/server/config.go index d9bfc8a706f..411dfada8ba 100644 --- a/staging/src/k8s.io/apiserver/pkg/server/config.go +++ b/staging/src/k8s.io/apiserver/pkg/server/config.go @@ -682,6 +682,7 @@ func DefaultBuildHandlerChain(apiHandler http.Handler, c *Config) http.Handler { handler = genericfilters.WithCORS(handler, c.CorsAllowedOriginList, nil, nil, nil, "true") handler = genericfilters.WithTimeoutForNonLongRunningRequests(handler, c.LongRunningFunc, c.RequestTimeout) handler = genericfilters.WithWaitGroup(handler, c.LongRunningFunc, c.HandlerChainWaitGroup) + handler = genericapifilters.WithTrace(handler, c.LongRunningFunc) handler = genericapifilters.WithRequestInfo(handler, c.RequestInfoResolver) if c.SecureServing != nil && !c.SecureServing.DisableHTTP2 && c.GoawayChance > 0 { handler = genericfilters.WithProbabilisticGoaway(handler, c.GoawayChance) diff --git a/staging/src/k8s.io/apiserver/pkg/storage/cacher/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/cacher/BUILD index 16254390930..3018d34b4e1 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/cacher/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/cacher/BUILD @@ -27,6 +27,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/wait:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", "//staging/src/k8s.io/apiserver/pkg/util/feature:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher.go b/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher.go index 1b6432b8c36..52b84df8b8e 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher.go +++ b/staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher.go @@ -35,6 +35,7 @@ import ( utilruntime "k8s.io/apimachinery/pkg/util/runtime" "k8s.io/apimachinery/pkg/util/wait" "k8s.io/apimachinery/pkg/watch" + genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/features" "k8s.io/apiserver/pkg/storage" utilfeature "k8s.io/apiserver/pkg/util/feature" @@ -604,7 +605,7 @@ func (c *Cacher) GetToList(ctx context.Context, key string, opts storage.ListOpt return c.storage.GetToList(ctx, key, opts, listObj) } - trace := utiltrace.New("cacher list", utiltrace.Field{"type", c.objectType.String()}) + ctx, trace := genericapirequest.WithTrace(ctx, "cacher list", utiltrace.Field{"type", c.objectType.String()}) defer trace.LogIfLong(500 * time.Millisecond) c.ready.wait() @@ -678,7 +679,7 @@ func (c *Cacher) List(ctx context.Context, key string, opts storage.ListOptions, return c.storage.List(ctx, key, opts, listObj) } - trace := utiltrace.New("cacher list", utiltrace.Field{"type", c.objectType.String()}) + ctx, trace := genericapirequest.WithTrace(ctx, "cacher list", utiltrace.Field{"type", c.objectType.String()}) defer trace.LogIfLong(500 * time.Millisecond) c.ready.wait() diff --git a/staging/src/k8s.io/apiserver/pkg/storage/etcd3/BUILD b/staging/src/k8s.io/apiserver/pkg/storage/etcd3/BUILD index 982455986f3..3bc86f5d3c6 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/etcd3/BUILD +++ b/staging/src/k8s.io/apiserver/pkg/storage/etcd3/BUILD @@ -75,6 +75,7 @@ go_library( "//staging/src/k8s.io/apimachinery/pkg/util/runtime:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/util/validation/field:go_default_library", "//staging/src/k8s.io/apimachinery/pkg/watch:go_default_library", + "//staging/src/k8s.io/apiserver/pkg/endpoints/request:go_default_library", "//staging/src/k8s.io/apiserver/pkg/features:go_default_library", "//staging/src/k8s.io/apiserver/pkg/storage:go_default_library", "//staging/src/k8s.io/apiserver/pkg/storage/etcd3/metrics:go_default_library", diff --git a/staging/src/k8s.io/apiserver/pkg/storage/etcd3/store.go b/staging/src/k8s.io/apiserver/pkg/storage/etcd3/store.go index 812cfc69c6c..4e8bc4781ad 100644 --- a/staging/src/k8s.io/apiserver/pkg/storage/etcd3/store.go +++ b/staging/src/k8s.io/apiserver/pkg/storage/etcd3/store.go @@ -38,6 +38,7 @@ import ( "k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/watch" + genericapirequest "k8s.io/apiserver/pkg/endpoints/request" "k8s.io/apiserver/pkg/features" "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/etcd3/metrics" @@ -239,7 +240,7 @@ func (s *store) conditionalDelete(ctx context.Context, key string, out runtime.O func (s *store) GuaranteedUpdate( ctx context.Context, key string, out runtime.Object, ignoreNotFound bool, preconditions *storage.Preconditions, tryUpdate storage.UpdateFunc, suggestion ...runtime.Object) error { - trace := utiltrace.New("GuaranteedUpdate etcd3", utiltrace.Field{"type", getTypeName(out)}) + ctx, trace := genericapirequest.WithTrace(ctx, "GuaranteedUpdate etcd3", utiltrace.Field{"type", getTypeName(out)}) defer trace.LogIfLong(500 * time.Millisecond) v, err := conversion.EnforcePtr(out) @@ -382,7 +383,7 @@ func (s *store) GetToList(ctx context.Context, key string, listOpts storage.List resourceVersion := listOpts.ResourceVersion match := listOpts.ResourceVersionMatch pred := listOpts.Predicate - trace := utiltrace.New("GetToList etcd3", + ctx, trace := genericapirequest.WithTrace(ctx, "GetToList etcd3", utiltrace.Field{"key", key}, utiltrace.Field{"resourceVersion", resourceVersion}, utiltrace.Field{"resourceVersionMatch", match}, @@ -526,7 +527,7 @@ func (s *store) List(ctx context.Context, key string, opts storage.ListOptions, resourceVersion := opts.ResourceVersion match := opts.ResourceVersionMatch pred := opts.Predicate - trace := utiltrace.New("List etcd3", + ctx, trace := genericapirequest.WithTrace(ctx, "List etcd3", utiltrace.Field{"key", key}, utiltrace.Field{"resourceVersion", resourceVersion}, utiltrace.Field{"resourceVersionMatch", match}, diff --git a/vendor/modules.txt b/vendor/modules.txt index 5efcc2cf30f..39392a6b805 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1329,6 +1329,7 @@ k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager k8s.io/apiserver/pkg/endpoints/handlers/fieldmanager/internal k8s.io/apiserver/pkg/endpoints/handlers/negotiation k8s.io/apiserver/pkg/endpoints/handlers/responsewriters +k8s.io/apiserver/pkg/endpoints/internal k8s.io/apiserver/pkg/endpoints/metrics k8s.io/apiserver/pkg/endpoints/openapi k8s.io/apiserver/pkg/endpoints/request