
    lh3                     @   d dl m Z mZ d dlmZ d dlmZmZ d dlmZ d dlm	Z	m
Z d dlmZ d dlmZmZmZmZ d dlmZmZ d d	lmZmZ d d
lmZmZ d dlmZmZ d dlm Z  d dl!m"Z"m#Z$ d dl%m&Z& d dl'm(Z) erd dlm*Z*m+Z+m,Z, d dl-m.Z/ d dl0m1Z1m2Z2 dZ3dZ4dZ5d Z6 G d de	      Z7y)    )datetimetimezone)time)TYPE_CHECKINGcast)	get_value)SpanProcessorReadableSpan)SpanAttributes)format_span_idformat_trace_idget_current_spanSpanKind)INVALID_SPAN_IDINVALID_TRACE_ID)
get_clientstart_transaction)INSTRUMENTER
SPANSTATUS)SENTRY_BAGGAGE_KEYSENTRY_TRACE_KEYadd_global_event_processor)TransactionSpan)Dsn)	parse_url)AnyOptionalUnion)context)EventHintotel
   z	auto.otelc                    t               }|j                  d   t        j                  k7  r| S t	        | d      r
| d   dk(  r| S t               }|s| S |j                         }|j                  t        k(  s|j                  t        k(  r| S |j                  t        |j                        d       }|s| S | j                  di       }|j                  di       j                  |j                                | S )Ninstrumentertypetransactioncontextstrace)r   optionsr   OTELhasattrr   get_span_contexttrace_idr   span_idr   getr   
setdefaultupdateget_trace_context)eventotel_span_mapclient	otel_spanctxsentry_spanr*   s          /var/www/pru.catia.catastroantioquia-mas.com/tasa/lib/python3.12/site-packages/sentry_sdk/integrations/opentelemetry/span_processor.py!link_trace_context_to_error_eventr=   (   s    \F~~n%):)::uf%-="@ "I

$
$
&C
||''3;;/+I##N3;;$?FK
B/H$++K,I,I,KLL    c                   h     e Zd ZdZi Zi Z fdZd Zd ZddZ	d Z
d Zd Zd	 Zd
 Zd Zd Z xZS )SentrySpanProcessorzZ
    Converts OTel spans into Sentry spans so they can be sent to the Sentry backend.
    c                 \    t        | d      st        | 	  |       | _        | j                  S )Ninstance)r.   super__new__rB   )cls	__class__s    r<   rD   zSentrySpanProcessor.__new__P   s'    sJ' 7?3/CL||r>   c                 "     t          fd       }y )Nc                 0    t        | j                        S N)r=   r7   )r6   hintselfs     r<   global_event_processorz<SentrySpanProcessor.__init__.<locals>.global_event_processorY   s     5UD<N<NOOr>   r   )rK   rL   s   ` r<   __init__zSentrySpanProcessor.__init__W   s    	#	P 
$	Pr>   c                 ~   t        t               dz        }t        | j                  j	                               D ]  }| j                  |   t               k(  r| j                  j                  |       9||z
  t        kD  sF| j                  j                  |      D ]  }| j                  j                  |d          y)z?
        Prune spans that have been open for too long.
        <   N)	intr   list
open_spanskeyssetpopSPAN_MAX_TIME_OPEN_MINUTESr7   )rK   current_time_minutesspan_start_minutesr1   s       r<   _prune_old_spansz$SentrySpanProcessor._prune_old_spans^   s    
  #46B;/"&OO  "#
 
	: 12ce;##$67 &(::=WW#223EF :G&&**7D9:
	:r>   c           
         t               }|j                  sy 	 t        |j                        }|j                  d   t
        j                  k7  ry |j                         j                  sy | j                  |      ry | j                  ||      }|d   }|r| j                  j                  |      nd }d }|j                  1t        j                  |j                  dz  t         j"                        }d }	|r6|j%                  |d   |j&                  |t
        j                  t(              }	n8t+        |j&                  |d   ||d   |d   |t
        j                  t(              }	|	| j                  |d   <   |j                  Qt-        |j                  dz  d	z        }
