type AlertMarker interface { SetActiveOrSilenced(alert model.Fingerprint, version int, activeSilenceIDs, pendingSilenceIDs []string) SetInhibited(alert model.Fingerprint, alertIDs ...string)
Count(...AlertState) int
Status(model.Fingerprint) AlertStatus Delete(model.Fingerprint)
Unprocessed(model.Fingerprint) bool Active(model.Fingerprint) bool Silenced(model.Fingerprint) (activeIDs, pendingIDs []string, version int, silenced bool) Inhibited(model.Fingerprint) ([]string, bool) }
type GroupMarker interface { Muted(routeID, groupKey string) ([]string, bool) SetMuted(routeID, groupKey string, timeIntervalNames []string) DeleteByGroupKey(routeID, groupKey string) }
func NewMarker(r prometheus.Registerer) *MemMarker { m := &MemMarker{ alerts: map[model.Fingerprint]*AlertStatus{}, groups: map[string]*groupStatus{}, } m.registerMetrics(r) return m }
type MemMarker struct { alerts map[model.Fingerprint]*AlertStatus groups map[string]*groupStatus
mtx sync.RWMutex }
func (m *MemMarker) Muted(routeID, groupKey string) ([]string, bool) { m.mtx.Lock() defer m.mtx.Unlock() status, ok := m.groups[routeID+groupKey] if !ok { return nil, false } return status.mutedBy, len(status.mutedBy) > 0 }
func (m *MemMarker) SetMuted(routeID, groupKey string, timeIntervalNames []string) { m.mtx.Lock() defer m.mtx.Unlock() status, ok := m.groups[routeID+groupKey] if !ok { status = &groupStatus{} m.groups[routeID+groupKey] = status } status.mutedBy = timeIntervalNames }
func (m *MemMarker) DeleteByGroupKey(routeID, groupKey string) { m.mtx.Lock() defer m.mtx.Unlock() delete(m.groups, routeID+groupKey) }
func (m *MemMarker) registerMetrics(r prometheus.Registerer) { newMarkedAlertMetricByState := func(st AlertState) prometheus.GaugeFunc { return prometheus.NewGaugeFunc( prometheus.GaugeOpts{ Name: "alertmanager_marked_alerts", Help: "How many alerts by state are currently marked in the Alertmanager regardless of their expiry.", ConstLabels: prometheus.Labels{"state": string(st)}, }, func() float64 { return float64(m.Count(st)) }, ) }
alertsActive := newMarkedAlertMetricByState(AlertStateActive) alertsSuppressed := newMarkedAlertMetricByState(AlertStateSuppressed) alertStateUnprocessed := newMarkedAlertMetricByState(AlertStateUnprocessed)
r.MustRegister(alertsActive) r.MustRegister(alertsSuppressed) r.MustRegister(alertStateUnprocessed) }
func (m *MemMarker) Count(states ...AlertState) int { m.mtx.RLock() defer m.mtx.RUnlock()
if len(states) == 0 { return len(m.alerts) }
var count int for _, status := range m.alerts { for _, state := range states { if status.State == state { count++ } } } return count }
func (m *MemMarker) SetActiveOrSilenced(alert model.Fingerprint, version int, activeIDs, pendingIDs []string) { m.mtx.Lock() defer m.mtx.Unlock()
s, found := m.alerts[alert] if !found { s = &AlertStatus{} m.alerts[alert] = s } s.SilencedBy = activeIDs s.pendingSilences = pendingIDs s.silencesVersion = version
if len(activeIDs) == 0 && len(s.InhibitedBy) == 0 { s.State = AlertStateActive return }
s.State = AlertStateSuppressed }
func (m *MemMarker) SetInhibited(alert model.Fingerprint, ids ...string) { m.mtx.Lock() defer m.mtx.Unlock()
s, found := m.alerts[alert] if !found { s = &AlertStatus{} m.alerts[alert] = s } s.InhibitedBy = ids
if len(ids) == 0 && len(s.SilencedBy) == 0 { s.State = AlertStateActive return }
s.State = AlertStateSuppressed }
func (m *MemMarker) Status(alert model.Fingerprint) AlertStatus { m.mtx.RLock() defer m.mtx.RUnlock()
if s, found := m.alerts[alert]; found { return *s } return AlertStatus{ State: AlertStateUnprocessed, SilencedBy: []string{}, InhibitedBy: []string{}, } }
func (m *MemMarker) Delete(alert model.Fingerprint) { m.mtx.Lock() defer m.mtx.Unlock()
delete(m.alerts, alert) }
func (m *MemMarker) Unprocessed(alert model.Fingerprint) bool { return m.Status(alert).State == AlertStateUnprocessed }
func (m *MemMarker) Active(alert model.Fingerprint) bool { return m.Status(alert).State == AlertStateActive }
func (m *MemMarker) Inhibited(alert model.Fingerprint) ([]string, bool) { s := m.Status(alert) return s.InhibitedBy, s.State == AlertStateSuppressed && len(s.InhibitedBy) > 0 }
func (m *MemMarker) Silenced(alert model.Fingerprint) (activeIDs, pendingIDs []string, version int, silenced bool) { s := m.Status(alert) return s.SilencedBy, s.pendingSilences, s.silencesVersion, s.State == AlertStateSuppressed && len(s.SilencedBy) > 0 }
|