o
    0 i#                  
   @   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& 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/m0Z0m1Z1m2Z2m3Z3 G dd de(ddZ4G dd de4ddZ5e(d d!e6iZ7d"Z8d#Z9G d$d% d%e6eZ:e:j;gZ<e:j=e:j=e:j=e:j>e:j;e:j=e:j>e:j>e:j>d&	Z?d'd( Z@G d)d* d*ZAG d+d, d,ZBG d-d. d.eBZCG d/d0 d0eBZDer5e!	d7dddejEd1d2d3ZFe!d4d3 ZF	d7dddejEd1d5d3ZFd d6lGmHZHmIZImJZJmKZKmLZLmMZM dS )8    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)Set)	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 rA   rA   ^/home/app/PaddleOCR-VL-test/.venv_paddleocr/lib/python3.10/site-packages/sentry_sdk/tracing.pyr*   1   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)r:   r;   r<   r=   r>   r?   rA   rA   rA   rB   rD   l   s   
 rD   ProfileContextprofiler_idrH   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	componentZcustomZroutetaskurlviewc                 C      | j S N)valueselfrA   rA   rB   __str__      zTransactionSource.__str__N)
r:   r;   r<   	COMPONENTCUSTOMROUTEZTASKURLZVIEWrU   rA   rA   rA   rB   rK      s    rK   )	ZendpointZfunction_namehandler_nameZmethod_and_path_patternpathZ
route_nameZroute_patternZuri_templaterN   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   OKZPERMISSION_DENIED	NOT_FOUNDZRESOURCE_EXHAUSTEDZFAILED_PRECONDITIONZUNAUTHENTICATEDZALREADY_EXISTSZINVALID_ARGUMENTZDEADLINE_EXCEEDEDZUNIMPLEMENTEDUNAVAILABLEINTERNAL_ERRORUNKNOWN_ERROR)Zhttp_status_coderA   rA   rB   get_span_status_from_http_code   s4   
rb   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   rd   rT   re   rA   rA   rB   __init__   s   

z_SpanRecorder.__init__c                 C   s8   t | j| jkrd |_|  jd7  _d S | j| d S )Nrh   )lenrf   re   _span_recorderrg   append)rT   spanrA   rA   rB   add   s   z_SpanRecorder.addN)r:   r;   r<   __doc__	__slots__rj   ro   rA   rA   rA   rB   rc      s
    rc   c                   @   sf  e Zd ZdZdZ														dFd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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-d. Zd/d0 ZdGd2d3Zd4d5 Zd6d7 Z d8d9 Z!d:d; Z"dHd<d=Z#d>d? Z$d@dA Z%dBdC Z&dDdE Z'dS )I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/   r0   r1   _measurementsr6   _start_timestamp_monotonic_nsr3   	timestamp_tags_datarl   r2   _context_manager_state_containing_transactionr7   r8   r9   _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 | _ | !  | "t#  d S )N
   z>The `hub` parameter is deprecated. Please use `scope` instead.   
stacklevel)$rs   rt   r-   r.   r/   r0   r1   r3   r2   r7   r8   ru   rx   ry   r{   r|   r}   warningswarnDeprecationWarningr   nowr   utc
isinstancer@   fromtimestampr6   r   rv   AttributeErrorrw   rl   update_active_threadset_profiler_idr
   )rT   r+   r,   r-   r.   r/   r0   r1   r2   r3   r5   r6   r7   r8   r9   rA   rA   rB   rj     sL   

zSpan.__init__c                 C   s   | j d u rt|| _ d S d S rQ   )rl   rc   ri   rA   rA   rB   init_span_recordera  s   
zSpan.init_span_recorderc                 C   s   | j s	t j| _ | j S rQ   )rs   uuiduuid4hexrS   rA   rA   rB   r+   f  s   zSpan.trace_idc                 C   
   || _ d S rQ   )rs   rT   rR   rA   rA   rB   r+   n     
