
    `i3                        d dl m Z mZ d dl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mZ d d
l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) n# e*$ r  ed          w xY werd dlm+Z+m,Z,m-Z- d dl.m/Z0 d dl1m2Z2m3Z3 dZ4dZ5dZ6	 	 	 	 	 	 d dZ7 G d de          Z8dS )!    )datetimetimezone)time)TYPE_CHECKINGcast)
get_clientstart_transaction)INSTRUMENTER
SPANSTATUS)DidNotEnable)SENTRY_BAGGAGE_KEYSENTRY_TRACE_KEYadd_global_event_processor)TransactionSpan)	parse_url)	get_value)SpanProcessorReadableSpan)SpanAttributes)format_span_idformat_trace_idget_current_spanSpanKind)INVALID_SPAN_IDINVALID_TRACE_IDzopentelemetry not installed)AnyOptionalUnion)context)EventHintotel
   z	auto.oteleventr"   otel_span_map)dict[str, Union[Transaction, SentrySpan]]returnc                 "   t                      }|j        d         t          j        k    r| S t	          | d          r| d         dk    r| S t                      }|s| S |                                }|j        t          k    s|j	        t          k    r| S |                    t          |j	                  d           }|s| S |                     di           }|                    di                               |                                           | S )Ninstrumentertypetransactioncontextstrace)r   optionsr
   OTELhasattrr   get_span_contexttrace_idr   span_idr   getr   
setdefaultupdateget_trace_context)r&   r'   client	otel_spanctxsentry_spanr.   s          /home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/sentry_sdk/integrations/opentelemetry/span_processor.py!link_trace_context_to_error_eventr?   ,   s
    \\F~n%):::uf %-="@"@ ""I 

$
$
&
&C
|'''3;/+I+I##N3;$?$?FFK 
B//H$$++K,I,I,K,KLLLL    c                        e Zd ZU dZi Zded<   i Zded<   d fdZdd	ZddZ		 d	 	 	 	 	 ddZ
d dZdddefdZd!dZ	 	 	 	 	 	 d"dZ	 	 	 	 	 	 d#dZ	 	 	 	 	 	 d#dZ	 	 	 	 	 	 d#dZ xZS )$SentrySpanProcessorzZ
    Converts OTel spans into Sentry spans so they can be sent to the Sentry backend.
    r(   r'   zdict[int, set[str]]
open_spansr)   c                 ~    t          | d          s&t                                          |           | _        | j        S )Ninstance)r2   super__new__rE   )cls	__class__s    r>   rG   zSentrySpanProcessor.__new__U   s4    sJ'' 	0 77??3//CL|r@   Nc                 .     t           d fd            }d S )Nr&   r"   hintr#   r)   c                 .    t          | j                  S N)r?   r'   )r&   rK   selfs     r>   global_event_processorz<SentrySpanProcessor.__init__.<locals>.global_event_processor\   s    4UD<NOOOr@   )r&   r"   rK   r#   r)   r"   r   )rN   rO   s   ` r>   __init__zSentrySpanProcessor.__init__[   s>    	#	P 	P 	P 	P 	P 
$	#	P 	P 	Pr@   rN   c                    t          t                      dz            }t          | j                                                  D ]}| j        |         t                      k    r| j                            |           :||z
  t          k    r8| j                            |          D ]}| j                            |d           dS )z?
        Prune spans that have been open for too long.
        <   N)	intr   listrC   keyssetpopSPAN_MAX_TIME_OPEN_MINUTESr'   )rN   current_time_minutesspan_start_minutesr5   s       r>   _prune_old_spansz$SentrySpanProcessor._prune_old_spans`   s      #466B;//"&O  ""#
 #
 
	: 
	: 12cee;;##$67777 &(::=WWW#223EFF : :G&**7D9999
	: 
	:r@   r;   OTelSpanparent_contextOptional[context_api.Context]c           
         t                      }|j        sd S |j        d         t          j        k    rd S |                                j        sd S |                     |          rd S |                     ||          }|d         }|r| j	        
                    |          nd }d }|j        't          j        |j        dz  t          j                  }d }|r5|                    |d         |j        |t          j        t$                    }n=t'          |j        |d         ||d         |d         |t          j        t$                    }|| j	        |d         <   |j        Zt)          |j        dz  d	z            }	| j                            |	t/                                                    |d                    |                                  d S )
