From b5f196cf913b12d73f508a9d2f3b9a1bc22eaefc Mon Sep 17 00:00:00 2001 From: Diego Hurtado <5069942+ocelotl@users.noreply.github.com> Date: Mon, 24 Aug 2026 08:59:47 -0500 Subject: [PATCH 1/2] fix(sdk): make instrumentation scope glob matching case-sensitive _scope_name_matches_glob used fnmatch.fnmatch, which normalizes both the scope name and the glob pattern through os.path.normcase. On Windows normcase lower-cases its argument, so scope name matching was case-insensitive there while staying case-sensitive on Linux. The same configuration therefore disabled a different set of instrumentation scopes depending on the host operating system. The declarative configuration schema requires case-sensitive matching for the tracer, meter and logger configurator name matchers. Use fnmatchcase so the behavior no longer depends on the host platform, matching what metrics/_internal/view.py and trace/_sampling_experimental/_rule_based.py already do. Fixes #5583. --- .../opentelemetry/sdk/util/instrumentation.py | 7 +++++-- opentelemetry-sdk/tests/metrics/test_metrics.py | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/util/instrumentation.py b/opentelemetry-sdk/src/opentelemetry/sdk/util/instrumentation.py index 710bd81de49..dba64abad96 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/util/instrumentation.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/util/instrumentation.py @@ -1,7 +1,7 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 -import fnmatch from collections.abc import Callable +from fnmatch import fnmatchcase from json import dumps from typing_extensions import deprecated @@ -166,6 +166,9 @@ def _scope_name_matches_glob( glob_pattern: str, ) -> _InstrumentationScopePredicateT: def inner(scope: InstrumentationScope) -> bool: - return fnmatch.fnmatch(scope.name, glob_pattern) + # Scope name matching is case-sensitive. fnmatchcase is used instead of + # fnmatch so it does not rely on the host platform's filename case + # sensitivity (normcase), which lower-cases both operands on Windows. + return fnmatchcase(scope.name, glob_pattern) return inner diff --git a/opentelemetry-sdk/tests/metrics/test_metrics.py b/opentelemetry-sdk/tests/metrics/test_metrics.py index d093873ee59..bfca6ed778f 100644 --- a/opentelemetry-sdk/tests/metrics/test_metrics.py +++ b/opentelemetry-sdk/tests/metrics/test_metrics.py @@ -814,6 +814,22 @@ def test_scope_name_matches_glob_no_match(self): predicate = _scope_name_matches_glob("no.match") self.assertFalse(predicate(InstrumentationScope("my.meter", "1.0"))) + def test_scope_name_matches_glob_is_case_sensitive_on_every_platform(self): + # fnmatch normcases both operands, which lower-cases them on Windows. + # Scope name matching must stay case-sensitive everywhere. + exact = _scope_name_matches_glob("my.meter") + self.assertTrue(exact(InstrumentationScope("my.meter", "1.0"))) + self.assertFalse(exact(InstrumentationScope("My.Meter", "1.0"))) + + wildcard = _scope_name_matches_glob("my.*") + self.assertTrue(wildcard(InstrumentationScope("my.meter", "1.0"))) + self.assertFalse(wildcard(InstrumentationScope("MY.meter", "1.0"))) + + def test_scope_name_matches_glob_pattern_case_is_not_normalized(self): + predicate = _scope_name_matches_glob("MY.*") + self.assertTrue(predicate(InstrumentationScope("MY.meter", "1.0"))) + self.assertFalse(predicate(InstrumentationScope("my.meter", "1.0"))) + @patch("opentelemetry.sdk.metrics._internal.SynchronousMeasurementConsumer") def test_disabled_meter_counter_skips_measurement(self, mock_sync_measurement_consumer): sync_consumer_instance = mock_sync_measurement_consumer() From 4498bd16d51184bea90dcc9477a607d2e8fba596 Mon Sep 17 00:00:00 2001 From: Diego Hurtado <5069942+ocelotl@users.noreply.github.com> Date: Mon, 24 Aug 2026 09:00:49 -0500 Subject: [PATCH 2/2] Add changelog fragment for PR 5584 --- .changelog/5584.fixed | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changelog/5584.fixed diff --git a/.changelog/5584.fixed b/.changelog/5584.fixed new file mode 100644 index 00000000000..b3659d71411 --- /dev/null +++ b/.changelog/5584.fixed @@ -0,0 +1 @@ +`opentelemetry-sdk`: fix instrumentation scope name matching in the tracer, meter and logger configurators so it is case-sensitive on every platform instead of relying on `fnmatch`'s OS-dependent case handling