o
    Zh1                  
   @   s  d dl Z d dlZd dlmZmZ d dlZd dlmZ d dlmZm	Z	m
Z
 d dlmZmZmZ d dlmZ d dlmZ erd dlZd dlmZ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 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 edZ!d dl"Zd dlm#Z#m$Z$m%Z% dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-e)gZ.e,e,e,e*e)e,e*e*e*d	Z/G dd  d e0Z1G d!d" d"e0Z2G d#d$ d$e2Z3G d%d& d&e2Z4ered-d'd(Z5ed)d( Z5d-d*d(Z5d d+l6m7Z7m8Z8m9Z9m:Z:m;Z; d d,l<m=Z= dS ).    N)datetime	timedelta)INSTRUMENTER)is_valid_sample_rateloggernanosecond_time)datetime_utcnowutc_from_timestampPY2)SPANDATA)TYPE_CHECKING)CallableMutableMapping)Any)Dict)Iterator)List)Optional)overload)	ParamSpec)Tuple)Union)TypeVarPR)EventMeasurementUnitSamplingContextbaggagezsentry-traceZcustomurlZrouteview	componenttask)	ZendpointZfunction_namehandler_nameZmethod_and_path_patternpathZ
route_nameZroute_patternZuri_templater   c                   @   s$   e Zd ZdZdZdd Zdd ZdS )_SpanRecorderz5Limits the number of spans recorded in a transaction.maxlenspansc                 C   s   |d | _ g | _d S )N   r&   selfr'    r,   I/var/www/html/lang_env/lib/python3.10/site-packages/sentry_sdk/tracing.py__init__H   s   

z_SpanRecorder.__init__c                 C   s*   t | j| jkrd |_d S | j| d S N)lenr(   r'   _span_recorderappend)r+   spanr,   r,   r-   addR   s   
z_SpanRecorder.addN)__name__
__module____qualname____doc__	__slots__r.   r4   r,   r,   r,   r-   r%   C   s
    
r%   c                   @   s  e Zd ZdZdZdd Z												d5ddZd	d
 Zdd Zdd Z	dd Z
dd Zedd ZejfddZdd Zedd Zedd Zdd Zedd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd6d/d0Zd1d2 Zd3d4 Z dS )7SpanzuA span holds timing information of a block of code.
    Spans can have multiple child spans thus forming a span tree.)trace_idspan_idparent_span_idsame_process_as_parentsampledopdescriptionstart_timestamp_start_timestamp_monotonic_nsstatus	timestamp_tags_datar1   hub_context_manager_state_containing_transaction_local_aggregatorc                 K   s   d|v r	t tS t | S )z_
        Backwards-compatible implementation of Span and Transaction
        creation.
        transaction)object__new__Transaction)clskwargsr,   r,   r-   rN   s   s   


zSpan.__new__NTc                 C   s   |pt  j| _|pt  jdd  | _|| _|| _|| _|| _|| _	|	| _
|| _i | _i | _|| _|d u r:t }n	t|trCt|}|| _zt | _W n	 tyU   Y nw d | _d | _d | _d S )N   )uuiduuid4hexr;   r<   r=   r>   r?   r@   rA   rD   rH   rF   rG   rJ   r   
isinstancefloatr	   rB   r   rC   AttributeErrorrE   r1   rK   )r+   r;   r<   r=   r>   r?   r@   rA   rH   rD   rL   containing_transactionrB   r,   r,   r-   r.      s2   

