From 57f4be6e99815d88dbce96264fac3e21fffcce25 Mon Sep 17 00:00:00 2001 From: Lukas Hering Date: Tue, 26 May 2026 16:49:33 -0700 Subject: [PATCH 1/2] fix SelectableGroups deprecation warning --- .../opentelemetry/util/_importlib_metadata.py | 12 +++++++-- .../tests/util/test__importlib_metadata.py | 26 +++++++++++++++++++ 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py b/opentelemetry-api/src/opentelemetry/util/_importlib_metadata.py index be779f1137..8469f0ef90 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 itertools from functools import cache from importlib.metadata import ( Distribution, @@ -28,8 +29,15 @@ def _as_entry_points(eps: Any) -> EntryPoints: if isinstance(eps, EntryPoints): return eps - # Handle Python 3.10 SelectableGroups (dict-like) - return EntryPoints(ep for group_eps in eps.values() for ep in group_eps) + # Python 3.10 entry_points() returns a dict-like SelectableGroups object. + # Use dict.values() instead of eps.values() to avoid the DeprecationWarning + # that SelectableGroups raises when calling .values(). + if isinstance(eps, dict): + return EntryPoints(itertools.chain.from_iterable(dict.values(eps))) + # Fallback for all other types + return EntryPoints( + ep for group in eps.groups for ep in eps.select(group=group) + ) @cache diff --git a/opentelemetry-api/tests/util/test__importlib_metadata.py b/opentelemetry-api/tests/util/test__importlib_metadata.py index f7e5152467..18b7505dfb 100644 --- a/opentelemetry-api/tests/util/test__importlib_metadata.py +++ b/opentelemetry-api/tests/util/test__importlib_metadata.py @@ -1,8 +1,16 @@ # Copyright The OpenTelemetry Authors # SPDX-License-Identifier: Apache-2.0 +import unittest +import warnings from unittest import TestCase +try: + # pylint: disable-next=no-name-in-module + from importlib.metadata import SelectableGroups as _SelectableGroups +except ImportError: + _SelectableGroups = None + from opentelemetry.metrics import MeterProvider from opentelemetry.util._importlib_metadata import ( EntryPoint, @@ -117,3 +125,21 @@ def test_as_entry_points_selectable_groups_compat(self): self.assertIsInstance(normalized, EntryPoints) self.assertEqual(len(normalized), 2) self.assertEqual(list(normalized), [ep1, ep2]) + + @unittest.skipIf( + _SelectableGroups is None, + "SelectableGroups not available on this Python version", + ) + def test_as_entry_points_selectable_groups_no_deprecation_warning(self): + ep1 = EntryPoint(name="foo", value="bar:baz", group="gp") + ep2 = EntryPoint(name="foo2", value="bar2:baz2", group="gp") + + sg = _SelectableGroups({"gp": [ep1, ep2]}) # type: ignore + + with warnings.catch_warnings(): + warnings.simplefilter("error") + normalized = _as_entry_points(sg) + + self.assertIsInstance(normalized, EntryPoints) + self.assertEqual(len(normalized), 2) + self.assertEqual(list(normalized), [ep1, ep2]) From e230ef987f777642bb1a3dd75f568334aa2b65f1 Mon Sep 17 00:00:00 2001 From: Lukas Hering Date: Tue, 26 May 2026 16:53:28 -0700 Subject: [PATCH 2/2] add changelog fragment --- .changelog/5250.fixed | 1 + 1 file changed, 1 insertion(+) create mode 100644 .changelog/5250.fixed diff --git a/.changelog/5250.fixed b/.changelog/5250.fixed new file mode 100644 index 0000000000..24e9e7bdda --- /dev/null +++ b/.changelog/5250.fixed @@ -0,0 +1 @@ +`opentelemetry-api`: fix SelectableGroups deprecation warning