From ad27ab839e2075d47eebfbdb6da6996eac0f7b92 Mon Sep 17 00:00:00 2001 From: Dushyant Acharya Date: Wed, 16 Sep 2026 17:48:10 +0530 Subject: [PATCH 1/3] Fix View initialization to detect bracket wildcards in instrument_name when name is set (#5664) --- .changelog/5664.fixed | 1 + .../src/opentelemetry/sdk/metrics/_internal/view.py | 2 +- opentelemetry-sdk/tests/metrics/test_view.py | 4 ++++ 3 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changelog/5664.fixed diff --git a/.changelog/5664.fixed b/.changelog/5664.fixed new file mode 100644 index 00000000000..4e601eed63e --- /dev/null +++ b/.changelog/5664.fixed @@ -0,0 +1 @@ +Fix View initialization to detect bracket character pattern wildcards (`[`, `]`) in `instrument_name` when `name` is set. diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py index 31ac34c6645..0891dcb95fe 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py @@ -119,7 +119,7 @@ def __init__( # pylint: disable=broad-exception-raised raise Exception(f"Some instrument selection criteria must be provided for View {name}") - if name is not None and instrument_name is not None and ("*" in instrument_name or "?" in instrument_name): + if name is not None and instrument_name is not None and any(c in instrument_name for c in "*?["): # pylint: disable=broad-exception-raised raise Exception(f"View {name} declared with wildcard characters in instrument_name") diff --git a/opentelemetry-sdk/tests/metrics/test_view.py b/opentelemetry-sdk/tests/metrics/test_view.py index 5032e52da11..9dd48c54016 100644 --- a/opentelemetry-sdk/tests/metrics/test_view.py +++ b/opentelemetry-sdk/tests/metrics/test_view.py @@ -107,3 +107,7 @@ def test_additive_criteria(self): def test_view_name(self): with self.assertRaises(Exception): View(name="name", instrument_name="instrument_name*") + with self.assertRaises(Exception): + View(name="name", instrument_name="instrument_name?") + with self.assertRaises(Exception): + View(name="name", instrument_name="instrument_name[0-9]") From 58510902326bcc8b6c3c3f74c673b2316fb56902 Mon Sep 17 00:00:00 2001 From: Dushyant Acharya Date: Sat, 19 Sep 2026 11:16:20 +0530 Subject: [PATCH 2/3] Rename changelog fragment to match PR number (#5674) --- .changelog/{5664.fixed => 5674.fixed} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename .changelog/{5664.fixed => 5674.fixed} (100%) diff --git a/.changelog/5664.fixed b/.changelog/5674.fixed similarity index 100% rename from .changelog/5664.fixed rename to .changelog/5674.fixed From 266041d0595028b7d5f059a7e9fa50c264017378 Mon Sep 17 00:00:00 2001 From: Dushyant Acharya Date: Fri, 25 Sep 2026 23:06:28 +0530 Subject: [PATCH 3/3] Add package name to changelog and expand test_view_name test cases (#5674) --- .changelog/5674.fixed | 2 +- opentelemetry-sdk/tests/metrics/test_view.py | 22 ++++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/.changelog/5674.fixed b/.changelog/5674.fixed index 4e601eed63e..67c68e322d5 100644 --- a/.changelog/5674.fixed +++ b/.changelog/5674.fixed @@ -1 +1 @@ -Fix View initialization to detect bracket character pattern wildcards (`[`, `]`) in `instrument_name` when `name` is set. +`opentelemetry-sdk`: Fix View initialization to detect bracket character pattern wildcards (`[`, `]`) in `instrument_name` when `name` is set. diff --git a/opentelemetry-sdk/tests/metrics/test_view.py b/opentelemetry-sdk/tests/metrics/test_view.py index 9dd48c54016..cb1471fd96c 100644 --- a/opentelemetry-sdk/tests/metrics/test_view.py +++ b/opentelemetry-sdk/tests/metrics/test_view.py @@ -105,9 +105,19 @@ def test_additive_criteria(self): ) def test_view_name(self): - with self.assertRaises(Exception): - View(name="name", instrument_name="instrument_name*") - with self.assertRaises(Exception): - View(name="name", instrument_name="instrument_name?") - with self.assertRaises(Exception): - View(name="name", instrument_name="instrument_name[0-9]") + for wildcard_name in ( + "instrument_name*", + "*instrument_name", + "instrument?name", + "instrument_[0-9]", + "instrument_[!a-z]", + "instrument_[abc]", + "instrument_[", + ): + with self.subTest(wildcard_name=wildcard_name): + with self.assertRaises(Exception): + View(name="name", instrument_name=wildcard_name) + + view = View(name="name", instrument_name="instrument_name_1") + self.assertEqual(view._name, "name") + self.assertEqual(view._instrument_name, "instrument_name_1")