diff --git a/etcdserver/metrics.go b/etcdserver/metrics.go index 57e21ff37..3e24e8043 100644 --- a/etcdserver/metrics.go +++ b/etcdserver/metrics.go @@ -151,6 +151,19 @@ var ( Help: "Server or member ID in hexadecimal format. 1 for 'server_id' label with current ID.", }, []string{"server_id"}) + + fdUsed = prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: "os", + Subsystem: "fd", + Name: "used", + Help: "The number of used file descriptors.", + }) + fdLimit = prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: "os", + Subsystem: "fd", + Name: "limit", + Help: "The file descriptor limit.", + }) ) func init() { @@ -174,6 +187,8 @@ func init() { prometheus.MustRegister(isLearner) prometheus.MustRegister(learnerPromoteSucceed) prometheus.MustRegister(learnerPromoteFailed) + prometheus.MustRegister(fdUsed) + prometheus.MustRegister(fdLimit) currentVersion.With(prometheus.Labels{ "server_version": version.Version, @@ -184,7 +199,6 @@ func init() { } func monitorFileDescriptor(lg *zap.Logger, done <-chan struct{}) { - // This ticker will check File Descriptor Requirements ,and count all fds in used. // And recorded some logs when in used >= limit/5*4. Just recorded message. // If fds was more than 10K,It's low performance due to FDUsage() works. @@ -202,6 +216,7 @@ func monitorFileDescriptor(lg *zap.Logger, done <-chan struct{}) { } return } + fdUsed.Set(float64(used)) limit, err := runtime.FDLimit() if err != nil { if lg != nil { @@ -211,6 +226,7 @@ func monitorFileDescriptor(lg *zap.Logger, done <-chan struct{}) { } return } + fdLimit.Set(float64(limit)) if used >= limit/5*4 { if lg != nil { lg.Warn("80% of file descriptors are used", zap.Uint64("used", used), zap.Uint64("limit", limit))