This is an automated email from the ASF dual-hosted git repository.
iuliana pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
The following commit(s) were added to refs/heads/master by this push:
new aab4abe115 fix: logbook search case insensitive
aab4abe115 is described below
commit aab4abe115b74de7e20ca223721f2a349b83aabb
Author: Mateusz Zan <[email protected]>
AuthorDate: Tue Jun 16 19:46:04 2026 +0100
fix: logbook search case insensitive
Make both the logger prefix and search phrase filters case-insensitive
and consistent across the file and OpenSearch backends.
- FileLogStore: lowercase both sides of the clazz prefix and message
search-phrase comparisons (Locale.ROOT).
- OpenSearchLogStore: add case_insensitive:true to the class prefix
query, which is term-level and otherwise only matches the lowercased
indexed terms of the analyzed "class" field.
Co-Authored-By: Claude Opus 4.8 <[email protected]>
---
.../util/core/logbook/file/FileLogStore.java | 8 ++---
.../logbook/opensearch/OpenSearchLogStore.java | 6 ++--
.../util/core/logbook/file/FileLogStoreTest.java | 34 ++++++++++++++++++++++
.../logbook/opensearch/OpenSearchLogStoreTest.java | 4 +--
4 files changed, 44 insertions(+), 8 deletions(-)
diff --git
a/core/src/main/java/org/apache/brooklyn/util/core/logbook/file/FileLogStore.java
b/core/src/main/java/org/apache/brooklyn/util/core/logbook/file/FileLogStore.java
index 5b37b7773e..57ee4285d2 100644
---
a/core/src/main/java/org/apache/brooklyn/util/core/logbook/file/FileLogStore.java
+++
b/core/src/main/java/org/apache/brooklyn/util/core/logbook/file/FileLogStore.java
@@ -191,14 +191,14 @@ public class FileLogStore implements LogStore {
if (!isSearchTaskIdMatch) return false;
}
- // Check search phrases.
+ // Check search phrases. Case-insensitive to stay consistent
with the OpenSearch backend.
if (Strings.isNonBlank(params.getSearchPhrase())) {
- if (Strings.isBlank(brooklynLogEntry.getMessage()) ||
!brooklynLogEntry.getMessage().contains(params.getSearchPhrase())) return false;
+ if (Strings.isBlank(brooklynLogEntry.getMessage()) ||
!brooklynLogEntry.getMessage().toLowerCase(Locale.ROOT).contains(params.getSearchPhrase().toLowerCase(Locale.ROOT)))
return false;
}
- // Check logger/class name prefix.
+ // Check logger/class name prefix. Case-insensitive to stay
consistent with the OpenSearch backend.
if (Strings.isNonBlank(params.getLoggerName())) {
- if (Strings.isBlank(brooklynLogEntry.getClazz()) ||
!brooklynLogEntry.getClazz().startsWith(params.getLoggerName())) return false;
+ if (Strings.isBlank(brooklynLogEntry.getClazz()) ||
!brooklynLogEntry.getClazz().toLowerCase(Locale.ROOT).startsWith(params.getLoggerName().toLowerCase(Locale.ROOT)))
return false;
}
return true;
diff --git
a/core/src/main/java/org/apache/brooklyn/util/core/logbook/opensearch/OpenSearchLogStore.java
b/core/src/main/java/org/apache/brooklyn/util/core/logbook/opensearch/OpenSearchLogStore.java
index 9c76a662d4..38a4fdd51c 100644
---
a/core/src/main/java/org/apache/brooklyn/util/core/logbook/opensearch/OpenSearchLogStore.java
+++
b/core/src/main/java/org/apache/brooklyn/util/core/logbook/opensearch/OpenSearchLogStore.java
@@ -305,9 +305,11 @@ public class OpenSearchLogStore implements LogStore {
queryBoolMustListBuilder.add(buildMatchPhraseOf("message",
params.getSearchPhrase()));
}
- // Apply logger/class name prefix.
+ // Apply logger/class name prefix. Case-insensitive: the prefix query
is a term-level query that is not
+ // analyzed, so without this flag it only matches the lowercased
indexed terms of the analyzed "class" field.
if (Strings.isNonBlank(params.getLoggerName())) {
- queryBoolMustListBuilder.add(ImmutableMap.of("prefix",
ImmutableMap.of("class", params.getLoggerName())));
+ queryBoolMustListBuilder.add(ImmutableMap.of("prefix",
ImmutableMap.of("class",
+ ImmutableMap.of("value", params.getLoggerName(),
"case_insensitive", true))));
}
ImmutableList<Object> queryBoolMustList =
queryBoolMustListBuilder.build();
diff --git
a/core/src/test/java/org/apache/brooklyn/util/core/logbook/file/FileLogStoreTest.java
b/core/src/test/java/org/apache/brooklyn/util/core/logbook/file/FileLogStoreTest.java
index 969cf6ef84..c7b5e33737 100644
---
a/core/src/test/java/org/apache/brooklyn/util/core/logbook/file/FileLogStoreTest.java
+++
b/core/src/test/java/org/apache/brooklyn/util/core/logbook/file/FileLogStoreTest.java
@@ -548,6 +548,40 @@ public class FileLogStoreTest extends
BrooklynMgmtUnitTestSupport {
assertEquals(0, brooklynLogEntries.size());
}
+ @Test
+ public void testQueryLogSampleWithLoggerNameIsCaseInsensitive() {
+ File file = new
File(Objects.requireNonNull(getClass().getClassLoader().getResource(JAVA_LOG_SAMPLE_PATH)).getFile());
+ mgmt = LocalManagementContextForTests.newInstance();
+ mgmt.getBrooklynProperties().put(LOGBOOK_LOG_STORE_PATH.getName(),
file.getAbsolutePath());
+ LogBookQueryParams logBookQueryParams = new LogBookQueryParams();
+ logBookQueryParams.setNumberOfItems(1000);
+ logBookQueryParams.setTail(false);
+ logBookQueryParams.setLevels(ImmutableList.of());
+ logBookQueryParams.setLoggerName("I.C.B"); // upper case still matches
the lower case "i.c.b" entries
+ FileLogStore fileLogStore = new FileLogStore(mgmt);
+ List<BrooklynLogEntry> brooklynLogEntries =
fileLogStore.query(logBookQueryParams);
+
+ assertEquals(4, brooklynLogEntries.size());
+ assertTrue(brooklynLogEntries.stream().allMatch(e ->
e.getClazz().startsWith("i.c.b")));
+ }
+
+ @Test
+ public void testQueryLogSampleWithSearchPhraseIsCaseInsensitive() {
+ File file = new
File(Objects.requireNonNull(getClass().getClassLoader().getResource(JAVA_LOG_SAMPLE_PATH)).getFile());
+ mgmt = LocalManagementContextForTests.newInstance();
+ mgmt.getBrooklynProperties().put(LOGBOOK_LOG_STORE_PATH.getName(),
file.getAbsolutePath());
+ LogBookQueryParams logBookQueryParams = new LogBookQueryParams();
+ logBookQueryParams.setNumberOfItems(1000);
+ logBookQueryParams.setTail(false);
+ logBookQueryParams.setLevels(ImmutableList.of());
+ logBookQueryParams.setSearchPhrase("TESTING"); // upper case still
matches the lower case "testing" entries
+ FileLogStore fileLogStore = new FileLogStore(mgmt);
+ List<BrooklynLogEntry> brooklynLogEntries =
fileLogStore.query(logBookQueryParams);
+
+ assertEquals(3, brooklynLogEntries.size());
+ assertTrue(brooklynLogEntries.stream().allMatch(e ->
e.getMessage().toLowerCase(java.util.Locale.ROOT).contains("testing")));
+ }
+
private LogBookQueryParams newQueryParams(boolean recursive) {
LogBookQueryParams params = new LogBookQueryParams();
params.setNumberOfItems(5); // Request first five only
diff --git
a/core/src/test/java/org/apache/brooklyn/util/core/logbook/opensearch/OpenSearchLogStoreTest.java
b/core/src/test/java/org/apache/brooklyn/util/core/logbook/opensearch/OpenSearchLogStoreTest.java
index 393d0df888..66e35b5456 100644
---
a/core/src/test/java/org/apache/brooklyn/util/core/logbook/opensearch/OpenSearchLogStoreTest.java
+++
b/core/src/test/java/org/apache/brooklyn/util/core/logbook/opensearch/OpenSearchLogStoreTest.java
@@ -179,7 +179,7 @@ public class OpenSearchLogStoreTest {
p.setLevels(ImmutableList.of());
p.setLoggerName("o.a.b.SSH");
String query = cut.getJsonQuery(p);
- assertEquals(query,
"{\"sort\":{\"timestamp\":\"asc\"},\"size\":10,\"query\":{\"bool\":{\"must\":[{\"prefix\":{\"class\":\"o.a.b.SSH\"}}]}}}");
+ assertEquals(query,
"{\"sort\":{\"timestamp\":\"asc\"},\"size\":10,\"query\":{\"bool\":{\"must\":[{\"prefix\":{\"class\":{\"value\":\"o.a.b.SSH\",\"case_insensitive\":true}}}]}}}");
}
@Test
@@ -192,7 +192,7 @@ public class OpenSearchLogStoreTest {
p.setLoggerName("o.a.b.SSH");
p.setSearchPhrase("some phrase");
String query = cut.getJsonQuery(p);
- assertEquals(query,
"{\"sort\":{\"timestamp\":\"asc\"},\"size\":10,\"query\":{\"bool\":{\"must\":[{\"match_phrase\":{\"message\":\"some
phrase\"}},{\"prefix\":{\"class\":\"o.a.b.SSH\"}}]}}}");
+ assertEquals(query,
"{\"sort\":{\"timestamp\":\"asc\"},\"size\":10,\"query\":{\"bool\":{\"must\":[{\"match_phrase\":{\"message\":\"some
phrase\"}},{\"prefix\":{\"class\":{\"value\":\"o.a.b.SSH\",\"case_insensitive\":true}}}]}}}");
}
@Test