zSpan.__init__c                 C   s   | j d u rt|| _ d S d S r/   )r1   r%   r*   r,   r,   r-   init_span_recorder   s   
zSpan.init_span_recorderc                 C   s   | j }|d u rt  }| _ |S r/   )rK   LocalAggregatorr+   rvr,   r,   r-   _get_local_aggregator   s   zSpan._get_local_aggregatorc                 C   s&   d| j j| j| j| j| j| j| jf S )NzS<%s(op=%r, description:%r, trace_id=%r, span_id=%r, parent_span_id=%r, sampled=%r)>)	__class__r5   r@   rA   r;   r<   r=   r?   r+   r,   r,   r-   __repr__   s   zSpan.__repr__c                 C   s8   | j ptjj}|jd \}}|j}| |_|||f| _| S )N)rH   
sentry_sdkHubcurrent_stackr3   rI   )r+   rH   _scopeold_spanr,   r,   r-   	__enter__   s   zSpan.__enter__c                 C   s6   |d ur	|  d | j\}}}| `| | ||_d S )Ninternal_error)
set_statusrI   finishr3   )r+   tyvaluetbrH   rh   ri   r,   r,   r-   __exit__   s   


zSpan.__exit__c                 C   s   | j S )zThe ``Transaction`` that this span belongs to.
        The ``Transaction`` is the root of the span tree,
        so one could also think of this ``Transaction`` as the "root span".)rJ   r`   r,   r,   r-   rY      s   
zSpan.containing_transactionc                 K   sz   | j ptjj}|j}|o|jd }||krt S |d| j t	d| j
| j| jd|}| jo3| jj}|r;|| |S )a  
        Start a sub-span from the current span or transaction.

        Takes the same arguments as the initializer of :py:class:`Span`. The
        trace id, sampling decision, transaction pointer, and span recorder are
        inherited from the current span/transaction.
        instrumenterr?   )r;   r=   rY   Nr,   )rH   rc   rd   re   clientoptionsNoOpSpan
setdefaultr?   r:   r;   r<   rY   r1   r4   )r+   rr   rQ   rH   rs   Zconfiguration_instrumenterchildZspan_recorderr,   r,   r-   start_child   s$   	
zSpan.start_childc                 K   s   t d | jdi |S )zGDEPRECATED: use :py:meth:`sentry_sdk.tracing.Span.start_child` instead.z^Deprecated: use Span.start_child instead of Span.new_span. This will be removed in the future.Nr,   )r   warningrx   r+   rQ   r,   r,   r-   new_span  s   zSpan.new_spanc                 K   s(   | t u r	td tjt|fi |S )a(  
        Create a Transaction with the given params, then add in data pulled from
        the ``sentry-trace`` and ``baggage`` headers from the environ (if any)
        before returning the Transaction.

        This is different from :py:meth:`~sentry_sdk.tracing.Span.continue_from_headers`
        in that it assumes header names in the form ``HTTP_HEADER_NAME`` -
        such as you would get from a WSGI/ASGI environ -
        rather than the form ``header-name``.

        :param environ: The ASGI/WSGI environ to pull information from.
        zXDeprecated: use Transaction.continue_from_environ instead of Span.continue_from_environ.)r:   r   ry   rO   continue_from_headersEnvironHeaders)rP   environrQ   r,   r,   r-   continue_from_environ  s
   zSpan.continue_from_environc                 K   sp   | t u r	td t|t}|t|i t|t	}|dur,|| |
  tdi |}d|_|S )z
        Create a transaction with the given params (including any data pulled from
        the ``sentry-trace`` and ``baggage`` headers).

        :param headers: The dictionary with the HTTP headers to pull information from.
        zXDeprecated: use Transaction.continue_from_headers instead of Span.continue_from_headers.NFr,   )r:   r   ry   BaggageZfrom_incoming_headergetBAGGAGE_HEADER_NAMEupdateextract_sentrytrace_dataSENTRY_TRACE_HEADER_NAMEfreezerO   r>   )rP   headersrQ   r   Zsentrytrace_kwargsrL   r,   r,   r-   r|   0  s   
zSpan.continue_from_headersc                 c   s>    t |  fV  | jr| j  }|rt|fV  dS dS dS )z
        Creates a generator which returns the span's ``sentry-trace`` and ``baggage`` headers.
        If the span's containing transaction doesn't yet have a ``baggage`` value,
        this will cause one to be generated and stored.
        N)r   to_traceparentrY   get_baggage	serializer   )r+   r   r,   r,   r-   iter_headersZ  s   zSpan.iter_headersc                 K   s(   t d |s	dS | jt|ifi |S )a  
        DEPRECATED: Use :py:meth:`sentry_sdk.tracing.Span.continue_from_headers`.

        Create a ``Transaction`` with the given params, then add in data pulled from
        the given ``sentry-trace`` header value before returning the ``Transaction``.
        zwDeprecated: Use Transaction.continue_from_headers(headers, **kwargs) instead of from_traceparent(traceparent, **kwargs)N)r   ry   r|   r   )rP   traceparentrQ   r,   r,   r-   from_traceparenth  s   zSpan.from_traceparentc                 C   sN   | j du rd}n
