Skip to content

Commit c210ad6

Browse files
Added option to disable middleware spans in Starlette (#3052)
When middleware_spans is set to False, no spans will be recorded for Starlette middleware. (analogue to how the DjangoIntegration works) --------- Co-authored-by: Daniel Szoke <[email protected]>
1 parent 168600f commit c210ad6

File tree

2 files changed

+42
-7
lines changed

2 files changed

+42
-7
lines changed

sentry_sdk/integrations/starlette.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,20 @@ class StarletteIntegration(Integration):
7373

7474
transaction_style = ""
7575

76-
def __init__(self, transaction_style="url", failed_request_status_codes=None):
77-
# type: (str, Optional[list[HttpStatusCodeRange]]) -> None
76+
def __init__(
77+
self,
78+
transaction_style="url",
79+
failed_request_status_codes=None,
80+
middleware_spans=True,
81+
):
82+
# type: (str, Optional[list[HttpStatusCodeRange]], bool) -> None
7883
if transaction_style not in TRANSACTION_STYLE_VALUES:
7984
raise ValueError(
8085
"Invalid value for transaction_style: %s (must be in %s)"
8186
% (transaction_style, TRANSACTION_STYLE_VALUES)
8287
)
8388
self.transaction_style = transaction_style
89+
self.middleware_spans = middleware_spans
8490
self.failed_request_status_codes = failed_request_status_codes or [
8591
range(500, 599)
8692
]
@@ -110,7 +116,7 @@ def _enable_span_for_middleware(middleware_class):
110116
async def _create_span_call(app, scope, receive, send, **kwargs):
111117
# type: (Any, Dict[str, Any], Callable[[], Awaitable[Dict[str, Any]]], Callable[[Dict[str, Any]], Awaitable[None]], Any) -> None
112118
integration = sentry_sdk.get_client().get_integration(StarletteIntegration)
113-
if integration is None:
119+
if integration is None or not integration.middleware_spans:
114120
return await old_call(app, scope, receive, send, **kwargs)
115121

116122
middleware_name = app.__class__.__name__

tests/integrations/starlette/test_starlette.py

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -637,20 +637,49 @@ def test_middleware_spans(sentry_init, capture_events):
637637

638638
(_, transaction_event) = events
639639

640-
expected = [
640+
expected_middleware_spans = [
641641
"ServerErrorMiddleware",
642642
"AuthenticationMiddleware",
643643
"ExceptionMiddleware",
644+
"AuthenticationMiddleware", # 'op': 'middleware.starlette.send'
645+
"ServerErrorMiddleware", # 'op': 'middleware.starlette.send'
646+
"AuthenticationMiddleware", # 'op': 'middleware.starlette.send'
647+
"ServerErrorMiddleware", # 'op': 'middleware.starlette.send'
644648
]
645649

650+
assert len(transaction_event["spans"]) == len(expected_middleware_spans)
651+
646652
idx = 0
647653
for span in transaction_event["spans"]:
648-
if span["op"] == "middleware.starlette":
649-
assert span["description"] == expected[idx]
650-
assert span["tags"]["starlette.middleware_name"] == expected[idx]
654+
if span["op"].startswith("middleware.starlette"):
655+
assert (
656+
span["tags"]["starlette.middleware_name"]
657+
== expected_middleware_spans[idx]
658+
)
651659
idx += 1
652660

653661

662+
def test_middleware_spans_disabled(sentry_init, capture_events):
663+
sentry_init(
664+
traces_sample_rate=1.0,
665+
integrations=[StarletteIntegration(middleware_spans=False)],
666+
)
667+
starlette_app = starlette_app_factory(
668+
middleware=[Middleware(AuthenticationMiddleware, backend=BasicAuthBackend())]
669+
)
670+
events = capture_events()
671+
672+
client = TestClient(starlette_app, raise_server_exceptions=False)
673+
try:
674+
client.get("/message", auth=("Gabriela", "hello123"))
675+
except Exception:
676+
pass
677+
678+
(_, transaction_event) = events
679+
680+
assert len(transaction_event["spans"]) == 0
681+
682+
654683
def test_middleware_callback_spans(sentry_init, capture_events):
655684
sentry_init(
656685
traces_sample_rate=1.0,

0 commit comments

Comments
 (0)