mirror of
https://github.com/prymitive/karma
synced 2026-09-04 11:27:19 +00:00
Store alert state per instance
This commit is contained in:
@@ -24,6 +24,7 @@ func DedupAlerts() []models.AlertGroup {
|
||||
}
|
||||
|
||||
dedupedGroups := []models.AlertGroup{}
|
||||
alertStates := map[string][]string{}
|
||||
for _, agList := range uniqueGroups {
|
||||
alerts := map[string]models.Alert{}
|
||||
for _, ag := range agList {
|
||||
@@ -48,14 +49,28 @@ func DedupAlerts() []models.AlertGroup {
|
||||
}
|
||||
// update map
|
||||
alerts[alertLFP] = a
|
||||
// and append alert state to the slice
|
||||
alertStates[alertLFP] = append(alertStates[alertLFP], a.State)
|
||||
} else {
|
||||
alerts[alertLFP] = models.Alert(alert)
|
||||
// seed alert state slice
|
||||
alertStates[alertLFP] = []string{alert.State}
|
||||
}
|
||||
}
|
||||
}
|
||||
ag := models.AlertGroup(agList[0])
|
||||
ag.Alerts = models.AlertList{}
|
||||
for _, alert := range alerts {
|
||||
// calculate final alert state based on the most important value found
|
||||
// in the list of states from all instances
|
||||
alertLFP := alert.LabelsFingerprint()
|
||||
if slices.StringInSlice(alertStates[alertLFP], models.AlertStateActive) {
|
||||
alert.State = models.AlertStateActive
|
||||
} else if slices.StringInSlice(alertStates[alertLFP], models.AlertStateSuppressed) {
|
||||
alert.State = models.AlertStateSuppressed
|
||||
} else {
|
||||
alert.State = models.AlertStateUnprocessed
|
||||
}
|
||||
// sort Alertmanager instances for every alert
|
||||
sort.Slice(alert.Alertmanager, func(i, j int) bool {
|
||||
return alert.Alertmanager[i].Name < alert.Alertmanager[j].Name
|
||||
|
||||
@@ -153,6 +153,7 @@ func (am *Alertmanager) pullAlerts(version string) error {
|
||||
models.AlertmanagerInstance{
|
||||
Name: am.Name,
|
||||
URI: am.URI,
|
||||
State: alert.State,
|
||||
StartsAt: alert.StartsAt,
|
||||
EndsAt: alert.EndsAt,
|
||||
Source: alert.GeneratorURL,
|
||||
|
||||
@@ -7,6 +7,8 @@ import "time"
|
||||
type AlertmanagerInstance struct {
|
||||
Name string `json:"name"`
|
||||
URI string `json:"uri"`
|
||||
// per instance alert state
|
||||
State string `json:"state"`
|
||||
// timestamp collected from this instance, those on the alert itself
|
||||
// will be calculated min/max values
|
||||
StartsAt time.Time `json:"startsAt"`
|
||||
|
||||
Reference in New Issue
Block a user