Nr+   parent_span_id    eAr5   )r5   namestart_timestampr+   originr4   baggage)rb   r5   r`   r4   re   rc   r+   rd   rR   )r   
parsed_dsnr0   r
   r1   r3   is_valid_is_sentry_span_get_trace_datar'   r6   
start_timer   fromtimestampr   utcstart_childrb   SPAN_ORIGINr	   rS   rC   r7   rV   addr[   )
rN   r;   r]   r:   
trace_datar`   sentry_parent_spanrc   r=   span_start_in_minutess
             r>   on_startzSentrySpanProcessor.on_startq   s   
   	F>.)\->>>F))++4 	F	** 	F)))^DD
#$456DND"">222$ 	 +&4$s*HL O  	,88"9-^ /)." 9  KK ,^"9--#J/"9- /)."	 	 	K 5@:i01+$'$s*R/% %! O&&'<ceeDDHH9%   	r@   c                    t                      }|j        d         t          j        k    rd S |                                }|j        sd S t          |j                  }| j        	                    |d           }|sd S |j
        |_        |                     ||           t          |t                    rQ|j
        |_
        |                    t           |                     |                     |                     ||           n|                     ||           d }|j        't+          j        |j        dz  t.          j                  }|                    |           |j        Tt7          |j        dz  dz            }| j                            |t=                                                    |           |                                   d S )Nr+   ra   )end_timestamprR   )!r   r0   r
   r1   r3   rg   r   r5   r'   rW   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   rk   r   rl   finishrj   rS   rC   r7   rV   discardr[   )rN   r;   r:   span_contextr5   r=   ru   rr   s           r>   on_endzSentrySpanProcessor.on_end   s   >.)\->>>F 1133$ 	F !566(,,Wd;; 	F"**;	BBBk;// 	E(~K##&(>(>y(I(I   33KKKKK ,,[)DDD)$2"S((, M 	777+$'$s*R/% %! O&&'<ceeDDLLWUUUr@   c                     d}|j         $|j                             t          j                  }t	          d|          }t                      j        }|r|j        nd}|r|r||v rdS dS )zs
        Break infinite loop:
        HTTP requests to Sentry are caught by OTel and send again to Sentry.
        NOptional[str]TF)
attributesr6   r   HTTP_URLr   r   rf   netloc)rN   r;   otel_span_urlrf   dsn_urls        r>   rh   z#SentrySpanProcessor._is_sentry_span   s{    
 +%044^5LMMM_m<<\\,
'1;*##t 	W 	M)A)A4ur@   dict[str, Any]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   )rN   r;   r<   s      r>   r{   z%SentrySpanProcessor._get_otel_context   sT    
  	; $Y%9 : :C( 	B"9#5#@AAC
O
r@   c                    i }|                                 }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.
        r5   r4   Nr`   z!dict[str, Union[str, bool, None]]parent_sampledre   )
r3   r   r5   r   r4   parentr   r   r   r   )
rN   r;   r]   rp   r   r5   r4   r`   sentry_trace_datare   s
             r>   ri   z#SentrySpanProcessor._get_trace_data   s     (*
 1133 !566 '
9"<#899!)
: 9B8HRN9+3444d 	 (6
#$%&6GG !DFWXX3DN.//$ 	#$ .?? '
9r@   r=   
SentrySpanc                     |j         j        rdS |j         j        r!|                    t          j                   dS |                    t          j                   dS )z?
        Set the Sentry span status from the OTel span
        N)statusis_unsetis_ok
