...
1
2
3
4
5
6
7
8
9
10
11
12
13
14 package store
15
16 import (
17 "context"
18 "errors"
19 "sync"
20 "time"
21
22 "github.com/prometheus/common/model"
23
24 "github.com/prometheus/alertmanager/types"
25 )
26
27
28 var ErrNotFound = errors.New("alert not found")
29
30
31
32
33
34 type Alerts struct {
35 sync.Mutex
36 c map[model.Fingerprint]*types.Alert
37 cb func([]*types.Alert)
38 }
39
40
41 func NewAlerts() *Alerts {
42 a := &Alerts{
43 c: make(map[model.Fingerprint]*types.Alert),
44 cb: func(_ []*types.Alert) {},
45 }
46
47 return a
48 }
49
50
51 func (a *Alerts) SetGCCallback(cb func([]*types.Alert)) {
52 a.Lock()
53 defer a.Unlock()
54
55 a.cb = cb
56 }
57
58
59 func (a *Alerts) Run(ctx context.Context, interval time.Duration) {
60 t := time.NewTicker(interval)
61 defer t.Stop()
62 for {
63 select {
64 case <-ctx.Done():
65 return
66 case <-t.C:
67 a.gc()
68 }
69 }
70 }
71
72 func (a *Alerts) gc() {
73 a.Lock()
74 defer a.Unlock()
75
76 var resolved []*types.Alert
77 for fp, alert := range a.c {
78 if alert.Resolved() {
79 delete(a.c, fp)
80 resolved = append(resolved, alert)
81 }
82 }
83 a.cb(resolved)
84 }
85
86
87
88 func (a *Alerts) Get(fp model.Fingerprint) (*types.Alert, error) {
89 a.Lock()
90 defer a.Unlock()
91
92 alert, prs := a.c[fp]
93 if !prs {
94 return nil, ErrNotFound
95 }
96 return alert, nil
97 }
98
99
100 func (a *Alerts) Set(alert *types.Alert) error {
101 a.Lock()
102 defer a.Unlock()
103
104 a.c[alert.Fingerprint()] = alert
105 return nil
106 }
107
108
109 func (a *Alerts) Delete(fp model.Fingerprint) error {
110 a.Lock()
111 defer a.Unlock()
112
113 delete(a.c, fp)
114 return nil
115 }
116
117
118 func (a *Alerts) List() []*types.Alert {
119 a.Lock()
120 defer a.Unlock()
121
122 alerts := make([]*types.Alert, 0, len(a.c))
123 for _, alert := range a.c {
124 alerts = append(alerts, alert)
125 }
126
127 return alerts
128 }
129
130
131 func (a *Alerts) Empty() bool {
132 a.Lock()
133 defer a.Unlock()
134
135 return len(a.c) == 0
136 }
137
View as plain text