o
    Zh=                     @   s  d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dlm	Z	m
Z
mZmZmZmZmZmZ d dlmZmZmZ d dlmZ erQd dlmZ d dlmZmZ nd dlmZ d dlmZmZ erd dlZd dlmZ d d	lm Z  d d
lm!Z! d dlm"Z" d dlm#Z# d dl$m%Z% e&dZ'dZ(G dd deZ)dd Z*e j+	d&ddZ,dd Z-dd Z.dd Z/dd Z0G dd  d e1Z2d!d" Z3d#d$ Z4d d%l5m6Z6 dS )'    N)OPSPANDATA)capture_internal_exceptionsfilename_for_moduleDsnmatch_regex_list	to_stringis_sentry_url_is_external_source_module_in_list)PY2duration_in_milliseconds	iteritems)TYPE_CHECKING)Mapping)quoteunquote)Any)Dict)	Generator)Optional)Union)	FrameTypez5^[ 	]*([0-9a-f]{32})?-?([0-9a-f]{16})?-?([01])?[ 	]*$z(([a-zA-Z0-9+/]{4})*([a-zA-Z0-9+/]{2,3})?c                   @   s0   e Zd Z	dddZdd Zdd Zdd	 Zd
S )EnvironHeadersHTTP_c                 C   s   || _ || _d S N)environprefix)selfr   r    r   O/var/www/html/lang_env/lib/python3.10/site-packages/sentry_sdk/tracing_utils.py__init__=   s   
zEnvironHeaders.__init__c                 C   s   | j | j|dd   S N-_)r   r   replaceupper)r   keyr   r   r    __getitem__F   s   zEnvironHeaders.__getitem__c                 C   s   t dd t| D S )Nc                 s   s    | ]}d V  qdS )   Nr   ).0r$   r   r   r    	<genexpr>L   s    z)EnvironHeaders.__len__.<locals>.<genexpr>)sumiterr   r   r   r    __len__J   s   zEnvironHeaders.__len__c                 c   sP    | j D ]!}t|tsq|dd }|| jsq|t| jd  V  qd S r"   )r   
isinstancestrr%   r&   
startswithr   len)r   kr   r   r    __iter__N   s   

zEnvironHeaders.__iter__N)r   )__name__
__module____qualname__r!   r(   r/   r5   r   r   r   r    r   <   s    
	r   c                 C   s:   | du rdS t | dduo| ddup| dduS )z}
    Returns True if either traces_sample_rate or traces_sampler is
    defined and enable_tracing is set and not false.
    NFZenable_tracingtraces_sample_rateZtraces_sampler)boolget)optionsr   r   r    has_tracing_enabled[   s   r=   Fc                 c   s"   | j r| j jd ddr|r|d gkrd }|dkrd}nd }d }t||}i }|d ur1||d< |d ur9||d< |r?d|d	< |rI|d urI||d
< t  | j|d|d W d    n1 s_w   Y  | jtj|d}|	 D ]
\}	}
|
|	|
 qq|V  W d    d S 1 sw   Y  d S )NZ_experimentsZrecord_sql_paramsFZpyformatformatz	db.paramszdb.paramstyleTzdb.executemanyz	db.cursorquery)messagecategorydata)opdescription)clientr<   r;   _format_sqlr   add_breadcrumbZ
start_spanr   ZDBitemsset_data)hubcursorr?   Zparams_listZ
paramstyleZexecutemanyZrecord_cursor_reprrB   spanr4   vr   r   r    record_sql_queriesm   s:   
"rN   c                 C   sp   |j tjkr| j|jdd|jd d S |j tjkr$| jdd|jd d S |j dkr6| jdd|j|jd d S d S )NZredis)r@   typerA   rB   httphttplib)rO   rA   rB   
subprocess)rO   rA   r@   rB   )rC   r   ZDB_REDISrG   rD   Z_tagsZHTTP_CLIENT_data)rJ   rL   r   r   r    "maybe_create_breadcrumbs_from_span   s   


