o
    h~                  
   @   s  d dl Z d dlZd dlmZmZmZ d dlmZ d dlZd dlm	Z	m
Z
mZmZ d dlmZ d dlmZmZmZmZmZmZ d dlmZ erd dlmZ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% d dl&m'Z'm(Z( e"dZ)e%dZ*d dlm+Z+ d dl,m-Z- d dl.m/Z/m0Z0m1Z1m2Z2 G dd de'ddZ3G dd de3ddZ4e'dd e5iZ6d!Z7d"Z8G d#d$ d$e5eZ9e9j:gZ;e9j<e9j<e9j<e9j=e9j:e9j<e9j=e9j=e9j=d%	Z>d&d' Z?G d(d) d)Z@G d*d+ d+ZAG d,d- d-eAZBG d.d/ d/eAZCer/e!	d8dddejDd0d1d2ZEe!d3d2 ZE	d8dddejDd0d4d2ZEd d5lFmGZGmHZHmIZImJZJmKZKmLZL eM  eNd6eO d d7lPmQZQ W d   dS 1 siw   Y  dS )9    N)datetime	timedeltatimezone)Enum)INSTRUMENTER
SPANSTATUSSPANDATASPANTEMPLATE)get_profiler_id)capture_internal_exceptionsget_current_thread_metais_valid_sample_rateloggernanosecond_timeshould_be_treated_as_error)TYPE_CHECKING)CallableMappingMutableMapping)Any)Dict)Iterator)List)Optional)overload)	ParamSpec)Tuple)Union)TypeVar)	TypedDictUnpackPR)ContinuousProfile)Profile)EventMeasurementUnitSamplingContextMeasurementValuec                   @   s   e Zd ZU eed< 	 eed< 	 eed< 	 eed< 	 eed< 	 eed< 	 eed< 	 ed ed	< 	 eed
< 	 ed ed< 	 eeee	f  ed< 	 ded< 	 eed< 	 eed< dS )
SpanKwargstrace_idspan_idparent_span_idsame_process_as_parentsampledopdescriptionzsentry_sdk.HubhubstatusTransactioncontaining_transactionstart_timestampzsentry_sdk.ScopescopeoriginnameN)
__name__
__module____qualname__str__annotations__boolr   r   r   float r@   r@   T/var/www/html/pro-man-master/venv/lib/python3.10/site-packages/sentry_sdk/tracing.pyr)   0   s:   
 r)   F)totalc                   @   s*   e Zd ZU eed< 	 eed< 	 ded< dS )TransactionKwargssourceparent_sampledBaggagebaggageN)r9   r:   r;   r<   r=   r>   r@   r@   r@   rA   rC   k   s   
 rC   ProfileContextprofiler_idrG   zsentry-tracec                   @   s,   e Zd ZdZdZdZdZdZdZdd Z	d	S )
TransactionSource	componentcustomroutetaskurlviewc                 C      | j S N)valueselfr@   r@   rA   __str__      zTransactionSource.__str__N)
r9   r:   r;   	COMPONENTCUSTOMROUTETASKURLVIEWrV   r@   r@   r@   rA   rJ      s    rJ   )	endpointfunction_namehandler_namemethod_and_path_patternpath
route_nameroute_patternuri_templaterO   c                 C   s   | dk rt jS d|   krdk r@n n-| dkrt jS | dkr!t jS | dkr(t jS | dkr/t jS | dkr6t jS | dkr=t jS t jS d|   krJd	k rfn t jS | d
krUt j	S | dkr\t j
S | dkrct jS t jS t jS )z
    Returns the Sentry status corresponding to the given HTTP status code.

    See: https://develop.sentry.dev/sdk/event-payloads/contexts/#trace-context
    i  i  i  i  i  i  i  i  iX  i  i  i  )r   OKPERMISSION_DENIED	NOT_FOUNDRESOURCE_EXHAUSTEDFAILED_PRECONDITIONUNAUTHENTICATEDALREADY_EXISTSINVALID_ARGUMENTDEADLINE_EXCEEDEDUNIMPLEMENTEDUNAVAILABLEINTERNAL_ERRORUNKNOWN_ERROR)http_status_coder@   r@   rA   get_span_status_from_http_code   s4   
