
    fi\                        d dl Z 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 d dlm	Z	 d dl
mZ d dlmZmZ d dlZd dlZd dlmZmZmZmZ d dlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z# d dl$m%Z% e%r$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j-        d          Z.dZ/ G d de          Z0d Z1e j2        	 	 d6d            Z3d Z4d Z5d Z6d Z7d Z8d Z9d Z:d Z; G d d           Z< G d! d"          Z=d# Z>d$ Z?dddej@        fd%ZAd7d&ZBd7d'ZCd(d)d*ZDd+ ZEd, ZFd7d-ZGd. ZHd/ ZId0 ZJd1 ZKd2 ZLd3 ZMd d4lNmOZOmPZPmQZQ e%rd d5lNmRZR dS dS )8    N)Mapping)	timedelta)Random)quoteunquote)OPSPANDATA
SPANSTATUSSPANTEMPLATE)capture_internal_exceptionsfilename_for_moduleDsnloggermatch_regex_listqualname_from_function	safe_repr	to_stringtry_convertis_sentry_url_is_external_source_is_in_project_root_module_in_list)TYPE_CHECKING)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                   *    e Zd Z	 ddZd Zd Zd ZdS )EnvironHeadersHTTP_c                 "    || _         || _        d S N)environprefix)selfr%   r&   s      h/var/www/html/Pagina-Ingenieria-Requisitos/venv/lib/python3.11/site-packages/sentry_sdk/tracing_utils.py__init__zEnvironHeaders.__init__A   s         c                 x    | j         | j        |                    dd                                          z            S N-_)r%   r&   replaceupper)r'   keys     r(   __getitem__zEnvironHeaders.__getitem__J   s0    |DK#++c3*?*?*E*E*G*GGHHr*   c                 N    t          d t          |           D                       S )Nc              3      K   | ]}d V  dS )   N ).0r.   s     r(   	<genexpr>z)EnvironHeaders.__len__.<locals>.<genexpr>P   s"      ))1))))))r*   )sumiterr'   s    r(   __len__zEnvironHeaders.__len__N   s%    ))d4jj))))))r*   c              #     K   | j         D ]y}t          |t                    s|                    dd                                          }|                    | j                  s[|t          | j                  d          V  zd S r,   )r%   
isinstancestrr/   r0   
startswithr&   len)r'   ks     r(   __iter__zEnvironHeaders.__iter__R   s       	( 	(Aa%% 		#s##))++A<<,, C$$&&'''''	( 	(r*   N)r"   )__name__
__module____qualname__r)   r2   r<   rC   r6   r*   r(   r!   r!   @   s]            I I I* * *
( 
( 
( 
( 
(r*   r!   c                     | 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)optionss    r(   has_tracing_enabledrN   _   si     u$%%U2 	
KK,--T9 9{{+,,D8	  r*   Fmanualc              #   T  K   t          j                    j        d                             dd          r|r|d gk    rd }|dk    rd}nd }d }t	          | |          }i }|||d<   |||d<   |rd|d	<   |r| | |d
<   t                      5  t          j        |d|           d d d            n# 1 swxY w Y   t          j        t          j	        ||          5 }|
                                D ]\  }	}
|                    |	|
           |V  d d d            d S # 1 swxY w Y   d S )N_experimentsrecord_sql_paramsFpyformatformatz	db.paramszdb.paramstyleTzdb.executemanyz	db.cursorquery)messagecategorydata)opnameorigin)
sentry_sdk
get_clientrM   rL   _format_sqlr   add_breadcrumb
start_spanr   DBitemsset_data)cursorrU   params_list
paramstyleexecutemanyrecord_cursor_reprspan_originrX   spanrB   vs              r(   record_sql_queriesrl   q   s      &~6::;NPUVV  	kdV33K##!J
&&ED'[ *_ &!% #f0"[	$	&	& N N!%'MMMMN N N N N N N N N N N N N N N 
	5
 
 
  
JJLL 	  	 DAqMM!Q


                 s$   B//B36B35DD!$D!c                     |j         t          j        k    r%|                     |j        dd|j                   d S |j         t          j        k    rd }|j                            t          j
                  }|r%d|cxk    rdk    rn nd}nd|cxk    rdk    rn nd}|r |                     d	d
|j        |           d S |                     d	d
|j                   d S |j         dk    r%|                     dd|j        |j                   d S d S )Nredis)rV   typerW   rX   i  iW  errori  i  warninghttphttplib)ro   rW   rX   level)ro   rW   rX   
subprocess)ro   rW   rV   rX   )rY   r   DB_REDISr_   description_tagsHTTP_CLIENT_datarL   r	   HTTP_STATUS_CODE)scoperj   rt   status_codes       r(   "maybe_create_breadcrumbs_from_spanr~      sw   w"+$7W4: 	 	
 	
 	
 	
 	
 
BN	"	"jnnX%>?? 	"k((((S(((((****s*****! 	S  idj !        fytz RRRRR	L	 	 !$	 	 	
 	
 	
 	
 	
 
!	 r*   c                 >    	 | j         j        S # t          $ r Y d S w xY wr$   )f_codeco_filename	Exception)frames    r(   _get_frame_module_abs_pathr      s4    |''   tts    
c                     t          ||          }t          |          pt          ||          }|  o|pt          ||          o| S r$   )r   r   r   )is_sentry_sdk_frame	namespacein_app_includein_app_excludeabs_pathproject_rootshould_be_includedshould_be_excludeds           r(   _should_be_includedr      si     )NCC,X66 />; ; #"  	T,77R@R<Rr*   c                    t          j                    }|wt          |          }	 |j                            d          }n# t
          $ r d}Y nw xY w|duo|                    d          }t          ||||||          }|rn|j        }|wd}|q	 |j	        }	n# t
          $ r d}	Y nw xY w|	%| 
                    t          j        |j	                   	 |j                            d          }n# t
          $ r d}Y nw xY w| | 
                    t          j        |           t          |          }
|
|t          ||
          }nM|I|
                    |          r4|
                    |d                              t"          j                  }n|
}| 
                    t          j        |           	 |j        j        }n# t
          $ r d}Y nw xY w|.| 
                    t          j        |j        j                   dS dS dS )zB
    Adds OTel compatible source code information to the span
    NrD   zsentry_sdk.)r   r   r   r   r   r    )sys	_getframer   	f_globalsrL   r   r@   r   f_backf_linenorc   r	   CODE_LINENOCODE_NAMESPACEr   r/   lstripossepCODE_FILEPATHr   co_nameCODE_FUNCTION)rj   r   r   r   r   r   r   r   r   linenofilepathin_app_pathcode_functions                r(   
add_sourcer      s    MOOE

-e44	++J77II 	 	 	III	 (t3 
	8L8L9
 9
 1 3))%
 
 
  	/ 
2  	^FF 	 	 	FFF	MM(.???	++J77II 	 	 	III	 MM(19===-e44$1)XFF)h.A.A,.O.O)&..|R@@GGOO&MM(0+>>>	!!L0MM 	! 	! 	! MMM	! $MM(0%,2FGGGGG? < %$sG   A AAB B*)B*C0 0C?>C?6G GGc                    t          j                    }|                                sdS | j        | j        dS |j                            dd          }|sdS | j        | j        z
  }|j                            dd          }|t          d          z  |k    }|sdS t          | |j        d         |j                            d	          |j                            d
                     dS )zO
    Adds OTel compatible source code information to a database query span
    Nenable_db_query_sourceTdb_query_source_threshold_msr   r5   millisecondsr   r   r   rj   r   r   r   	r\   r]   	is_active	timestampstart_timestamprM   rL   r   r   )rj   clientshould_add_query_sourceduration	threshold
slow_querys         r(   add_query_sourcer   "  s
   
 "$$F ~!5!=$n001I4PP" ~ 44H""#A1EEII15555	AJ ^N3~))*:;;~))*:;;	     r*   c                    t          j                    }|                                sdS | j        | j        dS |j                            dd          }|sdS | j        | j        z
  }|j                            dd          }|t          d          z  |k    }|sdS t          | |j        d         |j                            d	          |j                            d
                     dS )z]
    Adds OTel compatible source code information to a span for an outgoing HTTP request
    Nenable_http_request_sourceT http_request_source_threshold_msr   r5   r   r   r   r   r   r   )rj   r   should_add_request_sourcer   r   r   s         r(   add_http_request_sourcer   A  s   
 "$$F ~!5!= & 2 23OQU V V$ ~ 44H""#EqIIII15555	AJ ^N3~))*:;;~))*:;;	     r*   c                    | sdS |                      d          r|                     d          r
| dd         } t                              |           }|sdS |                                \  }}}d}|r#d                    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)r@   endswithSENTRY_TRACE_REGEXmatchgroupsrT   int)headerr   r   r   sampled_strr   s         r(   extract_sentrytrace_datar   `  s    
  t FOOE$:$: "$$V,,E t,1LLNN)HnkN 7##C"$5$566 C"))#nb*A*ABB ,$+ ((  r*   c                    d }	 t          | d          rI|                     |          }t          |t                    r|                    | j        j                  }n# t          $ r d }Y nw xY w|pt          |          S )Nmogrify)	hasattrr   r>   bytesdecode
connectionencodingr   r   )rd   sqlreal_sqls      r(   r^   r^     s     H69%% 	G~~c**H(E** G#??6+<+EFF    %y~~%s   AA A-,A-c                       e Zd ZdZdZ	 	 	 	 	 ddZed             Zed             Z	e	j
        d             Z	ed             Zej
        d	             Zd
 Zd Zd Zd ZdS )PropagationContextzJ
    The PropagationContext represents the data of a trace in Sentry.
    	_trace_id_span_idr   r   dynamic_sampling_contextNc                 T    || _         	 || _        	 || _        	 || _        	 || _        d S r$   r   )r'   r   span_idr   r   r   s         r(   r)   zPropagationContext.__init__  sG     "/:,	H -	Q )A%??r*   c                    d }t          |          }|                    t                    }|r?t                      }t                              |                                          |_        |                    t                    }|r6t          |          }|%|t                      }|	                    |           ||
                                 |S r$   )normalize_incoming_datarL   BAGGAGE_HEADER_NAMEr   Baggagefrom_incoming_headerr   SENTRY_TRACE_HEADER_NAMEr   update_fill_sample_rand)clsincoming_datapropagation_contextnormalized_databaggage_headersentry_trace_headersentrytrace_datas          r(   from_incoming_dataz%PropagationContext.from_incoming_data  s     #1-@@(,,-@AA 	)"4"6"6;B;W;W< <&&((  8 .112JKK 	=78KLL+&.*<*>*>'#**+;<<<*11333""r*   c                 X    | j         st          j                    j        | _         | j         S )z!The trace id of the Sentry trace.)r   uuiduuid4hexr;   s    r(   r   zPropagationContext.trace_id  s&     ~ 	.!Z\\-DN~r*   c                     || _         d S r$   )r   r'   values     r(   r   zPropagationContext.trace_id  s     r*   c                 h    | j         s%t          j                    j        dd         | _         | j         S )z+The span id of the currently executed span.r   N)r   r   r   r   r;   s    r(   r   zPropagationContext.span_id  s/     } 	2 JLL,RSS1DM}r*   c                     || _         d S r$   )r   r   s     r(   r   zPropagationContext.span_id  s     r*   c                 ~    |                                 D ]'\  }}	 t          | ||           # t          $ r Y $w xY wdS )zU
        Updates the PropagationContext with data from the given dictionary.
        N)rb   setattrAttributeError)r'   
other_dictr1   r   s       r(   r   zPropagationContext.update  sg    
 %**,, 	 	JCc5))))!   	 	s   -
::c                 f    d                     | j        | j        | j        | j        | j                  S )Nzm<PropagationContext _trace_id={} _span_id={} parent_span_id={} parent_sampled={} dynamic_sampling_context={}>)rT   r   r   r   r   r   r;   s    r(   __repr__zPropagationContext.__repr__  s<    ~  F  FNM)
 
 	
r*   c                    | j         dS t          t          | j                             d                    }|d|cxk    rdk     rn ndS t          t          | j                             d                    }t	          | j        |          \  }}	 t          | j        ||f          }n1# t          $ r$ t          j
        d| j         d| d	           Y dS w xY w|d
| j         d<   dS )aJ  
        Ensure that there is a valid sample_rand value in the dynamic_sampling_context.

        If there is a valid sample_rand value in the dynamic_sampling_context, we keep it.
        Otherwise, we generate a sample_rand value according to the following:

          - If we have a parent_sampled value and a sample_rate in the DSC, we compute
            a sample_rand value randomly in the range:
                - [0, sample_rate) if parent_sampled is True,
                - or, in the range [sample_rate, 1) if parent_sampled is False.

          - If either parent_sampled or sample_rate is missing, we generate a random
            value in the range [0, 1).

        The sample_rand is deterministically generated from the trace_id, if present.

        This function does nothing if there is no dynamic_sampling_context.
        Nsample_randr   r5   sample_rateintervalz5Could not backfill sample_rand, since parent_sampled=z and sample_rate=..6f)r   r   floatrL   _sample_rand_ranger   _generate_sample_randr   
ValueErrorr   debug)r'   r   r   lowerr0   s        r(   r   z$PropagationContext._fill_sample_rand  s@   ( (0F!4044]CC
 
 "qK';';';';!';';';';';F "4044]CC
 
 *$*={KKu	/PUWWWKK 		 		 		
 L2H[ 2 2#.2 2 2   FF		 ;F7K7K%m444s   B* **CCc                 H    | j         dS | j                             d          S )zRConvenience method to get the sample_rand value from the dynamic_sampling_context.Nr   )r   rL   r;   s    r(   _sample_randzPropagationContext._sample_rand<  s)     (04,00???r*   )NNNNN)rD   rE   rF   __doc__	__slots__r)   classmethodr   propertyr   setterr   r   r   r   r  r6   r*   r(   r   r     s        I !%@ @ @ @6 # # [#2   X _  _   X ^  ^	 	 	
 
 
2L 2L 2Lh@ @ @ @ @r*   r   c                       e Zd ZdZdZdZ ej        d          Z	 	 ddZ	e
dd	d
            Ze
d             Ze
d             Zd Zd ZddZed             Zd Zd ZdS )r   aF  
    The W3C Baggage header information (see https://www.w3.org/TR/baggage/).

    Before mutating a `Baggage` object, calling code must check that `mutable` is `True`.
    Mutating a `Baggage` object that has `mutable` set to `False` is not allowed, but
    it is the caller's responsibility to enforce this restriction.
    sentry_itemsthird_party_itemsmutablezsentry-z^sentry-r   Tc                 0    || _         || _        || _        d S r$   r  )r'   r  r  r  s       r(   r)   zBaggage.__init__S  s     )!2r*   N)r  c                   i }d}d}|r|                     d          D ]}d|vrt                      5  |                                }|                     d          \  }}t          j                            |          r=t          |                     d          d                   }	t          |          ||	<   d}n||rdnd|z   z  }ddd           n# 1 swxY w Y   |t          |          |d	<   d}t          |||          S )
zF
        freeze if incoming header already has sentry baggage
        r   T,=r-   r5   FNr   )splitr   stripr   SENTRY_PREFIX_REGEXr   r   r?   )
r   r   r  r  r  r  itemr1   valbaggage_keys
             r(   r   zBaggage.from_incoming_header]  ss     	WS)) W Wd??022 W W::<<D#zz#HC288== W&-ciinnQ.?&@&@4;CLL[1"')5F.NccBRV-VV)W W W W W W W W W W W W W W W #*-l*;*;L'G|%6@@@s   BCC	C	c                    i }d}d}t          j                    }|                                r|j        t	          |          S |j        }|j        }|
|j        |d<   |                    d          r|d         |d<   |                    d          r|d         |d<   |                    d          rt          |d                   j	        |d<   |                    d          rt          |d                   |d	<   t	          |||          S )
Nr   Fr   environmentreleasedsn
public_keyrI   r   )r\   r]   r   _propagation_contextr   rM   r   rL   r   r  r?   )r   r|   r  r  r  r   rM   r   s           r(   from_optionszBaggage.from_options  s%    &((!! 	)U%?%G<(((.#8*':'CL$;;}%% 	A*1-*@L';;y!! 	9&-i&8L#;;u 	H),WU^)<)<)GL&;;+,, 	M*-g6J.K*L*LL'|%6@@@r*   c                    t          j                    }i }|                                st          |          S |j        pi }|j        |d<   |j        d|d<   |                    d          r|d         |d<   |                    d          r|d         |d<   |                    d          rt          |d                   j	        |d<   |j
        r|j        t          vr
|j
        |d<   |j        t          |j                  |d
<   |j        |j        rdnd|d<   |j        r+|j        j        r|                    |j        j                   t          |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  r  r  transactionNr   truefalsesampledFr  )r\   r]   r   r   rM   r   r  rL   r   r  rZ   sourceLOW_QUALITY_TRANSACTION_SOURCESr   r?   r&  _baggager  r   )r   r#  r   r  rM   s        r(   populate_from_transactionz!Baggage.populate_from_transaction  s    &((!! 	)<(((.&B#.#7Z )4)A&G&G]#;;}%% 	A*1-*@L';;y!! 	9&-i&8L#;;u 	H),WU^)<)<)GL& 	;"*III*5*:L'".*-k.E*F*FL'*0;0C&PffL#
  	CK$8$E 	C 4 ABBB|U3333r*   c                     d| _         d S )NFr'  r;   s    r(   freezezBaggage.freeze  s    r*   c                 R    i }| j                                         D ]
\  }}|||<   |S r$   )r  rb   )r'   r   r1   r  s       r(   r   z Baggage.dynamic_sampling_context  s9    *0022 	 	ICF3KKr*   Fc                    g }| j                                         D ]|\  }}t                      5  t          j        t          |          z   dz   t          t          |                    z   }|                    |           d d d            n# 1 swxY w Y   }|r|                    | j                   d	                    |          S )Nr  r  )
r  rb   r   r   SENTRY_PREFIXr   r?   appendr  join)r'   include_third_partyrb   r1   r  r  s         r(   	serializezBaggage.serialize  s    )//11 	# 	#HC,.. # #,uSzz9C?%C//QT"""# # # # # # # # # # # # # # #  	1LL/000xxs   ABB	B	c                 f    d                     d |                     d          D                       S )zRemove Sentry baggage from the given header.

        Given a Baggage header, return a new Baggage header with all Sentry baggage items removed.
        r  c              3   |   K   | ]7}t           j                            |                                          3|V  8d S r$   )r   r  r   r  )r7   r  s     r(   r8   z/Baggage.strip_sentry_baggage.<locals>.<genexpr>  sU        288FF     r*   )r2  r  )r   s    r(   strip_sentry_baggagezBaggage.strip_sentry_baggage  sB     xx "LL--  
 
 	
r*   c                     t          t          | j                            d                    }|d|cxk    rdk     rn n|S dS )zConvenience method to get the sample_rand value from the sentry_items.

        We validate the value and parse it as a float before returning it. The value is considered
        valid if it is a float in the range [0, 1).
        r   N              ?)r   r   r  rL   )r'   r   s     r(   r  zBaggage._sample_rand  sV     "%):)>)>})M)MNN"sk'?'?'?'?C'?'?'?'?'?tr*   c                 F    d|                      d           d| j         dS )Nz
<Baggage "T)r3  z", mutable=>)r4  r  r;   s    r(   r   zBaggage.__repr__	  s-    `DNNtNDD``QUQ]````r*   )r   T)F)rD   rE   rF   r  r  r0  recompiler  r)   r	  r   r!  r+  r-  r   r4  staticmethodr7  r  r   r6   r*   r(   r   r   E  s4         AIM$"*Z00
 	    
 	!A !A !A !A [!AF A A [A@ ,4 ,4 [,4\        
 
 \
  a a a a ar*   r   c                 d    | j         d         }t          | |          rdS t          ||d          S )zy
    Returns True if url matches trace_propagation_targets configured in the given client. Otherwise, returns False.
    trace_propagation_targetsFT)substring_matching)rM   r   r   )r   urlrA  s      r(   should_propagate_tracerD    s?    
 !'/J KVS!! uC!:tTTTTr*   c                     i }|                                  D ]Q\  }}|                    d          r
|dd         }|                    dd                                          }|||<   R|S )z
    Normalizes incoming data so the keys are all lowercase with dashes instead of underscores and stripped from known prefixes.
    r"      Nr.   r-   )rb   r@   r/   r  )r   rX   r1   r   s       r(   r   r     sx    
 D#))++  
U>>'"" 	abb'Ckk#s##))++S		Kr*   c                 .     ddl m  fd}|S )a  
    Create a span decorator that can wrap both sync and async functions.

    :param op: The operation type for the span.
    :type op: str or :py:class:`sentry_sdk.consts.OP` or None
    :param name: The name of the span.
    :type name: str or None
    :param attributes: Additional attributes to set on the span.
    :type attributes: dict or None
    :param template: The type of span to create. This determines what kind of
        span instrumentation and data collection will be applied. Use predefined
        constants from :py:class:`sentry_sdk.consts.SPANTEMPLATE`.
        The default is `SPANTEMPLATE.DEFAULT` which is the right choice for most
        use cases.
    :type template: :py:class:`sentry_sdk.consts.SPANTEMPLATE`
    r   )should_send_default_piic                 r    t          j                    fd            }	 t          j                   |_        n# t
          $ r Y nw xY wt          j                    fd            }	 t          j                   |_        n# t
          $ r Y nw xY wt          j                   r|S |S )zD
        Decorator to create a span for the given function.
        c            
        K   t                      }|0t          j        dt          
                      
| i | d {V S pt	                    }pt          
          pd}t          ||          }             }|                    ||          5 }|                    	pi            t          |||
| |            
| i | d {V }t          |||           |cd d d            S # 1 swxY w Y   d S NzbCannot create a child span for %s. Please start a Sentry transaction before calling this function.r   )rY   rZ   
get_current_spanr   r  r   _get_span_op_get_span_namestart_childupdate_data_set_input_attributes_set_output_attributesargskwargscurrent_spanspan_opfunction_name	span_namesend_piirj   result
attributesfrZ   rY   rH  templates            r(   async_wrapperzDcreate_span_decorator.<locals>.span_decorator.<locals>.async_wrapperG  s      ,--L#V*1--  
 Q//////////2L22G C$:1$=$=CM&xGGI..00H)) *      !1r222%(HmQf    !q$1&11111111&tXxHHH                 s   AC55C9<C9c            
         t                      }|*t          j        dt          
                      
| i |S pt	                    }pt          
          pd}t          ||          }             }|                    ||          5 }|                    	pi            t          |||
| |            
| i |}t          |||           |cd d d            S # 1 swxY w Y   d S rK  rL  rT  s            r(   sync_wrapperzCcreate_span_decorator.<locals>.span_decorator.<locals>.sync_wrapperm  s    ,--L#V*1--  
 q$)&)))2L22G C$:1$=$=CM&xGGI..00H)) *      !1r222%(HmQf   D+F++&tXxHHH                 s   AC''C+.C+)	functoolswrapsinspect	signature__signature__r   iscoroutinefunction)r^  r`  rb  r]  rZ   rY   rH  r_  s   `  r(   span_decoratorz-create_span_decorator.<locals>.span_decoratorA  s/    
			 	 	 	 	 	 	 	 	 
		@	*1*;A*>*>M'' 	 	 	D	 
			 	 	 	 	 	 	 	 	 
		@	)0):1)=)=L&& 	 	 	D	 &q)) 	   s#   A 
AA7B 
BB)sentry_sdk.scoperH  )rY   rZ   r]  r_  ri  rH  s   ```` @r(   create_span_decoratorrk  +  sZ    ( 988888U  U  U  U  U  U  U  U  U n r*   c                 >    | pt          j                    } | j        }|S )zU
    Returns the currently active span if there is one running, otherwise `None`
    )r\   get_current_scoperj   )r|   rW  s     r(   rM  rM    s$    
 3Z133E:Lr*   c                     | pt                      } | L|                     t          j                   | j        (| j                            t          j                   dS dS dS )z
    Set the status of the current or given span to ERROR.
    Also sets the status of the transaction (root span) to ERROR.
    N)rM  
set_statusr
   ERRORcontaining_transaction)rj   s    r(   set_span_erroredrr    sg     %#%%D
()))&2'22:3CDDDDD 22r*   r9  r:  r   c                    |\  }}||k     st          d          t          |           }t          |dz            }t          |dz            }	 |                    ||          }n# t           $ r |}Y nw xY w|dz  S )a  Generate a sample_rand value from a trace ID.

    The generated value will be pseudorandomly chosen from the provided
    interval. Specifically, given (lower, upper) = interval, the generated
    value will be in the range [lower, upper). The value has 6-digit precision,
    so when printing with .6f, the value will never be rounded up.

    The pseudorandom number generator is seeded with the trace ID.
    z/Invalid interval: lower must be less than upperi@B )r  r   r   	randrange)r   r   r  r0   rnglower_scaledupper_scaledsample_rand_scaleds           r(   r  r    s     LE55==JKKK


Cuy())Luy())L* ]]<FF * * * **
 	))s   A& &A54A5c                 &    | |dS | du rd|fS |dfS )z
    Compute the lower (inclusive) and upper (exclusive) bounds of the range of values
    that a generated sample_rand value must fall into, given the parent_sampled and
    sample_rate values.
    Nrs  Tr9  r:  r6   )r   r   s     r(   r   r     s5     !4x	4		KCr*   c                     d}t          | t                    r|                     |          }n4t          | |          r$	 t	          | |          }n# t
          $ r d}Y nw xY w|S )z
    Gets a value from a source object. The source can be a dict or an object.
    It is checked for dictionary keys and object attributes.
    N)r>   dictrL   r   getattrr   )r(  r1   r   s      r(   
_get_valuer~    s}     E&$ 

363 	,,   Ls   A AAc                    |}| t           j        k    rMd}|r?dD ]<}|                    |          r%t          ||         t                    r
||         } n=|rd| nd}n+| t           j        k    rd| }n| t           j        k    rd| }|S )zF
    Get the name of the span based on the template and the name.
    N)model
model_namezchat chatzinvoke_agent zexecute_tool )r   AI_CHATrL   r>   r?   AI_AGENTAI_TOOL)r_  rZ   rV  rZ  r  r1   s         r(   rO  rO    s    
 I<''' 	.  ::c?? z&+s'C'C "3KEE',8OEOOO&			\*	*	**D**			\)	)	)*D**	r*   c                     t           j        t          j        t           j        t          j        t           j        t          j        i}|                    | t          j	                  }t          |          S )z>
    Get the operation of the span based on the template.
    )r   r  r   GEN_AI_CHATr  GEN_AI_INVOKE_AGENTr  GEN_AI_EXECUTE_TOOLrL   FUNCTIONr?   )r_  mappingrY   s      r(   rN  rN    sM     	bnr5b4G
 
Xr{	+	+Br77Nr*   c                 X   i | t           j        t           j        t           j        fv rt          j        t          ft          j        t          ft          j        t          ft          j        t          ft          j        t          ft          j
        t          ft          j        t          ft          j        t          ft          j        t          ft          j        t          fd
fd}t!          |                                          D ]\  }}|dk    rLt%          |t                    r7                    t          j        g                               d|d           W|dk    rLt%          |t                    r7                    t          j        g                               d|d            |||           | t           j        k    r!|rt-          ||d          t          j        <   t          j        v r,t-          t          j                           t          j        <   S )	z;
    Get input attributes for the given span template.
    )
