Skip to content

Commit dedfaf0

Browse files
committed
starlette
1 parent 68cf5d2 commit dedfaf0

File tree

2 files changed

+63
-34
lines changed

2 files changed

+63
-34
lines changed

sentry_sdk/integrations/starlette.py

Lines changed: 60 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
SOURCE_FOR_STYLE,
2525
TransactionSource,
2626
)
27+
from sentry_sdk.tracing_utils import has_span_streaming_enabled
2728
from sentry_sdk.utils import (
2829
AnnotatedValue,
2930
capture_internal_exceptions,
@@ -147,10 +148,13 @@ async def _create_span_call(
147148
send: "Callable[[Dict[str, Any]], Awaitable[None]]",
148149
**kwargs: "Any",
149150
) -> None:
150-
integration = sentry_sdk.get_client().get_integration(StarletteIntegration)
151+
client = sentry_sdk.get_client()
152+
integration = client.get_integration(StarletteIntegration)
151153
if integration is None:
152154
return await old_call(app, scope, receive, send, **kwargs)
153155

156+
span_streaming = has_span_streaming_enabled(client.options)
157+
154158
# Update transaction name with middleware name
155159
name, source = _get_transaction_from_middleware(app, scope, integration)
156160

@@ -165,21 +169,45 @@ async def _create_span_call(
165169

166170
middleware_name = app.__class__.__name__
167171

168-
with sentry_sdk.start_span(
169-
op=OP.MIDDLEWARE_STARLETTE,
170-
name=middleware_name,
171-
origin=StarletteIntegration.origin,
172-
) as middleware_span:
173-
middleware_span.set_tag("starlette.middleware_name", middleware_name)
172+
if span_streaming:
173+
span_ctx = sentry_sdk.traces.start_span(name=middleware_name)
174+
else:
175+
span_ctx = sentry_sdk.start_span(
176+
op=OP.MIDDLEWARE_STARLETTE,
177+
name=middleware_name,
178+
origin=StarletteIntegration.origin,
179+
)
180+
181+
with span_ctx as middleware_span:
182+
if span_streaming:
183+
middleware_span.set_op(OP.MIDDLEWARE_STARLETTE)
184+
middleware_span.set_origin(StarletteIntegration.origin)
185+
middleware_span.set_attribute(
186+
"starlette.middleware_name", middleware_name
187+
)
188+
else:
189+
middleware_span.set_tag("starlette.middleware_name", middleware_name)
174190

175191
# Creating spans for the "receive" callback
176192
async def _sentry_receive(*args: "Any", **kwargs: "Any") -> "Any":
177-
with sentry_sdk.start_span(
178-
op=OP.MIDDLEWARE_STARLETTE_RECEIVE,
179-
name=getattr(receive, "__qualname__", str(receive)),
180-
origin=StarletteIntegration.origin,
181-
) as span:
182-
span.set_tag("starlette.middleware_name", middleware_name)
193+
if span_streaming:
194+
span_ctx = sentry_sdk.tracing.start_span(
195+
name=getattr(receive, "__qualname__", str(receive)),
196+
)
197+
else:
198+
span_ctx = sentry_sdk.start_span(
199+
op=OP.MIDDLEWARE_STARLETTE_RECEIVE,
200+
name=getattr(receive, "__qualname__", str(receive)),
201+
origin=StarletteIntegration.origin,
202+
)
203+
204+
with span_ctx as span:
205+
if span_streaming:
206+
span.set_origin(StarletteIntegration.origin)
207+
span.set_op(OP.MIDDLEWARE_STARLETTE_RECEIVE)
208+
span.set_attribute("starlette.middleware_name", middleware_name)
209+
else:
210+
span.set_tag("starlette.middleware_name", middleware_name)
183211
return await receive(*args, **kwargs)
184212

185213
receive_name = getattr(receive, "__name__", str(receive))
@@ -188,12 +216,25 @@ async def _sentry_receive(*args: "Any", **kwargs: "Any") -> "Any":
188216

189217
# Creating spans for the "send" callback
190218
async def _sentry_send(*args: "Any", **kwargs: "Any") -> "Any":
191-
with sentry_sdk.start_span(
192-
op=OP.MIDDLEWARE_STARLETTE_SEND,
193-
name=getattr(send, "__qualname__", str(send)),
194-
origin=StarletteIntegration.origin,
195-
) as span:
196-
span.set_tag("starlette.middleware_name", middleware_name)
219+
if span_streaming:
220+
span_ctx = sentry_sdk.tracing.start_span(
221+
name=getattr(send, "__qualname__", str(send)),
222+
)
223+
else:
224+
span_ctx = sentry_sdk.start_span(
225+
op=OP.MIDDLEWARE_STARLETTE_SEND,
226+
name=getattr(send, "__qualname__", str(send)),
227+
origin=StarletteIntegration.origin,
228+
)
229+
230+
with span_ctx as span:
231+
if span_streaming:
232+
span.set_op(OP.MIDDLEWARE_STARLETTE_SEND)
233+
span.set_origin(StarletteIntegration.origin)
234+
span.set_attribute("starlette.middleware_name", middleware_name)
235+
else:
236+
span.set_tag("starlette.middleware_name", middleware_name)
237+
197238
return await send(*args, **kwargs)
198239

199240
send_name = getattr(send, "__name__", str(send))

sentry_sdk/scope.py

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -675,15 +675,6 @@ def iter_trace_propagation_headers(
675675
span = kwargs.pop("span", None)
676676
span = span or self.span
677677

678-
if isinstance(span, StreamedSpan):
679-
warnings.warn(
680-
"Scope.iter_trace_propagation_headers is not available in "
681-
"streaming mode.",
682-
DeprecationWarning,
683-
stacklevel=2,
684-
)
685-
return None
686-
687678
if has_tracing_enabled(client.options) and span is not None:
688679
for header in span.iter_headers():
689680
yield header
@@ -831,12 +822,9 @@ def set_transaction_name(self, name: str, source: "Optional[str]" = None) -> Non
831822
self._transaction = name
832823
if self._span:
833824
if isinstance(self._span, StreamedSpan):
834-
warnings.warn(
835-
"Scope.set_transaction_name is not available in streaming mode.",
836-
DeprecationWarning,
837-
stacklevel=2,
838-
)
839-
return None
825+
self._span.segment.name = name
826+
if source:
827+
self._span.segment.set_source(source)
840828

841829
if self._span.containing_transaction:
842830
self._span.containing_transaction.name = name

0 commit comments

Comments
 (0)