diff --git a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware.py b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware.py index f46805316..07e3eb710 100644 --- a/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware.py +++ b/instrumentation/opentelemetry-instrumentation-django/src/opentelemetry/instrumentation/django/middleware.py @@ -101,21 +101,23 @@ class _DjangoMiddleware(MiddlewareMixin): tracer = get_tracer(__name__, __version__) - attributes = collect_request_attributes(environ) - for attr in self._traced_request_attrs: - value = getattr(request, attr, None) - if value is not None: - attributes[attr] = str(value) - span = tracer.start_span( self._get_span_name(request), kind=SpanKind.SERVER, - attributes=attributes, start_time=environ.get( "opentelemetry-instrumentor-django.starttime_key" ), ) + if span.is_recording(): + attributes = collect_request_attributes(environ) + for attr in self._traced_request_attrs: + value = getattr(request, attr, None) + if value is not None: + attributes[attr] = str(value) + for key, value in attributes.items(): + span.set_attribute(key, value) + activation = tracer.use_span(span, end_on_exit=True) activation.__enter__() diff --git a/instrumentation/opentelemetry-instrumentation-django/tests/test_middleware.py b/instrumentation/opentelemetry-instrumentation-django/tests/test_middleware.py index 378139d1c..7e9ab72b5 100644 --- a/instrumentation/opentelemetry-instrumentation-django/tests/test_middleware.py +++ b/instrumentation/opentelemetry-instrumentation-django/tests/test_middleware.py @@ -13,7 +13,7 @@ # limitations under the License. from sys import modules -from unittest.mock import patch +from unittest.mock import Mock, patch from django import VERSION from django.conf import settings @@ -89,6 +89,21 @@ class TestMiddleware(WsgiTestBase): self.assertEqual(span.attributes["http.status_code"], 200) self.assertEqual(span.attributes["http.status_text"], "OK") + def test_not_recording(self): + mock_tracer = Mock() + mock_span = Mock() + mock_span.is_recording.return_value = False + mock_tracer.start_span.return_value = mock_span + mock_tracer.use_span.return_value.__enter__ = mock_span + mock_tracer.use_span.return_value.__exit__ = mock_span + with patch("opentelemetry.trace.get_tracer") as tracer: + tracer.return_value = mock_tracer + Client().get("/traced/") + self.assertFalse(mock_span.is_recording()) + self.assertTrue(mock_span.is_recording.called) + self.assertFalse(mock_span.set_attribute.called) + self.assertFalse(mock_span.set_status.called) + def test_traced_post(self): Client().post("/traced/")