From f0332993efc52e723d2337ff96969542a4ebd69a Mon Sep 17 00:00:00 2001 From: Li Ling Date: Thu, 20 Aug 2020 14:09:55 +0200 Subject: [PATCH 1/4] Empty collection should return success=0 (#1323, #1723) Signed-off-by: Li Ling --- collector/pressure_linux.go | 2 +- collector/rapl_linux.go | 2 +- collector/zfs.go | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/collector/pressure_linux.go b/collector/pressure_linux.go index 8f0b8db6..026b9c7b 100644 --- a/collector/pressure_linux.go +++ b/collector/pressure_linux.go @@ -89,7 +89,7 @@ func (c *pressureStatsCollector) Update(ch chan<- prometheus.Metric) error { vals, err := c.fs.PSIStatsForResource(res) if err != nil { level.Debug(c.logger).Log("msg", "pressure information is unavailable, you need a Linux kernel >= 4.20 and/or CONFIG_PSI enabled for your kernel") - return nil + return ErrNoData } switch res { case "cpu": diff --git a/collector/rapl_linux.go b/collector/rapl_linux.go index 25498c94..2a0e805f 100644 --- a/collector/rapl_linux.go +++ b/collector/rapl_linux.go @@ -50,7 +50,7 @@ func (c *raplCollector) Update(ch chan<- prometheus.Metric) error { // nil zones are fine when platform doesn't have powercap files present. zones, err := sysfs.GetRaplZones(c.fs) if err != nil { - return nil + return ErrNoData } for _, rz := range zones { diff --git a/collector/zfs.go b/collector/zfs.go index b530e350..332fde00 100644 --- a/collector/zfs.go +++ b/collector/zfs.go @@ -65,6 +65,14 @@ func NewZFSCollector(logger log.Logger) (Collector, error) { } func (c *zfsCollector) Update(ch chan<- prometheus.Metric) error { + + if _, err := c.openProcFile(c.linuxProcpathBase); err != nil { + if err == errZFSNotAvailable { + level.Debug(c.logger).Log("err", err) + return ErrNoData + } + } + for subsystem := range c.linuxPathMap { if err := c.updateZfsStats(subsystem, ch); err != nil { if err == errZFSNotAvailable { From a26ffaf4f84521e2c0e9ce035902bb00957ebcb6 Mon Sep 17 00:00:00 2001 From: Li Ling Date: Thu, 20 Aug 2020 14:18:57 +0200 Subject: [PATCH 2/4] Failed conntrack update should return success=0 (#1323, #1723) Signed-off-by: Li Ling --- collector/conntrack_linux.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/collector/conntrack_linux.go b/collector/conntrack_linux.go index 9dc8114f..8b60018d 100644 --- a/collector/conntrack_linux.go +++ b/collector/conntrack_linux.go @@ -51,14 +51,14 @@ func (c *conntrackCollector) Update(ch chan<- prometheus.Metric) error { value, err := readUintFromFile(procFilePath("sys/net/netfilter/nf_conntrack_count")) if err != nil { // Conntrack probably not loaded into the kernel. - return nil + return err } ch <- prometheus.MustNewConstMetric( c.current, prometheus.GaugeValue, float64(value)) value, err = readUintFromFile(procFilePath("sys/net/netfilter/nf_conntrack_max")) if err != nil { - return nil + return err } ch <- prometheus.MustNewConstMetric( c.limit, prometheus.GaugeValue, float64(value)) From 875f437fcc5fb81577a1528839d5262c15a089ff Mon Sep 17 00:00:00 2001 From: Li Ling Date: Wed, 26 Aug 2020 14:35:39 +0200 Subject: [PATCH 3/4] Conntrack update: differentiate ErrNoData and other errors (#1323, #1723) Signed-off-by: Li Ling --- collector/conntrack_linux.go | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/collector/conntrack_linux.go b/collector/conntrack_linux.go index 8b60018d..9c8f17d2 100644 --- a/collector/conntrack_linux.go +++ b/collector/conntrack_linux.go @@ -16,7 +16,12 @@ package collector import ( + "errors" + "fmt" + "os" + "github.com/go-kit/kit/log" + "github.com/go-kit/kit/log/level" "github.com/prometheus/client_golang/prometheus" ) @@ -50,18 +55,25 @@ func NewConntrackCollector(logger log.Logger) (Collector, error) { func (c *conntrackCollector) Update(ch chan<- prometheus.Metric) error { value, err := readUintFromFile(procFilePath("sys/net/netfilter/nf_conntrack_count")) if err != nil { - // Conntrack probably not loaded into the kernel. - return err + return c.handleErr(err) } ch <- prometheus.MustNewConstMetric( c.current, prometheus.GaugeValue, float64(value)) value, err = readUintFromFile(procFilePath("sys/net/netfilter/nf_conntrack_max")) if err != nil { - return err + return c.handleErr(err) } ch <- prometheus.MustNewConstMetric( c.limit, prometheus.GaugeValue, float64(value)) return nil } + +func (c *conntrackCollector) handleErr(err error) error { + if errors.Is(err, os.ErrNotExist) { + level.Debug(c.logger).Log("msg", "conntrack probably not loaded") + return ErrNoData + } + return fmt.Errorf("failed to retrieve conntrack stats: %w", err) +} From bf154d485b7da46f5daa52a1eaacffb898656fed Mon Sep 17 00:00:00 2001 From: Li Ling Date: Tue, 1 Sep 2020 16:21:36 +0200 Subject: [PATCH 4/4] Differentiate ErrNoData and other errors (#1323, #1723) Signed-off-by: Li Ling --- collector/pressure_linux.go | 9 +++++++-- collector/rapl_linux.go | 16 +++++++++++++--- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/collector/pressure_linux.go b/collector/pressure_linux.go index 026b9c7b..bd660451 100644 --- a/collector/pressure_linux.go +++ b/collector/pressure_linux.go @@ -16,7 +16,9 @@ package collector import ( + "errors" "fmt" + "os" "github.com/go-kit/kit/log" "github.com/go-kit/kit/log/level" @@ -88,8 +90,11 @@ func (c *pressureStatsCollector) Update(ch chan<- prometheus.Metric) error { level.Debug(c.logger).Log("msg", "collecting statistics for resource", "resource", res) vals, err := c.fs.PSIStatsForResource(res) if err != nil { - level.Debug(c.logger).Log("msg", "pressure information is unavailable, you need a Linux kernel >= 4.20 and/or CONFIG_PSI enabled for your kernel") - return ErrNoData + if errors.Is(err, os.ErrNotExist) { + level.Debug(c.logger).Log("msg", "pressure information is unavailable, you need a Linux kernel >= 4.20 and/or CONFIG_PSI enabled for your kernel") + return ErrNoData + } + return fmt.Errorf("failed to retrieve pressure stats: %w", err) } switch res { case "cpu": diff --git a/collector/rapl_linux.go b/collector/rapl_linux.go index 2a0e805f..bbcdbef0 100644 --- a/collector/rapl_linux.go +++ b/collector/rapl_linux.go @@ -16,15 +16,20 @@ package collector import ( + "errors" + "fmt" + "os" "strconv" "github.com/go-kit/kit/log" + "github.com/go-kit/kit/log/level" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/procfs/sysfs" ) type raplCollector struct { - fs sysfs.FS + fs sysfs.FS + logger log.Logger } func init() { @@ -40,7 +45,8 @@ func NewRaplCollector(logger log.Logger) (Collector, error) { } collector := raplCollector{ - fs: fs, + fs: fs, + logger: logger, } return &collector, nil } @@ -50,7 +56,11 @@ func (c *raplCollector) Update(ch chan<- prometheus.Metric) error { // nil zones are fine when platform doesn't have powercap files present. zones, err := sysfs.GetRaplZones(c.fs) if err != nil { - return ErrNoData + if errors.Is(err, os.ErrNotExist) { + level.Debug(c.logger).Log("msg", "Platform doesn't have powercap files present", "err", err) + return ErrNoData + } + return fmt.Errorf("failed to retrieve rapl stats: %w", err) } for _, rz := range zones {