@@ -27,10 +27,12 @@ import (
27
27
"google.golang.org/grpc"
28
28
"google.golang.org/grpc/connectivity"
29
29
"google.golang.org/grpc/credentials/insecure"
30
+ "google.golang.org/grpc/status"
30
31
31
32
utilversion "k8s.io/apimachinery/pkg/util/version"
32
33
"k8s.io/klog/v2"
33
34
drapb "k8s.io/kubelet/pkg/apis/dra/v1alpha4"
35
+ "k8s.io/kubernetes/pkg/kubelet/metrics"
34
36
)
35
37
36
38
// NewDRAPluginClient returns a wrapper around those gRPC methods of a DRA
@@ -86,6 +88,7 @@ func (p *Plugin) getOrCreateGRPCConn() (*grpc.ClientConn, error) {
86
88
grpc .WithContextDialer (func (ctx context.Context , target string ) (net.Conn , error ) {
87
89
return (& net.Dialer {}).DialContext (ctx , network , target )
88
90
}),
91
+ grpc .WithChainUnaryInterceptor (newMetricsInterceptor (p .name )),
89
92
)
90
93
if err != nil {
91
94
return nil , err
@@ -145,3 +148,12 @@ func (p *Plugin) NodeUnprepareResources(
145
148
logger .V (4 ).Info ("Done calling NodeUnprepareResources rpc" , "response" , response , "err" , err )
146
149
return response , err
147
150
}
151
+
152
+ func newMetricsInterceptor (pluginName string ) grpc.UnaryClientInterceptor {
153
+ return func (ctx context.Context , method string , req , reply any , conn * grpc.ClientConn , invoker grpc.UnaryInvoker , opts ... grpc.CallOption ) error {
154
+ start := time .Now ()
155
+ err := invoker (ctx , method , req , reply , conn , opts ... )
156
+ metrics .DRAGRPCOperationsDuration .WithLabelValues (pluginName , method , status .Code (err ).String ()).Observe (time .Since (start ).Seconds ())
157
+ return err
158
+ }
159
+ }
0 commit comments