From 9a044cd46a3e823f22df1e34c808825bb42360fd Mon Sep 17 00:00:00 2001 From: Ed Bartosh Date: Thu, 10 Oct 2024 00:36:11 +0300 Subject: [PATCH] kubelet: intercept DRA GRPC to record metrics --- pkg/kubelet/cm/dra/plugin/plugin.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pkg/kubelet/cm/dra/plugin/plugin.go b/pkg/kubelet/cm/dra/plugin/plugin.go index 708a3774c9e..7cddcfe420e 100644 --- a/pkg/kubelet/cm/dra/plugin/plugin.go +++ b/pkg/kubelet/cm/dra/plugin/plugin.go @@ -27,10 +27,12 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/connectivity" "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/status" utilversion "k8s.io/apimachinery/pkg/util/version" "k8s.io/klog/v2" drapb "k8s.io/kubelet/pkg/apis/dra/v1alpha4" + "k8s.io/kubernetes/pkg/kubelet/metrics" ) // NewDRAPluginClient returns a wrapper around those gRPC methods of a DRA @@ -86,6 +88,7 @@ func (p *Plugin) getOrCreateGRPCConn() (*grpc.ClientConn, error) { grpc.WithContextDialer(func(ctx context.Context, target string) (net.Conn, error) { return (&net.Dialer{}).DialContext(ctx, network, target) }), + grpc.WithChainUnaryInterceptor(newMetricsInterceptor(p.name)), ) if err != nil { return nil, err @@ -145,3 +148,12 @@ func (p *Plugin) NodeUnprepareResources( logger.V(4).Info("Done calling NodeUnprepareResources rpc", "response", response, "err", err) return response, err } + +func newMetricsInterceptor(pluginName string) grpc.UnaryClientInterceptor { + return func(ctx context.Context, method string, req, reply any, conn *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + start := time.Now() + err := invoker(ctx, method, req, reply, conn, opts...) + metrics.DRAGRPCOperationsDuration.WithLabelValues(pluginName, method, status.Code(err).String()).Observe(time.Since(start).Seconds()) + return err + } +}