Skip to content

Commit

Permalink
Fix ASGI instrumentation default span name (#418)
Browse files Browse the repository at this point in the history
  • Loading branch information
adamantike committed May 27, 2021
1 parent daa7238 commit 3bb28ab
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 23 deletions.
8 changes: 5 additions & 3 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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))
- `opentelemetry-instrumentation-asgi` Fix 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
Expand Down Expand Up @@ -84,7 +86,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))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -146,12 +146,13 @@ 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 = scope.get("path", "").strip() or "HTTP {}".format(
scope.get("method", "").strip()
)

return method_or_path, {}
return span_name, {}


class OpenTelemetryMiddleware:
Expand Down Expand Up @@ -204,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)
Expand All @@ -215,7 +216,7 @@ async def __call__(self, scope, receive, send):
@wraps(receive)
async def wrapped_receive():
with self.tracer.start_as_current_span(
span_name + " asgi." + scope["type"] + ".receive"
" ".join((span_name, scope["type"], "receive"))
) as receive_span:
message = await receive()
if receive_span.is_recording():
Expand All @@ -227,7 +228,7 @@ async def wrapped_receive():
@wraps(send)
async def wrapped_send(message):
with self.tracer.start_as_current_span(
span_name + " asgi." + scope["type"] + ".send"
" ".join((span_name, scope["type"], "send"))
) as send_span:
if send_span.is_recording():
if message["type"] == "http.response.start":
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,25 +116,25 @@ def validate_outputs(self, outputs, error=None, modifiers=None):
self.assertEqual(len(span_list), 4)
expected = [
{
"name": "GET asgi.http.receive",
"name": "/ http receive",
"kind": trace_api.SpanKind.INTERNAL,
"attributes": {"type": "http.request"},
},
{
"name": "GET asgi.http.send",
"name": "/ http send",
"kind": trace_api.SpanKind.INTERNAL,
"attributes": {
SpanAttributes.HTTP_STATUS_CODE: 200,
"type": "http.response.start",
},
},
{
"name": "GET asgi.http.send",
"name": "/ http send",
"kind": trace_api.SpanKind.INTERNAL,
"attributes": {"type": "http.response.body"},
},
{
"name": "GET asgi",
"name": "/",
"kind": trace_api.SpanKind.SERVER,
"attributes": {
SpanAttributes.HTTP_METHOD: "GET",
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -305,38 +308,38 @@ def test_websocket(self):
self.assertEqual(len(span_list), 6)
expected = [
{
"name": "/ asgi.websocket.receive",
"name": "/ websocket receive",
"kind": trace_api.SpanKind.INTERNAL,
"attributes": {"type": "websocket.connect"},
},
{
"name": "/ asgi.websocket.send",
"name": "/ websocket send",
"kind": trace_api.SpanKind.INTERNAL,
"attributes": {"type": "websocket.accept"},
},
{
"name": "/ asgi.websocket.receive",
"name": "/ websocket receive",
"kind": trace_api.SpanKind.INTERNAL,
"attributes": {
"type": "websocket.receive",
SpanAttributes.HTTP_STATUS_CODE: 200,
},
},
{
"name": "/ asgi.websocket.send",
"name": "/ websocket send",
"kind": trace_api.SpanKind.INTERNAL,
"attributes": {
"type": "websocket.send",
SpanAttributes.HTTP_STATUS_CODE: 200,
},
},
{
"name": "/ asgi.websocket.receive",
"name": "/ websocket receive",
"kind": trace_api.SpanKind.INTERNAL,
"attributes": {"type": "websocket.disconnect"},
},
{
"name": "/ asgi",
"name": "/",
"kind": trace_api.SpanKind.SERVER,
"attributes": {
SpanAttributes.HTTP_SCHEME: self.scope["scheme"],
Expand Down

0 comments on commit 3bb28ab

Please sign in to comment.