set_statusr   OKINTERNAL_ERROR)rN   r=   r;   s      r>   rw   z1SentrySpanProcessor._update_span_with_otel_status  s]     $ 	F! 	"":=111Fz899999r@   c                 6   |                     d|j                   |j        }|j        }|j        Y|j                                        D ]\  }}|                     ||           |j                            t          j                  }t          d|          }|j                            t          j	                  }|rd}|j        t          j        k    r|dz  }n|j        t          j        k    r|dz  }|}|j                            t          j        d          }	|	r|d                    |	          z  }|j                            t          j        d          }
|
r|d                    |
          z  }|	s|
s|j                            t          j        d          }t          d|          }|rMt#          |          }d                    |j        |j        |j                  }|d                    |          z  }|j                            t          j        d          }t          d	|          }|r|                    |           n=|r;d
}|j                            t          j        d          }t          d|          }|r|}||_        ||_        dS )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   itemsr6   r   HTTP_METHODr   	DB_SYSTEMr   SERVERCLIENTNET_PEER_NAMEformatHTTP_TARGETr   urlparseschemer   pathHTTP_STATUS_CODEset_http_statusDB_STATEMENTrv   description)rN   r=   r;   rv   r   keyvalhttp_methoddb_query	peer_nametargeturl
parsed_urlstatus_code	statements                  r>   r}   z/SentrySpanProcessor._update_span_with_otel_data.  s    	[).999^n+%06688 / /S$$S#....#.22>3MNNK<<K +//0HIIH (,>X_44)OBB^x66)OB)%044^5QSWXX	 ;5<<	#:#::K"-11.2LdSS 85<<#7#77K  9 9#.22>3JDQQC44C 9%-c]]
)00&-z/@*/  $u||C'8'88'266"3T  #?K@@ =//<<< ,%044^5PRVWW	 )<<	 ,"+K"-r@   c                 z   |j         d S |j                             t          j                  }|r|j                             t          j                  }t          d|          }|r|                    |           d}|j        t          j	        k    r|dz  }n|j        t          j
        k    r|dz  }||_        d S d S )Nr   r   r   r   )r   r6   r   r   r   r   r   r   r   r   r   rv   )rN   r=   r;   r   r   rv   s         r>   r|   z6SentrySpanProcessor._update_transaction_with_otel_datap  s     'F*..~/IJJ 	 #.22>3RSSK<<K 9++K888B~00i8?22iKNNN	  	 r@   )r)   rB   )r)   N)rN   rB   r)   NrM   )r;   r\   r]   r^   r)   N)r;   r\   r)   N)r;   r\   r)   r   )r;   r\   r]   r^   r)   r   )r=   r   r;   r\   r)   N)__name__
__module____qualname____doc__r'   __annotations__rC   rG   rP   r[   rs   r   boolrh   r{   ri   rw   r}   r|   __classcell__)rI   s   @r>   rB   rB   J   s         
 BDM>CCC )+J%***     P P P P
: : : :( ;?? ?  8?  
	?  ?  ?  ? B+  +  +  + Z     $   #5T	   >:':4>:	: : : :@.'@.4>@.	@. @. @. @.D ' 4> 	               r@   rB   N)r&   r"   r'   r(   r)   r"   )9r   r   r   typingr   r   
sentry_sdkr   r	   sentry_sdk.constsr
   r   sentry_sdk.integrationsr   ,sentry_sdk.integrations.opentelemetry.constsr   r   sentry_sdk.scoper   sentry_sdk.tracingr   r   r   urllib3.utilr   r   opentelemetry.contextr   opentelemetry.sdk.tracer   r   r\   opentelemetry.semconv.tracer   opentelemetry.tracer   r   r   r   opentelemetry.trace.spanr   r   ImportErrorr   r   r    opentelemetryr!   context_apisentry_sdk._typesr"   r#   rz   rX   rn   r?   rB    r@   r>   <module>r      s   ' ' ' ' ' ' ' '       & & & & & & & & 4 4 4 4 4 4 4 4 6 6 6 6 6 6 6 6 0 0 0 0 0 0        8 7 7 7 7 7 > > > > > > > > . . . . . .6//////OOOOOOOO::::::                     6 6 6
,4
5
556  .++++++++++444444--------  #N   <{  {  {  {  { - {  {  {  {  { s   
(A3 3B