o
    ii.=                     @   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 d dlmZmZ d dlmZ erMd 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 Z.G dd  d e/Z0d!d" Z1d#d$ Z2d d%l3m4Z4 dS )'    N)OPSPANDATA)capture_internal_exceptionsDsnmatch_regex_list	to_stringis_sentry_url_is_external_source_module_in_list)PY2	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   W/var/www/html/pca-backend/venv/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__E   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>K   s    z)EnvironHeaders.__len__.<locals>.<genexpr>)sumiterr   r   r   r   __len__I   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__M   s   

zEnvironHeaders.__iter__N)r   )__name__
__module____qualname__r   r&   r-   r3   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.
    NFenable_tracingtraces_sample_ratetraces_sampler)boolget)optionsr   r   r   has_tracing_enabledZ   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 )N_experimentsrecord_sql_paramsFpyformatformatz	db.paramszdb.paramstyleTzdb.executemanyz	db.cursorquery)messagecategorydata)opdescription)clientr<   r;   _format_sqlr   add_breadcrumb
start_spanr   DBitemsset_data)hubcursorrB   params_list
paramstyleexecutemanyrecord_cursor_reprrE   spanr2   vr   r   r   record_sql_queriesl   s:   
"rW   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 )Nredis)rC   typerD   rE   httphttplib)rY   rD   rE   
subprocess)rY   rD   rC   rE   )rF   r   DB_REDISrJ   rG   _tagsHTTP_CLIENT_data)rO   rU   r   r   r   "maybe_create_breadcrumbs_from_span   s   


ra   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}|j|d k}|s8dS |jd }|jd}|jd	}	t }
|
durz|
jj	}|r`t
r`tj|}W n tyl   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sQd}
|
durSz|
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r0|dur'||r'||d
tj}n|}|tj| z|
jj}W n tyB   d}Y nw |durU|tj|
jj dS dS dS )zB
    Adds OTel compatible source code information to the span
    Nenable_db_query_sourceFdb_query_source_threshold_msr   i  project_rootin_app_includein_app_exclude r4   zsentry_sdk.T)rH   	timestampstart_timestampr<   r;   microsecondssys	_getframef_codeco_filenamer   ospathabspath	Exception	f_globalsr0   r	   r
   f_backf_linenorN   r   CODE_LINENOCODE_NAMESPACEr#   lstripsepCODE_FILEPATHco_nameCODE_FUNCTION)rO   rU   rH   should_add_query_sourceduration	threshold
slow_queryrd   re   rf   frameabs_path	namespaceis_sentry_sdk_frameshould_be_includedlinenofilepathin_app_pathcode_functionr   r   r   add_query_source   s   

#



r   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)r0   endswithSENTRY_TRACE_REGEXmatchgroupsrA   int)headerr   r   r   sampled_strr   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   r.   bytesdecode
connectionencodingrr   r   )rP   sqlreal_sqlr   r   r   rI   1  s   


rI   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-rg   Tc                 C   s   || _ || _|| _d S r   r   )r   r   r   r   r   r   r   r   O  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
        rg   T,=r!   r'   FN)splitr   stripr   SENTRY_PREFIX_REGEXr   r   )	clsr   r   r   r   itemr%   valbaggage_keyr   r   r   from_incoming_headerY  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 )Nrg   Fr   environmentreleasedsn
public_keyr8   sample_ratesegmentuser_segment)
sentry_sdkHubcurrentrH   _propagation_contextr   r<   r;   r   r   _user)	r   scoper   r   r   rH   r<   propagation_contextuserr   r   r   from_optionst  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.
        r   r   r   r   r   transactionr   r   Nr   truefalsesampledFr   )rO   r   r   r   rH   r   r<   r   r   r   r;   r   r   namesourceLOW_QUALITY_TRANSACTION_SOURCESr   r/   r   _baggager   update)r   r   rO   rH   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   r/   appendr   join)r   include_third_partyrM   r%   r   r   r   r   r   	serialize  s   
zBaggage.serializeN)rg   TF)r4   r5   r6   __doc__	__slots__r   recompiler   r   classmethodr   r   r   r   r   r   r   r   r   r   r   E  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)substring_matching)rH   r<   r   r   )rO   urlrH   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!   )rM   r0   r#   lower)incoming_datarE   r%   valuer   r   r   normalize_incoming_data  s   

r   )r   r   )5
contextlibro   r   rk   r   sentry_sdk.constsr   r   sentry_sdk.utilsr   r   r   r   r   r	   r
   sentry_sdk._compatr   r   sentry_sdk._typesr   collectionsr   urllibr   r   collections.abcurllib.parsetypingr   r   r   r   r   typesr   r   r   base64_strippedr   r=   contextmanagerrW   ra   r   r   rI   objectr   r   r   sentry_sdk.tracingr   r   r   r   r   <module>   sR    $	
-f  $