| j.                  j1                  |
t3                     j5                  |d          | j7                          y # t        $ r Y y w xY w)
Nr'   parent_span_id    eAr1   )r1   namestart_timestampr'   originr0   baggage)r]   r1   r[   r0   r`   r^   r'   r_   rO   )r   dsnr   	Exceptionr,   r   r-   r/   is_valid_is_sentry_span_get_trace_datar7   r2   
start_timer   fromtimestampr   utcstart_childr]   SPAN_ORIGINr   rP   rR   r3   rT   addrY   )rK   r9   parent_contextr8   _
trace_datar[   sentry_parent_spanr^   r;   span_start_in_minutess              r<   on_startzSentrySpanProcessor.on_startp   s   zz	FJJA >>.)\->->>))+44	*)))^D
#$456DD"">2$ 	 +&44$$s*HLLO ,88"9-^^ /).." 9 K ,^^"9--#J/"9- /).."	K 5@:i01+$'$$s*R/%! OO&&'<ceDHH9% 	q  		s   G# #	G/.G/c                    t               }|j                  d   t        j                  k7  ry |j	                         }|j
                  sy t        |j                        }| j                  j                  |d       }|sy |j                  |_        | j                  ||       t        |t              rI|j                  |_
        |j                  t         | j#                  |             | j%                  ||       n| j'                  ||       d }|j(                  1t+        j,                  |j(                  dz  t.        j0                        }|j3                  |       |j4                  Nt7        |j4                  dz  dz        }| j8                  j;                  |t=                     j?                  |       | jA                          y )Nr'   r\   )end_timestamprO   )!r   r,   r   r-   r/   rc   r   r1   r7   rU   r]   op_update_span_with_otel_status
isinstancer   set_contextOPEN_TELEMETRY_CONTEXT_get_otel_context"_update_transaction_with_otel_data_update_span_with_otel_dataend_timer   rg   r   rh   finishrf   rP   rR   r3   rT   discardrY   )rK   r9   r8   span_contextr1   r;   rs   rp   s           r<   on_endzSentrySpanProcessor.on_end   s   >>.)\->->> 113$$ !5!56((,,Wd;"**;	Bk;/(~~K##&(>(>y(I 33KK ,,[)D)$22""S((,,M 	7+$'$$s*R/%! OO&&'<ceDLLWUr>   c                 
   d}|j                   )|j                   j                  t        j                        }t	        d|      }d}t               }|j                  rt        |j                        j                  }|r|r||v ryy)zs
        Break infinite loop:
        HTTP requests to Sentry are caught by OTel and send again to Sentry.
        NOptional[str]TF)	
attributesr2   r   HTTP_URLr   r   ra   r   netloc)rK   r9   otel_span_urldsn_urlr8   s        r<   rd   z#SentrySpanProcessor._is_sentry_span   su     +%0044^5L5LMM_m<::&**o,,GWM)Ar>   c                     i }|j                   rt        |j                         |d<   |j                  j                   r"t        |j                  j                         |d<   |S )z
        Returns the OTel context for Sentry.
        See: https://develop.sentry.dev/sdk/performance/opentelemetry/#step-5-add-opentelemetry-context
        r   resource)r   dictr   )rK   r9   r:   s      r<   ry   z%SentrySpanProcessor._get_otel_context   sU      $Y%9%9 :C(("9#5#5#@#@AC
O
r>   c                 p   i }|j                         }t        |j                        }||d<   t        |j                        }||d<   |j
                  rt        |j
                  j                        nd}||d<   t        t        |      }t        d|      }|r|d   nd|d<   t        t        |      }	|	|d<   |S )z^
        Extracts tracing information from one OTel span and its parent OTel context.
        r1   r0   Nr[   z!dict[str, Union[str, bool, None]]parent_sampledr`   )