rt   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spansdropped_spansc                 C   s   |d | _ g | _d| _d S )N   r   rv   rU   rw   r@   r@   rA   __init__   s   

z_SpanRecorder.__init__c                 C   s8   t | j| jkrd |_|  jd7  _d S | j| d S )Nrz   )lenrx   rw   _span_recorderry   append)rU   spanr@   r@   rA   add   s   z_SpanRecorder.addN)r9   r:   r;   __doc__	__slots__r|   r   r@   r@   r@   rA   ru      s
    ru   c                   @   sn  e Zd ZdZdZ														dHddZdd	 Zed
d Zej	dd Zedd Z
e
j	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edd Zedd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/d0 Zd1d2 ZdId4d5Zd6d7 Z d8d9 Z!d:d; Z"d<d= Z#dJd>d?Z$d@dA Z%dBdC Z&dDdE Z'dFdG Z(dS )KSpanak  A span holds timing information of a block of code.
    Spans can have multiple child spans thus forming a span tree.

    :param trace_id: The trace ID of the root span. If this new span is to be the root span,
        omit this parameter, and a new trace ID will be generated.
    :param span_id: The span ID of this span. If omitted, a new span ID will be generated.
    :param parent_span_id: The span ID of the parent span, if applicable.
    :param same_process_as_parent: Whether this span is in the same process as the parent span.
    :param sampled: Whether the span should be sampled. Overrides the default sampling decision
        for this span when provided.
    :param op: The span's operation. A list of recommended values is available here:
        https://develop.sentry.dev/sdk/performance/span-operations/
    :param description: A description of what operation is being performed within the span.

        .. deprecated:: 2.15.0
            Please use the `name` parameter, instead.
    :param name: A string describing what operation is being performed within the span.
    :param hub: The hub to use for this span.

        .. deprecated:: 2.0.0
            Please use the `scope` parameter, instead.
    :param status: The span's status. Possible values are listed at
        https://develop.sentry.dev/sdk/event-payloads/span/
    :param containing_transaction: The transaction that this span belongs to.
    :param start_timestamp: The timestamp when the span started. If omitted, the current time
        will be used.
    :param scope: The scope to use for this span. If not provided, we use the current scope.
    )	_trace_id_span_idr,   r-   r.   r/   r0   _measurementsr5   _start_timestamp_monotonic_nsr2   	timestamp_tags_datar~   r1   _context_manager_state_containing_transaction_local_aggregatorr6   r7   r8   _flags_flags_capacityNTmanualc                 C   s  || _ || _|| _|| _|| _|| _|p|| _|	| _|| _|| _	|| _
i | _i | _i | _|
| _i | _d| _|d urHtjdtdd | j	pF|j	| _	|d u rSttj}nt|tr_t|tj}|| _zt | _W n	 tyq   Y nw d | _d | _ d | _!| "  | #t$  d S )N
   z>The `hub` parameter is deprecated. Please use `scope` instead.   
stacklevel)%r   r   r,   r-   r.   r/   r0   r2   r1   r6   r7   r   r   r   r   r   r   warningswarnDeprecationWarningr   nowr   utc
isinstancer?   fromtimestampr5   r   r   AttributeErrorr   r~   r   update_active_threadset_profiler_idr
   )rU   r*   r+   r,   r-   r.   r/   r0   r1   r2   r4   r5   r6   r7   r8   r@   r@   rA   r|     sN   

zSpan.__init__c                 C   s   | j d u rt|| _ d S d S rR   )r~   ru   r{   r@   r@   rA   init_span_recorderb  s   
zSpan.init_span_recorderc                 C   s   | j s	t j| _ | j S rR   )r   uuiduuid4hexrT   r@   r@   rA   r*   g  s   zSpan.trace_idc                 C   
   || _ d S rR   )r   rU   rS   r@   r@   rA   r*   o     