r  r  agent
agent_name
max_tokensfrequency_penaltypresence_penaltytemperaturetop_ptop_kc                 `    | v r$|          \  }}|t          ||          r||<   d S d S d S d S r$   )r>   )r1   r   	attribute	data_typer]  r  s       r(   _set_from_keyz,_get_input_attributes.<locals>._set_from_key1  sR    g~~)0&I$E9)E)E$,1Jy))) ~$$$$r*   promptuser)rolecontentsystem_promptsystem)rU  rV  )r   r  r  r  r	   GEN_AI_REQUEST_MODELr?   GEN_AI_AGENT_NAMEGEN_AI_REQUEST_MAX_TOKENSr    GEN_AI_REQUEST_FREQUENCY_PENALTYr   GEN_AI_REQUEST_PRESENCE_PENALTYGEN_AI_REQUEST_TEMPERATUREGEN_AI_REQUEST_TOP_PGEN_AI_REQUEST_TOP_Klistrb   r>   
setdefaultGEN_AI_REQUEST_MESSAGESr1  r   GEN_AI_TOOL_INPUT)	r_  r[  rU  rV  r  r1   r   r]  r  s	          @@r(   _get_input_attributesr    s   
 JL)<+?AUVVV3S9#8#>0#6#5s;#=sC"*"KU!S!)!I5 Q$?G3U;3S9
 
	2 	2 	2 	2 	2 	2 v||~~.. 	& 	&JCh:eS#9#9%%h&FKKRR#66   o%%*UC*@*@%%%h&FKKRR%%88   M#u%%%%<'''H'1:V,,2
 2

8-.
 ':557@x788
 8

834 r*   c                      i  fd} |t           j        d            |t           j        d            |t           j        d           S )z
    Get usage attributes.
    c                 j    |D ].}t          |          }|t          |t                    r|| <   /d S r$   )r~  r>   r   )r  keysr1   r   r]  usages       r(   _set_from_keysz-_get_usage_attributes.<locals>._set_from_keys\  sK     	. 	.Cuc**E Zs%;%; (-
9%	. 	.r*   )prompt_tokensinput_tokens)completion_tokensoutput_tokens)total_tokens)r	   GEN_AI_USAGE_INPUT_TOKENSGEN_AI_USAGE_OUTPUT_TOKENSGEN_AI_USAGE_TOTAL_TOKENS)r  r  r]  s   ` @r(   _get_usage_attributesr  U  s    
 J. . . . . . N*)   N+.   N*  
 r*   c                    i }| t           j        t           j        t           j        fv rt	                      5  |g}t          |d          }|                    |           t          |d          }t          |d          }|                    |           |D ]&}|"|                    t          |                     't          |d          }|$t          |t                    r||t          j        <   t          |d          }|$t          |t                    r||t          j        <   ddd           n# 1 swxY w Y   | t           j        k    r|rt          |          |t          j        <   |S )z<
    Get output attributes for the given span template.
    r  metadataNr  r  )r   r  r  r  r   r~  r1  r   r  r>   r?   r	   GEN_AI_RESPONSE_MODELr   GEN_AI_TOOL_OUTPUT)	r_  r[  r\  r]  usage_candidatesr  metausage_candidater  s	            r(   _get_output_attributesr  s  s   
 JL)<+?AUVVV(** 	H 	H &xvw//E##E***fj11DtW--E##E***#3 N N".%%&;O&L&LMMM $FG44J%*Z*E*E%=G
89:#FL99J%*Z*E*E%=G
89:-	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H 	H2 <'''H'2;F2C2C
8./s   C3D66D:=D:c                    i }|t           j        k    rt          j        dt          j        |i}na|t           j        k    rt          j        di}nB|t           j        k    r2t          j        dt          j        |i}|j        }|||t          j	        <   |
                    t          ||||                     |                     |pi            dS )a  
    Set span input attributes based on the given span template.

    :param span: The span to set attributes on.
    :param template: The template to use to set attributes on the span.
    :param send_pii: Whether to send PII data.
    :param f: The wrapped function.
    :param args: The arguments to the wrapped function.
    :param kwargs: The keyword arguments to the wrapped function.
    invoke_agentr  execute_toolN)r   r  r	   GEN_AI_OPERATION_NAMEr  r  r  GEN_AI_TOOL_NAMEr  GEN_AI_TOOL_DESCRIPTIONr   r  rQ  )	rj   r_  r[  rZ   r^  rU  rV  r]  	docstrings	            r(   rR  rR    s     J<(((*N&


 
\)	)	)*F


 
\)	)	)*N%t


 I	 ;DJx78+HhfMMNNNZ%2&&&&&r*   c                 R    |                      t          |||          pi            dS )a%  
    Set span output attributes based on the given span template.

    :param span: The span to set attributes on.
    :param template: The template to use to set attributes on the span.
    :param send_pii: Whether to send PII data.
    :param result: The result of the wrapped function.
    N)rQ  r  )rj   r_  r[  r\  s       r(   rS  rS    s0     	+HhGGM2NNNNNr*   )r   r)  r   )Span)FrO   r$   )S
contextlibrc  re  r   r=  r   collections.abcr   datetimer   randomr   urllib.parser   r   r   r\   sentry_sdk.constsr   r	   r
   r   sentry_sdk.utilsr   r   r   r   r   r   r   r   r   r   r   r   r   typingr   r   r   r   r   r   typesr   r>  r   base64_strippedr!   rN   contextmanagerrl   r~   r   r   r   r   r   r   r^   r   r   rD  r   DEFAULTrk  rM  rr  r  r   r~  rO  rN  r  r  r  rR  rS  sentry_sdk.tracingr   r)  r   r  r6   r*   r(   <module>r     s            				 				 



 # # # # # #             ' ' ' ' ' ' ' '      D D D D D D D D D D D D                               !                    RZ   ( ( ( ( (W ( ( (>  $  , , , ,^
 
 
@    (BH BH BHJ  >  >  @& & &(n@ n@ n@ n@ n@ n@ n@ n@bFa Fa Fa Fa Fa Fa Fa FaR
U 
U 
U  " $4,2Fm m m m`   
E 
E 
E 
E  * * * * *@       $   4  6 6 6r  <$ $ $N"' "' "'J
O 
O 
O           (''''''''( (r*   