From 896b8a1ca706e406d6576af42caf93a3521c55b6 Mon Sep 17 00:00:00 2001 From: Conall O'Brien Date: Wed, 19 Jul 2023 14:49:38 +0100 Subject: [PATCH 1/8] Rename parsePoolObjsetFile to parseLinuxPoolObjsetFile to better reflect it's scope Signed-off-by: Conall O'Brien --- collector/zfs_linux.go | 4 ++-- collector/zfs_linux_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/collector/zfs_linux.go b/collector/zfs_linux.go index ec195b3d62..e7be4a9836 100644 --- a/collector/zfs_linux.go +++ b/collector/zfs_linux.go @@ -104,7 +104,7 @@ func (c *zfsCollector) updatePoolStats(ch chan<- prometheus.Metric) error { return errZFSNotAvailable } - err = c.parsePoolObjsetFile(file, zpoolPath, func(poolName string, datasetName string, s zfsSysctl, v uint64) { + err = c.parseLinuxPoolObjsetFile(file, zpoolPath, func(poolName string, datasetName string, s zfsSysctl, v uint64) { ch <- c.constPoolObjsetMetric(poolName, datasetName, s, v) }) file.Close() @@ -220,7 +220,7 @@ func (c *zfsCollector) parsePoolProcfsFile(reader io.Reader, zpoolPath string, h return scanner.Err() } -func (c *zfsCollector) parsePoolObjsetFile(reader io.Reader, zpoolPath string, handler func(string, string, zfsSysctl, uint64)) error { +func (c *zfsCollector) parseLinuxPoolObjsetFile(reader io.Reader, zpoolPath string, handler func(string, string, zfsSysctl, uint64)) error { scanner := bufio.NewScanner(reader) parseLine := false diff --git a/collector/zfs_linux_test.go b/collector/zfs_linux_test.go index 69e4ed8fc1..f6ce8d9487 100644 --- a/collector/zfs_linux_test.go +++ b/collector/zfs_linux_test.go @@ -332,7 +332,7 @@ func TestZpoolObjsetParsing(t *testing.T) { t.Fatal(err) } - err = c.parsePoolObjsetFile(file, zpoolPath, func(poolName string, datasetName string, s zfsSysctl, v uint64) { + err = c.parseLinuxPoolObjsetFile(file, zpoolPath, func(poolName string, datasetName string, s zfsSysctl, v uint64) { if s != zfsSysctl("kstat.zfs.misc.objset.writes") { return } From 75d23aa7642d38be8eeb569e7489aaa83fcbc209 Mon Sep 17 00:00:00 2001 From: Conall O'Brien Date: Thu, 20 Jul 2023 12:37:29 +0100 Subject: [PATCH 2/8] Create a new parseFreeBSDPoolObjsetStats function, to generate a list of per pool metrics to be queried via sysctl Signed-off-by: Conall O'Brien --- collector/zfs_freebsd.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/collector/zfs_freebsd.go b/collector/zfs_freebsd.go index 2418b229d0..6db076ebb4 100644 --- a/collector/zfs_freebsd.go +++ b/collector/zfs_freebsd.go @@ -21,6 +21,8 @@ import ( "github.com/go-kit/log" "github.com/prometheus/client_golang/prometheus" + + "golang.org/x/sys/unix" ) type zfsCollector struct { @@ -264,3 +266,38 @@ func (c *zfsCollector) Update(ch chan<- prometheus.Metric) error { return nil } + +func (c *zfsCollector) parseFreeBSDPoolObjsetStats() error { + zfsPoolMibPrefix := "kstat.zfs.pool.dataset" + zfsPoolObjs := []string{} + + zfsDatasets, err := unix.Sysctl(zfsPoolMibPrefix) + if err != nil { + return fmt.Errorf("couldn't get sysctl: %w", err) + } + for dataset, _ := range zfsDatasets { + if strings.HasSuffix(dataset, ".dataset_name") { + zfsPoolObjs = append(zfsPoolObjs, strings.SplitAfter(dataset, ".")[3]) + } + } + + // TODO(conallob): Check if bsdSysCtl or prometheus.Metric should be used + perPoolMetric := []bsdSysctl{} + sysCtlMetrics := []string{ + "nunlinked", "nunlinks", "nread", "reads", "nwritten", "writes", + } + + for poolObj := range zfsPoolObjs { + for metric := range sysCtlMetrics { + sysCtlMetrics = append(sysCtlMetrics, { + name: fmt.SprintF("node_zfs_zpool_dataset_%s", metric), + description: fmt.SprintF("node_zfs_zpool_dataset_%s", metric), + mib: fmt.Sprintf("%s.%s.%s", + zfsPoolMibPrefix, poolObj, metric), + dataType: bsdSysctlTypeUint64, + valueType: prometheus.CounterValue, + }) + } + + return nil +} From 7e2a867cda579f7022c724345b5ed196a8e9dcbf Mon Sep 17 00:00:00 2001 From: Conall O'Brien Date: Thu, 20 Jul 2023 12:46:51 +0100 Subject: [PATCH 3/8] Add missing brace and correct slice variable to append to Signed-off-by: Conall O'Brien --- collector/zfs_freebsd.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/collector/zfs_freebsd.go b/collector/zfs_freebsd.go index 6db076ebb4..5da354dac2 100644 --- a/collector/zfs_freebsd.go +++ b/collector/zfs_freebsd.go @@ -275,6 +275,7 @@ func (c *zfsCollector) parseFreeBSDPoolObjsetStats() error { if err != nil { return fmt.Errorf("couldn't get sysctl: %w", err) } + for dataset, _ := range zfsDatasets { if strings.HasSuffix(dataset, ".dataset_name") { zfsPoolObjs = append(zfsPoolObjs, strings.SplitAfter(dataset, ".")[3]) @@ -282,21 +283,22 @@ func (c *zfsCollector) parseFreeBSDPoolObjsetStats() error { } // TODO(conallob): Check if bsdSysCtl or prometheus.Metric should be used - perPoolMetric := []bsdSysctl{} + perPoolMetrics := []bsdSysctl{} sysCtlMetrics := []string{ "nunlinked", "nunlinks", "nread", "reads", "nwritten", "writes", } for poolObj := range zfsPoolObjs { for metric := range sysCtlMetrics { - sysCtlMetrics = append(sysCtlMetrics, { - name: fmt.SprintF("node_zfs_zpool_dataset_%s", metric), - description: fmt.SprintF("node_zfs_zpool_dataset_%s", metric), - mib: fmt.Sprintf("%s.%s.%s", + perPoolMetrics = append(perPoolMetrics, { + name: fmt.SprintF("node_zfs_zpool_dataset_%s", metric), + description: fmt.SprintF("node_zfs_zpool_dataset_%s", metric), + mib: fmt.Sprintf("%s.%s.%s", zfsPoolMibPrefix, poolObj, metric), - dataType: bsdSysctlTypeUint64, - valueType: prometheus.CounterValue, + dataType: bsdSysctlTypeUint64, + valueType: prometheus.CounterValue, }) + } } return nil From 254d623a4944005e1c7df1fa5476f9ed5ffdbdde Mon Sep 17 00:00:00 2001 From: Conall O'Brien Date: Mon, 14 Aug 2023 20:12:22 +0100 Subject: [PATCH 4/8] Evolve bsdSysctl struct to include a labels attribute of type prometheus.Labels. Update all references of bsdSysctl to set labels to nil Signed-off-by: Conall O'Brien --- collector/exec_bsd.go | 6 ++++++ collector/memory_bsd.go | 12 ++++++++++++ collector/netisr_freebsd.go | 6 ++++++ collector/sysctl_bsd.go | 3 +++ 4 files changed, 27 insertions(+) diff --git a/collector/exec_bsd.go b/collector/exec_bsd.go index 87cb3ceeb4..7ae5e2ee32 100644 --- a/collector/exec_bsd.go +++ b/collector/exec_bsd.go @@ -49,31 +49,37 @@ func NewExecCollector(logger log.Logger) (Collector, error) { name: "exec_context_switches_total", description: "Context switches since system boot. Resets at architecture unsigned integer.", mib: "vm.stats.sys.v_swtch", + labels: nil, }, { name: "exec_traps_total", description: "Traps since system boot. Resets at architecture unsigned integer.", mib: "vm.stats.sys.v_trap", + labels: nil, }, { name: "exec_system_calls_total", description: "System calls since system boot. Resets at architecture unsigned integer.", mib: "vm.stats.sys.v_syscall", }, + labels: nil, { name: "exec_device_interrupts_total", description: "Device interrupts since system boot. Resets at architecture unsigned integer.", mib: "vm.stats.sys.v_intr", + labels: nil, }, { name: "exec_software_interrupts_total", description: "Software interrupts since system boot. Resets at architecture unsigned integer.", mib: "vm.stats.sys.v_soft", + labels: nil, }, { name: "exec_forks_total", description: "Number of fork() calls since system boot. Resets at architecture unsigned integer.", mib: "vm.stats.vm.v_forks", + labels: nil, }, }, logger: logger, diff --git a/collector/memory_bsd.go b/collector/memory_bsd.go index 6af9d8aaa4..6f16ac896d 100644 --- a/collector/memory_bsd.go +++ b/collector/memory_bsd.go @@ -69,18 +69,21 @@ func NewMemoryCollector(logger log.Logger) (Collector, error) { description: "Recently used by userland", mib: "vm.stats.vm.v_active_count", conversion: fromPage, + labels: nil, }, { name: "inactive_bytes", description: "Not recently used by userland", mib: "vm.stats.vm.v_inactive_count", conversion: fromPage, + labels: nil, }, { name: "wired_bytes", description: "Locked in memory by kernel, mlock, etc", mib: "vm.stats.vm.v_wire_count", conversion: fromPage, + labels: nil, }, { name: "user_wired_bytes", @@ -88,42 +91,49 @@ func NewMemoryCollector(logger log.Logger) (Collector, error) { mib: "vm.stats.vm.v_user_wire_count", conversion: fromPage, dataType: bsdSysctlTypeCLong, + labels: nil, }, { name: "cache_bytes", description: "Almost free, backed by swap or files, available for re-allocation", mib: "vm.stats.vm.v_cache_count", conversion: fromPage, + labels: nil, }, { name: "buffer_bytes", description: "Disk IO Cache entries for non ZFS filesystems, only usable by kernel", mib: "vfs.bufspace", dataType: bsdSysctlTypeCLong, + labels: nil, }, { name: "free_bytes", description: "Unallocated, available for allocation", mib: "vm.stats.vm.v_free_count", conversion: fromPage, + labels: nil, }, { name: "laundry_bytes", description: "Dirty not recently used by userland", mib: "vm.stats.vm.v_laundry_count", conversion: fromPage, + labels: nil, }, { name: "size_bytes", description: "Total physical memory size", mib: "vm.stats.vm.v_page_count", conversion: fromPage, + labels: nil, }, { name: "swap_size_bytes", description: "Total swap memory size", mib: mibSwapTotal, dataType: bsdSysctlTypeUint64, + labels: nil, }, // Descriptions via: top(1) { @@ -132,6 +142,7 @@ func NewMemoryCollector(logger log.Logger) (Collector, error) { mib: "vm.stats.vm.v_swappgsin", valueType: prometheus.CounterValue, conversion: fromPage, + labels: nil, }, { name: "swap_out_bytes_total", @@ -139,6 +150,7 @@ func NewMemoryCollector(logger log.Logger) (Collector, error) { mib: "vm.stats.vm.v_swappgsout", valueType: prometheus.CounterValue, conversion: fromPage, + labels: nil, }, }, }, nil diff --git a/collector/netisr_freebsd.go b/collector/netisr_freebsd.go index 4ac10dae83..ff5e9f7125 100644 --- a/collector/netisr_freebsd.go +++ b/collector/netisr_freebsd.go @@ -45,6 +45,7 @@ func NewNetisrCollector(logger log.Logger) (Collector, error) { mib: "net.isr.numthreads", dataType: bsdSysctlTypeUint32, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "maxprot", @@ -52,6 +53,7 @@ func NewNetisrCollector(logger log.Logger) (Collector, error) { mib: "net.isr.maxprot", dataType: bsdSysctlTypeUint32, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "defaultqlimit", @@ -59,6 +61,7 @@ func NewNetisrCollector(logger log.Logger) (Collector, error) { mib: "net.isr.defaultqlimit", dataType: bsdSysctlTypeUint32, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "maxqlimit", @@ -66,6 +69,7 @@ func NewNetisrCollector(logger log.Logger) (Collector, error) { mib: "net.isr.maxqlimit", dataType: bsdSysctlTypeUint32, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "bindthreads", @@ -73,6 +77,7 @@ func NewNetisrCollector(logger log.Logger) (Collector, error) { mib: "net.isr.bindthreads", dataType: bsdSysctlTypeUint32, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "maxthreads", @@ -80,6 +85,7 @@ func NewNetisrCollector(logger log.Logger) (Collector, error) { mib: "net.isr.maxthreads", dataType: bsdSysctlTypeUint32, valueType: prometheus.GaugeValue, + labels: nil, }, }, logger: logger, diff --git a/collector/sysctl_bsd.go b/collector/sysctl_bsd.go index 2ab248ed2e..8c7d6ed018 100644 --- a/collector/sysctl_bsd.go +++ b/collector/sysctl_bsd.go @@ -59,6 +59,9 @@ type bsdSysctl struct { // Post-retrieval conversion hooks conversion func(float64) float64 + + // Prometheus labels + labels prometheus.Labels } func (b bsdSysctl) Value() (float64, error) { From 055c4f0ed82b32fb628506412ce9b26cbca3da20 Mon Sep 17 00:00:00 2001 From: Conall O'Brien Date: Mon, 14 Aug 2023 20:15:04 +0100 Subject: [PATCH 5/8] Add labels attributes to bsdSysctl objects, set to nil for existing mibs. Set zpool and dataset labels on the per ZFS dataset status, using consistent label naming from https://github.com/prometheus/node_exporter/pull/2753 Signed-off-by: Conall O'Brien --- collector/zfs_freebsd.go | 39 +++++++++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/collector/zfs_freebsd.go b/collector/zfs_freebsd.go index 5da354dac2..e6dbc3c122 100644 --- a/collector/zfs_freebsd.go +++ b/collector/zfs_freebsd.go @@ -47,6 +47,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.abdstats.linear_cnt", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, + labels: nil, }, { name: "abdstats_linear_data_bytes", @@ -54,6 +55,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.abdstats.linear_data_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "abdstats_scatter_chunk_waste_bytes", @@ -61,6 +63,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.abdstats.scatter_chunk_waste", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "abdstats_scatter_count_total", @@ -68,6 +71,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.abdstats.scatter_cnt", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, + labels: nil, }, { name: "abdstats_scatter_data_bytes", @@ -75,6 +79,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.abdstats.scatter_data_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "abdstats_struct_bytes", @@ -82,6 +87,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.abdstats.struct_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "arcstats_anon_bytes", @@ -89,6 +95,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.anon_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "arcstats_c_bytes", @@ -96,6 +103,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.c", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "arcstats_c_max_bytes", @@ -103,6 +111,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.c_max", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "arcstats_c_min_bytes", @@ -110,6 +119,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.c_min", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "arcstats_data_bytes", @@ -117,6 +127,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.data_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "arcstats_demand_data_hits_total", @@ -124,6 +135,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.demand_data_hits", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, + labels: nil, }, { name: "arcstats_demand_data_misses_total", @@ -131,6 +143,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.demand_data_misses", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, + labels: nil, }, { name: "arcstats_demand_metadata_hits_total", @@ -138,6 +151,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.demand_metadata_hits", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, + labels: nil, }, { name: "arcstats_demand_metadata_misses_total", @@ -145,6 +159,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.demand_metadata_misses", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, + labels: nil, }, { name: "arcstats_hdr_bytes", @@ -152,6 +167,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.hdr_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "arcstats_hits_total", @@ -159,6 +175,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.hits", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, + labels: nil, }, { name: "arcstats_misses_total", @@ -166,6 +183,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.misses", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, + labels: nil, }, { name: "arcstats_mfu_ghost_hits_total", @@ -173,6 +191,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.mfu_ghost_hits", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, + labels: nil, }, { name: "arcstats_mfu_ghost_size", @@ -180,6 +199,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.mfu_ghost_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "arcstats_mfu_bytes", @@ -187,6 +207,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.mfu_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "arcstats_mru_ghost_hits_total", @@ -194,6 +215,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.mru_ghost_hits", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, + labels: nil, }, { name: "arcstats_mru_ghost_bytes", @@ -201,6 +223,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.mru_ghost_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "arcstats_mru_bytes", @@ -208,6 +231,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.mru_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "arcstats_other_bytes", @@ -215,6 +239,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.other_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "arcstats_p_bytes", @@ -222,6 +247,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.p", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "arcstats_size_bytes", @@ -229,6 +255,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, + labels: nil, }, { name: "zfetchstats_hits_total", @@ -236,6 +263,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.zfetchstats.hits", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, + labels: nil, }, { name: "zfetchstats_misses_total", @@ -243,6 +271,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.zfetchstats.misses", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, + labels: nil, }, }, logger: logger, @@ -269,7 +298,7 @@ func (c *zfsCollector) Update(ch chan<- prometheus.Metric) error { func (c *zfsCollector) parseFreeBSDPoolObjsetStats() error { zfsPoolMibPrefix := "kstat.zfs.pool.dataset" - zfsPoolObjs := []string{} + zfsDatasetsNames:= []string{} zfsDatasets, err := unix.Sysctl(zfsPoolMibPrefix) if err != nil { @@ -278,17 +307,16 @@ func (c *zfsCollector) parseFreeBSDPoolObjsetStats() error { for dataset, _ := range zfsDatasets { if strings.HasSuffix(dataset, ".dataset_name") { - zfsPoolObjs = append(zfsPoolObjs, strings.SplitAfter(dataset, ".")[3]) + zfsDatasetNames = append(zfsDatasetNames, strings.SplitAfter(dataset, ".")[3]) } } - // TODO(conallob): Check if bsdSysCtl or prometheus.Metric should be used perPoolMetrics := []bsdSysctl{} sysCtlMetrics := []string{ "nunlinked", "nunlinks", "nread", "reads", "nwritten", "writes", } - for poolObj := range zfsPoolObjs { + for zpoolDataset := range zfsDatasetsNames { for metric := range sysCtlMetrics { perPoolMetrics = append(perPoolMetrics, { name: fmt.SprintF("node_zfs_zpool_dataset_%s", metric), @@ -297,6 +325,9 @@ func (c *zfsCollector) parseFreeBSDPoolObjsetStats() error { zfsPoolMibPrefix, poolObj, metric), dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, + labels: {"dataset": zpoolDataset, + "zpool": strings.SplitAfter(zpoolDataset, "/")[0] + } }) } } From c33a11666f227dd5871f1251df38dbb4b0dac017 Mon Sep 17 00:00:00 2001 From: Conall O'Brien Date: Mon, 14 Aug 2023 23:52:24 +0100 Subject: [PATCH 6/8] Rename zfsPoolObjs to zfsDatasetsNames, to be self documenting. Fix append() to perPoolMetrics to cast object as type bsdSysctl Signed-off-by: Conall O'Brien --- collector/zfs_freebsd.go | 88 ++++++++++++++++++++-------------------- 1 file changed, 45 insertions(+), 43 deletions(-) diff --git a/collector/zfs_freebsd.go b/collector/zfs_freebsd.go index e6dbc3c122..b6334e3894 100644 --- a/collector/zfs_freebsd.go +++ b/collector/zfs_freebsd.go @@ -47,7 +47,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.abdstats.linear_cnt", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, - labels: nil, + labels: nil, }, { name: "abdstats_linear_data_bytes", @@ -55,7 +55,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.abdstats.linear_data_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "abdstats_scatter_chunk_waste_bytes", @@ -63,7 +63,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.abdstats.scatter_chunk_waste", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "abdstats_scatter_count_total", @@ -71,7 +71,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.abdstats.scatter_cnt", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, - labels: nil, + labels: nil, }, { name: "abdstats_scatter_data_bytes", @@ -79,7 +79,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.abdstats.scatter_data_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "abdstats_struct_bytes", @@ -87,7 +87,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.abdstats.struct_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "arcstats_anon_bytes", @@ -95,7 +95,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.anon_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "arcstats_c_bytes", @@ -103,7 +103,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.c", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "arcstats_c_max_bytes", @@ -111,7 +111,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.c_max", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "arcstats_c_min_bytes", @@ -119,7 +119,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.c_min", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "arcstats_data_bytes", @@ -127,7 +127,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.data_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "arcstats_demand_data_hits_total", @@ -135,7 +135,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.demand_data_hits", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, - labels: nil, + labels: nil, }, { name: "arcstats_demand_data_misses_total", @@ -143,7 +143,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.demand_data_misses", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, - labels: nil, + labels: nil, }, { name: "arcstats_demand_metadata_hits_total", @@ -151,7 +151,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.demand_metadata_hits", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, - labels: nil, + labels: nil, }, { name: "arcstats_demand_metadata_misses_total", @@ -159,7 +159,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.demand_metadata_misses", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, - labels: nil, + labels: nil, }, { name: "arcstats_hdr_bytes", @@ -167,7 +167,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.hdr_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "arcstats_hits_total", @@ -175,7 +175,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.hits", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, - labels: nil, + labels: nil, }, { name: "arcstats_misses_total", @@ -183,7 +183,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.misses", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, - labels: nil, + labels: nil, }, { name: "arcstats_mfu_ghost_hits_total", @@ -191,7 +191,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.mfu_ghost_hits", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, - labels: nil, + labels: nil, }, { name: "arcstats_mfu_ghost_size", @@ -199,7 +199,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.mfu_ghost_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "arcstats_mfu_bytes", @@ -207,7 +207,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.mfu_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "arcstats_mru_ghost_hits_total", @@ -215,7 +215,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.mru_ghost_hits", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, - labels: nil, + labels: nil, }, { name: "arcstats_mru_ghost_bytes", @@ -223,7 +223,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.mru_ghost_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "arcstats_mru_bytes", @@ -231,7 +231,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.mru_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "arcstats_other_bytes", @@ -239,7 +239,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.other_size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "arcstats_p_bytes", @@ -247,7 +247,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.p", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "arcstats_size_bytes", @@ -255,7 +255,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.arcstats.size", dataType: bsdSysctlTypeUint64, valueType: prometheus.GaugeValue, - labels: nil, + labels: nil, }, { name: "zfetchstats_hits_total", @@ -263,7 +263,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.zfetchstats.hits", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, - labels: nil, + labels: nil, }, { name: "zfetchstats_misses_total", @@ -271,7 +271,7 @@ func NewZfsCollector(logger log.Logger) (Collector, error) { mib: "kstat.zfs.misc.zfetchstats.misses", dataType: bsdSysctlTypeUint64, valueType: prometheus.CounterValue, - labels: nil, + labels: nil, }, }, logger: logger, @@ -297,8 +297,12 @@ func (c *zfsCollector) Update(ch chan<- prometheus.Metric) error { } func (c *zfsCollector) parseFreeBSDPoolObjsetStats() error { + + sysCtlMetrics := []string{ + "nunlinked", "nunlinks", "nread", "reads", "nwritten", "writes", + } zfsPoolMibPrefix := "kstat.zfs.pool.dataset" - zfsDatasetsNames:= []string{} + zfsDatasetsNames := []string{} zfsDatasets, err := unix.Sysctl(zfsPoolMibPrefix) if err != nil { @@ -312,22 +316,20 @@ func (c *zfsCollector) parseFreeBSDPoolObjsetStats() error { } perPoolMetrics := []bsdSysctl{} - sysCtlMetrics := []string{ - "nunlinked", "nunlinks", "nread", "reads", "nwritten", "writes", - } for zpoolDataset := range zfsDatasetsNames { + zfsDatasetLabels := map[string]string{ + "dataset": zpoolDataset, + "zpool": strings.SplitAfter(zpoolDataset, "/")[0], + } for metric := range sysCtlMetrics { - perPoolMetrics = append(perPoolMetrics, { - name: fmt.SprintF("node_zfs_zpool_dataset_%s", metric), - description: fmt.SprintF("node_zfs_zpool_dataset_%s", metric), - mib: fmt.Sprintf("%s.%s.%s", - zfsPoolMibPrefix, poolObj, metric), - dataType: bsdSysctlTypeUint64, - valueType: prometheus.CounterValue, - labels: {"dataset": zpoolDataset, - "zpool": strings.SplitAfter(zpoolDataset, "/")[0] - } + perPoolMetrics = append(perPoolMetrics, bsdSysctl{ + name: fmt.SprintF("node_zfs_zpool_dataset_%s", metric), + description: fmt.SprintF("node_zfs_zpool_dataset_%s", metric), + mib: fmt.Sprintf("%s.%s.%s", zfsPoolMibPrefix, poolObj, metric), + dataType: bsdSysctlTypeUint64, + valueType: prometheus.CounterValue, + labels: zfsDatasetLabels, }) } } From 8c8f84f6e0a58ccdcacefe1ec171da8e7cd3f914 Mon Sep 17 00:00:00 2001 From: Conall O'Brien Date: Tue, 15 Aug 2023 00:01:30 +0100 Subject: [PATCH 7/8] Replace perPoolMetrics with just appending directly to c.sysctls Signed-off-by: Conall O'Brien --- collector/zfs_freebsd.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/collector/zfs_freebsd.go b/collector/zfs_freebsd.go index b6334e3894..2b3948a50a 100644 --- a/collector/zfs_freebsd.go +++ b/collector/zfs_freebsd.go @@ -315,15 +315,13 @@ func (c *zfsCollector) parseFreeBSDPoolObjsetStats() error { } } - perPoolMetrics := []bsdSysctl{} - for zpoolDataset := range zfsDatasetsNames { zfsDatasetLabels := map[string]string{ "dataset": zpoolDataset, "zpool": strings.SplitAfter(zpoolDataset, "/")[0], } for metric := range sysCtlMetrics { - perPoolMetrics = append(perPoolMetrics, bsdSysctl{ + c.sysctls = append(c.sysctls, bsdSysctl{ name: fmt.SprintF("node_zfs_zpool_dataset_%s", metric), description: fmt.SprintF("node_zfs_zpool_dataset_%s", metric), mib: fmt.Sprintf("%s.%s.%s", zfsPoolMibPrefix, poolObj, metric), From e8a9810f8d9c2f57854793d65f76c09c32baf4b9 Mon Sep 17 00:00:00 2001 From: Conall O'Brien Date: Tue, 15 Aug 2023 00:04:09 +0100 Subject: [PATCH 8/8] Run gofmt Signed-off-by: Conall O'Brien --- collector/sysctl_bsd.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/collector/sysctl_bsd.go b/collector/sysctl_bsd.go index 8c7d6ed018..df5c9f93f1 100644 --- a/collector/sysctl_bsd.go +++ b/collector/sysctl_bsd.go @@ -61,7 +61,7 @@ type bsdSysctl struct { conversion func(float64) float64 // Prometheus labels - labels prometheus.Labels + labels prometheus.Labels } func (b bsdSysctl) Value() (float64, error) {