c                 C   s    | j st jdd  | _ | j S )N   )rt   r   r   r   rS   rA   rA   rB   r,   s  s   zSpan.span_idc                 C   r   rQ   )rt   r   rA   rA   rB   r,   {  r   c              	   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__r:   r0   r1   r+   r,   r-   r/   r8   rS   rA   rA   rB   __repr__  s   zSpan.__repr__c                 C   s(   | j pt }|j}| |_||f| _| S rQ   )r7   
sentry_sdkget_current_scopern   rz   )rT   r7   old_spanrA   rA   rB   	__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 rQ   )
r   r3   r   ERROR
set_statusr`   r   rz   finishrn   )rT   tyrR   tbr7   r   rA   rA   rB   __exit__  s   

"zSpan.__exit__c                 C   rP   )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{   rS   rA   rA   rB   r5     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.
        r1   NzEThe `description` parameter is deprecated. Please use `name` instead.r   r   instrumenterr/   )r+   r-   r5   rA   )getr   r   r   r   
get_clientoptionsNoOpSpan
setdefaultr/   rr   r+   r,   r5   rl   ro   )rT   r   kwargsZconfiguration_instrumenterchildZspan_recorderrA   rA   rB   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.)rr   r   warningr4   continue_from_headersEnvironHeaders)clsenvironr   rA   rA   rB   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   NFrA   )rr   r   r   rG   Zfrom_incoming_headerr   BAGGAGE_HEADER_NAMEupdateextract_sentrytrace_dataSENTRY_TRACE_HEADER_NAMEfreezer4   r.   )r   headersr   r   rH   Zsentrytrace_kwargstransactionrA   rA   rB   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)r5   r   to_traceparentget_baggage	serializer   )rT   rH   rA   rA   rB   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   rA   rA   rB   from_traceparent8  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,   )rT   r/   r   rA   rA   rB   r   Q  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)r5   r   rS   rA   rA   rB   
to_baggage`  s   
zSpan.to_baggagec                 C      || j |< d S rQ   )rx   rT   keyrR   rA   rA   rB   set_tagi     zSpan.set_tagc                 C   r   rQ   )ry   r   rA   rA   rB   set_datam  r   zSpan.set_datac                 C   s   | j | d S rQ   )ry   r   rT   datarA   rA   rB   update_dataq  s   zSpan.update_datac                 C   s"   t | j| jk r|| j|< d S d S rQ   )rk   r|   r}   )rT   flagresultrA   rA   rB   set_flagu  s   zSpan.set_flagc                 C   r   rQ   r3   r   rA   rA   rB   r   z     
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   )rR   unitNr   r   r   ru   rT   r9   rR   r   rA   rA   rB   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 rQ   )r   r   	THREAD_IDr=   THREAD_NAMErT   	thread_idthread_namerA   rA   rB   
set_thread  s   zSpan.set_threadc                 C   s   |d ur|  tj| d S d S rQ   )r   r   PROFILER_IDrT   rJ   rA   rA   rB   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   rb   rT   Zhttp_statusrA   rA   rB   set_http_status  s
   zSpan.set_http_statusc                 C   s
   | j dkS )Nokr   rS   rA   rA   rB   
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)rw   r   r@   r   r   r   r   r   rv   r6   r   r   r   r   r   "maybe_create_breadcrumbs_from_span)rT   r7   end_timestampelapsedrA   rA   rB   r     s$   



zSpan.finishc              
   C   s   | j | j| j| j| j| j| j| j| jd	}| j	r| j	| j
d< t| jdkr*| j|d< | j
}|r3||d< i }|| j || j |rG||d< |S )z5Returns a JSON-compatible representation of the span.)	r+   r,   r-   r.   r0   r1   r6   rw   r8   r3   r   measurementstagsr   )r+   r,   r-   r.   r0   r1   r6   rw   r8   r3   rx   rk   ru   r   r|   ry   )rT   rvr   r   rA   rA   rB   to_json  s.   
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-   r0   r1   r8   r3   dynamic_sampling_contextz	thread.idzthread.namer   )r+   r,   r-   r0   r1   r8   r3   r5   r   r   ry   r   r   r   r   )rT   r   r   r   r   rA   rA   rB   get_trace_context  s,   
zSpan.get_trace_contextc                 C   s"   | j tj}|d u rd S d|iS )NrJ   )ry   r   r   r   r   rA   rA   rB   get_profile_context  s
   zSpan.get_profile_contextc                 C   s   t  \}}| || d S rQ   )r   r   r   rA   rA   rB   r     s   
