diff --git a/CHANGELOG.md b/CHANGELOG.md index 37a9ad6410..d09540a188 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +### Fixed + +- `opentelemetry-instrumentation-asgi`: fix excluded_urls in instrumentation-asgi + ([#3567](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/3567)) + ## Version 1.34.0/0.55b0 (2025-06-04) ### Added diff --git a/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py b/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py index 8bf9c71aed..f4f84d1c58 100644 --- a/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py @@ -254,11 +254,13 @@ def client_response_hook(span: Span, scope: dict[str, Any], message: dict[str, A OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SANITIZE_FIELDS, OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST, OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_RESPONSE, + ExcludeList, SanitizeValue, _parse_url_query, get_custom_headers, normalise_request_header_name, normalise_response_header_name, + parse_excluded_urls, remove_url_credentials, sanitize_method, ) @@ -537,7 +539,7 @@ class OpenTelemetryMiddleware: def __init__( self, app, - excluded_urls=None, + excluded_urls: ExcludeList | str | None = None, default_span_details=None, server_request_hook: ServerRequestHook = None, client_request_hook: ClientRequestHook = None, @@ -619,6 +621,8 @@ def __init__( self.active_requests_counter = create_http_server_active_requests( self.meter ) + if isinstance(excluded_urls, str): + excluded_urls = parse_excluded_urls(excluded_urls) self.excluded_urls = excluded_urls self.default_span_details = ( default_span_details or get_default_span_details diff --git a/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py b/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py index 95a874bcdb..c243ca0d9f 100644 --- a/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py +++ b/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py @@ -1633,6 +1633,29 @@ async def test_no_metric_for_websockets(self): await self.get_all_output() self.assertIsNone(self.memory_metrics_reader.get_metrics_data()) + async def test_excluded_urls(self): + self.scope["path"] = "/test_excluded_urls" + app = otel_asgi.OpenTelemetryMiddleware( + simple_asgi, excluded_urls="test_excluded_urls" + ) + self.seed_app(app) + await self.send_default_request() + await self.get_all_output() + spans = self.memory_exporter.get_finished_spans() + self.assertEqual(len(spans), 0) + + async def test_no_excluded_urls(self): + self.scope["path"] = "/test_excluded_urls" + app = otel_asgi.OpenTelemetryMiddleware( + simple_asgi, excluded_urls="test_excluded_urls" + ) + self.seed_app(app) + self.scope["path"] = "/test_no_excluded_urls" + await self.send_default_request() + await self.get_all_output() + spans = self.memory_exporter.get_finished_spans() + self.assertGreater(len(spans), 0) + class TestAsgiAttributes(unittest.TestCase): def setUp(self):