From 3fe8225e85187c274674635264ec15b9767a6dc2 Mon Sep 17 00:00:00 2001 From: Leighton Chen Date: Tue, 22 Sep 2020 10:30:39 -0700 Subject: [PATCH] Use is_recording flag in asgi, pyramid, aiohttp instrumentation (#1142) --- .../instrumentation/pyramid/callbacks.py | 15 ++++++++------- .../tests/test_programmatic.py | 18 +++++++++++++++++- 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/callbacks.py b/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/callbacks.py index fe45c39e2a77..ada239b8e318 100644 --- a/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/callbacks.py +++ b/instrumentation/opentelemetry-instrumentation-pyramid/src/opentelemetry/instrumentation/pyramid/callbacks.py @@ -74,21 +74,22 @@ def _before_traversal(event): ) tracer = trace.get_tracer(__name__, __version__) - attributes = otel_wsgi.collect_request_attributes(environ) - if request.matched_route: span_name = request.matched_route.pattern - attributes["http.route"] = request.matched_route.pattern else: span_name = otel_wsgi.get_default_span_name(environ) span = tracer.start_span( - span_name, - kind=trace.SpanKind.SERVER, - attributes=attributes, - start_time=start_time, + span_name, kind=trace.SpanKind.SERVER, start_time=start_time, ) + if span.is_recording(): + attributes = otel_wsgi.collect_request_attributes(environ) + if request.matched_route: + attributes["http.route"] = request.matched_route.pattern + for key, value in attributes.items(): + span.set_attribute(key, value) + activation = tracer.use_span(span, end_on_exit=True) activation.__enter__() environ[_ENVIRON_ACTIVATION_KEY] = activation diff --git a/instrumentation/opentelemetry-instrumentation-pyramid/tests/test_programmatic.py b/instrumentation/opentelemetry-instrumentation-pyramid/tests/test_programmatic.py index add4660caab2..38ba71cb55d8 100644 --- a/instrumentation/opentelemetry-instrumentation-pyramid/tests/test_programmatic.py +++ b/instrumentation/opentelemetry-instrumentation-pyramid/tests/test_programmatic.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from unittest.mock import patch +from unittest.mock import Mock, patch from pyramid.config import Configurator @@ -87,6 +87,22 @@ def test_simple(self): self.assertEqual(span_list[0].kind, trace.SpanKind.SERVER) self.assertEqual(span_list[0].attributes, expected_attrs) + 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"): + self.client.get("/hello/123") + span_list = self.memory_exporter.get_finished_spans() + self.assertEqual(len(span_list), 0) + 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_404(self): expected_attrs = expected_attributes( {