@@ -37,9 +37,9 @@ import (
3737 "github.com/containerd/log"
3838 "github.com/containerd/ttrpc"
3939 "github.com/docker/go-metrics"
40- grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware"
41- grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
40+ grpc_prometheus "github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus"
4241 v1 "github.com/opencontainers/image-spec/specs-go/v1"
42+ "github.com/prometheus/client_golang/prometheus"
4343 "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
4444 "google.golang.org/grpc"
4545 "google.golang.org/grpc/backoff"
@@ -144,16 +144,25 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) {
144144 diff .RegisterProcessor (diff .BinaryHandler (id , p .Returns , p .Accepts , p .Path , p .Args , p .Env ))
145145 }
146146
147+ var prometheusServerMetricsOpts []grpc_prometheus.ServerMetricsOption
148+ if config .Metrics .GRPCHistogram {
149+ // Enable grpc time histograms to measure rpc latencies
150+ prometheusServerMetricsOpts = append (prometheusServerMetricsOpts , grpc_prometheus .WithServerHandlingTimeHistogram ())
151+ }
152+
153+ prometheusServerMetrics := grpc_prometheus .NewServerMetrics (prometheusServerMetricsOpts ... )
154+ prometheus .MustRegister (prometheusServerMetrics )
155+
147156 serverOpts := []grpc.ServerOption {
148157 grpc .StatsHandler (otelgrpc .NewServerHandler ()),
149- grpc .StreamInterceptor (grpc_middleware .ChainStreamServer (
150- grpc_prometheus .StreamServerInterceptor ,
158+ grpc .ChainStreamInterceptor (
151159 streamNamespaceInterceptor ,
152- ) ),
153- grpc . UnaryInterceptor ( grpc_middleware . ChainUnaryServer (
154- grpc_prometheus . UnaryServerInterceptor ,
160+ prometheusServerMetrics . StreamServerInterceptor ( ),
161+ ),
162+ grpc . ChainUnaryInterceptor (
155163 unaryNamespaceInterceptor ,
156- )),
164+ prometheusServerMetrics .UnaryServerInterceptor (),
165+ ),
157166 }
158167 if config .GRPC .MaxRecvMsgSize > 0 {
159168 serverOpts = append (serverOpts , grpc .MaxRecvMsgSize (config .GRPC .MaxRecvMsgSize ))
@@ -213,10 +222,11 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) {
213222 ttrpcServices []ttrpcService
214223
215224 s = & Server {
216- grpcServer : grpcServer ,
217- tcpServer : tcpServer ,
218- ttrpcServer : ttrpcServer ,
219- config : config ,
225+ prometheusServerMetrics : prometheusServerMetrics ,
226+ grpcServer : grpcServer ,
227+ tcpServer : tcpServer ,
228+ ttrpcServer : ttrpcServer ,
229+ config : config ,
220230 }
221231 initialized = plugin .NewPluginSet ()
222232 required = make (map [string ]struct {})
@@ -364,24 +374,18 @@ func recordConfigDeprecations(ctx context.Context, config *srvconfig.Config, set
364374
365375// Server is the containerd main daemon
366376type Server struct {
367- grpcServer * grpc.Server
368- ttrpcServer * ttrpc.Server
369- tcpServer * grpc.Server
370- config * srvconfig.Config
371- plugins []* plugin.Plugin
372- ready sync.WaitGroup
377+ prometheusServerMetrics * grpc_prometheus.ServerMetrics
378+ grpcServer * grpc.Server
379+ ttrpcServer * ttrpc.Server
380+ tcpServer * grpc.Server
381+ config * srvconfig.Config
382+ plugins []* plugin.Plugin
383+ ready sync.WaitGroup
373384}
374385
375386// ServeGRPC provides the containerd grpc APIs on the provided listener
376387func (s * Server ) ServeGRPC (l net.Listener ) error {
377- if s .config .Metrics .GRPCHistogram {
378- // enable grpc time histograms to measure rpc latencies
379- grpc_prometheus .EnableHandlingTimeHistogram ()
380- }
381- // before we start serving the grpc API register the grpc_prometheus metrics
382- // handler. This needs to be the last service registered so that it can collect
383- // metrics for every other service
384- grpc_prometheus .Register (s .grpcServer )
388+ s .prometheusServerMetrics .InitializeMetrics (s .grpcServer )
385389 return trapClosedConnErr (s .grpcServer .Serve (l ))
386390}
387391
@@ -403,7 +407,7 @@ func (s *Server) ServeMetrics(l net.Listener) error {
403407
404408// ServeTCP allows services to serve over tcp
405409func (s * Server ) ServeTCP (l net.Listener ) error {
406- grpc_prometheus . Register (s .tcpServer )
410+ s . prometheusServerMetrics . InitializeMetrics (s .tcpServer )
407411 return trapClosedConnErr (s .tcpServer .Serve (l ))
408412}
409413
0 commit comments