def use_span( span: Span, end_on_exit: bool = False, record_exception: bool = True, set_status_on_exception: bool = True, ) -> Iterator[Span]: """Takes a non-active span and activates it in the current context. Args: span: The span that should be activated in the current context. end_on_exit: Whether to end the span automatically when leaving the context manager scope. record_exception: Whether to record any exceptions raised within the context as error event on the span. set_status_on_exception: Only relevant if the returned span is used in a with/context manager. Defines wether the span status will be automatically set to ERROR when an uncaught exception is raised in the span with block. The span status won't be set by this mechanism if it was previously set manually. """ try: token = context_api.attach(context_api.set_value(_SPAN_KEY, span)) try: yield span finally: context_api.detach(token) except Exception as exc: # pylint: disable=broad-except if isinstance(span, Span) and span.is_recording(): # Record the exception as an event if record_exception: span.record_exception(exc) # Set status in case exception was raised if set_status_on_exception: span.set_status( Status( status_code=StatusCode.ERROR, description=f"{type(exc).__name__}: {exc}", ) ) raise finally: if end_on_exit: span.end()
def _apply_status_code(span: Span, status_code: int) -> None: if not span.is_recording(): return span.set_attribute(SpanAttributes.HTTP_STATUS_CODE, status_code) span.set_status(Status(http_status_to_status_code(status_code)))
def _after_exec(span: Span, error: Optional[BaseException] = None): if str(error) == "0": # This is an OK cli exit state span.set_status(Status(StatusCode.OK)) else: span.set_status(Status(StatusCode.ERROR))