From 2e97a4879dcca5081bd13fa8bbfcd2b6abff29f2 Mon Sep 17 00:00:00 2001 From: Tasdiqul Date: Wed, 20 May 2026 18:04:08 -0500 Subject: [PATCH 1/3] fix: avoid SelectableGroups deprecation warning Assisted-by: OpenAI Codex --- .../opentelemetry/util/_importlib_metadata.py | 4 ++++ .../tests/util/test__importlib_metadata.py | 22 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py b/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py index be779f1137..22f7b56769 100644 --- a/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py +++ b/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py @@ -28,6 +28,10 @@ def _as_entry_points(eps: Any) -> EntryPoints: if isinstance(eps, EntryPoints): return eps + if hasattr(eps, "groups") and hasattr(eps, "select"): + return EntryPoints( + ep for group in eps.groups for ep in eps.select(group=group) + ) # Handle Python 3.10 SelectableGroups (dict-like) return EntryPoints(ep for group_eps in eps.values() for ep in group_eps) diff --git a/opentelemetry-api/tests/util/test__importlib_metadata.py b/opentelemetry-api/tests/util/test__importlib_metadata.py index f7e5152467..1b195935fc 100644 --- a/opentelemetry-api/tests/util/test__importlib_metadata.py +++ b/opentelemetry-api/tests/util/test__importlib_metadata.py @@ -1,6 +1,8 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 +import importlib.metadata +import warnings from unittest import TestCase from opentelemetry.metrics import MeterProvider @@ -117,3 +119,23 @@ def test_as_entry_points_selectable_groups_compat(self): self.assertIsInstance(normalized, EntryPoints) self.assertEqual(len(normalized), 2) self.assertEqual(list(normalized), [ep1, ep2]) + + def test_as_entry_points_selectable_groups_without_warning(self): + selectable_groups_class = getattr( + importlib.metadata, "SelectableGroups", None + ) + if selectable_groups_class is None: + self.skipTest("SelectableGroups is not available") + + ep1 = EntryPoint(name="foo", value="bar:baz", group="gp") + ep2 = EntryPoint(name="foo2", value="bar2:baz2", group="gp2") + selectable_groups = selectable_groups_class( + {"gp": [ep1], "gp2": [ep2]} + ) + + with warnings.catch_warnings(): + warnings.simplefilter("error", DeprecationWarning) + normalized = _as_entry_points(selectable_groups) + + self.assertIsInstance(normalized, EntryPoints) + self.assertCountEqual(normalized, [ep1, ep2]) From a3b83379b383f19f3dc296703eac05290d35ae1a Mon Sep 17 00:00:00 2001 From: Tasdiqul Date: Wed, 20 May 2026 18:04:55 -0500 Subject: [PATCH 2/3] chore: add changelog for importlib metadata warning Assisted-by: OpenAI Codex --- .changelog/5238.fixed | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changelog/5238.fixed diff --git a/.changelog/5238.fixed b/.changelog/5238.fixed new file mode 100644 index 0000000000..2d3a207e3d --- /dev/null +++ b/.changelog/5238.fixed @@ -0,0 +1 @@ +Avoid import-time deprecation warnings on Python 3.10 and 3.11. From 38cd40c039a4e02ecda6dfc99cfcabd78507b00d Mon Sep 17 00:00:00 2001 From: Tasdiqul Date: Thu, 21 May 2026 09:10:32 -0500 Subject: [PATCH 3/3] fix: keep single-pass entry point normalization Assisted-by: OpenAI Codex --- .../src/opentelemetry/util/_importlib_metadata.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py b/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py index 22f7b56769..2f9d76c1b6 100644 --- a/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py +++ b/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py @@ -11,6 +11,7 @@ - https://github.com/open-telemetry/opentelemetry-python/pull/5203 """ +import warnings from functools import cache from importlib.metadata import ( Distribution, @@ -28,12 +29,14 @@ def _as_entry_points(eps: Any) -> EntryPoints: if isinstance(eps, EntryPoints): return eps - if hasattr(eps, "groups") and hasattr(eps, "select"): - return EntryPoints( - ep for group in eps.groups for ep in eps.select(group=group) - ) # Handle Python 3.10 SelectableGroups (dict-like) - return EntryPoints(ep for group_eps in eps.values() for ep in group_eps) + with warnings.catch_warnings(): + warnings.filterwarnings( + "ignore", + message=r"SelectableGroups dict interface is deprecated\. Use select\.", + category=DeprecationWarning, + ) + return EntryPoints(ep for group_eps in eps.values() for ep in group_eps) @cache