Skip to content

Commit d4e2492

Browse files
committed
Add grok pattern validator to data-prepper-api
Signed-off-by: Taylor Gray <tylgry@amazon.com>
1 parent 062ae95 commit d4e2492

3 files changed

Lines changed: 104 additions & 0 deletions

File tree

data-prepper-api/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55

66
dependencies {
7+
implementation "io.krakens:java-grok:0.1.9"
78
implementation 'io.micrometer:micrometer-core'
89
implementation 'com.fasterxml.jackson.core:jackson-databind'
910
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package org.opensearch.dataprepper.validations;
2+
3+
import io.krakens.grok.api.GrokCompiler;
4+
5+
import java.util.ArrayList;
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
public final class GrokPatternValidator {
10+
11+
private static final GrokCompiler grokCompiler = GrokCompiler.newInstance();
12+
13+
static {
14+
grokCompiler.registerDefaultPatterns();
15+
}
16+
17+
private GrokPatternValidator() {
18+
19+
}
20+
21+
public static List<String> validatePatterns(final Map<String, String> additionalPatternsToRegister, final List<String> matchPatterns) {
22+
final List<String> incompatiblePatternErrors = new ArrayList<>();
23+
additionalPatternsToRegister.forEach((patternName, pattern) -> {
24+
try {
25+
grokCompiler.register(patternName, pattern);
26+
} catch (final NullPointerException | IllegalArgumentException e) {
27+
final String errorMessage = String.format("The grok pattern with name \"%s\" and pattern \"%s\" is invalid with the following error: %s", patternName, pattern, e.getMessage());
28+
incompatiblePatternErrors.add(errorMessage);
29+
}
30+
});
31+
32+
if (incompatiblePatternErrors.isEmpty()) {
33+
matchPatterns.forEach(pattern -> {
34+
try {
35+
grokCompiler.compile(pattern);
36+
} catch (final IllegalArgumentException e) {
37+
final String errorMessage = String.format("The grok match pattern \"%s\" is invalid with the following error: %s", pattern, e.getMessage());
38+
incompatiblePatternErrors.add(errorMessage);
39+
}
40+
});
41+
}
42+
43+
return incompatiblePatternErrors;
44+
}
45+
46+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package org.opensearch.dataprepper.validations;
2+
3+
import org.junit.jupiter.api.Test;
4+
5+
import java.util.HashMap;
6+
import java.util.List;
7+
import java.util.Map;
8+
9+
import static org.hamcrest.MatcherAssert.assertThat;
10+
import static org.hamcrest.Matchers.equalTo;
11+
import static org.hamcrest.Matchers.notNullValue;
12+
import static org.hamcrest.Matchers.startsWith;
13+
14+
public class GrokPatternValidatorTest {
15+
16+
@Test
17+
void validatePatterns_with_invalid_match_patterns_returns_expected_messages() {
18+
final Map<String, String> additionalPatterns = Map.of(
19+
"PATTERN1", "one_%{WORD}"
20+
);
21+
22+
final List<String> matchPatterns = List.of("some_pattern", "%{PATTERN1}", "%{WORD} %{PATTERN10}", "%{ANOTHER_PATTERN}");
23+
final List<String> validationErrors = GrokPatternValidator.validatePatterns(additionalPatterns, matchPatterns);
24+
25+
assertThat(validationErrors, notNullValue());
26+
assertThat(validationErrors.size(), equalTo(2));
27+
assertThat(validationErrors.get(0), startsWith("The grok match pattern \"%{WORD} %{PATTERN10}\" is invalid"));
28+
assertThat(validationErrors.get(1), startsWith("The grok match pattern \"%{ANOTHER_PATTERN}\" is invalid"));
29+
}
30+
31+
@Test
32+
void validatePatterns_with_no_invalid_patterns_returns_empty_list() {
33+
final Map<String, String> additionalPatterns = Map.of(
34+
"PATTERN1", "one_%{WORD}",
35+
"PATTERN2", "test_%{NUMBER}"
36+
);
37+
38+
final List<String> matchPatterns = List.of("some_pattern", "%{PATTERN1}", "%{WORD} %{PATTERN2}");
39+
40+
final List<String> errorMessages = GrokPatternValidator.validatePatterns(additionalPatterns, matchPatterns);
41+
assertThat(errorMessages, notNullValue());
42+
assertThat(errorMessages.size(), equalTo(0));
43+
}
44+
45+
@Test
46+
void validatePatterns_with_invalid_additional_patterns_returns_expected_messages() {
47+
final Map<String, String> additionalPatterns = new HashMap<>();
48+
additionalPatterns.put("test", null);
49+
50+
final List<String> matchPatterns = List.of("some_pattern", "%{PATTERN1}", "%{WORD} %{PATTERN2}");
51+
52+
final List<String> errorMessages = GrokPatternValidator.validatePatterns(additionalPatterns, matchPatterns);
53+
assertThat(errorMessages, notNullValue());
54+
assertThat(errorMessages.size(), equalTo(1));
55+
assertThat(errorMessages.get(0), startsWith("The grok pattern with name \"test\" and pattern \"null\""));
56+
}
57+
}

0 commit comments

Comments
 (0)