Skip to content

Commit 95e52c9

Browse files
committed
Add search_query in messages_url - #56
1 parent 2abbb33 commit 95e52c9

File tree

2 files changed

+62
-8
lines changed

2 files changed

+62
-8
lines changed

src/main/java/com/airbus_cyber_security/graylog/events/notifications/types/MessagesURLBuilder.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,21 @@
1818

1919
import org.graylog.events.event.EventDto;
2020
import org.graylog.events.notifications.EventNotificationContext;
21+
import org.graylog.events.processor.EventDefinitionDto;
22+
import org.graylog.events.processor.EventProcessorConfig;
23+
import org.graylog.events.processor.aggregation.AggregationEventProcessorConfig;
2124
import org.joda.time.DateTime;
2225
import org.joda.time.format.DateTimeFormat;
2326
import org.joda.time.format.DateTimeFormatter;
2427

28+
import java.util.Optional;
2529
import java.util.Set;
2630

2731
public class MessagesURLBuilder {
2832

2933
private static final String MSGS_URL_BEGIN = "/search?rangetype=absolute&from=";
3034
private static final String MSGS_URL_TO = "&to=";
35+
private static final String MSGS_URL_QUERY = "&q=";
3136
private static final String MSGS_URL_STREAM = "&streams=";
3237
private static final String COMMA_SEPARATOR = "%2C";
3338
private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormat.forPattern("yyy-MM-dd'T'HH'%3A'mm'%3A'ss.SSS'Z'");
@@ -47,6 +52,24 @@ private String buildSourceStreams(EventDto event) {
4752
return MSGS_URL_STREAM + result.toString();
4853
}
4954

55+
private String buildSearchQuery(Optional<EventDefinitionDto> eventDefinitionOpt) {
56+
if (eventDefinitionOpt.isPresent()) {
57+
EventDefinitionDto eventDefinition = eventDefinitionOpt.get();
58+
EventProcessorConfig config = eventDefinition.config();
59+
60+
if (config instanceof AggregationEventProcessorConfig) {
61+
AggregationEventProcessorConfig aggregationConfig = (AggregationEventProcessorConfig) config;
62+
if (aggregationConfig.query() == null || aggregationConfig.query().isEmpty() || aggregationConfig.query().equals("*")) {
63+
return "";
64+
}
65+
66+
return MSGS_URL_QUERY + aggregationConfig.query();
67+
}
68+
}
69+
70+
return "";
71+
}
72+
5073
private DateTime evaluateEndTime(EventDto event, DateTime beginTime) {
5174
if (event.timerangeEnd().isEmpty()) {
5275
return beginTime.plusMinutes(1);
@@ -64,6 +87,7 @@ public String buildMessagesUrl(EventNotificationContext context, DateTime beginT
6487
// TODO review how beginTime/endTime are computed: they do not seem to correspond to the aggregation time range shown when viewing the alert!!
6588
return MSGS_URL_BEGIN + beginTime.toString(TIME_FORMATTER)
6689
+ MSGS_URL_TO + endTime.toString(TIME_FORMATTER)
90+
+ this.buildSearchQuery(context.eventDefinition())
6791
+ this.buildSourceStreams(event);
6892
}
6993
}

src/test/java/com/airbus_cyber_security/graylog/events/notifications/types/MessagesURLBuilderTest.java

Lines changed: 38 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -28,22 +28,27 @@
2828
import org.graylog.events.notifications.EventNotificationSettings;
2929
import org.graylog.events.processor.EventDefinitionDto;
3030
import org.graylog.events.processor.EventProcessorConfig;
31+
import org.graylog.events.processor.aggregation.AggregationEventProcessorConfig;
3132
import org.graylog.scheduler.JobSchedule;
3233
import org.graylog.scheduler.JobTriggerDto;
3334
import org.graylog2.plugin.Tools;
3435
import org.joda.time.DateTime;
36+
import org.junit.Assert;
3537
import org.junit.Before;
3638
import org.junit.Test;
3739
import org.graylog2.plugin.streams.Stream;
3840
import org.graylog.events.event.EventOriginContext;
3941

42+
import java.util.Collections;
43+
4044
public class MessagesURLBuilderTest {
4145

4246
private MessagesURLBuilder subject;
4347

4448
private DateTime dummyTime;
4549

4650
private static final String TEST_NOTIFICATION_ID = "NotificationTestId";
51+
private static final String TEST_SEARCH_QUERY = "src: x";
4752

4853
@Before
4954
public void setup() {
@@ -69,13 +74,13 @@ private EventDto.Builder dummyEventBuilder() {
6974
.fields(ImmutableMap.of("field1", "value1", "field2", "value2"));
7075
}
7176

72-
EventDefinitionDto buildDummyEventDefinition() {
77+
EventDefinitionDto buildDummyEventDefinition(boolean isFallback) {
7378
return EventDefinitionDto.builder()
7479
.alert(true)
7580
.id(TEST_NOTIFICATION_ID)
7681
.title("Event Definition Test Title")
7782
.description("Event Definition Test Description")
78-
.config(new EventProcessorConfig.FallbackConfig())
83+
.config(dummyEventProcessorConfig(isFallback))
7984
.fieldSpec(ImmutableMap.of())
8085
.priority(2)
8186
.keySpec(ImmutableList.of())
@@ -98,9 +103,9 @@ public Builder toBuilder() {
98103
).build();
99104
}
100105

101-
private EventNotificationContext.Builder dummyContextBuilder() {
106+
private EventNotificationContext.Builder dummyContextBuilder(boolean isFallback) {
102107
EventNotificationConfig notificationConfig = new EventNotificationConfig.FallbackNotificationConfig();
103-
EventDefinitionDto eventDefinitionDto = buildDummyEventDefinition();
108+
EventDefinitionDto eventDefinitionDto = buildDummyEventDefinition(isFallback);
104109
EventDto event = dummyEventBuilder()
105110
.timerangeStart(this.dummyTime)
106111
.timerangeEnd(this.dummyTime.plusMinutes(1))
@@ -112,6 +117,23 @@ private EventNotificationContext.Builder dummyContextBuilder() {
112117
.event(event);
113118
}
114119

120+
private EventProcessorConfig dummyEventProcessorConfig(boolean isFallback) {
121+
if (isFallback) {
122+
return new EventProcessorConfig.FallbackConfig();
123+
} else {
124+
EventProcessorConfig eventProcessorConfig = AggregationEventProcessorConfig.builder()
125+
.query(TEST_SEARCH_QUERY)
126+
.streams(Collections.emptySet())
127+
.groupBy(Collections.emptyList())
128+
.series(Collections.emptyList())
129+
.searchWithinMs(60000)
130+
.executeEveryMs(60000)
131+
.build();
132+
133+
return eventProcessorConfig;
134+
}
135+
}
136+
115137
private JobTriggerDto buildJobTrigger(DateTime jobTriggerTime) {
116138
return JobTriggerDto.builder()
117139
.jobDefinitionId("jobDefinitionId")
@@ -123,7 +145,7 @@ private JobTriggerDto buildJobTrigger(DateTime jobTriggerTime) {
123145

124146
private EventNotificationContext buildDummyContext(DateTime jobTriggerTime) {
125147
JobTriggerDto jobTrigger = buildJobTrigger(jobTriggerTime);
126-
return dummyContextBuilder()
148+
return dummyContextBuilder(true)
127149
.jobTrigger(jobTrigger)
128150
.build();
129151
}
@@ -136,21 +158,29 @@ public void buildMessagesUrlShouldNotFailWhenSplitFieldIsNotPresent() {
136158

137159
@Test
138160
public void getStreamSearchUrlShouldNotFailWhenThereIsNoJobTrigger() {
139-
EventNotificationContext context = dummyContextBuilder().build();
161+
EventNotificationContext context = dummyContextBuilder(true).build();
140162
this.subject.buildMessagesUrl(context, this.dummyTime);
141163
}
142164

143165
@Test
144166
public void getStreamSearchUrlShouldNotFailWhenThereIsNoTimerangeStart() {
145167
EventDto event = dummyEventBuilder().timerangeEnd(this.dummyTime.plusMinutes(1)).build();
146-
EventNotificationContext context = dummyContextBuilder().event(event).build();
168+
EventNotificationContext context = dummyContextBuilder(true).event(event).build();
147169
this.subject.buildMessagesUrl(context, this.dummyTime);
148170
}
149171

150172
@Test
151173
public void getStreamSearchUrlShouldNotFailWhenThereIsNoTimerangeEnd() {
152174
EventDto event = dummyEventBuilder().timerangeStart(this.dummyTime).build();
153-
EventNotificationContext context = dummyContextBuilder().event(event).build();
175+
EventNotificationContext context = dummyContextBuilder(true).event(event).build();
154176
this.subject.buildMessagesUrl(context, this.dummyTime);
155177
}
178+
179+
@Test
180+
public void getStreamSearchUrlShouldContainsSearchQuery() {
181+
EventDto event = dummyEventBuilder().timerangeStart(this.dummyTime).build();
182+
EventNotificationContext context = dummyContextBuilder(false).event(event).build();
183+
String messageUrl = this.subject.buildMessagesUrl(context, this.dummyTime);
184+
Assert.assertTrue(messageUrl.contains(TEST_SEARCH_QUERY));
185+
}
156186
}

0 commit comments

Comments
 (0)