@ -21,6 +21,8 @@ import (
"github.com/go-kit/log"
"github.com/prometheus/client_golang/prometheus"
"golang.org/x/sys/unix"
)
type zfsCollector struct {
@ -45,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" ,
@ -52,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" ,
@ -59,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" ,
@ -66,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" ,
@ -73,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" ,
@ -80,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" ,
@ -87,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" ,
@ -94,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" ,
@ -101,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" ,
@ -108,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" ,
@ -115,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" ,
@ -122,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" ,
@ -129,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" ,
@ -136,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" ,
@ -143,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" ,
@ -150,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" ,
@ -157,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" ,
@ -164,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" ,
@ -171,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" ,
@ -178,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" ,
@ -185,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" ,
@ -192,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" ,
@ -199,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" ,
@ -206,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" ,
@ -213,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" ,
@ -220,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" ,
@ -227,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" ,
@ -234,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" ,
@ -241,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 ,
@ -264,3 +295,42 @@ func (c *zfsCollector) Update(ch chan<- prometheus.Metric) error {
return nil
}
func ( c * zfsCollector ) parseFreeBSDPoolObjsetStats ( ) error {
sysCtlMetrics := [ ] string {
"nunlinked" , "nunlinks" , "nread" , "reads" , "nwritten" , "writes" ,
}
zfsPoolMibPrefix := "kstat.zfs.pool.dataset"
zfsDatasetsNames := [ ] 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" ) {
zfsDatasetNames = append ( zfsDatasetNames , strings . SplitAfter ( dataset , "." ) [ 3 ] )
}
}
for zpoolDataset := range zfsDatasetsNames {
zfsDatasetLabels := map [ string ] string {
"dataset" : zpoolDataset ,
"zpool" : strings . SplitAfter ( zpoolDataset , "/" ) [ 0 ] ,
}
for metric := range sysCtlMetrics {
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 ) ,
dataType : bsdSysctlTypeUint64 ,
valueType : prometheus . CounterValue ,
labels : zfsDatasetLabels ,
} )
}
}
return nil
}