c                 C   s    | j st jdd  | _ | j S )N   )r   r   r   r   rT   r@   r@   rA   r+   t  s   zSpan.span_idc                 C   r   rR   )r   r   r@   r@   rA   r+   |  r   c                 C   s   | j }|d u rt  }| _ |S rR   )r   LocalAggregatorrU   rvr@   r@   rA   _get_local_aggregator  s   zSpan._get_local_aggregatorc              	   C   s*   d| j j| j| j| j| j| j| j| jf S )Nz^<%s(op=%r, description:%r, trace_id=%r, span_id=%r, parent_span_id=%r, sampled=%r, origin=%r)>)		__class__r9   r/   r0   r*   r+   r,   r.   r7   rT   r@   r@   rA   __repr__  s   zSpan.__repr__c                 C   s(   | j pt }|j}| |_||f| _| S rR   )r6   
sentry_sdkget_current_scoper   r   )rU   r6   old_spanr@   r@   rA   	__enter__  s
   
zSpan.__enter__c                 C   st   |d urt ||r| jtjkr| tj t  | j\}}| `| | ||_	W d    d S 1 s3w   Y  d S rR   )
r   r2   r   ERROR
set_statusrq   r   r   finishr   )rU   tyrS   tbr6   r   r@   r@   rA   __exit__  s   

"zSpan.__exit__c                 C   rQ   )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".)r   rT   r@   r@   rA   r4     s   
zSpan.containing_transactionc                 K   s   | ddurtjdtdd t jd }||krt S |d| j	 t
d	| j| j| jd|}| jo8| 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.

        The instrumenter parameter is deprecated for user code, and it will
        be removed in the next major version. Going forward, it should only
        be used by the SDK itself.
        r0   NzEThe `description` parameter is deprecated. Please use `name` instead.r   r   instrumenterr.   )r*   r,   r4   r@   )getr   r   r   r   
get_clientoptionsNoOpSpan
setdefaultr.   r   r*   r+   r4   r~   r   )rU   r   kwargsconfiguration_instrumenterchildspan_recorderr@   r@   rA   start_child  s,   
zSpan.start_childc                 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   warningr3   continue_from_headersEnvironHeaders)clsenvironr   r@   r@   rA   continue_from_environ  s
   zSpan.continue_from_environ_sample_randc                K   st   | t u r	td tj|t|d}|t|i t|t	}|dur.|| |
  tdi |}d|_|S )a  
        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.
        :param _sample_rand: If provided, we override the sample_rand value from the
            incoming headers with this value. (internal use only)
        zXDeprecated: use Transaction.continue_from_headers instead of Span.continue_from_headers.r   NFr@   )r   r   r   rF   from_incoming_headerr   BAGGAGE_HEADER_NAMEupdateextract_sentrytrace_dataSENTRY_TRACE_HEADER_NAMEfreezer3   r-   )r   headersr   r   rG   sentrytrace_kwargstransactionr@   r@   rA   r     s"   

zSpan.continue_from_headersc                 c   s>    | j sdS t|  fV  | j   }|rt|fV  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)r4   r   to_traceparentget_baggage	serializer   )rU   rG   r@   r@   rA   iter_headers,  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   r   r   r   )r   traceparentr   r@   r@   rA   from_traceparent@  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+   )rU   r.   r   r@   r@   rA   r   Y  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)r4   r   rT   r@   r@   rA   
to_baggageh  s   
zSpan.to_baggagec                 C      || j |< d S rR   )r   rU   keyrS   r@   r@   rA   set_tagq     zSpan.set_tagc                 C   r   rR   )r   r   r@   r@   rA   set_datau  r   zSpan.set_datac                 C   s   | j | d S rR   )r   r   rU   datar@   r@   rA   update_datay  s   zSpan.update_datac                 C   s"   t | j| jk r|| j|< d S d S rR   )r}   r   r   )rU   flagresultr@   r@   rA   set_flag}  s   zSpan.set_flagc                 C   r   rR   r2   r   r@   r@   rA   r        
zSpan.set_status c                 C   $   t jdtdd ||d| j|< dS z
        .. deprecated:: 2.28.0
            This function is deprecated and will be removed in the next major release.
        zq`set_measurement()` is deprecated and will be removed in the next major version. Please use `set_data()` instead.r   r   )rS   unitNr   r   r   r   rU   r8   rS   r   r@   r@   rA   set_measurement     zSpan.set_measurementc                 C   s<   |d ur|  tjt| |d ur|  tj| d S d S d S rR   )r   r   	THREAD_IDr<   THREAD_NAMErU   	thread_idthread_namer@   r@   rA   
set_thread  s   zSpan.set_threadc                 C   s   |d ur|  tj| d S d S rR   )r   r   PROFILER_IDrU   rI   r@   r@   rA   r     s   zSpan.set_profiler_idc                 C   s0   |  dt| | tj| | t| d S )Nzhttp.status_code)r   r<   r   r   HTTP_STATUS_CODEr   rt   rU   http_statusr@   r@   rA   set_http_status  s
   zSpan.set_http_statusc                 C   s
   | j dkS )Nokr   rT   r@   r@   rA   
is_success  r   zSpan.is_successc                 C   s   | j durdS z%|rt|trt|tj}|| _ nt | j }| j	t
|d d | _ W n ty<   ttj| _ Y nw |pBt }t||  dS )aD  
        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 scope: The scope to use for this transaction.
            If not provided, the current scope 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)r   r   r?   r   r   r   r   r   r   r5   r   r   r   r   r   "maybe_create_breadcrumbs_from_span)rU   r6   end_timestampelapsedr@   r@   rA   r     s$   



zSpan.finishc              
   C   s   | j | j| j| j| j| j| j| j| jd	}| j	r| j	| j
d< | jdur.| j }|r.||d< t| jdkr:| j|d< | j
}|rC||d< i }|| j || j |rW||d< |S )	z5Returns a JSON-compatible representation of the span.)	r*   r+   r,   r-   r/   r0   r5   r   r7   r2   N_metrics_summaryr   measurementstagsr   )r*   r+   r,   r-   r/   r0   r5   r   r7   r2   r   r   to_jsonr}   r   r   r   r   )rU   r   metrics_summaryr  r   r@   r@   rA   r    s6   


zSpan.to_jsonc                 C   s   | j | j| j| j| j| jd}| jr| j|d< | jr#| j 	 |d< i }| j
tj}|d ur4||d< | j
tj}|d urC||d< |rI||d< |S )N)r*   r+   r,   r/   r0   r7   r2   dynamic_sampling_contextz	thread.idzthread.namer   )r*   r+   r,   r/   r0   r7   r2   r4   r   r
  r   r   r   r   r   )rU   r   r   r   r   r@   r@   rA   get_trace_context  s,   
zSpan.get_trace_contextc                 C   s"   | j tj}|d u rd S d|iS )NrI   )r   r   r   r   r   r@   r@   rA   get_profile_context  s
   zSpan.get_profile_contextc                 C   s   t  \}}| || d S rR   )r   r   r   r@   r@   rA   r   &  s   
zSpan.update_active_thread)NNNTNNNNNNNNr   Nr   NN))r9   r:   r;   r   r   r|   r   propertyr*   setterr+   r   r   r   r   r4   r   SENTRYr   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r@   r@   r@   rA   r      sv    
D




*
/
	
	
&'!
r   c                       s   e Zd ZdZdZdddejf fdd	Zdd Zd	d
 Z	 fddZ
 fddZedd Zdd Z		d$dd fddZd%ddZdd Z fddZ fddZ fddZd d! Zd"d# Z  ZS )&r3   ai  The Transaction is the root element that holds all the spans
    for Sentry performance instrumentation.

    :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".
    :param kwargs: Additional arguments to be passed to the Span constructor.
        See :py:class:`sentry_sdk.tracing.Span` for available arguments.
    )
r8   rD   rE   sample_rater   	_contexts_profile_continuous_profile_baggager   r   Nc                    s   t  jdi | || _|| _d | _|| _i | _i | _d | _d | _	|| _
| j
d u r+d n| j
 }|d ur9|| _d S t| j| _d S Nr@   )superr|   r8   rD   r  rE   r   r  r  r  r  r   _generate_sample_randr*   )rU   r8   rE   rG   rD   r   baggage_sample_randr   r@   rA   r|   L  s   	
zTransaction.__init__c              
   C   s.   d| j j| j| j| j| j| j| j| j| j	f	 S )Nzb<%s(name=%r, op=%r, trace_id=%r, span_id=%r, parent_span_id=%r, sampled=%r, source=%r, origin=%r)>)
r   r9   r8   r/   r*   r+   r,   r.   rD   r7   rT   r@   r@   rA   r   i  s   zTransaction.__repr__c                 C   s   | j dup	| jdu S )zReturns whether the transaction might have been started.

        If this returns False, we know that the transaction was not started
        with sentry_sdk.start_transaction, and therefore the transaction will
        be discarded.
        NF)r~   r.   rT   r@   r@   rA   _possibly_startedz  s   
zTransaction._possibly_startedc                    s4   |   s	td t   | jd ur| j  | S )NzTransaction was entered without being started with sentry_sdk.start_transaction.The transaction will not be sent to Sentry. To fix, start the transaction bypassing it to sentry_sdk.start_transaction.)r  r   debugr  r   r  rT   r  r@   rA   r     s   


zTransaction.__enter__c                    sB   | j d ur| j ||| | jd ur| j  t ||| d S rR   )r  r   r  stopr  )rU   r   rS   r   r  r@   rA   r     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@   rT   r@   r@   rA   r4     s   
z"Transaction.containing_transactionc                 C   sF   |}|durt jdtdd |}t|tjr!t jdtdd |jS |S )z
        Logic to get the scope from the arguments passed to finish. This
        function exists for backwards compatibility with the old finish.

        TODO: Remove this function in the next major version.
        NzMThe `hub` parameter is deprecated. Please use the `scope` parameter, instead.   r   zDPassing a Hub to finish is deprecated. Please pass a Scope, instead.)r   r   r   r   r   Hubr6   )rU   	scope_arghub_argscope_or_hubr@   r@   rA   _get_scope_from_finish_args  s    z'Transaction._get_scope_from_finish_argsr1   c             	      s   | j durdS | ||}|p| jpt }t }| s dS | jdu r]| jdu r0t	
d nt	
d |jr[t|jr[|jrI|jjdkrId}nd}|jj|dd	 |jj|d
d	 dS | jsht	d d| _t || | js~| jdu r|t	d dS dd | jjD }t| jjt| }|| jj }d| _i }	|	| j |	d|  i |  }
|
dur|	d|
i d| jd| ji|	| j| j | j|d}|dkr||d< | jdur| j  r| j|d< d| _| j!|d< | j"dur| j"# }|r||d< |$|S )au  Finishes the transaction and sends it to Sentry.
        All finished spans in the transaction will also be sent to Sentry.

        :param scope: The Scope to use for this transaction.
            If not provided, the current Scope will be used.
        :param end_timestamp: Optional timestamp that should
            be used as timestamp instead of the current time.
        :param hub: The hub to use for this transaction.
            This argument is DEPRECATED. Please use the `scope`
            parameter, instead.

        :return: The event ID if the transaction was sent to Sentry,
            otherwise None.
        NFz.Discarding transaction because sampled = FalsezSDiscarding transaction because it was not started with sentry_sdk.start_transactionr   backpressurer  r   )data_categoryr   zCTransaction 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 rR   )r   r  ).0r   r@   r@   rA   
<listcomp>  s
    
z&Transaction.finish.<locals>.<listcomp>traceprofilerD   )typer   transaction_infocontextsr  r   r5   rx   _dropped_spansr  r  )%r   r%  r6   r   r   r   	is_activer~   r.   r   r  	transporthas_tracing_enabledr   monitordownsample_factorrecord_lost_eventr8   r   r  r   rx   r}   ry   r   r  r  r  rD   r   r5   r  validr   r   r  capture_event)rU   r6   r  r1   clientreasonfinished_spanslen_diffry   r/  profile_contexteventr	  r  r@   rA   r     s   









zTransaction.finishc                 C   r   r   r   r   r@   r@   rA   r   O  r   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@   rA   set_context]  s   	zTransaction.set_contextc                    s    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  r   r?  r   r  r@   rA   r   h  s   zTransaction.set_http_statusc                    s,   t   }| j|d< | j|d< | j|d< |S )z<Returns a JSON-compatible representation of the transaction.r8   rD   r.   )r  r  r8   rD   r.   r   r  r@   rA   r  p  s
   



zTransaction.to_jsonc                    s   t   }| jr| j|d< |S )Nr   )r  r  r   )rU   trace_contextr  r@   rA   r  {  s   

zTransaction.get_trace_contextc                 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  mutablerF   populate_from_transactionrT   r@   r@   rA   r     s   zTransaction.get_baggagec                 C   s`  t  }dj| jrd| j d nd| jd}t|js d| _dS | jdur-t| j| _	dS t
|jdr<|jd |n|d	 durF|d	 n|jd
 }t|dds_tdj|d d| _dS t|| _	|jrr|  j	d|jj   _	| j	stdj|t