| j du rd}nd }d| j| jf }|d ur%|d|f 7 }|S )NT1F0z%s-%sz-%s)r?   r;   r<   )r+   r?   r   r,   r,   r-   r     s   

zSpan.to_traceparentc                 C   s   | j r| j  S dS )zReturns the :py:class:`~sentry_sdk.tracing_utils.Baggage`
        associated with this ``Span``, if any. (Taken from the root of the span tree.)
        N)rY   r   r`   r,   r,   r-   
to_baggage  s   
zSpan.to_baggagec                 C      || j |< d S r/   )rF   r+   keyro   r,   r,   r-   set_tag     zSpan.set_tagc                 C   r   r/   )rG   r   r,   r,   r-   set_data  r   zSpan.set_datac                 C   s
   || _ d S r/   rD   r+   ro   r,   r,   r-   rl        
zSpan.set_statusc                 C   sT  |  dt| | tj| |dk r| d d S d|  kr$dk ron nI|dkr1| d d S |dkr<| d d S |d	krG| d
 d S |dkrR| d d S |dkr]| d d S |dkrh| d d S | d d S d|  krydk rn n(|dkr| d d S |dkr| d d S |dkr| d d S | d d S | d d S )Nzhttp.status_codei  oki  i  Zpermission_deniedi  	not_foundi  Zresource_exhaustedi  Zfailed_preconditioni  Zunauthenticatedi  Zalready_existsZinvalid_argumentiX  i  Zdeadline_exceededi  Zunimplementedi  unavailablerk   Zunknown_error)r   strr   r   ZHTTP_STATUS_CODErl   r+   Zhttp_statusr,   r,   r-   set_http_status  s:   zSpan.set_http_statusc                 C   s
   | j dkS )Nr   r   r`   r,   r,   r-   
is_success  r   zSpan.is_successc                 C   s   | j durdS |p| jptjj}z"|r t|trt|}|| _ nt | j	 }| j
t|d d | _ W n ty?   t | _ Y nw t||  dS )a4  Sets the end timestamp of the span.
        Additionally it also creates a breadcrumb from the span,
        if the span represents a database or HTTP request.

        :param hub: The hub to use for this transaction.
            If not provided, the current hub will be used.
        :param end_timestamp: Optional timestamp that should
            be used as timestamp instead of the current time.

        :return: Always ``None``. The type is ``Optional[str]`` to match
            the return value of :py:meth:`sentry_sdk.tracing.Transaction.finish`.
        Ni  )microseconds)rE   rH   rc   rd   re   rV   rW   r	   r   rC   rB   r   rX   r   "maybe_create_breadcrumbs_from_span)r+   rH   end_timestampelapsedr,   r,   r-   rm     s$   



zSpan.finishc              	   C   s   | j | j| j| j| j| j| j| jd}| jr| j| j	d< | j
dur,| j
 }|r,||d< | j	}|r5||d< | j}|r>||d< |S )z5Returns a JSON-compatible representation of the span.)r;   r<   r=   r>   r@   rA   rB   rE   rD   N_metrics_summarytagsdata)r;   r<   r=   r>   r@   rA   rB   rE   rD   rF   rK   to_jsonrG   )r+   r]   metrics_summaryr   r   r,   r,   r-   r     s,   

zSpan.to_jsonc                 C   sF   | j | j| j| j| jd}| jr| j|d< | jr!| j  |d< |S )N)r;   r<   r=   r@   rA   rD   dynamic_sampling_context)	r;   r<   r=   r@   rA   rD   rY   r   r   r\   r,   r,   r-   get_trace_context  s   
zSpan.get_trace_context)NNNTNNNNNNNNNN)!r5   r6   r7   r8   r9   rN   r.   rZ   r^   ra   rj   rq   propertyrY   r   SENTRYrx   r{   classmethodr   r|   r   r   r   r   r   r   rl   r   r   rm   r   r   r,   r,   r,   r-   r:   Z   sV    
0

!

)
	$
