Skip to content

Commit db3d4e6

Browse files
Extend allowed characters for grok field names (#21745) (#31653) (#31722)
1 parent 5a66544 commit db3d4e6

File tree

2 files changed

+51
-5
lines changed

2 files changed

+51
-5
lines changed

libs/grok/src/main/java/org/elasticsearch/grok/Grok.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public final class Grok {
5252
"%\\{" +
5353
"(?<name>" +
5454
"(?<pattern>[A-z0-9]+)" +
55-
"(?::(?<subname>[A-z0-9_:.-]+))?" +
55+
"(?::(?<subname>[[:alnum:]@\\[\\]_:.-]+))?" +
5656
")" +
5757
"(?:=(?<definition>" +
5858
"(?:" +
@@ -81,11 +81,11 @@ public final class Grok {
8181
public Grok(Map<String, String> patternBank, String grokPattern) {
8282
this(patternBank, grokPattern, true, ThreadWatchdog.noop());
8383
}
84-
84+
8585
public Grok(Map<String, String> patternBank, String grokPattern, ThreadWatchdog threadWatchdog) {
8686
this(patternBank, grokPattern, true, threadWatchdog);
8787
}
88-
88+
8989
Grok(Map<String, String> patternBank, String grokPattern, boolean namedCaptures) {
9090
this(patternBank, grokPattern, namedCaptures, ThreadWatchdog.noop());
9191
}

libs/grok/src/test/java/org/elasticsearch/grok/GrokTests.java

+48-2
Original file line numberDiff line numberDiff line change
@@ -379,10 +379,10 @@ public void testMultipleNamedCapturesWithSameName() {
379379
expected.put("num", "1");
380380
assertThat(grok.captures("12"), equalTo(expected));
381381
}
382-
382+
383383
public void testExponentialExpressions() {
384384
AtomicBoolean run = new AtomicBoolean(true); // to avoid a lingering thread when test has completed
385-
385+
386386
String grokPattern = "Bonsuche mit folgender Anfrage: Belegart->\\[%{WORD:param2},(?<param5>(\\s*%{NOTSPACE})*)\\] " +
387387
"Zustand->ABGESCHLOSSEN Kassennummer->%{WORD:param9} Bonnummer->%{WORD:param10} Datum->%{DATESTAMP_OTHER:param11}";
388388
String logLine = "Bonsuche mit folgender Anfrage: Belegart->[EINGESCHRAENKTER_VERKAUF, VERKAUF, NACHERFASSUNG] " +
@@ -406,4 +406,50 @@ public void testExponentialExpressions() {
406406
run.set(false);
407407
assertThat(e.getMessage(), equalTo("grok pattern matching was interrupted after [200] ms"));
408408
}
409+
410+
public void testAtInFieldName() {
411+
assertGrokedField("@metadata");
412+
}
413+
414+
public void assertNonAsciiLetterInFieldName() {
415+
assertGrokedField("metädata");
416+
}
417+
418+
public void assertSquareBracketInFieldName() {
419+
assertGrokedField("metadat[a]");
420+
assertGrokedField("metad[a]ta");
421+
assertGrokedField("[m]etadata");
422+
}
423+
424+
public void testUnderscoreInFieldName() {
425+
assertGrokedField("meta_data");
426+
}
427+
428+
public void testDotInFieldName() {
429+
assertGrokedField("meta.data");
430+
}
431+
432+
public void testMinusInFieldName() {
433+
assertGrokedField("meta-data");
434+
}
435+
436+
public void testAlphanumericFieldName() {
437+
assertGrokedField(randomAlphaOfLengthBetween(1, 5));
438+
assertGrokedField(randomAlphaOfLengthBetween(1, 5) + randomIntBetween(0, 100));
439+
assertGrokedField(randomIntBetween(0, 100) + randomAlphaOfLengthBetween(1, 5));
440+
assertGrokedField(String.valueOf(randomIntBetween(0, 100)));
441+
}
442+
443+
public void testUnsupportedBracketsInFieldName() {
444+
Grok grok = new Grok(basePatterns, "%{WORD:unsuppo(r)ted}");
445+
Map<String, Object> matches = grok.captures("line");
446+
assertNull(matches);
447+
}
448+
449+
private void assertGrokedField(String fieldName) {
450+
String line = "foo";
451+
Grok grok = new Grok(basePatterns, "%{WORD:" + fieldName + "}");
452+
Map<String, Object> matches = grok.captures(line);
453+
assertEquals(line, matches.get(fieldName));
454+
}
409455
}

0 commit comments

Comments
 (0)