From 4408aa0a1f3eadfd6c87a0a77df4659e690aadeb Mon Sep 17 00:00:00 2001 From: Dmitry Romanov Date: Fri, 26 Apr 2024 14:59:03 +0700 Subject: [PATCH] metric for deleted and unclosed file descriptors --- fd/fds_collector.go | 52 +++++++++++++++++++++++++++++++++++++++++++++ fd/file.d.go | 1 + go.mod | 2 +- 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 fd/fds_collector.go diff --git a/fd/fds_collector.go b/fd/fds_collector.go new file mode 100644 index 000000000..3f2485e6c --- /dev/null +++ b/fd/fds_collector.go @@ -0,0 +1,52 @@ +package fd + +import ( + "os" + "strings" + + "github.com/ozontech/file.d/logger" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/procfs" +) + +func newFdsCollector() prometheus.Collector { + c := &fdsCollector{ + processDeletedFds: prometheus.NewDesc( + "process_deleted_fds", + "Number of deleted and unclosed file descriptors.", + nil, nil, + ), + } + return c +} + +type fdsCollector struct { + processDeletedFds *prometheus.Desc +} + +func (f *fdsCollector) Collect(ch chan<- prometheus.Metric) { + p, err := procfs.NewProc(os.Getpid()) + if err != nil { + logger.Errorf("failed to get procfs: %s", err.Error()) + return + } + + targets, err := p.FileDescriptorTargets() + if err != nil { + logger.Errorf("failed to read file descriptor targets: %s", err.Error()) + return + } + + processDeletedFds := 0 + for _, target := range targets { + if strings.HasSuffix(target, " (deleted)") { + processDeletedFds++ + } + } + + ch <- prometheus.MustNewConstMetric(f.processDeletedFds, prometheus.GaugeValue, float64(processDeletedFds)) +} + +func (f *fdsCollector) Describe(ch chan<- *prometheus.Desc) { + ch <- f.processDeletedFds +} diff --git a/fd/file.d.go b/fd/file.d.go index 65e21ce84..2b928b636 100644 --- a/fd/file.d.go +++ b/fd/file.d.go @@ -69,6 +69,7 @@ func (f *FileD) createRegistry() { f.registry = prometheus.NewRegistry() f.registry.MustRegister(prometheus.NewProcessCollector(prometheus.ProcessCollectorOpts{})) f.registry.MustRegister(prometheus.NewGoCollector()) + f.registry.MustRegister(newFdsCollector()) } func (f *FileD) startPipelines() { diff --git a/go.mod b/go.mod index 1c64d9e88..dc8aa3dcc 100644 --- a/go.mod +++ b/go.mod @@ -27,6 +27,7 @@ require ( github.com/klauspost/compress v1.16.7 github.com/minio/minio-go v6.0.14+incompatible github.com/prometheus/client_golang v1.16.0 + github.com/prometheus/procfs v0.10.1 github.com/rjeczalik/notify v0.9.3 github.com/satori/go.uuid v1.2.0 github.com/stretchr/testify v1.8.4 @@ -120,7 +121,6 @@ require ( github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect github.com/prometheus/common v0.42.0 // indirect - github.com/prometheus/procfs v0.10.1 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/ryanuber/go-glob v1.0.0 // indirect github.com/segmentio/asm v1.2.0 // indirect