|jdrdndd d| _dS | j| 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/   r8   FNtraces_samplerrE   traces_sample_rateTracing)rD   zN[Tracing] Discarding {transaction_description} because of invalid sample rate.)transaction_descriptionr   z?[Tracing] Discarding {transaction_description} because {reason}z"traces_sampler returned 0 or Falseztraces_sample_rate is set to 0)rI  r:  z,[Tracing] Starting {transaction_description}z}[Tracing] Discarding {transaction_description} because it's not included in the random sample (sampling rate = {sample_rate}))rI  r  )r   r   formatr/   r8   r3  r   r.   r?   r  callabler   r   r   r   r4  r5  r  r   )rU   sampling_contextr9  rI  r  r@   r@   rA   _set_initial_sampling_decision  sf   



z*Transaction._set_initial_sampling_decisionr  r  )r9   r:   r;   r   r   rJ   rY   r|   r   r  r   r   r  r4   r%  r   r   r?  r   r  r  r   rM  __classcell__r@   r@   r  rA   r3   ,  s8    

# 
	r3   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  Z	!	!d.d!d"d#d$Zd/d&d'Zd(d) Zd*d+ Zd,d- Zd!S )0r   c                 C   s   d| j j S )Nz<%s>)r   r9   rT   r@   r@   rA   r     s   zNoOpSpan.__repr__c                 C      d S rR   r@   rT   r@   r@   rA   r4     s   zNoOpSpan.containing_transactionc                 K   s   t  S rR   )r   )rU   r   r   r@   r@   rA   r     rW   zNoOpSpan.start_childc                 C      dS )Nr   r@   rT   r@   r@   rA   r        zNoOpSpan.to_traceparentc                 C   rO  rR   r@   rT   r@   r@   rA   r   	  rQ  zNoOpSpan.to_baggagec                 C   rO  rR   r@   rT   r@   r@   rA   r     rQ  zNoOpSpan.get_baggagec                 C   s   t dS r  )iterrT   r@   r@   rA   r     s   zNoOpSpan.iter_headersc                 C   rO  rR   r@   r   r@   r@   rA   r     rQ  zNoOpSpan.set_tagc                 C   rO  rR   r@   r   r@   r@   rA   r     rQ  zNoOpSpan.set_datac                 C   rO  rR   r@   r   r@   r@   rA   r     rQ  zNoOpSpan.update_datac                 C   rO  rR   r@   r   r@   r@   rA   r   !  rQ  zNoOpSpan.set_statusc                 C   rO  rR   r@   r   r@   r@   rA   r   %  rQ  zNoOpSpan.set_http_statusc                 C   rP  )NTr@   rT   r@   r@   rA   r   )  rQ  zNoOpSpan.is_successc                 C      i S rR   r@   rT   r@   r@   rA   r  -  rQ  zNoOpSpan.to_jsonc                 C   rS  rR   r@   rT   r@   r@   rA   r  1  rQ  zNoOpSpan.get_trace_contextc                 C   rS  rR   r@   rT   r@   r@   rA   r  5  rQ  zNoOpSpan.get_profile_contextNr&  c                C   rP  )z_
        The `hub` parameter is deprecated. Please use the `scope` parameter, instead.
        Nr@   )rU   r6   r  r1   r@   r@   rA   r   9  s   zNoOpSpan.finishr   c                 C   rO  rR   r@   r   r@   r@   rA   r   F  rQ  zNoOpSpan.set_measurementc                 C   rO  rR   r@   r   r@   r@   rA   r?  J  rQ  zNoOpSpan.set_contextc                 C   rO  rR   r@   r{   r@   r@   rA   r   N  rQ  zNoOpSpan.init_span_recorderc                 C   rO  rR   r@   )rU   rL  r@   r@   rA   rM  R  rQ  z'NoOpSpan._set_initial_sampling_decisionr  r  )r9   r:   r;   r   r  r4   r   r  r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   r   r?  r   rM  r@   r@   r@   rA   r     s6    

