Pulse/internal/monitoring/node_disk_sources.go

100 lines
2.6 KiB
Go

package monitoring
import (
"strings"
"github.com/rcourtman/pulse-go-rewrite/internal/models"
"github.com/rcourtman/pulse-go-rewrite/pkg/proxmox"
"github.com/rs/zerolog/log"
)
func (m *Monitor) resolveNodeDisk(
instanceName string,
nodeID string,
nodeName string,
node proxmox.Node,
nodeInfo *proxmox.NodeStatus,
) (models.Disk, string) {
if linkedHost := m.linkedHostForNode(nodeID, nodeName); linkedHost != nil {
if disk, ok := models.SummaryDisk(linkedHost.Disks); ok {
resolved := models.Disk{
Total: disk.Total,
Used: disk.Used,
Free: disk.Free,
Usage: disk.Usage,
}
log.Debug().
Str("instance", instanceName).
Str("node", nodeName).
Str("hostAgentID", linkedHost.ID).
Int64("total", resolved.Total).
Int64("used", resolved.Used).
Float64("usage", resolved.Usage).
Msg("Node disk: using linked Pulse host agent disk summary")
return resolved, "host-agent"
}
}
if nodeInfo != nil && nodeInfo.RootFS != nil && nodeInfo.RootFS.Total > 0 {
resolved := models.Disk{
Total: int64(nodeInfo.RootFS.Total),
Used: int64(nodeInfo.RootFS.Used),
Free: int64(nodeInfo.RootFS.Free),
Usage: safePercentage(float64(nodeInfo.RootFS.Used), float64(nodeInfo.RootFS.Total)),
}
log.Debug().
Str("instance", instanceName).
Str("node", nodeName).
Uint64("rootfsUsed", nodeInfo.RootFS.Used).
Uint64("rootfsTotal", nodeInfo.RootFS.Total).
Float64("rootfsUsage", resolved.Usage).
Msg("Node disk: using Proxmox rootfs metrics")
return resolved, "rootfs"
}
if node.MaxDisk > 0 {
resolved := models.Disk{
Total: int64(node.MaxDisk),
Used: int64(node.Disk),
Free: int64(node.MaxDisk - node.Disk),
Usage: safePercentage(float64(node.Disk), float64(node.MaxDisk)),
}
log.Debug().
Str("instance", instanceName).
Str("node", nodeName).
Uint64("disk", node.Disk).
Uint64("maxDisk", node.MaxDisk).
Float64("usage", resolved.Usage).
Msg("Node disk: using /nodes endpoint metrics")
return resolved, "nodes-endpoint"
}
return models.Disk{}, ""
}
func (m *Monitor) linkedHostForNode(nodeID, nodeName string) *models.Host {
state := m.GetState()
linkedHostID := ""
for _, existingNode := range state.Nodes {
if existingNode.ID == nodeID || strings.EqualFold(existingNode.Name, nodeName) {
linkedHostID = strings.TrimSpace(existingNode.LinkedHostAgentID)
break
}
}
if linkedHostID == "" {
return nil
}
for _, host := range state.Hosts {
if strings.TrimSpace(host.ID) != linkedHostID {
continue
}
if !strings.EqualFold(strings.TrimSpace(host.Status), "online") {
return nil
}
resolved := host
return &resolved
}
return nil
}