orama/pkg/cli/monitor/tui/alerts.go

89 lines
2.2 KiB
Go

package tui
import (
"fmt"
"sort"
"strings"
"github.com/DeBrosOfficial/network/pkg/cli/monitor"
)
// renderAlertsTab renders all alerts sorted by severity.
func renderAlertsTab(snap *monitor.ClusterSnapshot, width int) string {
if snap == nil {
return styleMuted.Render("Collecting cluster data...")
}
if len(snap.Alerts) == 0 {
return styleHealthy.Render(" No alerts. All systems nominal.")
}
var b strings.Builder
critCount, warnCount, infoCount := countAlertsBySeverity(snap.Alerts)
b.WriteString(styleBold.Render("Alerts"))
b.WriteString(fmt.Sprintf(" %s %s %s\n",
styleCritical.Render(fmt.Sprintf("%d critical", critCount)),
styleWarning.Render(fmt.Sprintf("%d warning", warnCount)),
styleMuted.Render(fmt.Sprintf("%d info", infoCount)),
))
b.WriteString(separator(width))
b.WriteString("\n\n")
// Sort: critical first, then warning, then info
sorted := make([]monitor.Alert, len(snap.Alerts))
copy(sorted, snap.Alerts)
sort.Slice(sorted, func(i, j int) bool {
return severityRank(sorted[i].Severity) < severityRank(sorted[j].Severity)
})
// Group by severity
currentSev := monitor.AlertSeverity("")
for _, a := range sorted {
if a.Severity != currentSev {
currentSev = a.Severity
label := strings.ToUpper(string(a.Severity))
b.WriteString(severityStyle(string(a.Severity)).Render(fmt.Sprintf(" ── %s ", label)))
b.WriteString("\n")
}
sevTag := formatSeverityTag(a.Severity)
b.WriteString(fmt.Sprintf(" %s %-12s %-18s %s\n",
sevTag,
styleMuted.Render("["+a.Subsystem+"]"),
a.Node,
a.Message,
))
}
return b.String()
}
// severityRank returns a sort rank (lower = more severe).
func severityRank(s monitor.AlertSeverity) int {
switch s {
case monitor.AlertCritical:
return 0
case monitor.AlertWarning:
return 1
case monitor.AlertInfo:
return 2
default:
return 3
}
}
// formatSeverityTag returns a styled severity label.
func formatSeverityTag(s monitor.AlertSeverity) string {
switch s {
case monitor.AlertCritical:
return styleCritical.Render("CRIT")
case monitor.AlertWarning:
return styleWarning.Render("WARN")
case monitor.AlertInfo:
return styleMuted.Render("INFO")
default:
return styleMuted.Render("????")
}
}