pull/3141/merge
Daniel Kimsey 2025-02-17 10:00:34 +00:00 committed by GitHub
commit 60ad580b95
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 61 additions and 32 deletions

View File

@ -18,6 +18,7 @@
package collector package collector
import ( import (
"strconv"
"strings" "strings"
"golang.org/x/sys/unix" "golang.org/x/sys/unix"
@ -61,3 +62,15 @@ func parseHostNameAndDomainName(utsname unix.Utsname) (hostname string, domainna
} }
return hostname, domainname return hostname, domainname
} }
// getOSReleaseMajorMinor returns the Major.Minor version of the Operating System based on the uname's Release as a floating point number
// this is intended to assist in detecting OS compatibilty/support
func getOSReleaseMajorMinor() (float64, error) {
u, err := getUname()
if err != nil {
return 0, err
}
majorMinor := versionRegex.FindString(u.Release)
f, err := strconv.ParseFloat(majorMinor, 64)
return f, err
}

View File

@ -17,8 +17,9 @@
package collector package collector
import ( import (
"github.com/prometheus/client_golang/prometheus"
"log/slog" "log/slog"
"github.com/prometheus/client_golang/prometheus"
) )
type zfsCollector struct { type zfsCollector struct {
@ -31,7 +32,8 @@ const (
) )
func NewZFSCollector(logger *slog.Logger) (Collector, error) { func NewZFSCollector(logger *slog.Logger) (Collector, error) {
return &zfsCollector{ c := &zfsCollector{
// Common ZFS sysctl metrics
sysctls: []bsdSysctl{ sysctls: []bsdSysctl{
{ {
name: "abdstats_linear_count_total", name: "abdstats_linear_count_total",
@ -208,35 +210,6 @@ func NewZFSCollector(logger *slog.Logger) (Collector, error) {
dataType: bsdSysctlTypeUint64, dataType: bsdSysctlTypeUint64,
valueType: prometheus.GaugeValue, valueType: prometheus.GaugeValue,
}, },
// when FreeBSD 14.0+, `meta/pm/pd` install of `p`.
{
name: "arcstats_p_bytes",
description: "ZFS ARC MRU target size",
mib: "kstat.zfs.misc.arcstats.p",
dataType: bsdSysctlTypeUint64,
valueType: prometheus.GaugeValue,
},
{
name: "arcstats_meta_bytes",
description: "ZFS ARC metadata target frac ",
mib: "kstat.zfs.misc.arcstats.meta",
dataType: bsdSysctlTypeUint64,
valueType: prometheus.GaugeValue,
},
{
name: "arcstats_pd_bytes",
description: "ZFS ARC data MRU target frac",
mib: "kstat.zfs.misc.arcstats.pd",
dataType: bsdSysctlTypeUint64,
valueType: prometheus.GaugeValue,
},
{
name: "arcstats_pm_bytes",
description: "ZFS ARC meta MRU target frac",
mib: "kstat.zfs.misc.arcstats.pm",
dataType: bsdSysctlTypeUint64,
valueType: prometheus.GaugeValue,
},
{ {
name: "arcstats_size_bytes", name: "arcstats_size_bytes",
description: "ZFS ARC size", description: "ZFS ARC size",
@ -260,7 +233,50 @@ func NewZFSCollector(logger *slog.Logger) (Collector, error) {
}, },
}, },
logger: logger, logger: logger,
}, nil }
v, err := getOSReleaseMajorMinor()
if err != nil {
c.logger.Warn("unable to determine OS release, zfs arcstats metrics may be missing or unsupported", "error", err)
return c, nil
}
// when FreeBSD 14.0+, use `meta/pm/pd` instead of `p`.
if v >= 14.0 {
c.sysctls = append(c.sysctls,
bsdSysctl{
name: "arcstats_meta_bytes",
description: "ZFS ARC metadata target frac ",
mib: "kstat.zfs.misc.arcstats.meta",
dataType: bsdSysctlTypeUint64,
valueType: prometheus.GaugeValue,
},
bsdSysctl{
name: "arcstats_pd_bytes",
description: "ZFS ARC data MRU target frac",
mib: "kstat.zfs.misc.arcstats.pd",
dataType: bsdSysctlTypeUint64,
valueType: prometheus.GaugeValue,
},
bsdSysctl{
name: "arcstats_pm_bytes",
description: "ZFS ARC meta MRU target frac",
mib: "kstat.zfs.misc.arcstats.pm",
dataType: bsdSysctlTypeUint64,
valueType: prometheus.GaugeValue,
},
)
} else {
c.sysctls = append(c.sysctls,
bsdSysctl{
name: "arcstats_p_bytes",
description: "ZFS ARC MRU target size",
mib: "kstat.zfs.misc.arcstats.p",
dataType: bsdSysctlTypeUint64,
valueType: prometheus.GaugeValue,
},
)
}
return c, nil
} }
func (c *zfsCollector) Update(ch chan<- prometheus.Metric) error { func (c *zfsCollector) Update(ch chan<- prometheus.Metric) error {