@@ -580,12 +580,18 @@ def get_traceparent(self, *args: "Any", **kwargs: "Any") -> "Optional[str]":
580580 """
581581 client = self .get_client ()
582582
583+ if not has_tracing_enabled (client .options ):
584+ return self .get_active_propagation_context ().to_traceparent ()
585+
586+ span_streaming = has_span_streaming_enabled (client .options )
583587 # If we have an active span, return traceparent from there
584588 if (
585- has_tracing_enabled ( client . options )
586- and self .span is not None
587- and not isinstance (self .span , NoOpStreamedSpan )
589+ span_streaming
590+ and self .streamed_span is not None
591+ and not isinstance (self .streamed_span , NoOpStreamedSpan )
588592 ):
593+ return self .streamed_span ._to_traceparent ()
594+ elif not span_streaming and self .span is not None :
589595 return self .span ._to_traceparent ()
590596
591597 # else return traceparent from the propagation context
@@ -598,12 +604,18 @@ def get_baggage(self, *args: "Any", **kwargs: "Any") -> "Optional[Baggage]":
598604 """
599605 client = self .get_client ()
600606
607+ if not has_tracing_enabled (client .options ):
608+ return self .get_active_propagation_context ().get_baggage ()
609+
610+ span_streaming = has_span_streaming_enabled (client .options )
601611 # If we have an active span, return baggage from there
602612 if (
603- has_tracing_enabled ( client . options )
604- and self .span is not None
605- and not isinstance (self .span , NoOpStreamedSpan )
613+ span_streaming
614+ and self .streamed_span is not None
615+ and not isinstance (self .streamed_span , NoOpStreamedSpan )
606616 ):
617+ return self .streamed_span ._to_baggage ()
618+ elif not span_streaming and self .span is not None :
607619 return self .span ._to_baggage ()
608620
609621 # else return baggage from the propagation context
@@ -680,7 +692,9 @@ def iter_trace_propagation_headers(
680692 return
681693
682694 span = kwargs .pop ("span" , None )
683- span = span or self .span
695+ if not span :
696+ span_streaming = has_span_streaming_enabled (client .options )
697+ span = self .streamed_span if span_streaming else self .span
684698
685699 if (
686700 has_tracing_enabled (client .options )
@@ -877,12 +891,12 @@ def set_user(self, value: "Optional[Dict[str, Any]]") -> None:
877891 session .update (user = value )
878892
879893 @property
880- def span (self ) -> "Optional[Union[ Span, StreamedSpan] ]" :
894+ def span (self ) -> "Optional[Span]" :
881895 """Get/set current tracing span or transaction."""
882- return self ._span
896+ return self ._span if isinstance ( self . _span , Span ) else None
883897
884898 @span .setter
885- def span (self , span : "Optional[Union[ Span, StreamedSpan] ]" ) -> None :
899+ def span (self , span : "Optional[Span]" ) -> None :
886900 self ._span = span
887901 # XXX: this differs from the implementation in JS, there Scope.setSpan
888902 # does not set Scope._transactionName.
@@ -893,6 +907,15 @@ def span(self, span: "Optional[Union[Span, StreamedSpan]]") -> None:
893907 if transaction .source :
894908 self ._transaction_info ["source" ] = transaction .source
895909
910+ @property
911+ def streamed_span (self ) -> "Optional[StreamedSpan]" :
912+ """Get/set current tracing span."""
913+ return self ._span if isinstance (self ._span , StreamedSpan ) else None
914+
915+ @streamed_span .setter
916+ def streamed_span (self , span : "Optional[StreamedSpan]" ) -> None :
917+ self ._span = span
918+
896919 # Also set _transaction and _transaction_info in streaming mode as this
897920 # is used for populating events and linking them to segments
898921 if (
@@ -1267,7 +1290,7 @@ def start_streamed_span(
12671290 if parent_span is _DEFAULT_PARENT_SPAN or isinstance (
12681291 parent_span , NoOpStreamedSpan
12691292 ):
1270- parent_span = self .span # type: ignore
1293+ parent_span = self .streamed_span
12711294
12721295 # If no eligible parent_span was provided and there is no currently
12731296 # active span, this is a segment
@@ -1848,9 +1871,21 @@ def apply_to_telemetry(self, telemetry: "Union[Log, Metric, StreamedSpan]") -> N
18481871 telemetry ["trace_id" ] = (
18491872 trace_id or "00000000-0000-0000-0000-000000000000"
18501873 )
1851- span_id = trace_context .get ("span_id" )
1852- if telemetry .get ("span_id" ) is None and span_id :
1853- telemetry ["span_id" ] = span_id
1874+
1875+ # span_id should only be populated if there's an active span. We can't
1876+ # use the trace_context here because it synthesizes a span_id if there
1877+ # isn't one
1878+ if telemetry .get ("span_id" ) is None :
1879+ if self ._span is not None and not isinstance (
1880+ self ._span , NoOpStreamedSpan
1881+ ):
1882+ telemetry ["span_id" ] = self ._span .span_id
1883+ else :
1884+ external_propagation_context = get_external_propagation_context ()
1885+ if external_propagation_context :
1886+ _ , span_id = external_propagation_context
1887+ if span_id is not None :
1888+ telemetry ["span_id" ] = span_id
18541889
18551890 self ._apply_scope_attributes_to_telemetry (telemetry )
18561891 self ._apply_user_attributes_to_telemetry (telemetry )
0 commit comments