zSpan.update_active_thread)NNNTNNNNNNNNr~   Nr   NN)(r:   r;   r<   rp   rq   rj   r   propertyr+   setterr,   r   r   r   r5   r   SENTRYr   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rA   rA   rA   rB   rr      st    
C




*
/
	
	
&"!
rr   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 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 )(r4   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.
    )
r9   rE   rF   sample_rateru   	_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 NrA   )superrj   r9   rE   r   rF   ru   r   r   r   r   r   _generate_sample_randr+   )rT   r9   rF   rH   rE   r   Zbaggage_sample_randr   rA   rB   rj   ?  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   r:   r9   r0   r+   r,   r-   r/   rE   r8   rS   rA   rA   rB   r   \  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)rl   r/   rS   rA   rA   rB   _possibly_startedm  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   rS   r   rA   rB   r   y  s   


zTransaction.__enter__c                    sB   | j d ur| j ||| | jd ur| j  t ||| d S rQ   )r   r   r   stopr   )rT   r   rR   r   r   rA   rB   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.
        rA   rS   rA   rA   rB   r5     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   ZHubr7   )rT   Z	scope_argZhub_argZscope_or_hubrA   rA   rB   _get_scope_from_finish_args  s    z'Transaction._get_scope_from_finish_argsc                 C   s$   dj | jrd| j d nd| jdS )Nz{op}transaction <{name}><z> r   )r0   r9   )formatr0   r9   rS   rA   rA   rB   _get_log_representation  s   z#Transaction._get_log_representationr2   c             	      sp  | 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tj}|dur||jd v rt	
dj|  | jtj |jd d |jr|jjddd	 t| jjd }|jjdd
|d d| _| js| jdu rt	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< |(|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   Zbackpressurer   r   )data_categoryrn   zCTransaction has no name, falling back to `<unlabeled transaction>`.z<unlabeled transaction>trace_ignore_status_codesz[Tracing] Discarding {transaction_description} because the HTTP status code {status_code} is matched by trace_ignore_status_codes: {trace_ignore_status_codes})transaction_descriptionstatus_coder	  Zevent_processorrh   )r  Zquantityz1Discarding transaction without sampling decision.c                 S   s   g | ]}|j d ur| qS rQ   )rw   r   ).0rn   rA   rA   rB   
<listcomp>-  s
    
z&Transaction.finish.<locals>.<listcomp>traceZprofilerE   )typer   Ztransaction_infocontextsr   rw   r6   rf   Z_dropped_spansr   ))rw   r  r7   r   r   r   	is_activerl   r/   r   r   	transporthas_tracing_enabledr   monitordownsample_factorZrecord_lost_eventr9   r   r   r   ry   r   r   r   r  r  rk   rf   rg   r   r   r   r   rE   rx   r6   r   Zvalidru   Zcapture_event)rT   r7   r   r2   clientreasonr  Z	num_spansZfinished_spansZlen_diffrg   r  Zprofile_contexteventr   rA   rB   r     s   



	





zTransaction.finishc                 C   r   r   r   r   rA   rA   rB   r   Y  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   rA   rA   rB   set_contextg  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.responser  N)r   r   r  r   r   rA   rB   r   r  s   zTransaction.set_http_statusc                    s,   t   }| j|d< | j|d< | j|d< |S )z<Returns a JSON-compatible representation of the transaction.r9   rE   r/   )r   r   r9   rE   r/   )rT   r   r   rA   rB   r   z  s
   



zTransaction.to_jsonc                    s   t   }| jr| j|d< |S )Nr   )r   r   ry   )rT   Ztrace_contextr   rA   rB   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   mutablerG   Zpopulate_from_transactionrS   rA   rA   rB   r     s   zTransaction.get_baggagec                 C   sD  t  }|  }t|jsd| _dS | jdurt| j| _dS t|j	dr.|jd |n|d dur8|d n|jd }t
|ddsQtdj|d	 d| _dS t|| _|jrd|  jd
|jj   _| jstdj|t|j	drvd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.
        FNZtraces_samplerrF   Ztraces_sample_rateZTracing)rE   zN[Tracing] Discarding {transaction_description} because of invalid sample rate.)r
  r   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   )r   r   r  r  r   r/   r@   r   callabler   r   r   r   r  r  r  r   r   )rT   sampling_contextr  r
  r   rA   rA   rB   _set_initial_sampling_decision  sb   



