Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([#4006](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4006))
- `opentelemetry-instrumentation-flask`: Add support for 3.1+ streaming responses
([#3938](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3938))
- `opentelemetry-instrumentation`: Add support for wrapt 2
([#4082](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4082))
- `opentelemetry-instrumentation-aiohttp-server`: Support passing `TracerProvider` when instrumenting.
([#3819](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3819))
- `opentelemetry-instrumentation-system-metrics`: Add support for the `OTEL_PYTHON_SYSTEM_METRICS_EXCLUDED_METRICS` environment variable
Expand Down
2 changes: 1 addition & 1 deletion opentelemetry-instrumentation/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ classifiers = [
dependencies = [
"opentelemetry-api ~= 1.4",
"opentelemetry-semantic-conventions == 0.61b0.dev",
"wrapt >= 1.0.0, < 2.0.0",
"wrapt >= 1.0.0",
"packaging >= 18.0",
]

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,10 @@
from re import escape, sub
from typing import Any, Dict, Generator, Sequence

from wrapt import ObjectProxy
try:
from wrapt import BaseObjectProxy
except ImportError:
from wrapt import ObjectProxy as BaseObjectProxy

from opentelemetry import context, trace

Expand Down Expand Up @@ -108,7 +111,7 @@ def unwrap(obj: object, attr: str):
) from exc

func = getattr(obj, attr, None)
if func and isinstance(func, ObjectProxy) and hasattr(func, "__wrapped__"):
if func and isinstance(func, BaseObjectProxy) and hasattr(func, "__wrapped__"):
setattr(obj, attr, func.__wrapped__)


Expand Down
30 changes: 17 additions & 13 deletions opentelemetry-instrumentation/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,11 @@
import unittest
from http import HTTPStatus

from wrapt import ObjectProxy, wrap_function_wrapper
from wrapt import wrap_function_wrapper
try:
from wrapt import BaseObjectProxy
except ImportError:
from wrapt import ObjectProxy as BaseObjectProxy

from opentelemetry.context import (
_SUPPRESS_HTTP_INSTRUMENTATION_KEY,
Expand Down Expand Up @@ -263,55 +267,55 @@ def _wrap_method():
def test_can_unwrap_object_attribute(self):
self._wrap_method()
instance = WrappedClass()
self.assertTrue(isinstance(instance.method, ObjectProxy))
self.assertTrue(isinstance(instance.method, BaseObjectProxy))

unwrap(WrappedClass, "method")
self.assertFalse(isinstance(instance.method, ObjectProxy))
self.assertFalse(isinstance(instance.method, BaseObjectProxy))

def test_can_unwrap_object_attribute_as_string(self):
self._wrap_method()
instance = WrappedClass()
self.assertTrue(isinstance(instance.method, ObjectProxy))
self.assertTrue(isinstance(instance.method, BaseObjectProxy))

unwrap("tests.test_utils.WrappedClass", "method")
self.assertFalse(isinstance(instance.method, ObjectProxy))
self.assertFalse(isinstance(instance.method, BaseObjectProxy))

def test_raises_import_error_if_path_not_well_formed(self):
self._wrap_method()
instance = WrappedClass()
self.assertTrue(isinstance(instance.method, ObjectProxy))
self.assertTrue(isinstance(instance.method, BaseObjectProxy))

with self.assertRaisesRegex(
ImportError, "Cannot parse '' as dotted import path"
):
unwrap("", "method")

unwrap(WrappedClass, "method")
self.assertFalse(isinstance(instance.method, ObjectProxy))
self.assertFalse(isinstance(instance.method, BaseObjectProxy))

def test_raises_import_error_if_cannot_find_module(self):
self._wrap_method()
instance = WrappedClass()
self.assertTrue(isinstance(instance.method, ObjectProxy))
self.assertTrue(isinstance(instance.method, BaseObjectProxy))

with self.assertRaisesRegex(ImportError, "No module named 'does'"):
unwrap("does.not.exist.WrappedClass", "method")

unwrap(WrappedClass, "method")
self.assertFalse(isinstance(instance.method, ObjectProxy))
self.assertFalse(isinstance(instance.method, BaseObjectProxy))

def test_raises_import_error_if_cannot_find_object(self):
self._wrap_method()
instance = WrappedClass()
self.assertTrue(isinstance(instance.method, ObjectProxy))
self.assertTrue(isinstance(instance.method, BaseObjectProxy))

with self.assertRaisesRegex(
ImportError, "Cannot import 'NotWrappedClass' from"
):
unwrap("tests.test_utils.NotWrappedClass", "method")

unwrap(WrappedClass, "method")
self.assertFalse(isinstance(instance.method, ObjectProxy))
self.assertFalse(isinstance(instance.method, BaseObjectProxy))

# pylint: disable=no-self-use
def test_does_nothing_if_cannot_find_attribute(self):
Expand All @@ -320,6 +324,6 @@ def test_does_nothing_if_cannot_find_attribute(self):

def test_does_nothing_if_attribute_is_not_from_wrapt(self):
instance = WrappedClass()
self.assertFalse(isinstance(instance.method, ObjectProxy))
self.assertFalse(isinstance(instance.method, BaseObjectProxy))
unwrap(WrappedClass, "method")
self.assertFalse(isinstance(instance.method, ObjectProxy))
self.assertFalse(isinstance(instance.method, BaseObjectProxy))