From 690efa61e86acefdf05bb4334a3d68128ded49c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Knecht?= Date: Fri, 17 Jun 2022 14:17:35 +0200 Subject: [PATCH] collector/diskstats: Ignore udev when directory unreadable MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Log a single error message when the udev data directory (`/run/udev/data` by default) is unreadable, and then don't try to get device properties out of it. Also lower the log level from error to debug when we can't parse the udev files properly, since these messages would be sent every time the node exporter gets scraped. Signed-off-by: BenoƮt Knecht --- collector/diskstats_linux.go | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/collector/diskstats_linux.go b/collector/diskstats_linux.go index 961be248..d7a4287e 100644 --- a/collector/diskstats_linux.go +++ b/collector/diskstats_linux.go @@ -77,14 +77,15 @@ func (d *typedFactorDesc) mustNewConstMetric(value float64, labels ...string) pr } type diskstatsCollector struct { - deviceFilter deviceFilter - fs blockdevice.FS - infoDesc typedFactorDesc - descs []typedFactorDesc - filesystemInfoDesc typedFactorDesc - deviceMapperInfoDesc typedFactorDesc - ataDescs map[string]typedFactorDesc - logger log.Logger + deviceFilter deviceFilter + fs blockdevice.FS + infoDesc typedFactorDesc + descs []typedFactorDesc + filesystemInfoDesc typedFactorDesc + deviceMapperInfoDesc typedFactorDesc + ataDescs map[string]typedFactorDesc + logger log.Logger + getUdevDeviceProperties func(uint32, uint32) (udevInfo, error) } func init() { @@ -105,7 +106,7 @@ func NewDiskstatsCollector(logger log.Logger) (Collector, error) { return nil, fmt.Errorf("failed to parse device filter flags: %w", err) } - return &diskstatsCollector{ + collector := diskstatsCollector{ deviceFilter: deviceFilter, fs: fs, infoDesc: typedFactorDesc{ @@ -256,7 +257,16 @@ func NewDiskstatsCollector(logger log.Logger) (Collector, error) { }, }, logger: logger, - }, nil + } + + // Only enable getting device properties from udev if the directory is readable. + if stat, err := os.Stat(*udevDataPath); err != nil || !stat.IsDir() { + level.Error(logger).Log("msg", "Failed to open directory, disabling udev device properties", "path", *udevDataPath) + } else { + collector.getUdevDeviceProperties = getUdevDeviceProperties + } + + return &collector, nil } func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error { @@ -273,7 +283,7 @@ func (c *diskstatsCollector) Update(ch chan<- prometheus.Metric) error { info, err := getUdevDeviceProperties(stats.MajorNumber, stats.MinorNumber) if err != nil { - level.Error(c.logger).Log("msg", "Failed to parse udev info", "err", err) + level.Debug(c.logger).Log("msg", "Failed to parse udev info", "err", err) } ch <- c.infoDesc.mustNewConstMetric(1.0, dev,