z*Transaction._set_initial_sampling_decisionr   r   )r:   r;   r<   rp   rq   rK   rX   rj   r   r   r   r   r   r5   r  r  r   r   r  r   r   r   r   r  __classcell__rA   rA   r   rB   r4     s:    

! 
	r4   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   r:   rS   rA   rA   rB   r      s   zNoOpSpan.__repr__c                 C      d S rQ   rA   rS   rA   rA   rB   r5     s   zNoOpSpan.containing_transactionc                 K   s   t  S rQ   )r   )rT   r   r   rA   rA   rB   r   	  rV   zNoOpSpan.start_childc                 C      dS )Nr   rA   rS   rA   rA   rB   r        zNoOpSpan.to_traceparentc                 C   r   rQ   rA   rS   rA   rA   rB   r     r"  zNoOpSpan.to_baggagec                 C   r   rQ   rA   rS   rA   rA   rB   r     r"  zNoOpSpan.get_baggagec                 C   s   t dS r   )iterrS   rA   rA   rB   r     s   zNoOpSpan.iter_headersc                 C   r   rQ   rA   r   rA   rA   rB   r     r"  zNoOpSpan.set_tagc                 C   r   rQ   rA   r   rA   rA   rB   r   !  r"  zNoOpSpan.set_datac                 C   r   rQ   rA   r   rA   rA   rB   r   %  r"  zNoOpSpan.update_datac                 C   r   rQ   rA   r   rA   rA   rB   r   )  r"  zNoOpSpan.set_statusc                 C   r   rQ   rA   r   rA   rA   rB   r   -  r"  zNoOpSpan.set_http_statusc                 C   r!  )NTrA   rS   rA   rA   rB   r   1  r"  zNoOpSpan.is_successc                 C      i S rQ   rA   rS   rA   rA   rB   r   5  r"  zNoOpSpan.to_jsonc                 C   r$  rQ   rA   rS   rA   rA   rB   r   9  r"  zNoOpSpan.get_trace_contextc                 C   r$  rQ   rA   rS   rA   rA   rB   r   =  r"  zNoOpSpan.get_profile_contextNr  c                C   r!  )z_
        The `hub` parameter is deprecated. Please use the `scope` parameter, instead.
        NrA   )rT   r7   r   r2   rA   rA   rB   r   A  s   zNoOpSpan.finishr   c                 C   r   rQ   rA   r   rA   rA   rB   r   N  r"  zNoOpSpan.set_measurementc                 C   r   rQ   rA   r   rA   rA   rB   r  R  r"  zNoOpSpan.set_contextc                 C   r   rQ   rA   ri   rA   rA   rB   r   V  r"  zNoOpSpan.init_span_recorderc                 C   r   rQ   rA   )rT   r  rA   rA   rB   r  Z  r"  z'NoOpSpan._set_initial_sampling_decisionr   r   )r:   r;   r<   r   r   r5   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  rA   rA   rA   rB   r     s6    

r   r0   r9   
attributestemplatec                C   r   rQ   rA   )funcr0   r9   r&  r'  rA   rA   rB   r  a  s   r  c                 C   r   rQ   rA   )r(  rA   rA   rB   r  i  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_decoratorr%  )sentry_sdk.tracing_utilsr)  )r(  r0   r9   r&  r'  r)  	decoratorrA   rA   rB   r  p  s   F)rG   r   r   r   r  r   rQ   )Nr   r   r   r   r   enumr   r   Zsentry_sdk.constsr   r   r   r	   Z'sentry_sdk.profiler.continuous_profilerr
   Zsentry_sdk.utilsr   r   r   r   r   r   typingr   collections.abcr   r   r   r   r   r   r   r   r   r   r   r   r   r   Ztyping_extensionsr    r!   r"   r#   r$   Z(sentry_sdk.profiler.transaction_profilerr%   Zsentry_sdk._typesr&   r'   r(   r)   r*   rD   r=   rI   r   r   rK   rZ   ZLOW_QUALITY_TRANSACTION_SOURCESrW   rY   ZSOURCE_FOR_STYLErb   rc   rr   r4   r   DEFAULTr  r*  rG   r   r   r   r  r   rA   rA   rA   rB   <module>   s     	;'    =   c`


$W