@@ -17,6 +17,7 @@ package v3rpc
1717import (
1818 "crypto/tls"
1919 "math"
20+ "sync"
2021
2122 grpc_prometheus "github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus"
2223 "github.com/prometheus/client_golang/prometheus"
@@ -35,22 +36,19 @@ const (
3536 maxSendBytes = math .MaxInt32
3637)
3738
39+ var (
40+ metricsServerLock sync.Mutex
41+ metricsServerCached * grpc_prometheus.ServerMetrics
42+ )
43+
3844func Server (s * etcdserver.EtcdServer , tls * tls.Config , interceptor grpc.UnaryServerInterceptor , gopts ... grpc.ServerOption ) * grpc.Server {
3945 var opts []grpc.ServerOption
4046 opts = append (opts , grpc .CustomCodec (& codec {}))
4147 if tls != nil {
4248 opts = append (opts , grpc .Creds (credentials .NewTransportCredential (tls )))
4349 }
4450
45- var mopts []grpc_prometheus.ServerMetricsOption
46- if s .Cfg .Metrics == "extensive" {
47- mopts = append (mopts , grpc_prometheus .WithServerHandlingTimeHistogram ())
48- }
49- serverMetrics := grpc_prometheus .NewServerMetrics (mopts ... )
50- err := prometheus .Register (serverMetrics )
51- if err != nil {
52- s .Cfg .Logger .Warn ("etcdserver: failed to register grpc metrics" , zap .Error (err ))
53- }
51+ serverMetrics := getServerMetrics (s .Cfg .Metrics , s .Cfg .Logger )
5452
5553 chainUnaryInterceptors := []grpc.UnaryServerInterceptor {
5654 newLogUnaryInterceptor (s ),
@@ -95,3 +93,22 @@ func Server(s *etcdserver.EtcdServer, tls *tls.Config, interceptor grpc.UnarySer
9593
9694 return grpcServer
9795}
96+
97+ func getServerMetrics (metricType string , lg * zap.Logger ) * grpc_prometheus.ServerMetrics {
98+ metricsServerLock .Lock ()
99+ defer metricsServerLock .Unlock ()
100+
101+ if metricsServerCached == nil {
102+ var mopts []grpc_prometheus.ServerMetricsOption
103+ if metricType == "extensive" {
104+ mopts = append (mopts , grpc_prometheus .WithServerHandlingTimeHistogram ())
105+ }
106+ metricsServerCached = grpc_prometheus .NewServerMetrics (mopts ... )
107+ err := prometheus .Register (metricsServerCached )
108+ if err != nil {
109+ lg .Warn ("etcdserver: failed to register grpc metrics" , zap .Error (err ))
110+ }
111+ }
112+
113+ return metricsServerCached
114+ }
0 commit comments