Skip to content

Commit 0745315

Browse files
authored
Merge pull request #20905 from k8s-infra-cherrypick-robot/cherry-pick-20887-to-release-3.6
[release-3.6] fix duplicate metrics collector registration attempted
2 parents 88b9794 + 145d927 commit 0745315

File tree

1 file changed

+26
-9
lines changed

1 file changed

+26
-9
lines changed

server/etcdserver/api/v3rpc/grpc.go

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package v3rpc
1717
import (
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+
3844
func 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

Comments
 (0)