Skip to content

Commit 6ca49a8

Browse files
author
Alex Boten
committed
[instrumentation/wsgi] fix NonRecordingSpan bug
There was a bug caused by accessing `.kind` on a NonRecordingSpan. Added a test to validate the fix. Fix open-telemetry#956
1 parent 1bf9e0c commit 6ca49a8

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ def response_hook(span: Span, environ: WSGIEnvironment, status: str, response_he
116116
from opentelemetry.instrumentation.wsgi.version import __version__
117117
from opentelemetry.propagators.textmap import Getter
118118
from opentelemetry.semconv.trace import SpanAttributes
119+
from opentelemetry.trace import NonRecordingSpan
119120
from opentelemetry.trace.status import Status, StatusCode
120121
from opentelemetry.util.http import (
121122
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST,
@@ -313,7 +314,7 @@ def _create_start_response(span, start_response, response_hook):
313314
@functools.wraps(start_response)
314315
def _start_response(status, response_headers, *args, **kwargs):
315316
add_response_attributes(span, status, response_headers)
316-
if span.kind == trace.SpanKind.SERVER:
317+
if not isinstance(span, NonRecordingSpan) and span.kind == trace.SpanKind.SERVER:
317318
add_custom_response_headers(span, response_headers)
318319
if response_hook:
319320
response_hook(status, response_headers)
@@ -336,7 +337,7 @@ def __call__(self, environ, start_response):
336337
context_getter=wsgi_getter,
337338
attributes=collect_request_attributes(environ),
338339
)
339-
if span.kind == trace.SpanKind.SERVER:
340+
if not isinstance(span, NonRecordingSpan) and span.kind == trace.SpanKind.SERVER:
340341
add_custom_request_headers(span, environ)
341342

342343
if self.request_hook:

instrumentation/opentelemetry-instrumentation-wsgi/tests/test_wsgi_middleware.py

+21
Original file line numberDiff line numberDiff line change
@@ -475,6 +475,27 @@ def iterate_response(self, response):
475475
except StopIteration:
476476
break
477477

478+
@mock.patch.dict(
479+
"os.environ",
480+
{
481+
OTEL_INSTRUMENTATION_HTTP_CAPTURE_HEADERS_SERVER_REQUEST: "Custom-Test-Header-1,Custom-Test-Header-2,Custom-Test-Header-3",
482+
},
483+
)
484+
def test_custom_request_headers_non_recording_span(self):
485+
try:
486+
tracer_provider = trace_api.NoOpTracerProvider()
487+
self.environ.update(
488+
{
489+
"HTTP_CUSTOM_TEST_HEADER_1": "Test Value 2",
490+
"HTTP_CUSTOM_TEST_HEADER_2": "TestValue2,TestValue3",
491+
}
492+
)
493+
app = otel_wsgi.OpenTelemetryMiddleware(simple_wsgi, tracer_provider=tracer_provider)
494+
response = app(self.environ, self.start_response)
495+
self.iterate_response(response)
496+
except Exception as e:
497+
self.fail(f"Exception raised with NonRecordingSpan {e}")
498+
478499
@mock.patch.dict(
479500
"os.environ",
480501
{

0 commit comments

Comments
 (0)