mirror of
https://github.com/prymitive/karma
synced 2026-05-07 03:26:52 +00:00
75 lines
2.5 KiB
Go
75 lines
2.5 KiB
Go
package models
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/cnf/structhash"
|
|
)
|
|
|
|
// AlertStateUnprocessed means that Alertmanager notify didn't yet process it
|
|
// and AM doesn't know if alert is active or suppressed
|
|
const AlertStateUnprocessed = "unprocessed"
|
|
|
|
// AlertStateActive is the state in which we know that the alert should fire
|
|
const AlertStateActive = "active"
|
|
|
|
// AlertStateSuppressed means that we know that alert is silenced or inhibited
|
|
const AlertStateSuppressed = "suppressed"
|
|
|
|
// AlertStateList exports all alert states so other packages can get this list
|
|
var AlertStateList = []string{
|
|
AlertStateUnprocessed,
|
|
AlertStateActive,
|
|
AlertStateSuppressed,
|
|
}
|
|
|
|
// Alert is vanilla alert + some additional attributes
|
|
// unsee extends an alert object with:
|
|
// * Links map, it's generated from annotations if annotation value is an url
|
|
// it's pulled out of annotation map and returned under links field,
|
|
// unsee UI used this to show links differently than other annotations
|
|
type Alert struct {
|
|
Annotations map[string]string `json:"annotations"`
|
|
Labels map[string]string `json:"labels"`
|
|
StartsAt time.Time `json:"startsAt"`
|
|
EndsAt time.Time `json:"endsAt"`
|
|
State string `json:"state"`
|
|
// those are not exposed in JSON, Alertmanager specific value will be in kept
|
|
// in the Alertmanager slice
|
|
// skip those when generating alert fingerprint too
|
|
GeneratorURL string `json:"-" hash:"-"`
|
|
SilencedBy []string `json:"-" hash:"-"`
|
|
InhibitedBy []string `json:"-" hash:"-"`
|
|
// unsee fields
|
|
Alertmanager []AlertmanagerInstance `json:"alertmanager"`
|
|
Receiver string `json:"receiver"`
|
|
Links map[string]string `json:"links"`
|
|
}
|
|
|
|
// LabelsFingerprint is a checksum computed only from labels which should be
|
|
// unique for every alert
|
|
func (a Alert) LabelsFingerprint() string {
|
|
return fmt.Sprintf("%x", structhash.Sha1(a.Labels, 1))
|
|
}
|
|
|
|
// ContentFingerprint is a checksum computed from entire alert object
|
|
func (a Alert) ContentFingerprint() string {
|
|
return fmt.Sprintf("%x", structhash.Sha1(a, 1))
|
|
}
|
|
|
|
// IsSilenced will return true if alert should be considered silenced
|
|
func (a Alert) IsSilenced() bool {
|
|
return (a.State == AlertStateSuppressed && len(a.SilencedBy) > 0)
|
|
}
|
|
|
|
// IsInhibited will return true if alert should be considered silenced
|
|
func (a Alert) IsInhibited() bool {
|
|
return (a.State == AlertStateSuppressed && len(a.InhibitedBy) > 0)
|
|
}
|
|
|
|
// IsActive will return true if alert is not suppressed in any way
|
|
func (a Alert) IsActive() bool {
|
|
return (a.State == AlertStateActive)
|
|
}
|