Skip to content

Commit d289bbc

Browse files
committed
feat(asgi): respect suppress_http_instrumentation in ASGI middleware
1 parent a428585 commit d289bbc

3 files changed

Lines changed: 20 additions & 2 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1313

1414
### Added
1515

16+
- `opentelemetry-instrumentation-asgi`: Respect `suppress_http_instrumentation` context in ASGI middleware to skip server span creation when HTTP instrumentation is suppressed
17+
([#XXXX](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/XXXX))
1618
- `opentelemetry-instrumentation-confluent-kafka`: Loosen confluent-kafka upper bound to <3.0.0
1719
([#4289](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/4289))
1820
- `opentelemetry-instrumentation`: Add support for wrapt 2.x

instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,10 @@ def client_response_hook(span: Span, scope: Scope, message: dict[str, Any]):
255255
from opentelemetry.instrumentation.propagators import (
256256
get_global_response_propagator,
257257
)
258-
from opentelemetry.instrumentation.utils import _start_internal_or_server_span
258+
from opentelemetry.instrumentation.utils import (
259+
_start_internal_or_server_span,
260+
is_http_instrumentation_enabled,
261+
)
259262
from opentelemetry.metrics import get_meter
260263
from opentelemetry.propagators.textmap import Getter, Setter
261264
from opentelemetry.semconv._incubating.attributes.http_attributes import (
@@ -745,7 +748,10 @@ async def __call__(
745748
send: An awaitable callable taking a single dictionary as argument.
746749
"""
747750
start = default_timer()
748-
if scope["type"] not in ("http", "websocket"):
751+
if not is_http_instrumentation_enabled() or scope["type"] not in (
752+
"http",
753+
"websocket",
754+
):
749755
return await self.app(scope, receive, send)
750756

751757
_, _, url = get_host_port_url_tuple(scope)

instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
get_global_response_propagator,
3838
set_global_response_propagator,
3939
)
40+
from opentelemetry.instrumentation.utils import suppress_http_instrumentation
4041
from opentelemetry.sdk import resources
4142
from opentelemetry.sdk.metrics.export import (
4243
HistogramDataPoint,
@@ -1880,6 +1881,15 @@ async def test_no_excluded_urls(self):
18801881
spans = self.get_finished_spans()
18811882
self.assertGreater(len(spans), 0)
18821883

1884+
async def test_suppress_http_instrumentation(self):
1885+
app = otel_asgi.OpenTelemetryMiddleware(simple_asgi)
1886+
self.seed_app(app)
1887+
with suppress_http_instrumentation():
1888+
await self.send_default_request()
1889+
await self.get_all_output()
1890+
spans = self.get_finished_spans()
1891+
self.assertEqual(len(spans), 0)
1892+
18831893

18841894
class TestAsgiAttributes(unittest.TestCase):
18851895
def setUp(self):

0 commit comments

Comments
 (0)