diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py index c162ea5c1ca..3b64006d3d5 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py @@ -605,7 +605,8 @@ def use_span( except Exception as error: # pylint: disable=broad-except if ( - span.status is None + isinstance(span, Span) + and span.status is None and span._set_status_on_exception # pylint:disable=protected-access # noqa ): span.set_status( diff --git a/opentelemetry-sdk/tests/trace/test_trace.py b/opentelemetry-sdk/tests/trace/test_trace.py index ccb1ccd1e4e..f9db925f11c 100644 --- a/opentelemetry-sdk/tests/trace/test_trace.py +++ b/opentelemetry-sdk/tests/trace/test_trace.py @@ -107,6 +107,16 @@ def run_general_code(shutdown_on_exit, explicit_shutdown): out = run_general_code(False, False) self.assertTrue(out.startswith(b"0")) + def test_use_span_exception(self): + class TestUseSpanException(Exception): + pass + + default_span = trace_api.DefaultSpan(trace_api.INVALID_SPAN_CONTEXT) + tracer = new_tracer() + with self.assertRaises(TestUseSpanException): + with tracer.use_span(default_span): + raise TestUseSpanException() + class TestTracerSampling(unittest.TestCase): def test_default_sampler(self):