3636 TransactionSource ,
3737)
3838from sentry_sdk .tracing_utils import (
39+ add_http_breadcrumb ,
3940 add_http_request_source ,
4041 has_span_streaming_enabled ,
4142 should_propagate_trace ,
@@ -378,57 +379,64 @@ async def on_request_start(
378379 with capture_internal_exceptions ():
379380 parsed_url = parse_url (str (params .url ), sanitize = False )
380381
382+ breadcrumb = {}
383+
381384 span_name = "%s %s" % (
382385 method ,
383386 parsed_url .url if parsed_url else SENSITIVE_DATA_SUBSTITUTE ,
384387 )
385388
386- span : "Union[Span, StreamedSpan, None]"
389+ span : "Union[Span, StreamedSpan, None]" = None
387390 if has_span_streaming_enabled (client .options ):
388- if sentry_sdk .traces .get_current_span () is None :
389- span = None
390- else :
391- attributes : "Attributes" = {
392- "sentry.op" : OP .HTTP_CLIENT ,
393- "sentry.origin" : AioHttpIntegration .origin ,
394- "http.request.method" : method ,
395- }
396- if parsed_url is not None :
397- if has_data_collection_enabled (client .options ):
398- url_full = parsed_url .url
399- attributes ["url.path" ] = params .url .path
400-
401- if parsed_url .query :
402- filtered_query = (
403- _apply_data_collection_filtering_to_query_string (
404- query_string = parsed_url .query ,
405- behaviour = client .options ["data_collection" ][
406- "url_query_params"
407- ],
408- )
391+ attributes : "Attributes" = {
392+ "sentry.op" : OP .HTTP_CLIENT ,
393+ "sentry.origin" : AioHttpIntegration .origin ,
394+ "http.request.method" : method ,
395+ }
396+ if parsed_url is not None :
397+ if has_data_collection_enabled (client .options ):
398+ url_full = parsed_url .url
399+ attributes ["url.path" ] = params .url .path
400+
401+ if parsed_url .query :
402+ filtered_query = (
403+ _apply_data_collection_filtering_to_query_string (
404+ query_string = parsed_url .query ,
405+ behaviour = client .options ["data_collection" ][
406+ "url_query_params"
407+ ],
409408 )
410- if filtered_query :
411- attributes ["url.query" ] = filtered_query
412- url_full += "?" + filtered_query
413-
414- if parsed_url .fragment :
415- attributes ["url.fragment" ] = parsed_url .fragment
416- url_full += "#" + parsed_url .fragment
417-
418- attributes ["url.full" ] = url_full
419- elif should_send_default_pii ():
420- url_full = parsed_url .url
421- attributes ["url.path" ] = params .url .path
422-
423- if parsed_url .query :
424- url_full += "?" + parsed_url .query
425- attributes ["url.query" ] = parsed_url .query
426- if parsed_url .fragment :
427- url_full += "#" + parsed_url .fragment
428- attributes ["url.fragment" ] = parsed_url .fragment
429-
430- attributes ["url.full" ] = url_full
431-
409+ )
410+ if filtered_query :
411+ attributes ["url.query" ] = filtered_query
412+ url_full += "?" + filtered_query
413+ breadcrumb [SPANDATA .HTTP_QUERY ] = filtered_query
414+
415+ if parsed_url .fragment :
416+ attributes ["url.fragment" ] = parsed_url .fragment
417+ url_full += "#" + parsed_url .fragment
418+ breadcrumb [SPANDATA .HTTP_FRAGMENT ] = parsed_url .fragment
419+
420+ attributes ["url.full" ] = url_full
421+ breadcrumb ["url" ] = url_full
422+
423+ elif should_send_default_pii ():
424+ url_full = parsed_url .url
425+ attributes ["url.path" ] = params .url .path
426+
427+ if parsed_url .query :
428+ url_full += "?" + parsed_url .query
429+ attributes ["url.query" ] = parsed_url .query
430+ breadcrumb [SPANDATA .HTTP_QUERY ] = parsed_url .query
431+ if parsed_url .fragment :
432+ url_full += "#" + parsed_url .fragment
433+ attributes ["url.fragment" ] = parsed_url .fragment
434+ breadcrumb [SPANDATA .HTTP_FRAGMENT ] = parsed_url .fragment
435+
436+ attributes ["url.full" ] = url_full
437+ breadcrumb ["url" ] = url_full
438+
439+ if sentry_sdk .traces .get_current_span () is not None :
432440 span = sentry_sdk .traces .start_span (
433441 name = span_name , attributes = attributes
434442 )
@@ -443,6 +451,13 @@ async def on_request_start(
443451 legacy_span .set_data ("url" , parsed_url .url )
444452 legacy_span .set_data (SPANDATA .HTTP_QUERY , parsed_url .query )
445453 legacy_span .set_data (SPANDATA .HTTP_FRAGMENT , parsed_url .fragment )
454+ breadcrumb .update (
455+ {
456+ SPANDATA .HTTP_QUERY : parsed_url .query ,
457+ SPANDATA .HTTP_FRAGMENT : parsed_url .fragment ,
458+ "url" : parsed_url .url ,
459+ }
460+ )
446461 span = legacy_span
447462
448463 if should_propagate_trace (client , str (params .url )):
@@ -465,19 +480,35 @@ async def on_request_start(
465480 else :
466481 params .headers [key ] = value
467482
468- trace_config_ctx .span = span
483+ trace_config_ctx ._sentry_span = span
484+ trace_config_ctx ._sentry_breadcrumb = breadcrumb
469485
470486 async def on_request_end (
471487 session : "ClientSession" ,
472488 trace_config_ctx : "SimpleNamespace" ,
473489 params : "TraceRequestEndParams" ,
474490 ) -> None :
475- if trace_config_ctx .span is None :
476- return
477-
478- span = trace_config_ctx .span
479491 status = int (params .response .status )
480492
493+ breadcrumb = getattr (trace_config_ctx , "_sentry_breadcrumb" , None )
494+ if breadcrumb is not None :
495+ breadcrumb .update (
496+ {
497+ SPANDATA .HTTP_METHOD : params .method .upper (),
498+ SPANDATA .HTTP_STATUS_CODE : status ,
499+ "reason" : params .response .reason ,
500+ }
501+ )
502+
503+ add_http_breadcrumb (
504+ status ,
505+ breadcrumb ,
506+ )
507+
508+ span = getattr (trace_config_ctx , "_sentry_span" , None )
509+ if span is None :
510+ return
511+
481512 if isinstance (span , StreamedSpan ):
482513 span .set_attribute ("http.response.status_code" , status )
483514 span .status = (
0 commit comments