Skip to content

FreeBSD13/FreeBSD14 sysctl get zfs zroot read and write info, parseFreeBSDPoolObjsetStats function #2874

@mingjunyang

Description

@mingjunyang

Host operating system: FreeBSD myhost 14.0-RELEASE FreeBSD 14.0-RELEASE #0 releng/14.0-n265380-f9716eee8ab4: Fri Nov 10 05:57:23 UTC 2023 [email protected]:/usr/obj/usr/src/amd64.amd64/sys/GENERIC amd64

node_exporter version: master branch on commit c2dcc79

I have 2 pool in my system

 # zpool list
NAME    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
datas  43.7T   952K  43.7T        -         -     0%     0%  1.00x    ONLINE  -
zroot   236G  5.07G   231G        -         -     0%     2%  1.00x    ONLINE  -

I run the sysctl, unknown oid.

# sysctl -a 'kstat.zfs.pool.dataset'
sysctl: unknown oid 'kstat.zfs.pool.dataset'

I write the demo, maybe it's should work. I don't know if anyone fix this issues.

package main

import (
	"fmt"
	"golang.org/x/sys/unix"
)

func main() {
	zfsDatasetNames := []string{"datas", "zroot"}

	for zfsRootNameID := range zfsDatasetNames {
		sysCtlMetrics := []string{
			"nunlinked", "nunlinks", "nread", "reads", "nwritten", "writes",
		}
		for sysCtlMetricID := range sysCtlMetrics {
			zfsPoolMibPrefix := fmt.Sprintf("kstat.zfs.%s.dataset.objset-0x36.%s", zfsDatasetNames[zfsRootNameID], sysCtlMetrics[sysCtlMetricID])

			metricData, err := unix.SysctlUint64(zfsPoolMibPrefix)
			if err != nil {
				fmt.Println("couldn't get sysctl:", err)
			}
			fmt.Println(fmt.Sprintf("%s\t%d", zfsPoolMibPrefix, metricData))

		}
	}
}
# go run main.go 
kstat.zfs.datas.dataset.objset-0x36.nunlinked	0
kstat.zfs.datas.dataset.objset-0x36.nunlinks	0
kstat.zfs.datas.dataset.objset-0x36.nread	0
kstat.zfs.datas.dataset.objset-0x36.reads	0
kstat.zfs.datas.dataset.objset-0x36.nwritten	54
kstat.zfs.datas.dataset.objset-0x36.writes	4
kstat.zfs.zroot.dataset.objset-0x36.nunlinked	0
kstat.zfs.zroot.dataset.objset-0x36.nunlinks	0
kstat.zfs.zroot.dataset.objset-0x36.nread	0
kstat.zfs.zroot.dataset.objset-0x36.reads	0
kstat.zfs.zroot.dataset.objset-0x36.nwritten	0
kstat.zfs.zroot.dataset.objset-0x36.writes	0

And , I try build the project. Some error for me.

# go version
go version go1.21.5 freebsd/amd64

 go build
# github.com/prometheus/node_exporter/collector
collector/exec_bsd.go:65:4: undefined: labels
collector/exec_bsd.go:65:12: cannot use nil as bsdSysctl value in array or slice literal
collector/zfs_freebsd.go:338:6: undefined: strings
collector/zfs_freebsd.go:339:46: undefined: strings
collector/zfs_freebsd.go:343:28: undefined: zfsDatasetsNames
collector/zfs_freebsd.go:346:15: undefined: strings
collector/zfs_freebsd.go:350:22: undefined: fmt.SprintF
collector/zfs_freebsd.go:351:22: undefined: fmt.SprintF
collector/zfs_freebsd.go:352:60: undefined: poolObj

Maybe I can fix this issues, and I need a new FreeBSD version build.
So anyone try fix this before me?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions