diff --git a/instrumentation/opentelemetry-instrumentation-jinja2/src/opentelemetry/instrumentation/jinja2/__init__.py b/instrumentation/opentelemetry-instrumentation-jinja2/src/opentelemetry/instrumentation/jinja2/__init__.py index 8ad883b27..4123f7de5 100644 --- a/instrumentation/opentelemetry-instrumentation-jinja2/src/opentelemetry/instrumentation/jinja2/__init__.py +++ b/instrumentation/opentelemetry-instrumentation-jinja2/src/opentelemetry/instrumentation/jinja2/__init__.py @@ -78,39 +78,44 @@ def _with_tracer_wrapper(func): def _wrap_render(tracer, wrapped, instance, args, kwargs): """Wrap `Template.render()` or `Template.generate()` """ - template_name = instance.name or DEFAULT_TEMPLATE_NAME - attributes = {ATTRIBUTE_JINJA2_TEMPLATE_NAME: template_name} with tracer.start_as_current_span( - "jinja2.render", kind=SpanKind.INTERNAL, attributes=attributes - ): + "jinja2.render", kind=SpanKind.INTERNAL, + ) as span: + if span.is_recording(): + template_name = instance.name or DEFAULT_TEMPLATE_NAME + span.set_attribute(ATTRIBUTE_JINJA2_TEMPLATE_NAME, template_name) return wrapped(*args, **kwargs) @_with_tracer_wrapper def _wrap_compile(tracer, wrapped, _, args, kwargs): - template_name = ( - args[1] if len(args) > 1 else kwargs.get("name", DEFAULT_TEMPLATE_NAME) - ) - attributes = {ATTRIBUTE_JINJA2_TEMPLATE_NAME: template_name} with tracer.start_as_current_span( - "jinja2.compile", kind=SpanKind.INTERNAL, attributes=attributes - ): + "jinja2.compile", kind=SpanKind.INTERNAL, + ) as span: + if span.is_recording(): + template_name = ( + args[1] + if len(args) > 1 + else kwargs.get("name", DEFAULT_TEMPLATE_NAME) + ) + span.set_attribute(ATTRIBUTE_JINJA2_TEMPLATE_NAME, template_name) return wrapped(*args, **kwargs) @_with_tracer_wrapper def _wrap_load_template(tracer, wrapped, _, args, kwargs): - template_name = kwargs.get("name", args[0]) - attributes = {ATTRIBUTE_JINJA2_TEMPLATE_NAME: template_name} with tracer.start_as_current_span( - "jinja2.load", kind=SpanKind.INTERNAL, attributes=attributes + "jinja2.load", kind=SpanKind.INTERNAL, ) as span: + if span.is_recording(): + template_name = kwargs.get("name", args[0]) + span.set_attribute(ATTRIBUTE_JINJA2_TEMPLATE_NAME, template_name) template = None try: template = wrapped(*args, **kwargs) return template finally: - if template: + if template and span.is_recording(): span.set_attribute( ATTRIBUTE_JINJA2_TEMPLATE_PATH, template.filename ) diff --git a/instrumentation/opentelemetry-instrumentation-jinja2/tests/test_jinja2.py b/instrumentation/opentelemetry-instrumentation-jinja2/tests/test_jinja2.py index 717431abb..5de1d598c 100644 --- a/instrumentation/opentelemetry-instrumentation-jinja2/tests/test_jinja2.py +++ b/instrumentation/opentelemetry-instrumentation-jinja2/tests/test_jinja2.py @@ -13,6 +13,7 @@ # limitations under the License. import os +from unittest import mock import jinja2 @@ -53,6 +54,21 @@ class TestJinja2Instrumentor(TestBase): self.assertIs(template.parent, root.get_span_context()) self.assertIsNone(root.parent) + def test_render_not_recording(self): + mock_tracer = mock.Mock() + mock_span = mock.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 mock.patch("opentelemetry.trace.get_tracer") as tracer: + tracer.return_value = mock_tracer + jinja2.environment.Template("Hello {{name}}!") + 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_render_inline_template(self): template = jinja2.environment.Template("Hello {{name}}!") self.assertEqual(template.render(name="Jinja"), "Hello Jinja!")