66from sentry_sdk .integrations import DidNotEnable , Integration , _check_minimum_version
77from sentry_sdk .scope import should_send_default_pii
88from sentry_sdk .traces import StreamedSpan
9- from sentry_sdk .tracing import BAGGAGE_HEADER_NAME , Span
9+ from sentry_sdk .tracing import BAGGAGE_HEADER_NAME
1010from sentry_sdk .tracing_utils import (
1111 add_http_breadcrumb ,
1212 add_sentry_baggage_to_headers ,
13- has_span_streaming_enabled ,
1413 should_propagate_trace ,
1514)
1615from sentry_sdk .utils import (
2019)
2120
2221if TYPE_CHECKING :
23- from typing import Any , Dict , Optional , Type , Union
22+ from typing import Any , Dict , Optional , Type
2423
2524 from botocore .model import ServiceId
2625
@@ -78,11 +77,30 @@ def _sentry_request_created(
7877
7978 breadcrumb : "dict[str, Any]" = {}
8079
81- is_span_streaming_enabled = has_span_streaming_enabled (client .options )
82- span : "Union[Span, StreamedSpan, None]" = None
83- if is_span_streaming_enabled :
80+ span : "Optional[StreamedSpan]" = None
81+ if parsed_url and should_send_default_pii ():
82+ breadcrumb .update (
83+ {
84+ SPANDATA .URL_FULL : parsed_url .url ,
85+ SPANDATA .URL_QUERY : parsed_url .query ,
86+ SPANDATA .URL_FRAGMENT : parsed_url .fragment ,
87+ }
88+ )
89+
90+ if request .method is not None :
91+ breadcrumb [SPANDATA .HTTP_REQUEST_METHOD ] = request .method
92+
93+ if sentry_sdk .traces .get_current_span () is not None :
94+ span = sentry_sdk .traces .start_span (
95+ name = description ,
96+ attributes = {
97+ "sentry.op" : OP .HTTP_CLIENT ,
98+ "sentry.origin" : Boto3Integration .origin ,
99+ SPANDATA .RPC_METHOD : f"{ service_id } /{ operation_name } " ,
100+ },
101+ )
84102 if parsed_url and should_send_default_pii ():
85- breadcrumb . update (
103+ span . set_attributes (
86104 {
87105 SPANDATA .URL_FULL : parsed_url .url ,
88106 SPANDATA .URL_QUERY : parsed_url .query ,
@@ -91,54 +109,7 @@ def _sentry_request_created(
91109 )
92110
93111 if request .method is not None :
94- breadcrumb [SPANDATA .HTTP_REQUEST_METHOD ] = request .method
95-
96- if sentry_sdk .traces .get_current_span () is not None :
97- span = sentry_sdk .traces .start_span (
98- name = description ,
99- attributes = {
100- "sentry.op" : OP .HTTP_CLIENT ,
101- "sentry.origin" : Boto3Integration .origin ,
102- SPANDATA .RPC_METHOD : f"{ service_id } /{ operation_name } " ,
103- },
104- )
105- if parsed_url and should_send_default_pii ():
106- span .set_attributes (
107- {
108- SPANDATA .URL_FULL : parsed_url .url ,
109- SPANDATA .URL_QUERY : parsed_url .query ,
110- SPANDATA .URL_FRAGMENT : parsed_url .fragment ,
111- }
112- )
113-
114- if request .method is not None :
115- span .set_attribute (SPANDATA .HTTP_REQUEST_METHOD , request .method )
116- else :
117- span = sentry_sdk .start_span (
118- op = OP .HTTP_CLIENT ,
119- name = description ,
120- origin = Boto3Integration .origin ,
121- )
122-
123- if parsed_url :
124- span .set_data ("aws.request.url" , parsed_url .url )
125- span .set_data (SPANDATA .HTTP_QUERY , parsed_url .query )
126- span .set_data (SPANDATA .HTTP_FRAGMENT , parsed_url .fragment )
127- breadcrumb .update (
128- {
129- "aws.request.url" : parsed_url .url ,
130- SPANDATA .HTTP_QUERY : parsed_url .query ,
131- SPANDATA .HTTP_FRAGMENT : parsed_url .fragment ,
132- }
133- )
134-
135- if request .method is not None :
136- span .set_data (SPANDATA .HTTP_METHOD , request .method )
137- breadcrumb [SPANDATA .HTTP_METHOD ] = request .method
138-
139- # We do it in order for subsequent http calls/retries be
140- # attached to this span.
141- span .__enter__ ()
112+ span .set_attribute (SPANDATA .HTTP_REQUEST_METHOD , request .method )
142113
143114 add_http_breadcrumb (None , breadcrumb )
144115
@@ -205,7 +176,7 @@ def _replace_header(request: "AWSRequest", key: str, value: str) -> None:
205176def _sentry_after_call (
206177 context : "Dict[str, Any]" , parsed : "Dict[str, Any]" , ** kwargs : "Any"
207178) -> None :
208- span : "Optional[Union[Span, StreamedSpan] ]" = context .pop ("_sentrysdk_span" , None )
179+ span : "Optional[StreamedSpan]" = context .pop ("_sentrysdk_span" , None )
209180
210181 # Span could be absent if the integration is disabled.
211182 if span is None :
@@ -217,22 +188,14 @@ def _sentry_after_call(
217188 if not isinstance (body , StreamingBody ):
218189 return
219190
220- streaming_span : "Union[Span, StreamedSpan]"
221- if isinstance (span , StreamedSpan ):
222- streaming_span = sentry_sdk .traces .start_span (
223- name = span .name ,
224- parent_span = span ,
225- attributes = {
226- "sentry.op" : OP .HTTP_CLIENT_STREAM ,
227- "sentry.origin" : Boto3Integration .origin ,
228- },
229- )
230- else :
231- streaming_span = span .start_child (
232- op = OP .HTTP_CLIENT_STREAM ,
233- name = span .description ,
234- origin = Boto3Integration .origin ,
235- )
191+ streaming_span = sentry_sdk .traces .start_span (
192+ name = span .name ,
193+ parent_span = span ,
194+ attributes = {
195+ "sentry.op" : OP .HTTP_CLIENT_STREAM ,
196+ "sentry.origin" : Boto3Integration .origin ,
197+ },
198+ )
236199
237200 orig_read = body .read
238201 orig_close = body .close
@@ -243,25 +206,16 @@ def sentry_streaming_body_read(*args: "Any", **kwargs: "Any") -> bytes:
243206 if ret :
244207 return ret
245208
246- if isinstance (streaming_span , StreamedSpan ):
247- streaming_span .end ()
248- else :
249- streaming_span .finish ()
209+ streaming_span .end ()
250210 return ret
251211 except Exception :
252- if isinstance (streaming_span , StreamedSpan ):
253- streaming_span .end ()
254- else :
255- streaming_span .finish ()
212+ streaming_span .end ()
256213 raise
257214
258215 body .read = sentry_streaming_body_read # type: ignore
259216
260217 def sentry_streaming_body_close (* args : "Any" , ** kwargs : "Any" ) -> None :
261- if isinstance (streaming_span , StreamedSpan ):
262- streaming_span .end ()
263- else :
264- streaming_span .finish ()
218+ streaming_span .end ()
265219 orig_close (* args , ** kwargs )
266220
267221 body .close = sentry_streaming_body_close # type: ignore
@@ -270,7 +224,7 @@ def sentry_streaming_body_close(*args: "Any", **kwargs: "Any") -> None:
270224def _sentry_after_call_error (
271225 context : "Dict[str, Any]" , exception : "Type[BaseException]" , ** kwargs : "Any"
272226) -> None :
273- span : "Optional[Union[Span, StreamedSpan] ]" = context .pop ("_sentrysdk_span" , None )
227+ span : "Optional[StreamedSpan]" = context .pop ("_sentrysdk_span" , None )
274228
275229 # Span could be absent if the integration is disabled.
276230 if span is None :
0 commit comments