@@ -37,9 +37,9 @@ import (
37
37
"github.com/containerd/log"
38
38
"github.com/containerd/ttrpc"
39
39
"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"
42
41
v1 "github.com/opencontainers/image-spec/specs-go/v1"
42
+ "github.com/prometheus/client_golang/prometheus"
43
43
"go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
44
44
"google.golang.org/grpc"
45
45
"google.golang.org/grpc/backoff"
@@ -144,16 +144,25 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) {
144
144
diff .RegisterProcessor (diff .BinaryHandler (id , p .Returns , p .Accepts , p .Path , p .Args , p .Env ))
145
145
}
146
146
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
+
147
156
serverOpts := []grpc.ServerOption {
148
157
grpc .StatsHandler (otelgrpc .NewServerHandler ()),
149
- grpc .StreamInterceptor (grpc_middleware .ChainStreamServer (
150
- grpc_prometheus .StreamServerInterceptor ,
158
+ grpc .ChainStreamInterceptor (
151
159
streamNamespaceInterceptor ,
152
- ) ),
153
- grpc . UnaryInterceptor ( grpc_middleware . ChainUnaryServer (
154
- grpc_prometheus . UnaryServerInterceptor ,
160
+ prometheusServerMetrics . StreamServerInterceptor ( ),
161
+ ),
162
+ grpc . ChainUnaryInterceptor (
155
163
unaryNamespaceInterceptor ,
156
- )),
164
+ prometheusServerMetrics .UnaryServerInterceptor (),
165
+ ),
157
166
}
158
167
if config .GRPC .MaxRecvMsgSize > 0 {
159
168
serverOpts = append (serverOpts , grpc .MaxRecvMsgSize (config .GRPC .MaxRecvMsgSize ))
@@ -213,10 +222,11 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) {
213
222
ttrpcServices []ttrpcService
214
223
215
224
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 ,
220
230
}
221
231
initialized = plugin .NewPluginSet ()
222
232
required = make (map [string ]struct {})
@@ -364,24 +374,18 @@ func recordConfigDeprecations(ctx context.Context, config *srvconfig.Config, set
364
374
365
375
// Server is the containerd main daemon
366
376
type 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
373
384
}
374
385
375
386
// ServeGRPC provides the containerd grpc APIs on the provided listener
376
387
func (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 )
385
389
return trapClosedConnErr (s .grpcServer .Serve (l ))
386
390
}
387
391
@@ -403,7 +407,7 @@ func (s *Server) ServeMetrics(l net.Listener) error {
403
407
404
408
// ServeTCP allows services to serve over tcp
405
409
func (s * Server ) ServeTCP (l net.Listener ) error {
406
- grpc_prometheus . Register (s .tcpServer )
410
+ s . prometheusServerMetrics . InitializeMetrics (s .tcpServer )
407
411
return trapClosedConnErr (s .tcpServer .Serve (l ))
408
412
}
409
413
0 commit comments