99from sentry_sdk .hub import Hub , _should_send_default_pii
1010from sentry_sdk .scope import add_global_event_processor
1111from sentry_sdk .serializer import add_global_repr_processor
12+ from sentry_sdk .tracing import SOURCE_FOR_STYLE
1213from sentry_sdk .tracing_utils import record_sql_queries
1314from sentry_sdk .utils import (
1415 HAS_REAL_CONTEXTVARS ,
@@ -82,7 +83,7 @@ def is_authenticated(request_user):
8283class DjangoIntegration (Integration ):
8384 identifier = "django"
8485
85- transaction_style = None
86+ transaction_style = ""
8687 middleware_spans = None
8788
8889 def __init__ (self , transaction_style = "url" , middleware_spans = True ):
@@ -319,6 +320,32 @@ def _patch_django_asgi_handler():
319320 patch_django_asgi_handler_impl (ASGIHandler )
320321
321322
323+ def _set_transaction_name_and_source (scope , transaction_style , request ):
324+ # type: (Scope, str, WSGIRequest) -> None
325+ try :
326+ transaction_name = ""
327+ if transaction_style == "function_name" :
328+ fn = resolve (request .path ).func
329+ transaction_name = (
330+ transaction_from_function (getattr (fn , "view_class" , fn )) or ""
331+ )
332+
333+ elif transaction_style == "url" :
334+ if hasattr (request , "urlconf" ):
335+ transaction_name = LEGACY_RESOLVER .resolve (
336+ request .path_info , urlconf = request .urlconf
337+ )
338+ else :
339+ transaction_name = LEGACY_RESOLVER .resolve (request .path_info )
340+
341+ scope .set_transaction_name (
342+ transaction_name ,
343+ source = SOURCE_FOR_STYLE [transaction_style ],
344+ )
345+ except Exception :
346+ pass
347+
348+
322349def _before_get_response (request ):
323350 # type: (WSGIRequest) -> None
324351 hub = Hub .current
@@ -330,24 +357,15 @@ def _before_get_response(request):
330357
331358 with hub .configure_scope () as scope :
332359 # Rely on WSGI middleware to start a trace
333- try :
334- if integration .transaction_style == "function_name" :
335- fn = resolve (request .path ).func
336- scope .transaction = transaction_from_function (
337- getattr (fn , "view_class" , fn )
338- )
339- elif integration .transaction_style == "url" :
340- scope .transaction = LEGACY_RESOLVER .resolve (request .path_info )
341- except Exception :
342- pass
360+ _set_transaction_name_and_source (scope , integration .transaction_style , request )
343361
344362 scope .add_event_processor (
345363 _make_event_processor (weakref .ref (request ), integration )
346364 )
347365
348366
349- def _attempt_resolve_again (request , scope ):
350- # type: (WSGIRequest, Scope) -> None
367+ def _attempt_resolve_again (request , scope , transaction_style ):
368+ # type: (WSGIRequest, Scope, str ) -> None
351369 """
352370 Some django middlewares overwrite request.urlconf
353371 so we need to respect that contract,
@@ -356,13 +374,7 @@ def _attempt_resolve_again(request, scope):
356374 if not hasattr (request , "urlconf" ):
357375 return
358376
359- try :
360- scope .transaction = LEGACY_RESOLVER .resolve (
361- request .path_info ,
362- urlconf = request .urlconf ,
363- )
364- except Exception :
365- pass
377+ _set_transaction_name_and_source (scope , transaction_style , request )
366378
367379
368380def _after_get_response (request ):
@@ -373,7 +385,7 @@ def _after_get_response(request):
373385 return
374386
375387 with hub .configure_scope () as scope :
376- _attempt_resolve_again (request , scope )
388+ _attempt_resolve_again (request , scope , integration . transaction_style )
377389
378390
379391def _patch_get_response ():
@@ -438,7 +450,7 @@ def _got_request_exception(request=None, **kwargs):
438450
439451 if request is not None and integration .transaction_style == "url" :
440452 with hub .configure_scope () as scope :
441- _attempt_resolve_again (request , scope )
453+ _attempt_resolve_again (request , scope , integration . transaction_style )
442454
443455 # If an integration is there, a client has to be there.
444456 client = hub .client # type: Any
0 commit comments