diff --git a/CHANGELOG.md b/CHANGELOG.md index c65af97b98..c7549c25ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased](https://github.com/open-telemetry/opentelemetry-python/compare/v1.10.0-0.29b0...HEAD) ### Fixed +- `opentelemetry-instrumentation-pyramid` Fixed which package is the correct caller in _traced_init. + ([#830](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/830)) - `opentelemetry-instrumentation-tornado` Fix Tornado errors mapping to 500 ([#1048])(https://github.com/open-telemetry/opentelemetry-python-contrib/pull/1048) - `opentelemetry-instrumentation-urllib` make span attributes available to sampler diff --git a/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/__init__.py b/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/__init__.py index c92f9b0dc5..0c7a6bdfdd 100644 --- a/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/__init__.py @@ -144,7 +144,7 @@ API --- """ - +import platform from typing import Collection from pyramid.config import Configurator @@ -166,6 +166,11 @@ # from importing an unused symbol. trace_tween_factory # pylint: disable=pointless-statement +if platform.python_implementation() == "PyPy": + CALLER_LEVELS = 3 +else: + CALLER_LEVELS = 2 + def _traced_init(wrapped, instance, args, kwargs): settings = kwargs.get("settings", {}) @@ -185,10 +190,12 @@ def _traced_init(wrapped, instance, args, kwargs): # to find the calling package. So if we let the original `__init__` # function call it, our wrapper will mess things up. if not kwargs.get("package", None): - # Get the package for the third frame up from this one. - # Default is `level=2` which will give us the package from `wrapt` - # instead of the desired package (the caller) - kwargs["package"] = caller_package(level=3) + # Get the package for the 2nd frame up from this one. + # Default is `level=2` one level down (in Configurator.__init__). + # We want the 3rd level from _there_. Since we are already 1 level above, + # we need the 2nd level up from here, which will give us the package from + # `wrapt` instead of the desired package (the caller) + kwargs["package"] = caller_package(level=CALLER_LEVELS) wrapped(*args, **kwargs) instance.include("opentelemetry.instrumentation.pyramid.callbacks") diff --git a/instrumentation/opentelemetry-instrumentation-pyramid/tests/test_automatic.py b/instrumentation/opentelemetry-instrumentation-pyramid/tests/test_automatic.py index 0a839c60a2..58a4a12b20 100644 --- a/instrumentation/opentelemetry-instrumentation-pyramid/tests/test_automatic.py +++ b/instrumentation/opentelemetry-instrumentation-pyramid/tests/test_automatic.py @@ -87,6 +87,12 @@ def test_tween_list(self): span_list = self.memory_exporter.get_finished_spans() self.assertEqual(len(span_list), 1) + def test_registry_name_is_this_module(self): + config = Configurator() + self.assertEqual( + config.registry.__name__, __name__.rsplit(".", maxsplit=1)[0] + ) + class TestWrappedWithOtherFramework( InstrumentationTest, TestBase, WsgiTestBase