(!r:   c                       s   e Zd ZdZdZdddef fdd	Zdd Z fd	d
Z fddZ	e
dd Zd fdd	ZdddZdd Z fddZ fddZdd Zdd Z  ZS )rO   zhThe Transaction is the root element that holds all the spans
    for Sentry performance instrumentation.)namesourceparent_sampledsample_rate_measurements	_contexts_profile_baggage Nc                    sj   |sd|v rt d |d}tt| jdi | || _|| _d| _|| _	i | _
i | _d| _|| _dS )a  Constructs a new Transaction.

        :param name: Identifier of the transaction.
            Will show up in the Sentry UI.
        :param parent_sampled: Whether the parent transaction was sampled.
            If True this transaction will be kept, if False it will be discarded.
        :param baggage: The W3C baggage header value.
            (see https://www.w3.org/TR/baggage/)
        :param source: A string describing the source of the transaction name.
            This will be used to determine the transaction's type.
            See https://develop.sentry.dev/sdk/event-payloads/transaction/#transaction-annotations
            for more information. Default "custom".
        rL   z^Deprecated: use Transaction(name=...) to create transactions instead of Span(transaction=...).Nr,   )r   ry   popsuperrO   r.   r   r   r   r   r   r   r   r   )r+   r   r   r   r   rQ   r_   r,   r-   r.   :  s   

zTransaction.__init__c              	   C   s*   d| j j| j| j| j| j| j| j| jf S )NzW<%s(name=%r, op=%r, trace_id=%r, span_id=%r, parent_span_id=%r, sampled=%r, source=%r)>)	r_   r5   r   r@   r;   r<   r=   r?   r   r`   r,   r,   r-   ra   e  s   zTransaction.__repr__c                    s&   t t|   | jd ur| j  | S r/   )r   rO   rj   r   r`   r   r,   r-   rj   u  s   

zTransaction.__enter__c                    s2   | j d ur| j ||| tt| ||| d S r/   )r   rq   r   rO   )r+   rn   ro   rp   r   r,   r-   rq   ~  s   
zTransaction.__exit__c                 C   s   | S )znThe root element of the span tree.
        In the case of a transaction it is the transaction itself.
        r,   r`   r,   r,   r-   rY     s   
z"Transaction.containing_transactionc           	   	      s  | j durdS |p| jptjj}|j}|du rdS | jdu rCtd |j	rAt
|jrA|jr7|jjdkr7d}nd}|j	j|dd dS | jsNtd d	| _tt| || | jsf| jdu rdtd
 dS dd | jjD }d| _i }|| j |d|  i d| jd| ji|| j| j | j|d}| jdur| j r| j|d< d| _| j|d< | jdur| j  }|r||d< |!|S )a  Finishes the transaction and sends it to Sentry.
        All finished spans in the transaction will also be sent to Sentry.

        :param hub: The hub to use for this transaction.
            If not provided, the current hub will be used.
        :param end_timestamp: Optional timestamp that should
            be used as timestamp instead of the current time.

        :return: The event ID if the transaction was sent to Sentry,
            otherwise None.
        Nz.Discarding transaction because sampled = Falser   Zbackpressurer   rL   )Zdata_categoryzCTransaction has no name, falling back to `<unlabeled transaction>`.z<unlabeled transaction>z1Discarding transaction without sampling decision.c                 S   s   g | ]}|j d ur| qS r/   )rE   r   ).0r3   r,   r,   r-   
<listcomp>  s
    
z&Transaction.finish.<locals>.<listcomp>tracer   )typerL   Ztransaction_infocontextsr   rE   rB   r(   Zprofilemeasurementsr   )"rE   rH   rc   rd   re   rs   r1   r   debug	transporthas_tracing_enabledrt   monitordownsample_factorZrecord_lost_eventr   ry   r   rO   rm   r?   r(   r   r   r   r   rF   rB   r   validr   rK   r   Zcapture_event)	r+   rH   r   rs   reasonZfinished_spansr   eventr   r   r,   r-   rm     sb   










zTransaction.finishc                 C   s   ||d| j |< d S )N)ro   unit)r   r+   r   ro   r   r,   r,   r-   set_measurement  s   zTransaction.set_measurementc                 C   s   || j |< dS )a  Sets a context. Transactions can have multiple contexts
        and they should follow the format described in the "Contexts Interface"
        documentation.

        :param key: The name of the context.
        :param value: The information about the context.
        N)r   r   r,   r,   r-   set_context  s   	zTransaction.set_contextc                    s$   t t| | | dd|i dS )zySets the status of the Transaction according to the given HTTP status.

        :param http_status: The HTTP status code.responsestatus_codeN)r   rO   r   r   r   r   r,   r-   r     s   zTransaction.set_http_statusc                    s0   t t|  }| j|d< | j|d< | j|d< |S )z<Returns a JSON-compatible representation of the transaction.r   r   r?   )r   rO   r   r   r   r?   r\   r   r,   r-   r     s
   


zTransaction.to_jsonc                 C   s    | j r| j jrt| | _ | j S )zReturns the :py:class:`~sentry_sdk.tracing_utils.Baggage`
        associated with the Transaction.

        The first time a new baggage with Sentry items is made,
        it will be frozen.)r   mutabler   Zpopulate_from_transactionr`   r,   r,   r-   r     s   zTransaction.get_baggagec                 C   sv  | j ptjj}|j}|r|jpi }dj| jrd| j d nd| jd}|r)t	|s.d| _
