Metrics now have expiration if not updated
This commit is contained in:
@@ -2,221 +2,261 @@ package metrics
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/prometheus/client_golang/prometheus"
|
||||
"github.com/prometheus/client_golang/prometheus/promauto"
|
||||
"lostak.dev/pve-exporter/proxmox"
|
||||
)
|
||||
|
||||
// PVE virtual machine collector.
|
||||
type PveVirtualMachineCollector struct {
|
||||
apiClient *proxmox.PveApiClient // PVE API client instance.
|
||||
registry *TTLRegistry // TTL metrics registry.
|
||||
|
||||
state *prometheus.GaugeVec // Virtual machine state prometheus gauge.
|
||||
uptime *prometheus.GaugeVec // Virtual machine uptime prometheus gauge.
|
||||
state *TTLGaugeVec // Virtual machine state prometheus gauge.
|
||||
uptime *TTLGaugeVec // Virtual machine uptime prometheus gauge.
|
||||
|
||||
cpu *prometheus.GaugeVec // Virtual machine count of CPUs prometheus gauge.
|
||||
cpuUsage *prometheus.GaugeVec // Virtual machine CPU usage % prometheus gauge.
|
||||
cpu *TTLGaugeVec // Virtual machine count of CPUs prometheus gauge.
|
||||
cpuUsage *TTLGaugeVec // Virtual machine CPU usage % prometheus gauge.
|
||||
|
||||
memBytes *prometheus.GaugeVec // Virtual machine memory in bytes prometheus gauge.
|
||||
memBytesUsed *prometheus.GaugeVec // Virtual machine memory usage in bytes prometheus gauge.
|
||||
memBytes *TTLGaugeVec // Virtual machine memory in bytes prometheus gauge.
|
||||
memBytesUsed *TTLGaugeVec // Virtual machine memory usage in bytes prometheus gauge.
|
||||
|
||||
disk *prometheus.GaugeVec // Virtual machine disk space usage in bytes prometheus gauge.
|
||||
diskMax *prometheus.GaugeVec // Virtual machine disk size in bytes prometheus gauge.
|
||||
swap *prometheus.GaugeVec // Virtual machine swap usage in bytes prometheus gauge.
|
||||
disk *TTLGaugeVec // Virtual machine disk space usage in bytes prometheus gauge.
|
||||
diskMax *TTLGaugeVec // Virtual machine disk size in bytes prometheus gauge.
|
||||
swap *TTLGaugeVec // Virtual machine swap usage in bytes prometheus gauge.
|
||||
|
||||
netReceive *prometheus.GaugeVec // Virtual machine network receive in bytes prometheus gauge.
|
||||
netTransmit *prometheus.GaugeVec // Virtual machine network transmit in bytes prometheus gauge.
|
||||
netReceive *TTLGaugeVec // Virtual machine network receive in bytes prometheus gauge.
|
||||
netTransmit *TTLGaugeVec // Virtual machine network transmit in bytes prometheus gauge.
|
||||
|
||||
diskReadOps *prometheus.GaugeVec // Virtual machine disk read ops prometheus gauge.
|
||||
diskWriteOps *prometheus.GaugeVec // Virtual machine disk write ops prometheus gauge.
|
||||
diskReadOps *TTLGaugeVec // Virtual machine disk read ops prometheus gauge.
|
||||
diskWriteOps *TTLGaugeVec // Virtual machine disk write ops prometheus gauge.
|
||||
|
||||
diskReadBytes *prometheus.GaugeVec // Virtual machine disk read bytes prometheus gauge.
|
||||
diskWriteBytes *prometheus.GaugeVec // Virtual machine disk write bytes prometheus gauge.
|
||||
diskReadBytes *TTLGaugeVec // Virtual machine disk read bytes prometheus gauge.
|
||||
diskWriteBytes *TTLGaugeVec // Virtual machine disk write bytes prometheus gauge.
|
||||
|
||||
diskReadTimeNs *prometheus.GaugeVec // Virtual machine disk read time total prometheus gauge.
|
||||
diskWriteTimeNs *prometheus.GaugeVec // Virtual machine disk write time total prometheus gauge.
|
||||
diskReadTimeNs *TTLGaugeVec // Virtual machine disk read time total prometheus gauge.
|
||||
diskWriteTimeNs *TTLGaugeVec // Virtual machine disk write time total prometheus gauge.
|
||||
|
||||
diskFailedReadOps *prometheus.GaugeVec // Virtual machine disk failed read ops prometheus gauge.
|
||||
diskFailedWriteOps *prometheus.GaugeVec // Virtual machine disk failed write ops prometheus gauge.
|
||||
diskFailedReadOps *TTLGaugeVec // Virtual machine disk failed read ops prometheus gauge.
|
||||
diskFailedWriteOps *TTLGaugeVec // Virtual machine disk failed write ops prometheus gauge.
|
||||
|
||||
agent *prometheus.GaugeVec // Virtual machine agent enabled prometheus gauge.
|
||||
agent *TTLGaugeVec // Virtual machine agent enabled prometheus gauge.
|
||||
}
|
||||
|
||||
// Create new instance of PVE virtual machine collector.
|
||||
func NewPveVirtualMachineCollector(apiClient *proxmox.PveApiClient) *PveVirtualMachineCollector {
|
||||
func NewPveVirtualMachineCollector(apiClient *proxmox.PveApiClient, registry *TTLRegistry) *PveVirtualMachineCollector {
|
||||
c := PveVirtualMachineCollector{apiClient: apiClient}
|
||||
c.registry = registry
|
||||
|
||||
// Virtual machine state.
|
||||
c.state = promauto.NewGaugeVec(
|
||||
c.state = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_state",
|
||||
Help: "Virtual machine state.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.state)
|
||||
|
||||
// Virtual machine uptime.
|
||||
c.uptime = promauto.NewGaugeVec(
|
||||
c.uptime = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_uptime",
|
||||
Help: "Virtual machine uptime.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.uptime)
|
||||
|
||||
// Virtual machine agent state.
|
||||
c.agent = promauto.NewGaugeVec(
|
||||
c.agent = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_agent",
|
||||
Help: "Virtual machine agent state.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.agent)
|
||||
|
||||
// Virtual machine CPU count.
|
||||
c.cpu = promauto.NewGaugeVec(
|
||||
c.cpu = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_cpu_count",
|
||||
Help: "Virtual machine CPU count.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.cpu)
|
||||
|
||||
// Virtual machine CPU usage.
|
||||
c.cpuUsage = promauto.NewGaugeVec(
|
||||
c.cpuUsage = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_cpu_usage",
|
||||
Help: "Virtual machine CPU usage.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.cpuUsage)
|
||||
|
||||
// Virtual machine memory total.
|
||||
c.memBytes = promauto.NewGaugeVec(
|
||||
c.memBytes = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_mem_total_bytes",
|
||||
Help: "Virtual machine total memory in bytes.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.memBytes)
|
||||
|
||||
// Virtual machine memory usage.
|
||||
c.memBytesUsed = promauto.NewGaugeVec(
|
||||
c.memBytesUsed = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_mem_used_bytes",
|
||||
Help: "Virtual machine used memory in bytes.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.memBytesUsed)
|
||||
|
||||
// Virtual machine disk size.
|
||||
c.disk = promauto.NewGaugeVec(
|
||||
c.disk = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_disk_usage_bytes",
|
||||
Help: "Virtual machine disk read bytes.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.disk)
|
||||
|
||||
// Virtual machine disk size.
|
||||
c.diskMax = promauto.NewGaugeVec(
|
||||
c.diskMax = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_disk_size_bytes",
|
||||
Help: "Virtual machine disk size bytes.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.diskMax)
|
||||
|
||||
// Virtual machine network receive bytes.
|
||||
c.netReceive = promauto.NewGaugeVec(
|
||||
c.netReceive = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_network_in_bytes",
|
||||
Help: "Virtual machine network receive in bytes.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name", "interface"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.netReceive)
|
||||
|
||||
// Virtual machine network transmit bytes.
|
||||
c.netTransmit = promauto.NewGaugeVec(
|
||||
c.netTransmit = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_network_out_bytes",
|
||||
Help: "Virtual machine network transmit in bytes.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name", "interface"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.netTransmit)
|
||||
|
||||
// Virtual machine disk read ops.
|
||||
c.diskReadOps = promauto.NewGaugeVec(
|
||||
c.diskReadOps = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_disk_rd_operations",
|
||||
Help: "Virtual machine disk read ops.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name", "device"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.diskReadOps)
|
||||
|
||||
// Virtual machine disk write ops.
|
||||
c.diskWriteOps = promauto.NewGaugeVec(
|
||||
c.diskWriteOps = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_disk_wr_operations",
|
||||
Help: "Virtual machine disk write ops.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name", "device"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.diskWriteOps)
|
||||
|
||||
// Virtual machine disk read bytes.
|
||||
c.diskReadBytes = promauto.NewGaugeVec(
|
||||
c.diskReadBytes = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_disk_rd_bytes",
|
||||
Help: "Virtual machine disk read bytes.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name", "device"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.diskReadBytes)
|
||||
|
||||
// Virtual machine disk write bytes.
|
||||
c.diskWriteBytes = promauto.NewGaugeVec(
|
||||
c.diskWriteBytes = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_disk_wr_bytes",
|
||||
Help: "Virtual machine disk write bytes.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name", "device"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.diskWriteBytes)
|
||||
|
||||
// Virtual machine failed disk read ops.
|
||||
c.diskFailedReadOps = promauto.NewGaugeVec(
|
||||
c.diskFailedReadOps = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_disk_failed_rd_ops",
|
||||
Help: "Virtual machine failed disk read ops.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name", "device"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.diskFailedReadOps)
|
||||
|
||||
// Virtual machine failed disk write ops.
|
||||
c.diskFailedWriteOps = promauto.NewGaugeVec(
|
||||
c.diskFailedWriteOps = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_disk_failed_wr_ops",
|
||||
Help: "Virtual machine failed disk write ops.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name", "device"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.diskFailedWriteOps)
|
||||
|
||||
// Virtual machine disk read time total nanoseconds.
|
||||
c.diskReadTimeNs = promauto.NewGaugeVec(
|
||||
c.diskReadTimeNs = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_disk_rd_time_total_ns",
|
||||
Help: "Virtual machine disk read time total in nanoseconds.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name", "device"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.diskReadTimeNs)
|
||||
|
||||
// Virtual machine disk write time total nanoseconds.
|
||||
c.diskWriteTimeNs = promauto.NewGaugeVec(
|
||||
c.diskWriteTimeNs = NewTTLGaugeVec(
|
||||
prometheus.GaugeOpts{
|
||||
Name: "pve_vm_disk_wr_time_total_ns",
|
||||
Help: "Virtual machine disk write time total in nanoseconds.",
|
||||
},
|
||||
[]string{"cluster", "node", "vmid", "name", "device"},
|
||||
1*time.Minute,
|
||||
)
|
||||
c.registry.Register(c.diskWriteTimeNs)
|
||||
|
||||
return &c
|
||||
}
|
||||
@@ -228,24 +268,6 @@ func (c *PveVirtualMachineCollector) CollectMetrics() error {
|
||||
return err
|
||||
}
|
||||
|
||||
c.state.Reset()
|
||||
c.cpu.Reset()
|
||||
c.memBytes.Reset()
|
||||
c.diskMax.Reset()
|
||||
c.uptime.Reset()
|
||||
c.cpuUsage.Reset()
|
||||
c.memBytesUsed.Reset()
|
||||
c.netReceive.Reset()
|
||||
c.netTransmit.Reset()
|
||||
c.diskReadOps.Reset()
|
||||
c.diskWriteOps.Reset()
|
||||
c.diskReadBytes.Reset()
|
||||
c.diskWriteBytes.Reset()
|
||||
c.diskFailedReadOps.Reset()
|
||||
c.diskFailedWriteOps.Reset()
|
||||
c.diskReadTimeNs.Reset()
|
||||
c.diskWriteTimeNs.Reset()
|
||||
|
||||
for _, node := range cluster.NodeStatuses {
|
||||
qemus, err := c.apiClient.GetNodeQemuList(node.Name)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user