
    gh3                     J   S SK J r Jr  S SKJr  S SKJrJr  S SKJr  S SKJ	r	J
r  S SKJr  S SKJrJrJrJr  S SKJrJr  S S	KJrJr  S S
KJrJr  S SKJrJr  S SKJ r   S SK!J"r"J#r$  S SK%J&r&  S SK'J(r)  \(       a  S SKJ*r*J+r+J,r,  S SK-J.r/  S SK0J1r1J2r2  Sr3Sr4Sr5S r6 " S S\	5      r7g)    )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                    [        5       nUR                  S   [        R                  :w  a  U $ [	        U S5      (       a  U S   S:X  a  U $ [        5       nU(       d  U $ UR                  5       nUR                  [        :X  d  UR                  [        :X  a  U $ UR                  [        UR                  5      S 5      nU(       d  U $ U R                  S0 5      nUR                  S0 5      R                  UR                  5       5        U $ )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          w/home/kali/devsecops-assessor/venv/lib/python3.13/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                   t   ^  \ rS rSrSr0 r0 rU 4S jrS rS r	SS jr
S rS rS	 rS
 rS rS rS rSrU =r$ )SentrySpanProcessorE   zR
Converts OTel spans into Sentry spans so they can be sent to the Sentry backend.
c                 f   > [        U S5      (       d  [        TU ]	  U 5      U l        U R                  $ )Ninstance)r.   super__new__rC   )cls	__class__s    r<   rE   SentrySpanProcessor.__new__P   s*    sJ'' 7?3/CL||r>   c                 $   ^  [         U 4S j5       ng )Nc                 0   > [        U TR                  5      $ N)r=   r7   )r6   hintselfs     r<   global_event_processor<SentrySpanProcessor.__init__.<locals>.global_event_processorY   s     5UD<N<NOOr>   r   )rM   rN   s   ` r<   __init__SentrySpanProcessor.__init__W   s    	#	P 
$	Pr>   c                    [        [        5       S-  5      n[        U R                  R	                  5       5       H  nU R                  U   [        5       :X  a  U R                  R                  U5        M;  X-
  [        :  d  MI  U R                  R                  U5       H  nU R                  R                  US5        M!     M     g)z/
Prune spans that have been open for too long.
<   N)	intr   list
open_spanskeyssetpopSPAN_MAX_TIME_OPEN_MINUTESr7   )rM   current_time_minutesspan_start_minutesr1   s       r<   _prune_old_spans$SentrySpanProcessor._prune_old_spans^   s    
  #46B;/"&OO  "#
 12ce;##$67 &:=WW#223EFG&&**7D9  G#
r>   c                    [        5       nUR                  (       d  g  [        UR                  5      nUR                  S   [
        R                  :w  a  g UR                  5       R                  (       d  g U R                  U5      (       a  g U R                  X5      nUS   nU(       a  U R                  R                  U5      OS nS nUR                  b2  [        R                  " UR                  S-  [         R"                  5      nS n	U(       a3  UR%                  US   UR&                  U[
        R                  [(        S9n	O5[+        UR&                  US   UUS   US   U[
        R                  [(        S9n	XR                  US   '   UR                  bQ  [-        UR                  S-  S	-  5      n
U R.                  R1                  U
[3        5       5      R5                  US   5        U R7                  5         g ! [         a     g f = f)
Nr'   parent_span_id    eAr1   )r1   namestart_timestampr'   originr0   baggage)rb   r1   r`   r0   re   rc   r'   rd   rS   )r   dsnr   	Exceptionr,   r   r-   r/   is_valid_is_sentry_span_get_trace_datar7   r2   
start_timer   fromtimestampr   utcstart_childrb   SPAN_ORIGINr   rT   rV   r3   rX   addr]   )rM   r9   parent_contextr8   _
trace_datar`   sentry_parent_spanrc   r;   span_start_in_minutess              r<   on_start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   G8 8
HHc                    [        5       nUR                  S   [        R                  :w  a  g UR	                  5       nUR
                  (       d  g [        UR                  5      nU R                  R                  US 5      nU(       d  g UR                  Ul        U R                  XQ5        [        U[        5      (       aH  UR                  Ul
        UR                  [         U R#                  U5      5        U R%                  XQ5        OU R'                  XQ5        S nUR(                  b2  [*        R,                  " UR(                  S-  [.        R0                  5      nUR3                  US9  UR4                  bN  [7        UR4                  S-  S-  5      nU R8                  R;                  U[=        5       5      R?                  U5        U RA                  5         g )Nr'   ra   )end_timestamprS   )!r   r,   r   r-   r/   rh   r   r1   r7   rY   rb   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   rl   r   rm   finishrk   rT   rV   r3   rX   discardr]   )rM   r9   r8   span_contextr1   r;   ry   ru   s           r<   on_end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                 ,   SnUR                   b)  UR                   R                  [        R                  5      n[	        SU5      nSn[        5       nUR                  (       a  [        UR                  5      R                  nU(       a  U(       a  X2;   a  gg)z[
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   rf   r   netloc)rM   r9   otel_span_urldsn_urlr8   s        r<   ri   #SentrySpanProcessor._is_sentry_span   ss     +%0044^5L5LMM_m<::&**o,,GW)Ar>   c                     0 nUR                   (       a  [        UR                   5      US'   UR                  R                   (       a"  [        UR                  R                   5      US'   U$ )z
Returns the OTel context for Sentry.
See: https://develop.sentry.dev/sdk/performance/opentelemetry/#step-5-add-opentelemetry-context
r   resource)r   dictr   )rM   r9   r:   s      r<   r   %SentrySpanProcessor._get_otel_context   sU      $Y%9%9 :C(("9#5#5#@#@AC
O
r>   c                 |   0 nUR                  5       n[        UR                  5      nXSS'   [        UR                  5      nXcS'   UR
                  (       a  [        UR
                  R                  5      OSnXsS'   [        [        U5      n[        SU5      nU(       a  US   OSUS'   [        [        U5      n	XS'   U$ )zN
Extracts tracing information from one OTel span and its parent OTel context.
r1   r0   Nr`   z!dict[str, Union[str, bool, None]]parent_sampledre   )
r/   r   r1   r   r0   parentr   r   r   r   )
rM   r9   rq   rs   r   r1   r0   r`   sentry_trace_datare   s
             r<   rj   #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                     UR                   R                  (       a  gUR                   R                  (       a   UR                  [        R
                  5        gUR                  [        R                  5        g)z/
Set the Sentry span status from the OTel span
N)statusis_unsetis_ok
set_statusr   OKINTERNAL_ERROR)rM   r;   r9   s      r<   r{   1SentrySpanProcessor._update_span_with_otel_status$  sN    
 $$!!"":==1z889r>   c                    UR                  SUR                  5        UR                  nUR                  nUR                  Gb  UR                  R	                  5        H  u  pVUR                  XV5        M     UR                  R                  [        R                  5      n[        SU5      nUR                  R                  [        R                  5      nU(       Ga  SnUR                  [        R                  :X  a  US-  nO#UR                  [        R                  :X  a  US-  nUnUR                  R                  [        R                  S5      n	U	(       a  USR                  U	5      -  nUR                  R                  [        R                  S5      n
U
(       a  USR                  U
5      -  nU	(       d  U
(       d  UR                  R                  [        R                   S5      n[        SU5      nU(       aP  [#        U5      nSR                  UR$                  UR&                  UR(                  5      nUSR                  U5      -  nUR                  R                  [        R*                  S5      n[        S	U5      nU(       a  UR-                  U5        OHU(       aA  S
nUR                  R                  [        R.                  S5      n[        SU5      nU(       a  UnX1l        XAl        g)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kindrb   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_STATEMENTrz   description)rM   r;   r9   rz   r   keyvalhttp_methoddb_query	peer_nametargeturl
parsed_urlstatus_code	statements                  r<   r   /SentrySpanProcessor._update_span_with_otel_data2  sK    	[)..9^^nn+%00668$$S. 9 $..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                    UR                   c  g UR                   R                  [        R                  5      nU(       a  UR                   R                  [        R                  5      n[        SU5      nU(       a  UR                  U5        SnUR                  [        R                  :X  a  US-  nO#UR                  [        R                  :X  a  US-  nXQl        g g )Nr   r   r   r   )r   r2   r   r   r   r   r   r   r   r   r   rz   )rM   r;   r9   r   r   rz   s         r<   r   6SentrySpanProcessor._update_transaction_with_otel_datas  s    '**..~/I/IJ#..22>3R3RSK<K++K8B~~0i8??2iN r>    rK   )__name__
__module____qualname____firstlineno____doc__r7   rV   rE   rP   r]   rv   r   ri   r   rj   r{   r   r   __static_attributes____classcell__)rG   s   @r<   r@   r@   E   sW    
 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#   r~   rZ   ro   r=   r@   r   r>   r<   <module>r      st    '  & + K 6  5 6 8 >   .++4-  :B - B r>   