Skip to content

Commit 6e282d2

Browse files
authored
Allow set_status to accept the StatusCode and optional description (#2735)
1 parent 6aee819 commit 6e282d2

File tree

5 files changed

+74
-13
lines changed

5 files changed

+74
-13
lines changed

Diff for: CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2727
([#2728](https://github.com/open-telemetry/opentelemetry-python/pull/2728))
2828
- fix: update entry point object references for metrics
2929
([#2731](https://github.com/open-telemetry/opentelemetry-python/pull/2731))
30+
- Allow set_status to accept the StatusCode and optional description
31+
([#2735](https://github.com/open-telemetry/opentelemetry-python/pull/2735))
3032
- Configure auto instrumentation to support metrics
3133
([#2705](https://github.com/open-telemetry/opentelemetry-python/pull/2705))
3234
- Add entrypoint for metrics exporter

Diff for: opentelemetry-api/src/opentelemetry/trace/span.py

+11-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import typing
66
from collections import OrderedDict
77

8-
from opentelemetry.trace.status import Status
8+
from opentelemetry.trace.status import Status, StatusCode
99
from opentelemetry.util import types
1010

1111
# The key MUST begin with a lowercase letter or a digit,
@@ -137,7 +137,11 @@ def is_recording(self) -> bool:
137137
"""
138138

139139
@abc.abstractmethod
140-
def set_status(self, status: Status) -> None:
140+
def set_status(
141+
self,
142+
status: typing.Union[Status, StatusCode],
143+
description: typing.Optional[str] = None,
144+
) -> None:
141145
"""Sets the Status of the Span. If used, this will override the default
142146
Span status.
143147
"""
@@ -524,7 +528,11 @@ def add_event(
524528
def update_name(self, name: str) -> None:
525529
pass
526530

527-
def set_status(self, status: Status) -> None:
531+
def set_status(
532+
self,
533+
status: typing.Union[Status, StatusCode],
534+
description: typing.Optional[str] = None,
535+
) -> None:
528536
pass
529537

530538
def record_exception(

Diff for: opentelemetry-api/tests/trace/test_globals.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ class TestSpan(trace.NonRecordingSpan):
1212
recorded_exception = None
1313
recorded_status = Status(status_code=StatusCode.UNSET)
1414

15-
def set_status(self, status):
15+
def set_status(self, status, description=None):
1616
self.recorded_status = status
1717

1818
def end(self, end_time=None):

Diff for: opentelemetry-sdk/src/opentelemetry/sdk/trace/__init__.py

+26-8
Original file line numberDiff line numberDiff line change
@@ -889,16 +889,34 @@ def is_recording(self) -> bool:
889889
return self._end_time is None
890890

891891
@_check_span_ended
892-
def set_status(self, status: trace_api.Status) -> None:
892+
def set_status(
893+
self,
894+
status: typing.Union[Status, StatusCode],
895+
description: typing.Optional[str] = None,
896+
) -> None:
893897
# Ignore future calls if status is already set to OK
894898
# Ignore calls to set to StatusCode.UNSET
895-
if (
896-
self._status
897-
and self._status.status_code is StatusCode.OK
898-
or status.status_code is StatusCode.UNSET
899-
):
900-
return
901-
self._status = status
899+
if isinstance(status, Status):
900+
if (
901+
self._status
902+
and self._status.status_code is StatusCode.OK
903+
or status.status_code is StatusCode.UNSET
904+
):
905+
return
906+
if description is not None:
907+
logger.warning(
908+
"Description %s ignored. Use either `Status` or `(StatusCode, Description)`",
909+
description,
910+
)
911+
self._status = status
912+
elif isinstance(status, StatusCode):
913+
if (
914+
self._status
915+
and self._status.status_code is StatusCode.OK
916+
or status is StatusCode.UNSET
917+
):
918+
return
919+
self._status = Status(status, description)
902920

903921
def __exit__(
904922
self,

Diff for: opentelemetry-sdk/tests/trace/test_trace.py

+34-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@
4545
get_span_with_dropped_attributes_events_links,
4646
new_tracer,
4747
)
48-
from opentelemetry.trace import StatusCode
48+
from opentelemetry.trace import Status, StatusCode
4949
from opentelemetry.util._time import _time_ns
5050

5151

@@ -903,6 +903,39 @@ def test_span_override_start_and_end_time(self):
903903
span.end(end_time)
904904
self.assertEqual(end_time, span.end_time)
905905

906+
def test_span_set_status(self):
907+
908+
span1 = self.tracer.start_span("span1")
909+
span1.set_status(Status(status_code=StatusCode.ERROR))
910+
self.assertEqual(span1.status.status_code, StatusCode.ERROR)
911+
self.assertEqual(span1.status.description, None)
912+
913+
span2 = self.tracer.start_span("span2")
914+
span2.set_status(
915+
Status(status_code=StatusCode.ERROR, description="desc")
916+
)
917+
self.assertEqual(span2.status.status_code, StatusCode.ERROR)
918+
self.assertEqual(span2.status.description, "desc")
919+
920+
span3 = self.tracer.start_span("span3")
921+
span3.set_status(StatusCode.ERROR)
922+
self.assertEqual(span3.status.status_code, StatusCode.ERROR)
923+
self.assertEqual(span3.status.description, None)
924+
925+
span4 = self.tracer.start_span("span4")
926+
span4.set_status(StatusCode.ERROR, "span4 desc")
927+
self.assertEqual(span4.status.status_code, StatusCode.ERROR)
928+
self.assertEqual(span4.status.description, "span4 desc")
929+
930+
span5 = self.tracer.start_span("span5")
931+
with self.assertLogs(level=WARNING):
932+
span5.set_status(
933+
Status(status_code=StatusCode.ERROR, description="desc"),
934+
description="ignored",
935+
)
936+
self.assertEqual(span5.status.status_code, StatusCode.ERROR)
937+
self.assertEqual(span5.status.description, "desc")
938+
906939
def test_ended_span(self):
907940
"""Events, attributes are not allowed after span is ended"""
908941

0 commit comments

Comments
 (0)