o
    hM=                     @   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mZ d dlmZ erOd 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 e0Z1d!d" Z2d#d$ Z3d d%l4m5Z5 dS )'    N)OPSPANDATA)capture_internal_exceptions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   [/var/www/html/aiguide_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.   r4   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cursorrC   params_list
paramstyleexecutemanyrecord_cursor_reprrF   spanr3   vr   r   r   record_sql_queriesl   s:   
"rX   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)rD   typerE   rF   httphttplib)rZ   rE   rF   
subprocess)rZ   rE   rD   rF   )rG   r   DB_REDISrK   rH   _tagsHTTP_CLIENT_data)rP   rV   r   r   r   "maybe_create_breadcrumbs_from_span   s   


rb   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rRz|
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&||r&||d	tj}n|}|tj| z|
jj}W n tyA   d}Y nw |durT|tj|
jj dS dS dS )zB
    Adds OTel compatible source code information to the span
    Nenable_db_query_sourceTdb_query_source_threshold_msr   project_rootin_app_includein_app_exclude r5   zsentry_sdk.F)rI   	timestampstart_timestampr=   r<   r   sys	_getframef_codeco_filenamer   ospathabspath	Exception	f_globalsr1   r	   r
   f_backf_linenorO   r   CODE_LINENOCODE_NAMESPACEr$   lstripsepCODE_FILEPATHco_nameCODE_FUNCTION)rP   rV   rI   should_add_query_sourceduration	threshold
slow_queryre   rf   rg   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)r1   endswithSENTRY_TRACE_REGEXmatchgroupsrB   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   )rQ   sqlreal_sqlr   r   r   rJ   1  s   


rJ   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-rh   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
        rh   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 )Nrh   Fr   environmentreleasedsn
public_keyr9   sample_ratesegmentuser_segment)
sentry_sdkHubcurrentrI   _propagation_contextr   r=   r<   r   r   _user)	r   scoper   r   r   rI   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   )rP   r   r   r   rI   r   r=   r   r   r   r<   r   r   namesourceLOW_QUALITY_TRANSACTION_SOURCESr   r0   r   _baggager   update)r   r   rP   rI   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   r0   appendr   join)r   include_third_partyrN   r&   r   r   r   r   r   	serialize  s   
zBaggage.serializeN)rh   TF)r5   r6   r7   __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)rI   r=   r   r   )rP   urlrI   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"   )rN   r1   r$   lower)incoming_datarF   r&   valuer   r   r   normalize_incoming_data  s   

r   )r   r   )6
contextlibro   r   rk   r   sentry_sdk.constsr   r   sentry_sdk.utilsr   r   r   r   r   r	   r
   sentry_sdk._compatr   r   r   sentry_sdk._typesr   collectionsr   urllibr   r   collections.abcurllib.parsetypingr   r   r   r   r   typesr   r   r   base64_strippedr   r>   contextmanagerrX   rb   r   r   rJ   objectr   r   r   sentry_sdk.tracingr   r   r   r   r   <module>   sR    $	
-f  $