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
"""
@@ -315,81 +289,19 @@ def _update_span_with_otel_data(self, sentry_span, otel_span):
315
289
"""
316
290
sentry_span .set_data ("otel.kind" , otel_span .kind )
317
291
318
- op = otel_span .name
319
- description = otel_span .name
320
-
321
292
if otel_span .attributes is not None :
322
293
for key , val in otel_span .attributes .items ():
323
294
sentry_span .set_data (key , val )
324
295
325
- http_method = otel_span .attributes .get (SpanAttributes .HTTP_METHOD )
326
- http_method = cast ("Optional[str]" , http_method )
327
-
328
- db_query = otel_span .attributes .get (SpanAttributes .DB_SYSTEM )
329
-
330
- if http_method :
331
- op = "http"
332
-
333
- if otel_span .kind == SpanKind .SERVER :
334
- op += ".server"
335
- elif otel_span .kind == SpanKind .CLIENT :
336
- op += ".client"
337
-
338
- description = http_method
339
-
340
- peer_name = otel_span .attributes .get (SpanAttributes .NET_PEER_NAME , None )
341
- if peer_name :
342
- description += " {}" .format (peer_name )
343
-
344
- target = otel_span .attributes .get (SpanAttributes .HTTP_TARGET , None )
345
- if target :
346
- description += " {}" .format (target )
347
-
348
- if not peer_name and not target :
349
- url = otel_span .attributes .get (SpanAttributes .HTTP_URL , None )
350
- url = cast ("Optional[str]" , url )
351
- if url :
352
- parsed_url = urlparse (url )
353
- url = "{}://{}{}" .format (
354
- parsed_url .scheme , parsed_url .netloc , parsed_url .path
355
- )
356
- description += " {}" .format (url )
357
-
358
- status_code = otel_span .attributes .get (
359
- SpanAttributes .HTTP_STATUS_CODE , None
360
- )
361
- status_code = cast ("Optional[int]" , status_code )
362
- if status_code :
363
- sentry_span .set_http_status (status_code )
364
-
365
- elif db_query :
366
- op = "db"
367
- statement = otel_span .attributes .get (SpanAttributes .DB_STATEMENT , None )
368
- statement = cast ("Optional[str]" , statement )
369
- if statement :
370
- description = statement
371
-
296
+ (op , description , status_code ) = extract_span_data (otel_span )
372
297
sentry_span .op = op
373
298
sentry_span .description = description
299
+ if status_code :
300
+ sentry_span .set_http_status (status_code )
374
301
375
302
def _update_transaction_with_otel_data (self , sentry_span , otel_span ):
376
303
# type: (SentrySpan, OTelSpan) -> None
377
- if otel_span .attributes is None :
378
- return
379
-
380
- http_method = otel_span .attributes .get (SpanAttributes .HTTP_METHOD )
381
-
382
- if http_method :
383
- status_code = otel_span .attributes .get (SpanAttributes .HTTP_STATUS_CODE )
384
- status_code = cast ("Optional[int]" , status_code )
385
- if status_code :
386
- sentry_span .set_http_status (status_code )
387
-
388
- op = "http"
389
-
390
- if otel_span .kind == SpanKind .SERVER :
391
- op += ".server"
392
- elif otel_span .kind == SpanKind .CLIENT :
393
- op += ".client"
394
-
395
- sentry_span .op = op
304
+ (op , _ , status_code ) = extract_span_data (otel_span )
305
+ sentry_span .op = op
306
+ if status_code :
307
+ sentry_span .set_http_status (status_code )
0 commit comments