From e3c707d2e472ec94ac5e76b9f3a7c34cca17f853 Mon Sep 17 00:00:00 2001 From: Jack Berg <34418638+jack-berg@users.noreply.github.com> Date: Fri, 6 Mar 2026 12:23:49 -0600 Subject: [PATCH 1/4] Change IncludeExcludePredicate to use case sensitive matching consistently --- .../internal/IncludeExcludePredicate.java | 4 ++-- .../internal/IncludeExcludePredicateTest.java | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicate.java b/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicate.java index a98efa69769..af293d6d1b7 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicate.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicate.java @@ -101,7 +101,7 @@ private static Predicate includedPredicate( if (globMatchingEnabled) { result = result.or(createGlobPatternPredicate(include)); } else { - result = result.or(include::equalsIgnoreCase); + result = result.or(include::equals); } } return result; @@ -114,7 +114,7 @@ private static Predicate excludedPredicate( if (globMatchingEnabled) { result = result.and(createGlobPatternPredicate(exclude).negate()); } else { - result = result.and(s -> !exclude.equalsIgnoreCase(s)); + result = result.and(s -> !exclude.equals(s)); } } return result; diff --git a/sdk/common/src/test/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicateTest.java b/sdk/common/src/test/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicateTest.java index e5f38a61962..2340d1009b0 100644 --- a/sdk/common/src/test/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicateTest.java +++ b/sdk/common/src/test/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicateTest.java @@ -48,38 +48,57 @@ private static Stream testArgs() { Arguments.of(EXACT_INCLUDE, "foo", true), Arguments.of(EXACT_INCLUDE, "bar", false), Arguments.of(EXACT_INCLUDE, "baz", false), + Arguments.of(EXACT_INCLUDE, "Foo", false), + Arguments.of(EXACT_INCLUDE, "FOO", false), // exclude only Arguments.of(EXACT_EXCLUDE, "foo", true), Arguments.of(EXACT_EXCLUDE, "bar", false), Arguments.of(EXACT_EXCLUDE, "baz", true), + Arguments.of(EXACT_EXCLUDE, "Bar", true), + Arguments.of(EXACT_EXCLUDE, "BAR", true), // include and exclude Arguments.of(EXACT_INCLUDE_AND_EXCLUDE, "foo", true), + Arguments.of(EXACT_INCLUDE_AND_EXCLUDE, "Foo", false), + Arguments.of(EXACT_INCLUDE_AND_EXCLUDE, "FOO", false), Arguments.of(EXACT_INCLUDE_AND_EXCLUDE, "bar", false), Arguments.of(EXACT_INCLUDE_AND_EXCLUDE, "baz", false), // multi Arguments.of(EXACT_MULTI, "foo", true), Arguments.of(EXACT_MULTI, "fooo", true), + Arguments.of(EXACT_MULTI, "Foo", false), + Arguments.of(EXACT_MULTI, "FOO", false), Arguments.of(EXACT_MULTI, "bar", false), Arguments.of(EXACT_MULTI, "barr", false), Arguments.of(EXACT_MULTI, "baz", false), // pattern matching // include only Arguments.of(PATTERN_INCLUDE, "foo", true), + Arguments.of(PATTERN_INCLUDE, "fOo", true), + Arguments.of(PATTERN_INCLUDE, "Foo", false), Arguments.of(PATTERN_INCLUDE, "bar", false), Arguments.of(PATTERN_INCLUDE, "baz", false), // exclude only Arguments.of(PATTERN_EXCLUDE, "foo", true), Arguments.of(PATTERN_EXCLUDE, "bar", false), + Arguments.of(PATTERN_EXCLUDE, "bAr", false), + Arguments.of(PATTERN_EXCLUDE, "Bar", true), + Arguments.of(PATTERN_EXCLUDE, "BAR", true), Arguments.of(PATTERN_EXCLUDE, "baz", true), // include and exclude Arguments.of(PATTERN_INCLUDE_AND_EXCLUDE, "foo", true), + Arguments.of(PATTERN_INCLUDE_AND_EXCLUDE, "fOo", true), + Arguments.of(PATTERN_INCLUDE_AND_EXCLUDE, "FOO", false), Arguments.of(PATTERN_INCLUDE_AND_EXCLUDE, "bar", false), Arguments.of(PATTERN_INCLUDE_AND_EXCLUDE, "baz", false), // multi Arguments.of(PATTERN_MULTI, "foo", true), Arguments.of(PATTERN_MULTI, "fooo", true), + Arguments.of(PATTERN_MULTI, "fOo", true), + Arguments.of(PATTERN_MULTI, "FOO", false), Arguments.of(PATTERN_MULTI, "bar", false), + Arguments.of(PATTERN_MULTI, "bAr", false), Arguments.of(PATTERN_MULTI, "barr", false), + Arguments.of(PATTERN_MULTI, "bArr", false), Arguments.of(PATTERN_MULTI, "baz", false)); } From f9c7114cf3bcbb79c2a4f270efbaedaf84760058 Mon Sep 17 00:00:00 2001 From: Jack Berg <34418638+jack-berg@users.noreply.github.com> Date: Fri, 6 Mar 2026 13:22:29 -0600 Subject: [PATCH 2/4] Extend to GlobUtil --- .../java/io/opentelemetry/sdk/common/internal/GlobUtil.java | 4 ++-- .../sdk/common/internal/IncludeExcludePredicate.java | 2 +- .../io/opentelemetry/sdk/common/internal/GlobUtilTest.java | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/GlobUtil.java b/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/GlobUtil.java index fcc002585ec..7a8394ad363 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/GlobUtil.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/GlobUtil.java @@ -98,8 +98,8 @@ public boolean test(String s) { if (pattern != null) { return pattern.matcher(s).matches(); } - // Exact match, ignoring case - return globPattern.equalsIgnoreCase(s); + // Exact match + return globPattern.equals(s); } @Override diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicate.java b/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicate.java index af293d6d1b7..243c6941d99 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicate.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicate.java @@ -21,7 +21,7 @@ * *

Supports optional glob pattern matching. See {@link GlobUtil}. * - *

String equality is evaluated using {@link String#equalsIgnoreCase(String)}. + *

String equality is evaluated using {@link String#equals(Object)}. * *

This class is internal and is hence not for public use. Its APIs are unstable and can change * at any time. diff --git a/sdk/common/src/test/java/io/opentelemetry/sdk/common/internal/GlobUtilTest.java b/sdk/common/src/test/java/io/opentelemetry/sdk/common/internal/GlobUtilTest.java index 448ef39655b..3ec5a0a830c 100644 --- a/sdk/common/src/test/java/io/opentelemetry/sdk/common/internal/GlobUtilTest.java +++ b/sdk/common/src/test/java/io/opentelemetry/sdk/common/internal/GlobUtilTest.java @@ -24,7 +24,7 @@ void matchesName(String globPattern, String testString, boolean isMatchExpected) private static Stream globPatternPredicateArgs() { return Stream.of( Arguments.of("foo", "foo", true), - Arguments.of("foo", "Foo", true), + Arguments.of("foo", "Foo", false), Arguments.of("foo", "bar", false), Arguments.of("fo?", "foo", true), Arguments.of("fo??", "fooo", true), From 2849c85a14ab0b85bd6730897669899dc92ad2b0 Mon Sep 17 00:00:00 2001 From: Jack Berg <34418638+jack-berg@users.noreply.github.com> Date: Fri, 6 Mar 2026 13:25:07 -0600 Subject: [PATCH 3/4] More tests --- .../io/opentelemetry/sdk/common/internal/GlobUtilTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sdk/common/src/test/java/io/opentelemetry/sdk/common/internal/GlobUtilTest.java b/sdk/common/src/test/java/io/opentelemetry/sdk/common/internal/GlobUtilTest.java index 3ec5a0a830c..1d8fb2a9bd8 100644 --- a/sdk/common/src/test/java/io/opentelemetry/sdk/common/internal/GlobUtilTest.java +++ b/sdk/common/src/test/java/io/opentelemetry/sdk/common/internal/GlobUtilTest.java @@ -38,6 +38,8 @@ private static Stream globPatternPredicateArgs() { Arguments.of("*", "", true), Arguments.of("fo*", "fo", true), Arguments.of("fo*", "foo", true), + Arguments.of("fo*", "foO", true), + Arguments.of("fo*", "FOO", false), Arguments.of("fo*", "fooo", true), Arguments.of("fo*", "foo.bar.baz", true), Arguments.of("*bar", "sandbar", true), @@ -45,6 +47,8 @@ private static Stream globPatternPredicateArgs() { Arguments.of("fo*b*", "foob", true), Arguments.of("fo*b*", "foo bar", true), Arguments.of("fo? b??", "foo bar", true), + Arguments.of("fo? b??", "foO bAR", true), + Arguments.of("fo? b??", "FOO BAR", false), Arguments.of("fo? b??", "fooo bar", false), Arguments.of("fo* ba?", "foo is not bar", true), Arguments.of("fo? b*", "fox beetles for lunch", true), From 5cecf3c0b8690084c4b0f83e0ca8ec2743cfbb58 Mon Sep 17 00:00:00 2001 From: Jack Berg <34418638+jack-berg@users.noreply.github.com> Date: Fri, 6 Mar 2026 14:25:42 -0600 Subject: [PATCH 4/4] Fix javadoc --- .../sdk/common/internal/IncludeExcludePredicate.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicate.java b/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicate.java index 243c6941d99..dd6ba4e63b4 100644 --- a/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicate.java +++ b/sdk/common/src/main/java/io/opentelemetry/sdk/common/internal/IncludeExcludePredicate.java @@ -55,7 +55,7 @@ private IncludeExcludePredicate( } /** - * Create a (case-insensitive) exact matching include exclude predicate. + * Create a (case-sensitive) exact matching include exclude predicate. * * @throws IllegalArgumentException if {@code included} AND {@code excluded} are null. */