rT   c                 C   s  | j }|du r	dS |jdu s|jdu rdS |jdd}|s dS |j|j }|jdd}t||k}|s7dS |jd }|jd}|jd}	t }
|
durz|
jj	}|r_t
r_tj|}W n tyk   d	}Y nw z|
jd
}W n ty   d}Y nw |duo|d}t| }|dur|	rt||	rd}|rt||rd}||r|r|sn	|
j}
|
dusPd}
|
dur`z|
j}W n ty   d}Y nw |dur|tj|
j z|
jd
}W n ty   d}Y nw |dur|tj| z|
jj	}W n ty
   d}Y nw |dur=|durt
st||}n|dur4||r4||d	tj}n|}|tj| z|
jj}W n tyO   d}Y nw |durb|tj|
jj dS dS dS )zB
    Adds OTel compatible source code information to the span
    NZenable_db_query_sourceTZdb_query_source_threshold_msr   project_rootin_app_includein_app_exclude r6   zsentry_sdk.F) rE   	timestampZstart_timestampr<   r;   r   sys	_getframef_codeco_filenamer   ospathabspath	Exception	f_globalsr2   r
   r   f_backf_linenorI   r   ZCODE_LINENOZCODE_NAMESPACEr   r%   lstripsepZCODE_FILEPATHco_nameZCODE_FUNCTION)rJ   rL   rE   Zshould_add_query_sourceduration	thresholdZ
slow_queryrU   rV   rW   frameabs_path	namespaceZis_sentry_sdk_frameZshould_be_includedlinenofilepathZin_app_pathZcode_functionr   r   r    add_query_source   s   

#



!ro   c                 C   s   | sdS |  dr| dr| dd } t| }|sdS | \}}}d}|r0dt|d}|r:dt|d}|r@|d	k}|||d
S )zL
    Given a `sentry-trace` header string, return a dictionary of data.
    Nz00-z-00   z{:032x}   z{:016x}0)trace_idparent_span_idparent_sampled)r2   endswithSENTRY_TRACE_REGEXmatchgroupsr>   int)headerry   rt   ru   Zsampled_strrv   r   r   r    extract_sentrytrace_data  s&   
r}   c                 C   sX   d }zt | dr| |}t|tr|| jj}W n ty%   d }Y nw |p+t|S )Nmogrify)	hasattrr~   r0   bytesdecode
connectionencodingra   r   )rK   sqlZreal_sqlr   r   r    rF   4  s   


rF   c                   @   sn   e Zd ZdZdZdZedZ		dddZ	e
d	d
 Ze
dd Ze
dd Zdd Zdd ZdddZdS )BaggagezR
    The W3C Baggage header information (see https://www.w3.org/TR/baggage/).
    sentry_itemsthird_party_itemsmutablezsentry-z^sentry-rX   Tc                 C   s   || _ || _|| _d S r   r   )r   r   r   r   r   r   r    r!   R  s   
zBaggage.__init__c           	   	   C   s   i }d}d}|rU| dD ]G}d|vrqt 5 | }| d\}}tj|r;t| dd }t|||< d}n
||r@dnd| 7 }W d   n1 sOw   Y  qt|||S )	zF
        freeze if incoming header already has sentry baggage
        rX   T,=r#   r)   FN)splitr   stripr   SENTRY_PREFIX_REGEXry   r   )	clsr|   r   r   r   itemr'   valZbaggage_keyr   r   r    from_incoming_header\  s&   
zBaggage.from_incoming_headerc           	      C   s   i }d}d}t jjj}|d u s|jd u rt|S |j}|j}|d ur,d|v r,|d |d< |dr7|d |d< |drB|d |d< |drPt|d j	|d< |dr[|d |d	< |r`|j
pai }|d
rm|d
 |d< t|||S )NrX   Frt   environmentreleasedsn
public_keyr9   sample_ratesegmentuser_segment)
sentry_sdkHubcurrentrE   Z_propagation_contextr   r<   r;   r   r   _user)	r   scoper   r   r   rE   r<   Zpropagation_contextuserr   r   r    from_optionsw  s,   





zBaggage.from_optionsc                 C   s  |j ptjj}|j}i }|st|S |jpi }|jr|jjpi }|j	|d< |
dr0|d |d< |
dr;|d |d< |
drIt|d j|d< |jrV|jtvrV|j|d< |
dra|d |d< |jd	urmt|j|d
< |jd	ur{|jrwdnd|d< |jr|jjr||jj t|ddS )z
        Populate fresh baggage entry with sentry_items and make it immutable
        if this is the head SDK which originates traces.
        rt   r   r   r   r   transactionr   r   Nr   truefalsesampledFr   )rJ   r   r   r   rE   r   r<   r   r   rt   r;   r   r   namesourceLOW_QUALITY_TRANSACTION_SOURCESr   r1   r   Z_baggager   update)r   r   rJ   rE   r   r<   r   r   r   r    populate_from_transaction  s6   









z!Baggage.populate_from_transactionc                 C   s
   d| _ d S )NFr   r.   r   r   r    freeze  s   
zBaggage.freezec                 C   s$   i }t | jD ]\}}|||< q|S r   )r   r   )r   r|   r'   r   r   r   r    dynamic_sampling_context  s   
z Baggage.dynamic_sampling_contextFc              	   C   s   g }t | jD ]+\}}t  tjt| d tt| }|| W d    n1 s-w   Y  q|r;|| j d	|S )Nr   r   )
r   r   r   r   SENTRY_PREFIXr   r1   appendr   join)r   Zinclude_third_partyrH   r'   r   r   r   r   r    	serialize  s   
zBaggage.serializeN)rX   TF)r6   r7   r8   __doc__	__slots__r   recompiler   r!   classmethodr   r   r   r   r   r   r   r   r   r    r   H  s"    




$
2	r   c                 C   s,   | j }|jd }t| |rdS t||ddS )zv
    Returns True if url matches trace_propagation_targets configured in the given hub. Otherwise, returns False.
    trace_propagation_targetsFT)Zsubstring_matching)rE   r<   r	   r   )rJ   urlrE   r   r   r   r    should_propagate_trace  s
   

r   c                 C   sH   i }|   D ]\}}|dr|dd }|dd }|||< q|S )z
    Normalizes incoming data so the keys are all lowercase with dashes instead of underscores and stripped from known prefixes.
    r      Nr$   r#   )rH   r2   r%   lower)Zincoming_datarB   r'   valuer   r   r    normalize_incoming_data  s   

r   )r   r   )7
contextlibr^   r   rZ   r   Zsentry_sdk.constsr   r   Zsentry_sdk.utilsr   r   r   r   r   r	   r
   r   Zsentry_sdk._compatr   r   r   Zsentry_sdk._typesr   collectionsr   urllibr   r   collections.abcurllib.parsetypingr   r   r   r   r   typesr   r   rx   Zbase64_strippedr   r=   contextmanagerrN   rT   ro   r}   rF   objectr   r   r   Zsentry_sdk.tracingr   r   r   r   r    <module>   sR    (

-h  $