From 09e0f47500f67414981515f26a749f0f867737c4 Mon Sep 17 00:00:00 2001 From: Michael Manganiello Date: Tue, 6 Apr 2021 10:41:38 -0300 Subject: [PATCH] Fix ASGI instrumentation default span name Fixes ASGI default span name for SERVER spans, to be `HTTP `. Fixes #146. --- CHANGELOG.md | 8 +++--- .../instrumentation/asgi/__init__.py | 8 +++--- .../tests/test_asgi_middleware.py | 27 ++++++++++--------- 3 files changed, 24 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 50e0efb246..11bc269669 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,12 +12,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - `opentelemetry-instrumentation-tornado` Fixed cases where description was used with non- error status code when creating Status objects. ([#504](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/504)) +- Fix ASGI instrumentation default span name. + ([#418](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/418)) ### Added - `opentelemetry-instrumentation-botocore` now supports - context propagation for lambda invoke via Payload embedded headers. + context propagation for lambda invoke via Payload embedded headers. ([#458](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/458)) - + ## [0.21b0](https://github.com/open-telemetry/opentelemetry-python/releases/tag/v1.2.0-0.21b0) - 2021-05-11 ### Changed @@ -81,7 +83,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ([#436](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/436)) - `opentelemetry-instrumentation-grpc` Keep client interceptor in sync with grpc client interceptors. ([#442](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/442)) - + ### Removed - Remove `http.status_text` from span attributes ([#406](https://github.com/open-telemetry/opentelemetry-python-contrib/pull/406)) 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 c02ae50287..4848c86622 100644 --- a/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-asgi/src/opentelemetry/instrumentation/asgi/__init__.py @@ -147,12 +147,12 @@ def get_default_span_details(scope: dict) -> Tuple[str, dict]: scope: the asgi scope dictionary Returns: - a tuple of the span, and any attributes to attach to the - span. + a tuple of the span name, and any attributes to attach to the span. """ method_or_path = scope.get("method") or scope.get("path") + span_name = "HTTP {}".format(method_or_path.strip()) - return method_or_path, {} + return span_name, {} class OpenTelemetryMiddleware: @@ -205,7 +205,7 @@ async def __call__(self, scope, receive, send): try: with self.tracer.start_as_current_span( - span_name + " asgi", kind=trace.SpanKind.SERVER, + span_name, kind=trace.SpanKind.SERVER, ) as span: if span.is_recording(): attributes = collect_request_attributes(scope) diff --git a/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py b/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py index 0a3b451b9c..5898e928e2 100644 --- a/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py +++ b/instrumentation/opentelemetry-instrumentation-asgi/tests/test_asgi_middleware.py @@ -116,12 +116,12 @@ def validate_outputs(self, outputs, error=None, modifiers=None): self.assertEqual(len(span_list), 4) expected = [ { - "name": "GET asgi.http.receive", + "name": "HTTP GET asgi.http.receive", "kind": trace_api.SpanKind.INTERNAL, "attributes": {"type": "http.request"}, }, { - "name": "GET asgi.http.send", + "name": "HTTP GET asgi.http.send", "kind": trace_api.SpanKind.INTERNAL, "attributes": { SpanAttributes.HTTP_STATUS_CODE: 200, @@ -129,12 +129,12 @@ def validate_outputs(self, outputs, error=None, modifiers=None): }, }, { - "name": "GET asgi.http.send", + "name": "HTTP GET asgi.http.send", "kind": trace_api.SpanKind.INTERNAL, "attributes": {"type": "http.response.body"}, }, { - "name": "GET asgi", + "name": "HTTP GET", "kind": trace_api.SpanKind.SERVER, "attributes": { SpanAttributes.HTTP_METHOD: "GET", @@ -201,9 +201,12 @@ def get_predefined_span_details(_): def update_expected_span_name(expected): for entry in expected: - entry["name"] = " ".join( - [span_name] + entry["name"].split(" ")[-1:] - ) + if entry["kind"] == trace_api.SpanKind.SERVER: + entry["name"] = span_name + else: + entry["name"] = " ".join( + [span_name] + entry["name"].split(" ")[-1:] + ) return expected app = otel_asgi.OpenTelemetryMiddleware( @@ -305,17 +308,17 @@ def test_websocket(self): self.assertEqual(len(span_list), 6) expected = [ { - "name": "/ asgi.websocket.receive", + "name": "/ asgi.websocket receive", "kind": trace_api.SpanKind.INTERNAL, "attributes": {"type": "websocket.connect"}, }, { - "name": "/ asgi.websocket.send", + "name": "/ asgi.websocket send", "kind": trace_api.SpanKind.INTERNAL, "attributes": {"type": "websocket.accept"}, }, { - "name": "/ asgi.websocket.receive", + "name": "/ asgi.websocket receive", "kind": trace_api.SpanKind.INTERNAL, "attributes": { "type": "websocket.receive", @@ -323,7 +326,7 @@ def test_websocket(self): }, }, { - "name": "/ asgi.websocket.send", + "name": "/ asgi.websocket send", "kind": trace_api.SpanKind.INTERNAL, "attributes": { "type": "websocket.send", @@ -331,7 +334,7 @@ def test_websocket(self): }, }, { - "name": "/ asgi.websocket.receive", + "name": "/ asgi.websocket receive", "kind": trace_api.SpanKind.INTERNAL, "attributes": {"type": "websocket.disconnect"}, },