1- from typing import TYPE_CHECKING
2-
31import sentry_sdk
2+ from sentry_sdk ._types import TYPE_CHECKING
43from sentry_sdk .consts import OP
54from sentry_sdk .integrations import DidNotEnable , Integration
65from sentry_sdk .integrations .asgi import SentryAsgiMiddleware
2019 from starlite .routes .http import HTTPRoute # type: ignore
2120 from starlite .utils import ConnectionDataExtractor , is_async_callable , Ref # type: ignore
2221 from pydantic import BaseModel # type: ignore
23-
24- if TYPE_CHECKING :
25- from typing import Any , Dict , List , Optional , Union
26- from starlite .types import ( # type: ignore
27- ASGIApp ,
28- Hint ,
29- HTTPReceiveMessage ,
30- HTTPScope ,
31- Message ,
32- Middleware ,
33- Receive ,
34- Scope as StarliteScope ,
35- Send ,
36- WebSocketReceiveMessage ,
37- )
38- from starlite import MiddlewareProtocol
39- from sentry_sdk ._types import Event
4022except ImportError :
4123 raise DidNotEnable ("Starlite is not installed" )
4224
25+ if TYPE_CHECKING :
26+ from typing import Any , Optional , Union
27+ from starlite .types import ( # type: ignore
28+ ASGIApp ,
29+ Hint ,
30+ HTTPReceiveMessage ,
31+ HTTPScope ,
32+ Message ,
33+ Middleware ,
34+ Receive ,
35+ Scope as StarliteScope ,
36+ Send ,
37+ WebSocketReceiveMessage ,
38+ )
39+ from starlite import MiddlewareProtocol
40+ from sentry_sdk ._types import Event
41+
4342
4443_DEFAULT_TRANSACTION_NAME = "generic Starlite request"
4544
@@ -49,14 +48,16 @@ class StarliteIntegration(Integration):
4948 origin = f"auto.http.{ identifier } "
5049
5150 @staticmethod
52- def setup_once () -> None :
51+ def setup_once ():
52+ # type: () -> None
5353 patch_app_init ()
5454 patch_middlewares ()
5555 patch_http_route_handle ()
5656
5757
5858class SentryStarliteASGIMiddleware (SentryAsgiMiddleware ):
59- def __init__ (self , app : "ASGIApp" , span_origin : str = StarliteIntegration .origin ):
59+ def __init__ (self , app , span_origin = StarliteIntegration .origin ):
60+ # type: (ASGIApp, str) -> None
6061 super ().__init__ (
6162 app = app ,
6263 unsafe_context_data = False ,
@@ -66,7 +67,8 @@ def __init__(self, app: "ASGIApp", span_origin: str = StarliteIntegration.origin
6667 )
6768
6869
69- def patch_app_init () -> None :
70+ def patch_app_init ():
71+ # type: () -> None
7072 """
7173 Replaces the Starlite class's `__init__` function in order to inject `after_exception` handlers and set the
7274 `SentryStarliteASGIMiddleware` as the outmost middleware in the stack.
@@ -76,7 +78,9 @@ def patch_app_init() -> None:
7678 """
7779 old__init__ = Starlite .__init__
7880
79- def injection_wrapper (self : "Starlite" , * args : "Any" , ** kwargs : "Any" ) -> None :
81+ @ensure_integration_enabled (StarliteIntegration , old__init__ )
82+ def injection_wrapper (self , * args , ** kwargs ):
83+ # type: (Starlite, *Any, **Any) -> None
8084 after_exception = kwargs .pop ("after_exception" , [])
8185 kwargs .update (
8286 after_exception = [
@@ -90,43 +94,43 @@ def injection_wrapper(self: "Starlite", *args: "Any", **kwargs: "Any") -> None:
9094 )
9195
9296 SentryStarliteASGIMiddleware .__call__ = SentryStarliteASGIMiddleware ._run_asgi3 # type: ignore
93- middleware = kwargs .pop ("middleware" , None ) or []
97+ middleware = kwargs .get ("middleware" ) or []
9498 kwargs ["middleware" ] = [SentryStarliteASGIMiddleware , * middleware ]
9599 old__init__ (self , * args , ** kwargs )
96100
97101 Starlite .__init__ = injection_wrapper
98102
99103
100- def patch_middlewares () -> None :
101- old__resolve_middleware_stack = BaseRouteHandler .resolve_middleware
104+ def patch_middlewares ():
105+ # type: () -> None
106+ old_resolve_middleware_stack = BaseRouteHandler .resolve_middleware
102107
103- def resolve_middleware_wrapper (self : "Any" ) -> "List[Middleware]" :
108+ @ensure_integration_enabled (StarliteIntegration , old_resolve_middleware_stack )
109+ def resolve_middleware_wrapper (self ):
110+ # type: (BaseRouteHandler) -> list[Middleware]
104111 return [
105112 enable_span_for_middleware (middleware )
106- for middleware in old__resolve_middleware_stack (self )
113+ for middleware in old_resolve_middleware_stack (self )
107114 ]
108115
109116 BaseRouteHandler .resolve_middleware = resolve_middleware_wrapper
110117
111118
112- def enable_span_for_middleware (middleware : "Middleware" ) -> "Middleware" :
119+ def enable_span_for_middleware (middleware ):
120+ # type: (Middleware) -> Middleware
113121 if (
114122 not hasattr (middleware , "__call__" ) # noqa: B004
115123 or middleware is SentryStarliteASGIMiddleware
116124 ):
117125 return middleware
118126
119127 if isinstance (middleware , DefineMiddleware ):
120- old_call : "ASGIApp" = middleware .middleware .__call__
128+ old_call = middleware .middleware .__call__ # type: ASGIApp
121129 else :
122130 old_call = middleware .__call__
123131
124- async def _create_span_call (
125- self : "MiddlewareProtocol" ,
126- scope : "StarliteScope" ,
127- receive : "Receive" ,
128- send : "Send" ,
129- ) -> None :
132+ async def _create_span_call (self , scope , receive , send ):
133+ # type: (MiddlewareProtocol, StarliteScope, Receive, Send) -> None
130134 if sentry_sdk .get_client ().get_integration (StarliteIntegration ) is None :
131135 return await old_call (self , scope , receive , send )
132136
@@ -139,9 +143,10 @@ async def _create_span_call(
139143 middleware_span .set_tag ("starlite.middleware_name" , middleware_name )
140144
141145 # Creating spans for the "receive" callback
142- async def _sentry_receive (
143- * args : "Any" , ** kwargs : "Any"
144- ) -> "Union[HTTPReceiveMessage, WebSocketReceiveMessage]" :
146+ async def _sentry_receive (* args , ** kwargs ):
147+ # type: (*Any, **Any) -> Union[HTTPReceiveMessage, WebSocketReceiveMessage]
148+ if sentry_sdk .get_client ().get_integration (StarliteIntegration ) is None :
149+ return await receive (* args , ** kwargs )
145150 with sentry_sdk .start_span (
146151 op = OP .MIDDLEWARE_STARLITE_RECEIVE ,
147152 description = getattr (receive , "__qualname__" , str (receive )),
@@ -155,7 +160,10 @@ async def _sentry_receive(
155160 new_receive = _sentry_receive if not receive_patched else receive
156161
157162 # Creating spans for the "send" callback
158- async def _sentry_send (message : "Message" ) -> None :
163+ async def _sentry_send (message ):
164+ # type: (Message) -> None
165+ if sentry_sdk .get_client ().get_integration (StarliteIntegration ) is None :
166+ return await send (message )
159167 with sentry_sdk .start_span (
160168 op = OP .MIDDLEWARE_STARLITE_SEND ,
161169 description = getattr (send , "__qualname__" , str (send )),
@@ -181,27 +189,28 @@ async def _sentry_send(message: "Message") -> None:
181189 return middleware
182190
183191
184- def patch_http_route_handle () -> None :
192+ def patch_http_route_handle ():
193+ # type: () -> None
185194 old_handle = HTTPRoute .handle
186195
187- async def handle_wrapper (
188- self : "HTTPRoute" , scope : "HTTPScope" , receive : "Receive" , send : "Send"
189- ) -> None :
196+ async def handle_wrapper (self , scope , receive , send ):
197+ # type: (HTTPRoute, HTTPScope, Receive, Send) -> None
190198 if sentry_sdk .get_client ().get_integration (StarliteIntegration ) is None :
191199 return await old_handle (self , scope , receive , send )
192200
193201 sentry_scope = sentry_sdk .get_isolation_scope ()
194- request : "Request[Any, Any]" = scope ["app" ].request_class (
202+ request = scope ["app" ].request_class (
195203 scope = scope , receive = receive , send = send
196- )
204+ ) # type: Request[Any, Any]
197205 extracted_request_data = ConnectionDataExtractor (
198206 parse_body = True , parse_query = True
199207 )(request )
200208 body = extracted_request_data .pop ("body" )
201209
202210 request_data = await body
203211
204- def event_processor (event : "Event" , _ : "Hint" ) -> "Event" :
212+ def event_processor (event , _ ):
213+ # type: (Event, Hint) -> Event
205214 route_handler = scope .get ("route_handler" )
206215
207216 request_info = event .get ("request" , {})
@@ -244,8 +253,9 @@ def event_processor(event: "Event", _: "Hint") -> "Event":
244253 HTTPRoute .handle = handle_wrapper
245254
246255
247- def retrieve_user_from_scope (scope : "StarliteScope" ) -> "Optional[Dict[str, Any]]" :
248- scope_user = scope .get ("user" , {})
256+ def retrieve_user_from_scope (scope ):
257+ # type: (StarliteScope) -> Optional[dict[str, Any]]
258+ scope_user = scope .get ("user" )
249259 if not scope_user :
250260 return None
251261 if isinstance (scope_user , dict ):
@@ -263,8 +273,9 @@ def retrieve_user_from_scope(scope: "StarliteScope") -> "Optional[Dict[str, Any]
263273
264274
265275@ensure_integration_enabled (StarliteIntegration )
266- def exception_handler (exc : Exception , scope : "StarliteScope" , _ : "State" ) -> None :
267- user_info : "Optional[Dict[str, Any]]" = None
276+ def exception_handler (exc , scope , _ ):
277+ # type: (Exception, StarliteScope, State) -> None
278+ user_info = None # type: Optional[dict[str, Any]]
268279 if should_send_default_pii ():
269280 user_info = retrieve_user_from_scope (scope )
270281 if user_info and isinstance (user_info , dict ):
0 commit comments