Skip to content

Commit f0514b6

Browse files
committed
feat(starlite): Support span streaming
1 parent 3142b16 commit f0514b6

2 files changed

Lines changed: 214 additions & 75 deletions

File tree

sentry_sdk/integrations/starlite.py

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from sentry_sdk.integrations.asgi import SentryAsgiMiddleware
77
from sentry_sdk.scope import should_send_default_pii
88
from sentry_sdk.tracing import SOURCE_FOR_STYLE, TransactionSource
9+
from sentry_sdk.tracing_utils import has_span_streaming_enabled
910
from sentry_sdk.utils import (
1011
ensure_integration_enabled,
1112
event_from_exception,
@@ -141,29 +142,47 @@ async def _create_span_call(
141142
receive: "Receive",
142143
send: "Send",
143144
) -> None:
144-
if sentry_sdk.get_client().get_integration(StarliteIntegration) is None:
145+
client = sentry_sdk.get_client()
146+
if client.get_integration(StarliteIntegration) is None:
145147
return await old_call(self, scope, receive, send)
146148

147149
middleware_name = self.__class__.__name__
148-
with sentry_sdk.start_span(
149-
op=OP.MIDDLEWARE_STARLITE,
150-
name=middleware_name,
151-
origin=StarliteIntegration.origin,
150+
is_span_streaming_enabled = has_span_streaming_enabled(client.options)
151+
152+
def _start_middleware_span(op: str, name: str) -> "Any":
153+
if is_span_streaming_enabled:
154+
return sentry_sdk.traces.start_span(
155+
name=name,
156+
attributes={
157+
"sentry.op": op,
158+
"sentry.origin": StarliteIntegration.origin,
159+
"starlite.middleware_name": middleware_name,
160+
},
161+
)
162+
return sentry_sdk.start_span(
163+
op=op,
164+
name=name,
165+
origin=StarliteIntegration.origin,
166+
)
167+
168+
with _start_middleware_span(
169+
op=OP.MIDDLEWARE_STARLITE, name=middleware_name
152170
) as middleware_span:
153-
middleware_span.set_tag("starlite.middleware_name", middleware_name)
171+
if not is_span_streaming_enabled:
172+
middleware_span.set_tag("starlite.middleware_name", middleware_name)
154173

155174
# Creating spans for the "receive" callback
156175
async def _sentry_receive(
157176
*args: "Any", **kwargs: "Any"
158177
) -> "Union[HTTPReceiveMessage, WebSocketReceiveMessage]":
159178
if sentry_sdk.get_client().get_integration(StarliteIntegration) is None:
160179
return await receive(*args, **kwargs)
161-
with sentry_sdk.start_span(
180+
with _start_middleware_span(
162181
op=OP.MIDDLEWARE_STARLITE_RECEIVE,
163182
name=getattr(receive, "__qualname__", str(receive)),
164-
origin=StarliteIntegration.origin,
165183
) as span:
166-
span.set_tag("starlite.middleware_name", middleware_name)
184+
if not is_span_streaming_enabled:
185+
span.set_tag("starlite.middleware_name", middleware_name)
167186
return await receive(*args, **kwargs)
168187

169188
receive_name = getattr(receive, "__name__", str(receive))
@@ -174,12 +193,12 @@ async def _sentry_receive(
174193
async def _sentry_send(message: "Message") -> None:
175194
if sentry_sdk.get_client().get_integration(StarliteIntegration) is None:
176195
return await send(message)
177-
with sentry_sdk.start_span(
196+
with _start_middleware_span(
178197
op=OP.MIDDLEWARE_STARLITE_SEND,
179198
name=getattr(send, "__qualname__", str(send)),
180-
origin=StarliteIntegration.origin,
181199
) as span:
182-
span.set_tag("starlite.middleware_name", middleware_name)
200+
if not is_span_streaming_enabled:
201+
span.set_tag("starlite.middleware_name", middleware_name)
183202
return await send(message)
184203

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

0 commit comments

Comments
 (0)