diff --git a/.changelog/5673.fixed b/.changelog/5673.fixed new file mode 100644 index 0000000000..40d9683828 --- /dev/null +++ b/.changelog/5673.fixed @@ -0,0 +1 @@ +`opentelemetry-sdk`: reject character set wildcards (`[`, `]`) in `View.instrument_name` when a custom `name` is provided diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py b/opentelemetry-sdk/src/opentelemetry/sdk/metrics/_internal/view.py index 31ac34c664..99b1f7ffe3 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 5032e52da1..9dacab1808 100644 --- a/opentelemetry-sdk/tests/metrics/test_view.py +++ b/opentelemetry-sdk/tests/metrics/test_view.py @@ -105,5 +105,21 @@ def test_additive_criteria(self): ) def test_view_name(self): - with self.assertRaises(Exception): - View(name="name", instrument_name="instrument_name*") + for wildcard_name in ( + "instrument_name*", + "*instrument_name", + "instrument?name", + "instrument_[0-9]", + "instrument_[!a-z]", + "instrument_[abc]", + "instrument_[", + "instrument_]", + ): + with self.subTest(wildcard_name=wildcard_name): + with self.assertRaises(Exception): + View(name="name", instrument_name=wildcard_name) + + # Non-wildcard instrument name should succeed + view = View(name="name", instrument_name="instrument_name") + self.assertEqual(view._name, "name") + self.assertEqual(view._instrument_name, "instrument_name")