3232
3333import json
3434from enum import Enum , auto
35- from typing import Any , Callable , Dict , Optional
35+ from typing import Any , Callable , Dict , Optional , Union
3636
3737import sentry_sdk
3838from sentry_sdk .integrations import Integration
3939from sentry_sdk .scope import should_send_default_pii
40+ from sentry_sdk .traces import StreamedSpan
4041from sentry_sdk .tracing import Span as SentrySpan
42+ from sentry_sdk .tracing_utils import has_span_streaming_enabled
4143from sentry_sdk .utils import SENSITIVE_DATA_SUBSTITUTE
4244
4345
@@ -202,13 +204,30 @@ def on_new_span(self, attrs: str, span_id: str) -> "Optional[SentrySpan]":
202204 else :
203205 sentry_span_name = "<unknown>"
204206
205- kwargs = {
206- "op" : "function" ,
207- "name" : sentry_span_name ,
208- "origin" : self .origin ,
209- }
210-
211- sentry_span = sentry_sdk .start_span (** kwargs )
207+ span_streaming = has_span_streaming_enabled (sentry_sdk .get_client ().options )
208+ if span_streaming :
209+ sentry_span = sentry_sdk .traces .start_span (
210+ name = sentry_span_name ,
211+ attributes = {
212+ "sentry.op" : "function" ,
213+ "sentry.origin" : self .origin ,
214+ },
215+ )
216+ fields = metadata .get ("fields" , [])
217+ for field in fields :
218+ if self ._include_tracing_fields ():
219+ sentry_span .set_attribute (field , attrs .get (field ))
220+ else :
221+ sentry_span .set_attribute (field , SENSITIVE_DATA_SUBSTITUTE )
222+
223+ sentry_span .__enter__ ()
224+ return sentry_span
225+
226+ sentry_span = sentry_sdk .start_span (
227+ op = "function" ,
228+ name = sentry_span_name ,
229+ origin = self .origin ,
230+ )
212231 fields = metadata .get ("fields" , [])
213232 for field in fields :
214233 if self ._include_tracing_fields ():
@@ -225,16 +244,24 @@ def on_close(self, span_id: str, sentry_span: "SentrySpan") -> None:
225244
226245 sentry_span .__exit__ (None , None , None )
227246
228- def on_record (self , span_id : str , values : str , sentry_span : "SentrySpan" ) -> None :
247+ def on_record (
248+ self , span_id : str , values : str , sentry_span : "Union[SentrySpan, StreamedSpan]"
249+ ) -> None :
229250 if sentry_span is None :
230251 return
231252
253+ set_on_span = (
254+ sentry_span .set_attribute
255+ if isinstance (sentry_span , StreamedSpan )
256+ else sentry_span .set_data
257+ )
258+
232259 deserialized_values = json .loads (values )
233260 for key , value in deserialized_values .items ():
234261 if self ._include_tracing_fields ():
235- sentry_span . set_data (key , value )
262+ set_on_span (key , value )
236263 else :
237- sentry_span . set_data (key , SENSITIVE_DATA_SUBSTITUTE )
264+ set_on_span (key , SENSITIVE_DATA_SUBSTITUTE )
238265
239266
240267class RustTracingIntegration (Integration ):
0 commit comments