r/   r   r1   r   r0   parentr   r   r   r   )
rK   r9   rl   rn   r   r1   r0   r[   sentry_trace_datar`   s
             r<   re   z#SentrySpanProcessor._get_trace_data  s    
 
 113 !5!56 '
9"<#8#89!)
: 9B8H8HN9++334d 	 (6
#$%&6G !DFWX3D./$ 	#$ .? '
9r>   c                     |j                   j                  ry|j                   j                  r |j                  t        j
                         y|j                  t        j                         y)z?
        Set the Sentry span status from the OTel span
        N)statusis_unsetis_ok
set_statusr   OKINTERNAL_ERROR)rK   r;   r9   s      r<   ru   z1SentrySpanProcessor._update_span_with_otel_status$  sN    
 $$!!"":==1z889r>   c                    |j                  d|j                         |j                  }|j                  }|j                  r|j                  j	                         D ]  \  }}|j                  ||        |j                  j                  t        j                        }t        d|      }|j                  j                  t        j                        }|rd}|j                  t        j                  k(  r|dz  }n"|j                  t        j                  k(  r|dz  }|}|j                  j                  t        j                  d      }	|	r|dj                  |	      z  }|j                  j                  t        j                  d      }
|
r|dj                  |
      z  }|	s|
s|j                  j                  t        j                   d      }t        d|      }|rPt#        |      }dj                  |j$                  |j&                  |j(                        }|dj                  |      z  }|j                  j                  t        j*                  d      }t        d	|      }|rP|j-                  |       n>|r<d
}|j                  j                  t        j.                  d      }t        d|      }|r|}||_        ||_        y)z
        Convert OTel span data and update the Sentry span with it.
        This should eventually happen on the server when ingesting the spans.
        z	otel.kindNr   http.server.clientz {}z	{}://{}{}Optional[int]db)set_datakindr]   r   itemsr2   r   HTTP_METHODr   	DB_SYSTEMr   SERVERCLIENTNET_PEER_NAMEformatHTTP_TARGETr   urlparseschemer   pathHTTP_STATUS_CODEset_http_statusDB_STATEMENTrt   description)rK   r;   r9   rt   r   keyvalhttp_methoddb_query	peer_nametargeturl
parsed_urlstatus_code	statements                  r<   r{   z/SentrySpanProcessor._update_span_with_otel_data2  sW    	[)..9^^nn+%00668 /S$$S#./ $..22>3M3MNK<K ++//0H0HIH>>X__4)OB^^x6)OB)%0044^5Q5QSWX	5<<	#::K"--11.2L2LdS5<<#77K #..22>3J3JDQC4C%-c]
)00&--z/@/@*// $u||C'88'2266"33T #?K@//<%0044^5P5PRVW	 )<	"+K"-r>   c                    |j                   y |j                   j                  t        j                        }|r|j                   j                  t        j                        }t        d|      }|r|j                  |       d}|j                  t        j                  k(  r|dz  }n"|j                  t        j                  k(  r|dz  }||_        y y )Nr   r   r   r   )r   r2   r   r   r   r   r   r   r   r   r   rt   )rK   r;   r9   r   r   rt   s         r<   rz   z6SentrySpanProcessor._update_transaction_with_otel_datas  s    '**..~/I/IJ#..22>3R3RSK<K++K8B~~0i8??2iKN r>   rI   )__name__
__module____qualname____doc__r7   rR   rD   rM   rY   rq   r   rd   ry   re   ru   r{   rz   __classcell__)rF   s   @r<   r@   r@   E   sR    
 M JP:$A F, \* <:?.B r>   r@   N)8r   r   r   typingr   r   opentelemetry.contextr   opentelemetry.sdk.tracer	   r
   OTelSpanopentelemetry.semconv.tracer   opentelemetry.tracer   r   r   r   opentelemetry.trace.spanr   r   
sentry_sdkr   r   sentry_sdk.constsr   r   ,sentry_sdk.integrations.opentelemetry.constsr   r   sentry_sdk.scoper   sentry_sdk.tracingr   r   
SentrySpansentry_sdk.utilsr   urllib3.utilr   r   r   r   r    opentelemetryr!   context_apisentry_sdk._typesr"   r#   rx   rV   rj   r=   r@    r>   r<   <module>r      st    '  & + K 6  5 6 8 >   .++4-  :B - B r>   