From 1445c736c584f17ffccb31607a34f9c443d3ba1c Mon Sep 17 00:00:00 2001 From: Tony Xiao Date: Tue, 17 Jan 2023 13:59:24 -0500 Subject: [PATCH] fix(otel): NoOpSpan updates scope (#1834) When using otel as the instrumentor, the NoOpSpan needs to update the scope when it's used as a context manager. If it does not, then this differs from the usual behaviour of a span and the end user may start seeing an unexpected `None` on the scope. --- sentry_sdk/tracing.py | 8 -------- tests/tracing/test_noop_span.py | 12 +++++++++--- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/sentry_sdk/tracing.py b/sentry_sdk/tracing.py index dc65ea5fd7..b72524f734 100644 --- a/sentry_sdk/tracing.py +++ b/sentry_sdk/tracing.py @@ -859,14 +859,6 @@ def __repr__(self): # type: () -> str return self.__class__.__name__ - def __enter__(self): - # type: () -> NoOpSpan - return self - - def __exit__(self, ty, value, tb): - # type: (Optional[Any], Optional[Any], Optional[Any]) -> None - pass - def start_child(self, instrumenter=INSTRUMENTER.SENTRY, **kwargs): # type: (str, **Any) -> NoOpSpan return NoOpSpan() diff --git a/tests/tracing/test_noop_span.py b/tests/tracing/test_noop_span.py index 3dc148f848..92cba75a35 100644 --- a/tests/tracing/test_noop_span.py +++ b/tests/tracing/test_noop_span.py @@ -11,10 +11,13 @@ def test_noop_start_transaction(sentry_init): sentry_init(instrumenter="otel", debug=True) - transaction = sentry_sdk.start_transaction(op="task", name="test_transaction_name") - assert isinstance(transaction, NoOpSpan) + with sentry_sdk.start_transaction( + op="task", name="test_transaction_name" + ) as transaction: + assert isinstance(transaction, NoOpSpan) + assert sentry_sdk.Hub.current.scope.span is transaction - transaction.name = "new name" + transaction.name = "new name" def test_noop_start_span(sentry_init): @@ -22,6 +25,7 @@ def test_noop_start_span(sentry_init): with sentry_sdk.start_span(op="http", description="GET /") as span: assert isinstance(span, NoOpSpan) + assert sentry_sdk.Hub.current.scope.span is span span.set_tag("http.status_code", "418") span.set_data("http.entity_type", "teapot") @@ -35,6 +39,7 @@ def test_noop_transaction_start_child(sentry_init): with transaction.start_child(op="child_task") as child: assert isinstance(child, NoOpSpan) + assert sentry_sdk.Hub.current.scope.span is child def test_noop_span_start_child(sentry_init): @@ -44,3 +49,4 @@ def test_noop_span_start_child(sentry_init): with span.start_child(op="child_task") as child: assert isinstance(child, NoOpSpan) + assert sentry_sdk.Hub.current.scope.span is child