From fbc3179e0b1f5a2b40823671b4854b95d6abd3ee Mon Sep 17 00:00:00 2001 From: Daisuke Taniwaki Date: Mon, 27 Apr 2020 16:01:33 +0900 Subject: [PATCH] Handle another exception on setting status on exception --- .../src/opentelemetry/sdk/trace/__init__.py | 28 +++++++++++-------- opentelemetry-sdk/tests/trace/test_trace.py | 11 ++++++++ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py index 5eff5e61307..503af763e85 100644 --- a/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py +++ b/opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py @@ -667,18 +667,24 @@ def use_span( context_api.detach(token) except Exception as error: # pylint: disable=broad-except - if ( - isinstance(span, Span) - and span.status is None - and span._set_status_on_exception # pylint:disable=protected-access # noqa - ): - span.set_status( - Status( - canonical_code=StatusCanonicalCode.UNKNOWN, - description="{}: {}".format( - type(error).__name__, error - ), + try: + if ( + isinstance(span, Span) + and span.status is None + and span._set_status_on_exception # pylint:disable=protected-access # noqa + ): + span.set_status( + Status( + canonical_code=StatusCanonicalCode.UNKNOWN, + description="{}: {}".format( + type(error).__name__, error + ), + ) ) + except Exception as e: + logger.error( + "Got another exception while setting status on exception: %s" + % e ) raise diff --git a/opentelemetry-sdk/tests/trace/test_trace.py b/opentelemetry-sdk/tests/trace/test_trace.py index 1094f1afb98..d661fcbabad 100644 --- a/opentelemetry-sdk/tests/trace/test_trace.py +++ b/opentelemetry-sdk/tests/trace/test_trace.py @@ -882,3 +882,14 @@ def test_add_span_processor_after_span_creation(self): expected_list.append(span_event_end_fmt("SP1", "foo")) self.assertListEqual(spans_calls_list, expected_list) + + def test_use_span_set_status_on_exception(self): + """In the case where tracer sets status on exception, + it shouldn't raise another exception instead of the original one. + """ + tracer = new_tracer() + invalid_span = None + with self.assertRaises(RuntimeError) as cm: + with tracer.use_span(invalid_span, False): + raise RuntimeError("intended error") + self.assertEqual(str(cm.exception), "intended error")