Skip to content

Commit c9ded52

Browse files
feat(rust-tracing): Support span streaming
1 parent 0e237dd commit c9ded52

2 files changed

Lines changed: 599 additions & 215 deletions

File tree

sentry_sdk/integrations/rust_tracing.py

Lines changed: 38 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,14 @@
3232

3333
import json
3434
from enum import Enum, auto
35-
from typing import Any, Callable, Dict, Optional
35+
from typing import Any, Callable, Dict, Optional, Union
3636

3737
import sentry_sdk
3838
from sentry_sdk.integrations import Integration
3939
from sentry_sdk.scope import should_send_default_pii
40+
from sentry_sdk.traces import StreamedSpan
4041
from sentry_sdk.tracing import Span as SentrySpan
42+
from sentry_sdk.tracing_utils import has_span_streaming_enabled
4143
from 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

240267
class RustTracingIntegration(Integration):

0 commit comments

Comments
 (0)