r   r/   r8   
attributestemplatec                C   rO  rR   r@   )funcr/   r8   rU  rV  r@   r@   rA   r+  Y  s   r+  c                 C   rO  rR   r@   )rW  r@   r@   rA   r+  a  s   c                C   s,   ddl m} |||||d}| r|| S |S )a
  
    Decorator to start a child span around a function call.

    This decorator automatically creates a new span when the decorated function
    is called, and finishes the span when the function returns or raises an exception.

    :param func: The function to trace. When used as a decorator without parentheses,
        this is the function being decorated. When used with parameters (e.g.,
        ``@trace(op="custom")``, this should be None.
    :type func: Callable or None

    :param op: The operation name for the span. This is a high-level description
        of what the span represents (e.g., "http.client", "db.query").
        You can use predefined constants from :py:class:`sentry_sdk.consts.OP`
        or provide your own string. If not provided, a default operation will
        be assigned based on the template.
    :type op: str or None

    :param name: The human-readable name/description for the span. If not provided,
        defaults to the function name. This provides more specific details about
        what the span represents (e.g., "GET /api/users", "process_user_data").
    :type name: str or None

    :param attributes: A dictionary of key-value pairs to add as attributes to the span.
        Attribute values must be strings, integers, floats, or booleans. These
        attributes provide additional context about the span's execution.
    :type attributes: dict[str, Any] 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`

    :returns: When used as ``@trace``, returns the decorated function. When used as
        ``@trace(...)`` with parameters, returns a decorator function.
    :rtype: Callable or decorator function

    Example::

        import sentry_sdk
        from sentry_sdk.consts import OP, SPANTEMPLATE

        # Simple usage with default values
        @sentry_sdk.trace
        def process_data():
            # Function implementation
            pass

        # With custom parameters
        @sentry_sdk.trace(
            op=OP.DB_QUERY,
            name="Get user data",
            attributes={"postgres": True}
        )
        def make_db_query(sql):
            # Function implementation
            pass

        # With a custom template
        @sentry_sdk.trace(template=SPANTEMPLATE.AI_TOOL)
        def calculate_interest_rate(amount, rate, years):
            # Function implementation
            pass
    r   )create_span_decoratorrT  )sentry_sdk.tracing_utilsrX  )rW  r/   r8   rU  rV  rX  	decoratorr@   r@   rA   r+  h  s   F)rF   r   r   r  r3  r  ignore)r   rR   )Rr   r   r   r   r   enumr   r   sentry_sdk.constsr   r   r   r	   'sentry_sdk.profiler.continuous_profilerr
   sentry_sdk.utilsr   r   r   r   r   r   typingr   collections.abcr   r   r   r   r   r   r   r   r   r   r   r   r   typing_extensionsr   r    r!   r"   r#   (sentry_sdk.profiler.transaction_profilerr$   sentry_sdk._typesr%   r&   r'   r(   r)   rC   r<   rH   r   r   rJ   r\   LOW_QUALITY_TRANSACTION_SOURCESrX   rZ   SOURCE_FOR_STYLErt   ru   r   r3   r   DEFAULTr+  rY  rF   r   r   r  r3  r  catch_warningssimplefilterr   sentry_sdk.metricsr   r@   r@   r@   rA   <module>   s     	;'    K   N`


 W
	$