// Mutes returns true iff the given label set is muted. func (ih *Inhibitor) Mutes(lset model.LabelSet) bool { alerts := ih.alerts.GetPending() defer alerts.Close() // TODO(fabxc): improve erroring for iterators so it does not // go silenced here. for alert := range alerts.Next() { if err := alerts.Err(); err != nil { log.Errorf("Error iterating alerts: %s", err) continue } if alert.Resolved() { continue } for _, rule := range ih.rules { if rule.Mutes(alert.Labels, lset) { ih.marker.SetInhibited(lset.Fingerprint(), true) return true } } } if err := alerts.Err(); err != nil { log.Errorf("Error after iterating alerts: %s", err) } ih.marker.SetInhibited(lset.Fingerprint(), false) return false }
// Mutes returns true iff the given label set is muted. func (ih *Inhibitor) Mutes(lset model.LabelSet) bool { fp := lset.Fingerprint() for _, r := range ih.rules { if r.TargetMatchers.Match(lset) && r.hasEqual(lset) { ih.marker.SetInhibited(fp, true) return true } } ih.marker.SetInhibited(fp, false) return false }
// The Silences provider must implement the Muter interface // for all its silences. The data provider may have access to an // optimized view of the data to perform this evaluation. func (s *Silences) Mutes(lset model.LabelSet) bool { sils, err := s.All() if err != nil { log.Errorf("retrieving silences failed: %s", err) // In doubt, do not silence anything. return false } for _, sil := range sils { if sil.Mutes(lset) { s.mk.SetSilenced(lset.Fingerprint(), sil.ID) return true } } s.mk.SetSilenced(lset.Fingerprint()) return false }
// processAlert determines in which aggregation group the alert falls // and insert it. func (d *Dispatcher) processAlert(alert *types.Alert, route *Route) { group := model.LabelSet{} for ln, lv := range alert.Labels { if _, ok := route.RouteOpts.GroupBy[ln]; ok { group[ln] = lv } } fp := group.Fingerprint() d.mtx.Lock() groups, ok := d.aggrGroups[route] if !ok { groups = map[model.Fingerprint]*aggrGroup{} d.aggrGroups[route] = groups } d.mtx.Unlock() // If the group does not exist, create it. ag, ok := groups[fp] if !ok { ag = newAggrGroup(d.ctx, group, &route.RouteOpts, d.timeout) groups[fp] = ag go ag.run(func(ctx context.Context, alerts ...*types.Alert) bool { _, _, err := d.stage.Exec(ctx, alerts...) if err != nil { log.Errorf("Notify for %d alerts failed: %s", len(alerts), err) } return err == nil }) } ag.insert(alert) }
func (g *Group) fingerprint() model.Fingerprint { l := model.LabelSet{"name": model.LabelValue(g.name)} return l.Fingerprint() }