Skip to content

Commit cbd5b5f

Browse files
Extracted mapping of information for alert into AlertManagerPayloadBuilder
Signed-off-by: Decker, Stefan <[email protected]>
1 parent f646e90 commit cbd5b5f

File tree

3 files changed

+145
-17
lines changed

3 files changed

+145
-17
lines changed

src/main/java/de/gdata/mobilelab/alertmanagercallback/AlertManagerAlarmCallback.java

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323
import java.net.URISyntaxException;
2424
import java.net.URL;
2525
import java.nio.charset.StandardCharsets;
26-
import java.util.HashMap;
2726
import java.util.Map;
2827

2928
public class AlertManagerAlarmCallback implements AlarmCallback {
@@ -41,22 +40,11 @@ public void initialize(Configuration config) throws AlarmCallbackConfigurationEx
4140

4241
@Override
4342
public void call(Stream stream, AlertCondition.CheckResult result) throws AlarmCallbackException {
44-
AlertManagerPayload alertManagerPayload = new AlertManagerPayload();
45-
alertManagerPayload.setStartsAt(result.getTriggeredAt().toString());
46-
alertManagerPayload.setEndsAt(result.getTriggeredAt().plusMinutes(result.getTriggeredCondition().getGrace()).toString());
47-
Object streamUrl = result.getTriggeredCondition().getParameters().get("stream_url");
48-
alertManagerPayload.setGeneratorURL(streamUrl != null ? (String) streamUrl : null);
49-
50-
Map<String, Object> labels = new HashMap<>();
51-
labels.put("alertname", configuration.getString("alertmanager_alert_name"));
52-
alertManagerPayload.setLabels(labels);
53-
54-
Map<String, Object> annotations = new HashMap<>();
55-
annotations.put("stream_title", stream.getTitle());
56-
annotations.put("triggered_at", result.getTriggeredAt().toString());
57-
annotations.put("triggered_rule_description", result.getTriggeredCondition().getDescription());
58-
annotations.put("triggered_rule_title", result.getTriggeredCondition().getTitle());
59-
alertManagerPayload.setAnnotations(annotations);
43+
AlertManagerPayload alertManagerPayload = AlertManagerPayloadBuilder.newInstance()
44+
.withCheckResult(result)
45+
.withConfiguration(configuration)
46+
.withStream(stream)
47+
.build();
6048

6149
Object[] wrapper = new Object[1];
6250
wrapper[0] = alertManagerPayload;
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
package de.gdata.mobilelab.alertmanagercallback;
2+
3+
import org.graylog2.plugin.alarms.AlertCondition;
4+
import org.graylog2.plugin.configuration.Configuration;
5+
import org.graylog2.plugin.streams.Stream;
6+
import org.joda.time.DateTime;
7+
8+
import java.util.HashMap;
9+
import java.util.Map;
10+
11+
class AlertManagerPayloadBuilder {
12+
13+
private static final String STREAM_TITLE_KEY = "stream_title";
14+
private static final String ALERTMANAGER_ALERT_NAME_KEY = "alertmanager_alert_name";
15+
private static final String ALERTNAME_KEY = "alertname";
16+
private Stream stream;
17+
private AlertCondition.CheckResult checkResult;
18+
private Configuration configuration;
19+
20+
private AlertManagerPayloadBuilder() {
21+
// Private constructor to hide the implicit one
22+
}
23+
24+
static AlertManagerPayloadBuilder newInstance() {
25+
return new AlertManagerPayloadBuilder();
26+
}
27+
28+
AlertManagerPayloadBuilder withStream(Stream stream) {
29+
this.stream = stream;
30+
31+
return this;
32+
}
33+
34+
AlertManagerPayloadBuilder withCheckResult(AlertCondition.CheckResult checkResult) {
35+
this.checkResult = checkResult;
36+
37+
return this;
38+
}
39+
40+
AlertManagerPayloadBuilder withConfiguration(Configuration configuration) {
41+
this.configuration = configuration;
42+
43+
return this;
44+
}
45+
46+
AlertManagerPayload build() {
47+
AlertManagerPayload alertManagerPayload = new AlertManagerPayload();
48+
alertManagerPayload.setAnnotations(extractAnnotations());
49+
alertManagerPayload.setLabels(extractLabels());
50+
alertManagerPayload.setGeneratorURL(extractStreamUrl());
51+
alertManagerPayload.setStartsAt(extractStartsAt());
52+
alertManagerPayload.setEndsAt(extractEndsAt());
53+
54+
return alertManagerPayload;
55+
}
56+
57+
private Map<String, Object> extractLabels() {
58+
Map<String, Object> labels = new HashMap<>();
59+
if(configuration != null && configuration.getString(ALERTMANAGER_ALERT_NAME_KEY) != null) {
60+
labels.put(ALERTNAME_KEY, configuration.getString(ALERTMANAGER_ALERT_NAME_KEY));
61+
} else {
62+
labels.put(ALERTNAME_KEY, "Please add a valid configuration object to AlertManager plugin.");
63+
}
64+
65+
return labels;
66+
}
67+
68+
private Map<String, Object> extractAnnotations() {
69+
Map<String, Object> annotations = new HashMap<>();
70+
71+
if(stream != null && stream.getTitle() != null) {
72+
annotations.put(STREAM_TITLE_KEY, stream.getTitle());
73+
}
74+
75+
if(checkResult != null) {
76+
annotations.put("triggered_at", checkResult.getTriggeredAt() != null ? checkResult.getTriggeredAt().toString() : null);
77+
if(checkResult.getTriggeredCondition() != null) {
78+
annotations.put("triggered_rule_description", checkResult.getTriggeredCondition().getDescription());
79+
annotations.put("triggered_rule_title", checkResult.getTriggeredCondition().getTitle());
80+
}
81+
}
82+
83+
return annotations;
84+
}
85+
86+
private String extractEndsAt() {
87+
if(checkResult == null || checkResult.getTriggeredAt() == null || checkResult.getTriggeredCondition() == null) {
88+
return new DateTime().plusMinutes(1).toString();
89+
}
90+
91+
return checkResult.getTriggeredAt().plusMinutes(checkResult.getTriggeredCondition().getGrace()).toString();
92+
}
93+
94+
private String extractStartsAt() {
95+
if(checkResult == null || checkResult.getTriggeredAt() == null) {
96+
return new DateTime().toString();
97+
}
98+
99+
return checkResult.getTriggeredAt().toString();
100+
}
101+
102+
private String extractStreamUrl() {
103+
if(checkResult == null || checkResult.getTriggeredCondition() == null || checkResult.getTriggeredCondition().getParameters() == null) {
104+
return null;
105+
}
106+
107+
return String.valueOf(checkResult.getTriggeredCondition().getParameters().get("stream_url"));
108+
}
109+
}

src/test/java/de/gdata/mobilelab/alertmanagercallback/AlertManagerAlarmCallbackIT.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,35 @@ public void call() throws AlarmCallbackException {
9494
assertTrue(alertOverview.contains("TestAlert1"));
9595
}
9696

97+
@Test
98+
public void callWithNullValues() throws AlarmCallbackException {
99+
// given: Stream stub
100+
Stream stream = mock(Stream.class);
101+
when(stream.getTitle()).thenReturn(null);
102+
103+
// and: AlertCondition stub
104+
AlertCondition alertCondition = mock(AlertCondition.class);
105+
when(alertCondition.getTitle()).thenReturn(null);
106+
when(alertCondition.getDescription()).thenReturn(null);
107+
when(alertCondition.getGrace()).thenReturn(1); // Grace time in minutes
108+
when(alertCondition.getParameters()).thenReturn(null);
109+
110+
// and: AlertCondition.CheckResult stub
111+
AlertCondition.CheckResult checkResult = mock(AlertCondition.CheckResult.class);
112+
when(checkResult.getTriggeredAt()).thenReturn(null);
113+
when(checkResult.getTriggeredCondition()).thenReturn(alertCondition);
114+
when(checkResult.getMatchingMessages()).thenReturn(null);
115+
116+
// expect: No exception thrown
117+
alertManagerAlarmCallback.call(stream, checkResult);
118+
119+
// and: Alert has been triggered in AlertManager
120+
String alertOverview = new RestTemplate().getForObject("http://" + alertManagerContainer.getContainerIpAddress()
121+
+ ":" + alertManagerContainer.getMappedPort(9093)
122+
+ "/api/v1/alerts/groups",
123+
String.class);
124+
assertNotNull(alertOverview);
125+
assertTrue(alertOverview.contains("TestAlert1"));
126+
}
127+
97128
}

0 commit comments

Comments
 (0)