1
2
3
4
5
6
7
8
9
10
11
12
13
14 package test
15
16 import (
17 "fmt"
18 "testing"
19 "time"
20
21 "github.com/go-openapi/strfmt"
22 "github.com/prometheus/common/model"
23 "github.com/stretchr/testify/require"
24
25 "github.com/prometheus/alertmanager/api/v2/client/alert"
26 "github.com/prometheus/alertmanager/api/v2/client/silence"
27 "github.com/prometheus/alertmanager/api/v2/models"
28 a "github.com/prometheus/alertmanager/test/with_api_v2"
29 )
30
31
32
33 func TestAlertGetReturnsCurrentAlertStatus(t *testing.T) {
34 t.Parallel()
35
36 conf := `
37 route:
38 receiver: "default"
39 group_by: []
40 group_wait: 1s
41 group_interval: 10m
42 repeat_interval: 1h
43
44 inhibit_rules:
45 - source_match:
46 severity: 'critical'
47 target_match:
48 severity: 'warning'
49 equal: ['alertname']
50
51 receivers:
52 - name: "default"
53 webhook_configs:
54 - url: 'http://%s'
55 `
56
57 at := a.NewAcceptanceTest(t, &a.AcceptanceOpts{
58 Tolerance: 1 * time.Second,
59 })
60 co := at.Collector("webhook")
61 wh := a.NewWebhook(t, co)
62
63 amc := at.AlertmanagerCluster(fmt.Sprintf(conf, wh.Address()), 1)
64 require.NoError(t, amc.Start())
65 defer amc.Terminate()
66
67 am := amc.Members()[0]
68
69 labelName := "alertname"
70 labelValue := "test1"
71
72 now := time.Now()
73 startsAt := strfmt.DateTime(now)
74 endsAt := strfmt.DateTime(now.Add(5 * time.Minute))
75
76 labels := models.LabelSet(map[string]string{labelName: labelValue, "severity": "warning"})
77 fp := model.LabelSet{model.LabelName(labelName): model.LabelValue(labelValue), "severity": "warning"}.Fingerprint()
78 pa := &models.PostableAlert{
79 StartsAt: startsAt,
80 EndsAt: endsAt,
81 Alert: models.Alert{Labels: labels},
82 }
83 alertParams := alert.NewPostAlertsParams()
84 alertParams.Alerts = models.PostableAlerts{pa}
85 _, err := am.Client().Alert.PostAlerts(alertParams)
86 require.NoError(t, err)
87
88 resp, err := am.Client().Alert.GetAlerts(nil)
89 require.NoError(t, err)
90
91
92 for _, al := range resp.Payload {
93 require.Equal(t, models.AlertStatusStateActive, *al.Status.State)
94 }
95
96
97
98 time.Sleep(2 * time.Second)
99
100
101
102 silenceParams := silence.NewPostSilencesParams()
103
104 cm := "a"
105 isRegex := false
106 ps := &models.PostableSilence{
107 Silence: models.Silence{
108 StartsAt: &startsAt,
109 EndsAt: &endsAt,
110 Comment: &cm,
111 CreatedBy: &cm,
112 Matchers: models.Matchers{
113 &models.Matcher{Name: &labelName, Value: &labelValue, IsRegex: &isRegex},
114 },
115 },
116 }
117 silenceParams.Silence = ps
118 silenceResp, err := am.Client().Silence.PostSilences(silenceParams)
119 require.NoError(t, err)
120 silenceID := silenceResp.Payload.SilenceID
121
122 resp, err = am.Client().Alert.GetAlerts(nil)
123 require.NoError(t, err)
124 for _, al := range resp.Payload {
125 require.Equal(t, models.AlertStatusStateSuppressed, *al.Status.State)
126 require.Equal(t, fp.String(), *al.Fingerprint)
127 require.Equal(t, 1, len(al.Status.SilencedBy))
128 require.Equal(t, silenceID, al.Status.SilencedBy[0])
129 }
130
131
132
133 labels["severity"] = "critical"
134 _, err = am.Client().Alert.PostAlerts(alertParams)
135 require.NoError(t, err)
136
137 inhibitingFP := model.LabelSet{model.LabelName(labelName): model.LabelValue(labelValue), "severity": "critical"}.Fingerprint()
138
139 resp, err = am.Client().Alert.GetAlerts(nil)
140 require.NoError(t, err)
141 for _, al := range resp.Payload {
142 require.Equal(t, 1, len(al.Status.SilencedBy))
143 require.Equal(t, silenceID, al.Status.SilencedBy[0])
144 if fp.String() == *al.Fingerprint {
145 require.Equal(t, models.AlertStatusStateSuppressed, *al.Status.State)
146 require.Equal(t, fp.String(), *al.Fingerprint)
147 require.Equal(t, 1, len(al.Status.InhibitedBy))
148 require.Equal(t, inhibitingFP.String(), al.Status.InhibitedBy[0])
149 }
150 }
151
152 deleteParams := silence.NewDeleteSilenceParams().WithSilenceID(strfmt.UUID(silenceID))
153 _, err = am.Client().Silence.DeleteSilence(deleteParams)
154 require.NoError(t, err)
155
156 resp, err = am.Client().Alert.GetAlerts(nil)
157 require.NoError(t, err)
158
159
160 for _, al := range resp.Payload {
161 require.Equal(t, 0, len(al.Status.SilencedBy))
162 if inhibitingFP.String() == *al.Fingerprint {
163 require.Equal(t, models.AlertStatusStateActive, *al.Status.State)
164 } else {
165 require.Equal(t, models.AlertStatusStateSuppressed, *al.Status.State)
166 }
167 }
168 }
169
170 func TestFilterAlertRequest(t *testing.T) {
171 t.Parallel()
172
173 conf := `
174 route:
175 receiver: "default"
176 group_by: []
177 group_wait: 1s
178 group_interval: 10m
179 repeat_interval: 1h
180
181 inhibit_rules:
182 - source_match:
183 severity: 'critical'
184 target_match:
185 severity: 'warning'
186 equal: ['alertname']
187
188 receivers:
189 - name: "default"
190 webhook_configs:
191 - url: 'http://%s'
192 `
193
194 at := a.NewAcceptanceTest(t, &a.AcceptanceOpts{
195 Tolerance: 1 * time.Second,
196 })
197 co := at.Collector("webhook")
198 wh := a.NewWebhook(t, co)
199
200 amc := at.AlertmanagerCluster(fmt.Sprintf(conf, wh.Address()), 1)
201 require.NoError(t, amc.Start())
202 defer amc.Terminate()
203
204 am := amc.Members()[0]
205
206 now := time.Now()
207 startsAt := strfmt.DateTime(now)
208 endsAt := strfmt.DateTime(now.Add(5 * time.Minute))
209
210 labels := models.LabelSet(map[string]string{"alertname": "test1", "severity": "warning"})
211 pa1 := &models.PostableAlert{
212 StartsAt: startsAt,
213 EndsAt: endsAt,
214 Alert: models.Alert{Labels: labels},
215 }
216 labels = models.LabelSet(map[string]string{"system": "foo", "severity": "critical"})
217 pa2 := &models.PostableAlert{
218 StartsAt: startsAt,
219 EndsAt: endsAt,
220 Alert: models.Alert{Labels: labels},
221 }
222 alertParams := alert.NewPostAlertsParams()
223 alertParams.Alerts = models.PostableAlerts{pa1, pa2}
224 _, err := am.Client().Alert.PostAlerts(alertParams)
225 require.NoError(t, err)
226
227 filter := []string{"alertname=test1", "severity=warning"}
228 resp, err := am.Client().Alert.GetAlerts(alert.NewGetAlertsParams().WithFilter(filter))
229 require.NoError(t, err)
230 require.Equal(t, 1, len(resp.Payload))
231 for _, al := range resp.Payload {
232 require.Equal(t, models.AlertStatusStateActive, *al.Status.State)
233 }
234 }
235
View as plain text