Skip to content

Commit 75aaebf

Browse files
authored
feat(starlite): Support span streaming (#6294)
1 parent 3142b16 commit 75aaebf

3 files changed

Lines changed: 220 additions & 76 deletions

File tree

sentry_sdk/consts.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -882,6 +882,11 @@ class SPANDATA:
882882
The messaging system's name, e.g. `kafka`, `aws_sqs`
883883
"""
884884

885+
MIDDLEWARE_NAME = "middleware.name"
886+
"""
887+
The middleware's name, e.g. `AuthenticationMiddleware`
888+
"""
889+
885890
NETWORK_PROTOCOL_NAME = "network.protocol.name"
886891
"""
887892
The application layer protocol name used for the network connection.

sentry_sdk/integrations/starlite.py

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
from copy import deepcopy
22

33
import sentry_sdk
4-
from sentry_sdk.consts import OP
4+
from sentry_sdk.consts import OP, SPANDATA
55
from sentry_sdk.integrations import DidNotEnable, Integration
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+
SPANDATA.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)