4
4
5
5
from opentelemetry .context import get_value
6
6
from opentelemetry .sdk .trace import SpanProcessor , ReadableSpan as OTelSpan
7
- from opentelemetry .semconv .trace import SpanAttributes
8
7
from opentelemetry .trace import (
9
8
format_span_id ,
10
9
format_trace_id ,
11
10
get_current_span ,
12
- SpanKind ,
13
11
)
14
12
from opentelemetry .trace .span import (
15
13
INVALID_SPAN_ID ,
20
18
from sentry_sdk .integrations .opentelemetry .consts import (
21
19
SENTRY_BAGGAGE_KEY ,
22
20
SENTRY_TRACE_KEY ,
21
+ OTEL_SENTRY_CONTEXT ,
22
+ SPAN_ORIGIN ,
23
+ )
24
+ from sentry_sdk .integrations .opentelemetry .utils import (
25
+ is_sentry_span ,
26
+ extract_span_data ,
23
27
)
24
28
from sentry_sdk .scope import add_global_event_processor
25
29
from sentry_sdk .tracing import Transaction , Span as SentrySpan
26
- from sentry_sdk .utils import Dsn
27
30
from sentry_sdk ._types import TYPE_CHECKING
28
31
29
- from urllib3 .util import parse_url as urlparse
30
32
31
33
if TYPE_CHECKING :
32
34
from typing import Any , Optional , Union
33
35
from opentelemetry import context as context_api
34
36
from sentry_sdk ._types import Event , Hint
35
37
36
- OPEN_TELEMETRY_CONTEXT = "otel"
37
38
SPAN_MAX_TIME_OPEN_MINUTES = 10
38
- SPAN_ORIGIN = "auto.otel"
39
39
40
40
41
41
def link_trace_context_to_error_event (event , otel_span_map ):
@@ -117,18 +117,13 @@ def on_start(self, otel_span, parent_context=None):
117
117
if not client .dsn :
118
118
return
119
119
120
- try :
121
- _ = Dsn (client .dsn )
122
- except Exception :
123
- return
124
-
125
120
if client .options ["instrumenter" ] != INSTRUMENTER .OTEL :
126
121
return
127
122
128
123
if not otel_span .get_span_context ().is_valid :
129
124
return
130
125
131
- if self . _is_sentry_span (otel_span ):
126
+ if is_sentry_span (otel_span ):
132
127
return
133
128
134
129
trace_data = self ._get_trace_data (otel_span , parent_context )
@@ -200,7 +195,7 @@ def on_end(self, otel_span):
200
195
if isinstance (sentry_span , Transaction ):
201
196
sentry_span .name = otel_span .name
202
197
sentry_span .set_context (
203
- OPEN_TELEMETRY_CONTEXT , self ._get_otel_context (otel_span )
198
+ OTEL_SENTRY_CONTEXT , self ._get_otel_context (otel_span )
204
199
)
205
200
self ._update_transaction_with_otel_data (sentry_span , otel_span )
206
201
@@ -223,27 +218,6 @@ def on_end(self, otel_span):
223
218
224
219
self ._prune_old_spans ()
225
220
226
- def _is_sentry_span (self , otel_span ):
227
- # type: (OTelSpan) -> bool
228
- """
229
- Break infinite loop:
230
- HTTP requests to Sentry are caught by OTel and send again to Sentry.
231
- """
232
- otel_span_url = None
233
- if otel_span .attributes is not None :
234
- otel_span_url = otel_span .attributes .get (SpanAttributes .HTTP_URL )
235
- otel_span_url = cast ("Optional[str]" , otel_span_url )
236
-
237
- dsn_url = None
238
- client = get_client ()
239
- if client .dsn :
240
- dsn_url = Dsn (client .dsn ).netloc
241
-
242
- if otel_span_url and dsn_url and dsn_url in otel_span_url :
243
- return True
244
-
245
- return False
246
-
247
221
def _get_otel_context (self , otel_span ):
248
222
# type: (OTelSpan) -> dict[str, Any]
249
223
"""
@@ -312,81 +286,19 @@ def _update_span_with_otel_data(self, sentry_span, otel_span):
312
286
"""
313
287
sentry_span .set_data ("otel.kind" , otel_span .kind )
314
288
315
- op = otel_span .name
316
- description = otel_span .name
317
-
318
289
if otel_span .attributes is not None :
319
290
for key , val in otel_span .attributes .items ():
320
291
sentry_span .set_data (key , val )
321
292
322
- http_method = otel_span .attributes .get (SpanAttributes .HTTP_METHOD )
323
- http_method = cast ("Optional[str]" , http_method )
324
-
325
- db_query = otel_span .attributes .get (SpanAttributes .DB_SYSTEM )
326
-
327
- if http_method :
328
- op = "http"
329
-
330
- if otel_span .kind == SpanKind .SERVER :
331
- op += ".server"
332
- elif otel_span .kind == SpanKind .CLIENT :
333
- op += ".client"
334
-
335
- description = http_method
336
-
337
- peer_name = otel_span .attributes .get (SpanAttributes .NET_PEER_NAME , None )
338
- if peer_name :
339
- description += " {}" .format (peer_name )
340
-
341
- target = otel_span .attributes .get (SpanAttributes .HTTP_TARGET , None )
342
- if target :
343
- description += " {}" .format (target )
344
-
345
- if not peer_name and not target :
346
- url = otel_span .attributes .get (SpanAttributes .HTTP_URL , None )
347
- url = cast ("Optional[str]" , url )
348
- if url :
349
- parsed_url = urlparse (url )
350
- url = "{}://{}{}" .format (
351
- parsed_url .scheme , parsed_url .netloc , parsed_url .path
352
- )
353
- description += " {}" .format (url )
354
-
355
- status_code = otel_span .attributes .get (
356
- SpanAttributes .HTTP_STATUS_CODE , None
357
- )
358
- status_code = cast ("Optional[int]" , status_code )
359
- if status_code :
360
- sentry_span .set_http_status (status_code )
361
-
362
- elif db_query :
363
- op = "db"
364
- statement = otel_span .attributes .get (SpanAttributes .DB_STATEMENT , None )
365
- statement = cast ("Optional[str]" , statement )
366
- if statement :
367
- description = statement
368
-
293
+ (op , description , status_code ) = extract_span_data (otel_span )
369
294
sentry_span .op = op
370
295
sentry_span .description = description
296
+ if status_code :
297
+ sentry_span .set_http_status (status_code )
371
298
372
299
def _update_transaction_with_otel_data (self , sentry_span , otel_span ):
373
300
# type: (SentrySpan, OTelSpan) -> None
374
- if otel_span .attributes is None :
375
- return
376
-
377
- http_method = otel_span .attributes .get (SpanAttributes .HTTP_METHOD )
378
-
379
- if http_method :
380
- status_code = otel_span .attributes .get (SpanAttributes .HTTP_STATUS_CODE )
381
- status_code = cast ("Optional[int]" , status_code )
382
- if status_code :
383
- sentry_span .set_http_status (status_code )
384
-
385
- op = "http"
386
-
387
- if otel_span .kind == SpanKind .SERVER :
388
- op += ".server"
389
- elif otel_span .kind == SpanKind .CLIENT :
390
- op += ".client"
391
-
392
- sentry_span .op = op
301
+ (op , _ , status_code ) = extract_span_data (otel_span )
302
+ sentry_span .op = op
303
+ if status_code :
304
+ sentry_span .set_http_status (status_code )
0 commit comments