package metrics import ( "strconv" "strings" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promauto" "lostak.dev/pve-exporter/proxmox" ) // PVE cluster state collector. type PveNodeDiskCollector struct { apiClient *proxmox.PveApiClient // PVE API client instance. healthy *prometheus.GaugeVec // Node disk SMART passed state prometheus gauge. wearout *prometheus.GaugeVec // Node disk wearout % prometheus gauge. sizeBytes *prometheus.GaugeVec // Node disk size in bytes prometheus gauge. } // Create new instance of PVE cluster state collector. func NewPveNodeDiskCollector(apiClient *proxmox.PveApiClient) *PveNodeDiskCollector { c := PveNodeDiskCollector{apiClient: apiClient} // Node disk healthy state. c.healthy = promauto.NewGaugeVec( prometheus.GaugeOpts{ Name: "pve_node_disk_healthy", Help: "Node disk healthy state.", }, []string{"cluster", "node", "wwn", "type", "model", "serial", "vendor", "used", "osd_id"}, ) // Node disk wearout. c.wearout = promauto.NewGaugeVec( prometheus.GaugeOpts{ Name: "pve_node_disk_wearout", Help: "Node disk wearout percent.", }, []string{"cluster", "node", "wwn", "type", "model", "serial", "vendor", "used", "osd_id"}, ) // Node disk size in bytes. c.sizeBytes = promauto.NewGaugeVec( prometheus.GaugeOpts{ Name: "pve_node_disk_size_bytes", Help: "Node disk size in bytes.", }, []string{"cluster", "node", "wwn", "type", "model", "serial", "vendor", "used", "osd_id"}, ) return &c } // PveMetricsCollector interface implementation. func (c *PveNodeDiskCollector) CollectMetrics() error { cluster, err := c.apiClient.GetClusterStatus() if err != nil { return err } c.healthy.Reset() c.wearout.Reset() c.sizeBytes.Reset() for _, node := range cluster.NodeStatuses { disks, err := c.apiClient.GetNodeDisksList(node.Name) if err != nil { return err } for _, disk := range *disks { labels := prometheus.Labels{ "cluster": cluster.GetClusterName(), "node": node.Name, "wwn": disk.WWN, "type": disk.Type, "model": disk.Model, "serial": disk.Serial, "vendor": strings.TrimSpace(disk.Vendor), "used": disk.Used, "osd_id": strconv.Itoa(disk.OSDID), } // Disk healthy state. c.healthy.With(labels).Set(disk.GetSmartPassedState()) // Disk wearout %. wearout, ok := disk.WearOut.(float64) if ok { c.wearout.With(labels).Set(wearout) } // Disk size in bytes. c.sizeBytes.With(labels).Set(float64(disk.Size)) } } return nil } // PveMetricsCollector interface implementation. func (c *PveNodeDiskCollector) GetName() string { return "Node Disks" }