dS | j
dur;t| j
| _dS t|drH|d |n|d	 durR|d	 n|d
 }t|ddsjtdj|d d| _
dS t|| _|jr}|  jd|jj   _| jstdj|t|drdndd d| _
dS t | jk | _
| j
rtdj|d dS tdj|| jd dS )aO  
        Sets the transaction's sampling decision, according to the following
        precedence rules:

        1. If a sampling decision is passed to `start_transaction`
        (`start_transaction(name: "my transaction", sampled: True)`), that
        decision will be used, regardless of anything else

        2. If `traces_sampler` is defined, its decision will be used. It can
        choose to keep or ignore any parent sampling decision, or use the
        sampling context data to make its own decision or to choose a sample
        rate for the transaction.

        3. If `traces_sampler` is not defined, but there's a parent sampling
        decision, the parent sampling decision will be used.

        4. If `traces_sampler` is not defined and there's no parent sampling
        decision, `traces_sample_rate` will be used.
        z{op}transaction <{name}><z> r   )r@   r   FNZtraces_samplerr   Ztraces_sample_rateZTracing)r   zN[Tracing] Discarding {transaction_description} because of invalid sample rate.)transaction_description   z?[Tracing] Discarding {transaction_description} because {reason}z"traces_sampler returned 0 or Falseztraces_sample_rate is set to 0)r   r   z,[Tracing] Starting {transaction_description}z}[Tracing] Discarding {transaction_description} because it's not included in the random sample (sampling rate = {sample_rate}))r   r   )rH   rc   rd   re   rs   rt   formatr@   r   r   r?   rW   r   callabler   r   r   ry   r   r   r   random)r+   sampling_contextrH   rs   rt   r   r   r,   r,   r-   _set_initial_sampling_decision#  sj   


