Skip to content

Commit fc1578e

Browse files
committed
Add groupByFields in message url - #56
1 parent 95e52c9 commit fc1578e

File tree

2 files changed

+49
-11
lines changed

2 files changed

+49
-11
lines changed

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

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
import org.joda.time.format.DateTimeFormat;
2626
import org.joda.time.format.DateTimeFormatter;
2727

28+
import java.util.ArrayList;
29+
import java.util.List;
30+
import java.util.Map;
2831
import java.util.Optional;
2932
import java.util.Set;
3033

@@ -52,18 +55,28 @@ private String buildSourceStreams(EventDto event) {
5255
return MSGS_URL_STREAM + result.toString();
5356
}
5457

55-
private String buildSearchQuery(Optional<EventDefinitionDto> eventDefinitionOpt) {
58+
private String buildSearchQuery(Optional<EventDefinitionDto> eventDefinitionOpt, Map<String, String> groupByFields) {
5659
if (eventDefinitionOpt.isPresent()) {
5760
EventDefinitionDto eventDefinition = eventDefinitionOpt.get();
5861
EventProcessorConfig config = eventDefinition.config();
5962

6063
if (config instanceof AggregationEventProcessorConfig) {
6164
AggregationEventProcessorConfig aggregationConfig = (AggregationEventProcessorConfig) config;
62-
if (aggregationConfig.query() == null || aggregationConfig.query().isEmpty() || aggregationConfig.query().equals("*")) {
63-
return "";
65+
List<String> filters = new ArrayList<>();
66+
67+
String searchQuery = aggregationConfig.query();
68+
if (searchQuery != null && !searchQuery.isEmpty() && !searchQuery.equals("*")) {
69+
filters.add(searchQuery);
6470
}
6571

66-
return MSGS_URL_QUERY + aggregationConfig.query();
72+
// Add groupByFields in filters
73+
groupByFields.entrySet().stream().map( entry -> entry.getKey() + ": " + entry.getValue()).forEach(filters::add);
74+
75+
Optional<String> filterResult = filters.stream().reduce((x, y) -> "(" + x + ") AND (" + y + ")");
76+
77+
if (filterResult.isPresent()) {
78+
return MSGS_URL_QUERY + filterResult.get();
79+
}
6780
}
6881
}
6982

@@ -87,7 +100,7 @@ public String buildMessagesUrl(EventNotificationContext context, DateTime beginT
87100
// TODO review how beginTime/endTime are computed: they do not seem to correspond to the aggregation time range shown when viewing the alert!!
88101
return MSGS_URL_BEGIN + beginTime.toString(TIME_FORMATTER)
89102
+ MSGS_URL_TO + endTime.toString(TIME_FORMATTER)
90-
+ this.buildSearchQuery(context.eventDefinition())
103+
+ this.buildSearchQuery(context.eventDefinition(), event.groupByFields())
91104
+ this.buildSourceStreams(event);
92105
}
93106
}

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

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,8 @@ public void setup() {
5656
this.dummyTime = DateTime.parse("2023-06-21T14:43:25Z");
5757
}
5858

59-
private EventDto.Builder dummyEventBuilder() {
60-
return EventDto.builder()
59+
private EventDto.Builder dummyEventBuilder(boolean withGroupByField) {
60+
EventDto.Builder builder = EventDto.builder()
6161
.alert(true)
6262
.eventDefinitionId("EventDefinitionTestId")
6363
.eventDefinitionType("notification-test-v1")
@@ -72,6 +72,12 @@ private EventDto.Builder dummyEventBuilder() {
7272
.originContext(EventOriginContext.elasticsearchMessage("testIndex_42", "b5e53442-12bb-4374-90ed-0deadbeefbaz"))
7373
.priority(2)
7474
.fields(ImmutableMap.of("field1", "value1", "field2", "value2"));
75+
76+
if (withGroupByField) {
77+
builder.groupByFields(ImmutableMap.of("user", "x"));
78+
}
79+
80+
return builder;
7581
}
7682

7783
EventDefinitionDto buildDummyEventDefinition(boolean isFallback) {
@@ -106,7 +112,7 @@ public Builder toBuilder() {
106112
private EventNotificationContext.Builder dummyContextBuilder(boolean isFallback) {
107113
EventNotificationConfig notificationConfig = new EventNotificationConfig.FallbackNotificationConfig();
108114
EventDefinitionDto eventDefinitionDto = buildDummyEventDefinition(isFallback);
109-
EventDto event = dummyEventBuilder()
115+
EventDto event = dummyEventBuilder(false)
110116
.timerangeStart(this.dummyTime)
111117
.timerangeEnd(this.dummyTime.plusMinutes(1))
112118
.build();
@@ -164,23 +170,42 @@ public void getStreamSearchUrlShouldNotFailWhenThereIsNoJobTrigger() {
164170

165171
@Test
166172
public void getStreamSearchUrlShouldNotFailWhenThereIsNoTimerangeStart() {
167-
EventDto event = dummyEventBuilder().timerangeEnd(this.dummyTime.plusMinutes(1)).build();
173+
EventDto event = dummyEventBuilder(false).timerangeEnd(this.dummyTime.plusMinutes(1)).build();
168174
EventNotificationContext context = dummyContextBuilder(true).event(event).build();
169175
this.subject.buildMessagesUrl(context, this.dummyTime);
170176
}
171177

172178
@Test
173179
public void getStreamSearchUrlShouldNotFailWhenThereIsNoTimerangeEnd() {
174-
EventDto event = dummyEventBuilder().timerangeStart(this.dummyTime).build();
180+
EventDto event = dummyEventBuilder(false).timerangeStart(this.dummyTime).build();
175181
EventNotificationContext context = dummyContextBuilder(true).event(event).build();
176182
this.subject.buildMessagesUrl(context, this.dummyTime);
177183
}
178184

185+
@Test
186+
public void getStreamSearchUrlShouldNotContainsSearchQuery() {
187+
EventDto event = dummyEventBuilder(false).timerangeStart(this.dummyTime).build();
188+
EventNotificationContext context = dummyContextBuilder(true).event(event).build();
189+
String messageUrl = this.subject.buildMessagesUrl(context, this.dummyTime);
190+
191+
Assert.assertFalse(messageUrl.contains("&q="));
192+
}
193+
179194
@Test
180195
public void getStreamSearchUrlShouldContainsSearchQuery() {
181-
EventDto event = dummyEventBuilder().timerangeStart(this.dummyTime).build();
196+
EventDto event = dummyEventBuilder(false).timerangeStart(this.dummyTime).build();
182197
EventNotificationContext context = dummyContextBuilder(false).event(event).build();
183198
String messageUrl = this.subject.buildMessagesUrl(context, this.dummyTime);
184199
Assert.assertTrue(messageUrl.contains(TEST_SEARCH_QUERY));
185200
}
201+
202+
@Test
203+
public void getStreamSearchUrlShouldContainsSearchQueryAndGroupByFields() {
204+
String expectedValue = "(" + TEST_SEARCH_QUERY + ") AND (user: x)";
205+
206+
EventDto event = dummyEventBuilder(true).timerangeStart(this.dummyTime).build();
207+
EventNotificationContext context = dummyContextBuilder(false).event(event).build();
208+
String messageUrl = this.subject.buildMessagesUrl(context, this.dummyTime);
209+
Assert.assertTrue(messageUrl.contains(expectedValue));
210+
}
186211
}

0 commit comments

Comments
 (0)