Skip to content

Commit 8b96068

Browse files
jeremydvossCopilot
andauthored
Distro 1.6.7 Hotfix: Adjust to breaking change in opentelemetry-instrumentation (#40463)
* Fix breaking change re: dep conflict checks * tests pass * clean up * changelog and min version * Update sdk/monitor/azure-monitor-opentelemetry/azure/monitor/opentelemetry/_configure.py Co-authored-by: Copilot <[email protected]> * lint: unused imports --------- Co-authored-by: Copilot <[email protected]>
1 parent b25da54 commit 8b96068

File tree

4 files changed

+34
-69
lines changed

4 files changed

+34
-69
lines changed

sdk/monitor/azure-monitor-opentelemetry/CHANGELOG.md

+3-6
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
11
# Release History
22

3-
## 1.6.7 (Unreleased)
4-
5-
### Features Added
6-
7-
### Breaking Changes
3+
## 1.6.7 (2025-04-10)
84

95
### Bugs Fixed
106

11-
### Other Changes
7+
- Adapt to OpenTelemetry dependency resolver change.
8+
([#40463](https://github.com/Azure/azure-sdk-for-python/pull/40463))
129

1310
## 1.6.6 (2025-04-07)
1411

sdk/monitor/azure-monitor-opentelemetry/azure/monitor/opentelemetry/_configure.py

+12-37
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33
# Licensed under the MIT License. See License in the project root for
44
# license information.
55
# --------------------------------------------------------------------------
6-
from functools import cached_property
76
from logging import getLogger, Formatter
87
from typing import Dict, List, cast
98

109
from opentelemetry._events import _set_event_logger_provider
1110
from opentelemetry._logs import set_logger_provider
1211
from opentelemetry.instrumentation.dependencies import (
13-
get_dist_dependency_conflicts,
12+
DependencyConflictError,
1413
)
1514
from opentelemetry.instrumentation.instrumentor import ( # type: ignore
1615
BaseInstrumentor,
@@ -26,11 +25,8 @@
2625
from opentelemetry.sdk.trace import TracerProvider
2726
from opentelemetry.sdk.trace.export import BatchSpanProcessor
2827
from opentelemetry.trace import set_tracer_provider
29-
from opentelemetry.util._importlib_metadata import (
30-
EntryPoint,
31-
distributions,
32-
entry_points,
33-
)
28+
from opentelemetry.util._importlib_metadata import entry_points
29+
3430

3531
from azure.core.settings import settings
3632
from azure.core.tracing.ext.opentelemetry_span import OpenTelemetrySpan
@@ -211,25 +207,8 @@ def _setup_live_metrics(configurations):
211207
enable_live_metrics(**configurations)
212208

213209

214-
class _EntryPointDistFinder:
215-
@cached_property
216-
def _mapping(self):
217-
return {self._key_for(ep): dist for dist in distributions() for ep in dist.entry_points}
218-
219-
def dist_for(self, entry_point: EntryPoint):
220-
dist = getattr(entry_point, "dist", None)
221-
if dist:
222-
return dist
223-
224-
return self._mapping.get(self._key_for(entry_point))
225-
226-
@staticmethod
227-
def _key_for(entry_point: EntryPoint):
228-
return f"{entry_point.group}:{entry_point.name}:{entry_point.value}"
229-
230-
231210
def _setup_instrumentations(configurations: Dict[str, ConfigurationValue]):
232-
entry_point_finder = _EntryPointDistFinder()
211+
# entry_point_finder = _EntryPointDistFinder()
233212
# use pkg_resources for now until https://github.com/open-telemetry/opentelemetry-python/pull/3168 is merged
234213
for entry_point in entry_points(group="opentelemetry_instrumentor"):
235214
lib_name = entry_point.name
@@ -239,20 +218,16 @@ def _setup_instrumentations(configurations: Dict[str, ConfigurationValue]):
239218
_logger.debug("Instrumentation skipped for library %s", entry_point.name)
240219
continue
241220
try:
242-
# Check if dependent libraries/version are installed
243-
entry_point_dist = entry_point_finder.dist_for(entry_point) # type: ignore
244-
conflict = get_dist_dependency_conflicts(entry_point_dist) # type: ignore
245-
if conflict:
246-
_logger.debug(
247-
"Skipping instrumentation %s: %s",
248-
entry_point.name,
249-
conflict,
250-
)
251-
continue
252221
# Load the instrumentor via entrypoint
253222
instrumentor: BaseInstrumentor = entry_point.load()
254-
# tell instrumentation to not run dep checks again as we already did it above
255-
instrumentor().instrument(skip_dep_check=True)
223+
instrumentor().instrument(raise_exception_on_conflict=True)
224+
except DependencyConflictError as exc:
225+
_logger.debug(
226+
"Skipping instrumentation %s: %s",
227+
entry_point.name,
228+
exc.conflict,
229+
)
230+
continue
256231
except Exception as ex: # pylint: disable=broad-except
257232
_logger.warning(
258233
"Exception occurred when instrumenting: %s.",

sdk/monitor/azure-monitor-opentelemetry/setup.py

+8-8
Original file line numberDiff line numberDiff line change
@@ -84,15 +84,15 @@
8484
"azure-core<2.0.0,>=1.28.0",
8585
"azure-core-tracing-opentelemetry~=1.0.0b11",
8686
"azure-monitor-opentelemetry-exporter~=1.0.0b31",
87-
"opentelemetry-instrumentation-django~=0.49b0",
88-
"opentelemetry-instrumentation-fastapi~=0.49b0",
89-
"opentelemetry-instrumentation-flask~=0.49b0",
90-
"opentelemetry-instrumentation-psycopg2~=0.49b0",
91-
"opentelemetry-instrumentation-requests~=0.49b0",
92-
"opentelemetry-instrumentation-urllib~=0.49b0",
93-
"opentelemetry-instrumentation-urllib3~=0.49b0",
87+
"opentelemetry-instrumentation-django~=0.53b0",
88+
"opentelemetry-instrumentation-fastapi~=0.53b0",
89+
"opentelemetry-instrumentation-flask~=0.53b0",
90+
"opentelemetry-instrumentation-psycopg2~=0.53b0",
91+
"opentelemetry-instrumentation-requests~=0.53b0",
92+
"opentelemetry-instrumentation-urllib~=0.53b0",
93+
"opentelemetry-instrumentation-urllib3~=0.53b0",
9494
"opentelemetry-resource-detector-azure~=0.1.4",
95-
"opentelemetry-sdk~=1.28",
95+
"opentelemetry-sdk~=1.32",
9696
],
9797
entry_points={
9898
"opentelemetry_distro": [

sdk/monitor/azure-monitor-opentelemetry/tests/test_configure.py

+11-18
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414
import unittest
1515
from unittest.mock import Mock, call, patch
1616

17+
from opentelemetry.instrumentation.dependencies import (
18+
DependencyConflict,
19+
DependencyConflictError,
20+
)
1721
from opentelemetry.sdk._logs import LoggingHandler
1822
from opentelemetry.sdk.resources import Resource
1923

@@ -533,12 +537,10 @@ def test_setup_live_metrics(
533537

534538
@patch("azure.monitor.opentelemetry._configure._ALL_SUPPORTED_INSTRUMENTED_LIBRARIES", ("test_instr2"))
535539
@patch("azure.monitor.opentelemetry._configure._is_instrumentation_enabled")
536-
@patch("azure.monitor.opentelemetry._configure.get_dist_dependency_conflicts")
537540
@patch("azure.monitor.opentelemetry._configure.entry_points")
538541
def test_setup_instrumentations_lib_not_supported(
539542
self,
540543
iter_mock,
541-
dep_mock,
542544
enabled_mock,
543545
):
544546
ep_mock = Mock()
@@ -550,10 +552,8 @@ def test_setup_instrumentations_lib_not_supported(
550552
ep_mock.name = "test_instr1"
551553
ep2_mock.name = "test_instr2"
552554
ep2_mock.load.return_value = instr_class_mock
553-
dep_mock.return_value = None
554555
enabled_mock.return_value = True
555556
_setup_instrumentations({})
556-
dep_mock.assert_called_with(ep2_mock.dist)
557557
ep_mock.load.assert_not_called()
558558
ep2_mock.load.assert_called_once()
559559
instrumentor_mock.instrument.assert_called_once()
@@ -579,12 +579,10 @@ def test_setup_instrumentations_additional_azure(
579579
@patch("azure.monitor.opentelemetry._configure._ALL_SUPPORTED_INSTRUMENTED_LIBRARIES", ("test_instr"))
580580
@patch("azure.monitor.opentelemetry._configure._is_instrumentation_enabled")
581581
@patch("azure.monitor.opentelemetry._configure._logger")
582-
@patch("azure.monitor.opentelemetry._configure.get_dist_dependency_conflicts")
583582
@patch("azure.monitor.opentelemetry._configure.entry_points")
584583
def test_setup_instrumentations_conflict(
585584
self,
586585
iter_mock,
587-
dep_mock,
588586
logger_mock,
589587
enabled_mock,
590588
):
@@ -595,23 +593,24 @@ def test_setup_instrumentations_conflict(
595593
instr_class_mock.return_value = instrumentor_mock
596594
ep_mock.name = "test_instr"
597595
ep_mock.load.return_value = instr_class_mock
598-
dep_mock.return_value = True
596+
instrumentor_mock.instrument.side_effect = DependencyConflictError(
597+
DependencyConflict(
598+
required="test_instr"
599+
)
600+
)
599601
enabled_mock.return_value = True
600602
_setup_instrumentations({})
601-
dep_mock.assert_called_with(ep_mock.dist)
602-
ep_mock.load.assert_not_called()
603-
instrumentor_mock.instrument.assert_not_called()
603+
ep_mock.load.assert_called_once()
604+
instrumentor_mock.instrument.assert_called_once()
604605
logger_mock.debug.assert_called_once()
605606

606607
@patch("azure.monitor.opentelemetry._configure._ALL_SUPPORTED_INSTRUMENTED_LIBRARIES", ("test_instr"))
607608
@patch("azure.monitor.opentelemetry._configure._is_instrumentation_enabled")
608609
@patch("azure.monitor.opentelemetry._configure._logger")
609-
@patch("azure.monitor.opentelemetry._configure.get_dist_dependency_conflicts")
610610
@patch("azure.monitor.opentelemetry._configure.entry_points")
611611
def test_setup_instrumentations_exception(
612612
self,
613613
iter_mock,
614-
dep_mock,
615614
logger_mock,
616615
enabled_mock,
617616
):
@@ -622,10 +621,8 @@ def test_setup_instrumentations_exception(
622621
instr_class_mock.return_value = instrumentor_mock
623622
ep_mock.name = "test_instr"
624623
ep_mock.load.side_effect = Exception()
625-
dep_mock.return_value = None
626624
enabled_mock.return_value = True
627625
_setup_instrumentations({})
628-
dep_mock.assert_called_with(ep_mock.dist)
629626
ep_mock.load.assert_called_once()
630627
instrumentor_mock.instrument.assert_not_called()
631628
logger_mock.warning.assert_called_once()
@@ -635,12 +632,10 @@ def test_setup_instrumentations_exception(
635632
)
636633
@patch("azure.monitor.opentelemetry._configure._is_instrumentation_enabled")
637634
@patch("azure.monitor.opentelemetry._configure._logger")
638-
@patch("azure.monitor.opentelemetry._configure.get_dist_dependency_conflicts")
639635
@patch("azure.monitor.opentelemetry._configure.entry_points")
640636
def test_setup_instrumentations_disabled(
641637
self,
642638
iter_mock,
643-
dep_mock,
644639
logger_mock,
645640
enabled_mock,
646641
):
@@ -653,10 +648,8 @@ def test_setup_instrumentations_disabled(
653648
ep_mock.name = "test_instr1"
654649
ep2_mock.name = "test_instr2"
655650
ep2_mock.load.return_value = instr_class_mock
656-
dep_mock.return_value = None
657651
enabled_mock.side_effect = [False, True]
658652
_setup_instrumentations({})
659-
dep_mock.assert_called_with(ep2_mock.dist)
660653
ep_mock.load.assert_not_called()
661654
ep2_mock.load.assert_called_once()
662655
instrumentor_mock.instrument.assert_called_once()

0 commit comments

Comments
 (0)