z*Transaction._set_initial_sampling_decisionr   r   )r5   r6   r7   r8   r9   TRANSACTION_SOURCE_CUSTOMr.   ra   rj   rq   r   rY   rm   r   r   r   r   r   r   __classcell__r,   r,   r   r-   rO   *  s(    +	

crO   c                   @   s   e Zd Zdd Zedd ZejfddZdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd+d d!Zd,d#d$Zd%d& Zd'd( Zd)d* ZdS )-ru   c                 C   s   | j jS r/   )r_   r5   r`   r,   r,   r-   ra        zNoOpSpan.__repr__c                 C      d S r/   r,   r`   r,   r,   r-   rY        zNoOpSpan.containing_transactionc                 K   s   t  S r/   )ru   )r+   rr   rQ   r,   r,   r-   rx     s   zNoOpSpan.start_childc                 K   s   | j di |S Nr,   )rx   rz   r,   r,   r-   r{     s   zNoOpSpan.new_spanc                 C      dS )Nr   r,   r`   r,   r,   r-   r        zNoOpSpan.to_traceparentc                 C   r   r/   r,   r`   r,   r,   r-   r     r   zNoOpSpan.to_baggagec                 C   r   r/   r,   r`   r,   r,   r-   r     r   zNoOpSpan.get_baggagec                 C   s   t dS r   )iterr`   r,   r,   r-   r     r   zNoOpSpan.iter_headersc                 C   r   r/   r,   r   r,   r,   r-   r     r   zNoOpSpan.set_tagc                 C   r   r/   r,   r   r,   r,   r-   r     r   zNoOpSpan.set_datac                 C   r   r/   r,   r   r,   r,   r-   rl     r   zNoOpSpan.set_statusc                 C   r   r/   r,   r   r,   r,   r-   r     r   zNoOpSpan.set_http_statusc                 C   r   )NTr,   r`   r,   r,   r-   r     r   zNoOpSpan.is_successc                 C      i S r/   r,   r`   r,   r,   r-   r     r   zNoOpSpan.to_jsonc                 C   r   r/   r,   r`   r,   r,   r-   r     r   zNoOpSpan.get_trace_contextNc                 C   r   r/   r,   )r+   rH   r   r,   r,   r-   rm     r   zNoOpSpan.finishr   c                 C   r   r/   r,   r   r,   r,   r-   r     r   zNoOpSpan.set_measurementc                 C   r   r/   r,   r   r,   r,   r-   r     r   zNoOpSpan.set_contextc                 C   r   r/   r,   r*   r,   r,   r-   rZ     r   zNoOpSpan.init_span_recorderc                 C   r   r/   r,   )r+   r   r,   r,   r-   r     r   z'NoOpSpan._set_initial_sampling_decisionr   r   )r5   r6   r7   ra   r   rY   r   r   rx   r{   r   r   r   r   r   r   rl   r   r   r   r   rm   r   r   rZ   r   r,   r,   r,   r-   ru     s,    


ru   c                 C   r   r/   r,   funcr,   r,   r-   r     r   r   c                 C   r   r/   r,   r   r,   r,   r-   r     r   c                 C   s.   t r	ddlm} nddlm} | r|| S |S )av  
    Decorator to start a child span under the existing current transaction.
    If there is no current transaction, then nothing will be traced.

    .. code-block::
        :caption: Usage

        import sentry_sdk

        @sentry_sdk.trace
        def my_function():
            ...

        @sentry_sdk.trace
        async def my_async_function():
            ...
    r   )start_child_span_decorator)r
   Zsentry_sdk.tracing_utils_py2r   Zsentry_sdk.tracing_utils_py3)r   r   r,   r,   r-   r     s   )r   r}   r   r   r   )r[   r/   )>rS   r   r   r   rc   Zsentry_sdk.constsr   Zsentry_sdk.utilsr   r   r   Zsentry_sdk._compatr   r	   r
   r   Zsentry_sdk._typesr   typingcollections.abcr   r   r   r   r   r   r   r   r   r   r   r   r   r   Zsentry_sdk.profilerr   r   r   r   r   r   ZTRANSACTION_SOURCE_URLZTRANSACTION_SOURCE_ROUTEZTRANSACTION_SOURCE_VIEWZTRANSACTION_SOURCE_COMPONENTZTRANSACTION_SOURCE_TASKZLOW_QUALITY_TRANSACTION_SOURCESZSOURCE_FOR_STYLErM   r%   r:   rO   ru   r   Zsentry_sdk.tracing_utilsr   r}   r   r   r   Zsentry_sdk.metricsr[   r,   r,   r,   r-   <module>   s~       S  fS

"