mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-04-28 11:30:15 +00:00
193 lines
4.6 KiB
Go
193 lines
4.6 KiB
Go
package mock
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
"time"
|
|
|
|
"github.com/rcourtman/pulse-go-rewrite/internal/models"
|
|
)
|
|
|
|
// GenerateAlertHistory generates historical alert data for testing
|
|
func GenerateAlertHistory(nodes []models.Node, vms []models.VM, containers []models.Container) []models.Alert {
|
|
var history []models.Alert
|
|
|
|
// Alert types and messages
|
|
alertTypes := []struct {
|
|
alertType string
|
|
level string
|
|
messages []string
|
|
}{
|
|
{
|
|
alertType: "threshold",
|
|
level: "warning",
|
|
messages: []string{
|
|
"CPU usage exceeded %d%%",
|
|
"Memory usage exceeded %d%%",
|
|
"Disk usage exceeded %d%%",
|
|
},
|
|
},
|
|
{
|
|
alertType: "threshold",
|
|
level: "critical",
|
|
messages: []string{
|
|
"CPU usage critical at %d%%",
|
|
"Memory exhausted at %d%%",
|
|
"Disk space critical at %d%%",
|
|
},
|
|
},
|
|
{
|
|
alertType: "connectivity",
|
|
level: "error",
|
|
messages: []string{
|
|
"Node offline",
|
|
"Connection lost",
|
|
"Network timeout",
|
|
},
|
|
},
|
|
{
|
|
alertType: "backup",
|
|
level: "warning",
|
|
messages: []string{
|
|
"Backup failed",
|
|
"Backup verification failed",
|
|
"Backup storage low",
|
|
},
|
|
},
|
|
{
|
|
alertType: "system",
|
|
level: "info",
|
|
messages: []string{
|
|
"System update available",
|
|
"Certificate expiring soon",
|
|
"Scheduled maintenance reminder",
|
|
},
|
|
},
|
|
}
|
|
|
|
// Generate alerts for the past 90 days with more consistent distribution
|
|
now := time.Now()
|
|
for days := 90; days >= 0; days-- {
|
|
// Generate 2-15 alerts per day for more realistic history
|
|
numAlerts := rand.Intn(14) + 2
|
|
|
|
for i := 0; i < numAlerts; i++ {
|
|
// Pick random alert type
|
|
alertType := alertTypes[rand.Intn(len(alertTypes))]
|
|
|
|
// Pick random resource
|
|
var resourceName, resourceID, node string
|
|
resourceType := rand.Intn(3)
|
|
|
|
switch resourceType {
|
|
case 0: // Node alert
|
|
if len(nodes) > 0 {
|
|
n := nodes[rand.Intn(len(nodes))]
|
|
resourceName = n.Name
|
|
resourceID = n.ID
|
|
node = n.Name
|
|
}
|
|
case 1: // VM alert
|
|
if len(vms) > 0 {
|
|
vm := vms[rand.Intn(len(vms))]
|
|
resourceName = vm.Name
|
|
resourceID = vm.ID
|
|
node = vm.Node
|
|
}
|
|
case 2: // Container alert
|
|
if len(containers) > 0 {
|
|
ct := containers[rand.Intn(len(containers))]
|
|
resourceName = ct.Name
|
|
resourceID = ct.ID
|
|
node = ct.Node
|
|
}
|
|
}
|
|
|
|
// Random time during that day
|
|
hours := rand.Intn(24)
|
|
minutes := rand.Intn(60)
|
|
seconds := rand.Intn(60)
|
|
|
|
startTime := now.AddDate(0, 0, -days).
|
|
Truncate(24 * time.Hour).
|
|
Add(time.Duration(hours) * time.Hour).
|
|
Add(time.Duration(minutes) * time.Minute).
|
|
Add(time.Duration(seconds) * time.Second)
|
|
|
|
// Alert duration (resolved after 1 minute to 4 hours) - for display purposes
|
|
|
|
// Pick random message and format it
|
|
msg := alertType.messages[rand.Intn(len(alertType.messages))]
|
|
if alertType.alertType == "threshold" {
|
|
value := rand.Intn(30) + 70 // 70-99%
|
|
msg = fmt.Sprintf(msg, value)
|
|
}
|
|
|
|
alert := models.Alert{
|
|
ID: fmt.Sprintf("hist-%d-%d-%d", days, i, rand.Intn(10000)),
|
|
Type: alertType.alertType,
|
|
Level: alertType.level,
|
|
ResourceID: resourceID,
|
|
ResourceName: resourceName,
|
|
Node: node,
|
|
Message: msg,
|
|
StartTime: startTime,
|
|
Acknowledged: false, // Historical alerts are not acknowledged
|
|
}
|
|
|
|
// Add threshold values for threshold alerts
|
|
if alertType.alertType == "threshold" {
|
|
value := float64(rand.Intn(30) + 70)
|
|
threshold := float64(rand.Intn(20) + 60)
|
|
alert.Value = value
|
|
alert.Threshold = threshold
|
|
}
|
|
|
|
history = append(history, alert)
|
|
}
|
|
}
|
|
|
|
// Add some recent unresolved alerts (last 2 hours)
|
|
for i := 0; i < 3; i++ {
|
|
alertType := alertTypes[rand.Intn(len(alertTypes))]
|
|
|
|
var resourceName, resourceID, node string
|
|
if len(nodes) > 0 {
|
|
n := nodes[rand.Intn(len(nodes))]
|
|
resourceName = n.Name
|
|
resourceID = n.ID
|
|
node = n.Name
|
|
}
|
|
|
|
startTime := now.Add(-time.Duration(rand.Intn(120)) * time.Minute)
|
|
|
|
msg := alertType.messages[rand.Intn(len(alertType.messages))]
|
|
if alertType.alertType == "threshold" {
|
|
value := rand.Intn(30) + 70
|
|
msg = fmt.Sprintf(msg, value)
|
|
}
|
|
|
|
alert := models.Alert{
|
|
ID: fmt.Sprintf("active-%d-%d", i, rand.Intn(10000)),
|
|
Type: alertType.alertType,
|
|
Level: alertType.level,
|
|
ResourceID: resourceID,
|
|
ResourceName: resourceName,
|
|
Node: node,
|
|
Message: msg,
|
|
StartTime: startTime,
|
|
Acknowledged: false,
|
|
}
|
|
|
|
if alertType.alertType == "threshold" {
|
|
value := float64(rand.Intn(30) + 70)
|
|
threshold := float64(rand.Intn(20) + 60)
|
|
alert.Value = value
|
|
alert.Threshold = threshold
|
|
}
|
|
|
|
history = append(history, alert)
|
|
}
|
|
|
|
return history
|
|
}
|