o
    ٰiP                  
   @   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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 erd dlmZmZmZ d d	lmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z& d d
l'm(Z(m)Z) e!dZ*e$dZ+d dl,m-Z-m.Z.m/Z/m0Z0 d dlm1Z1 d dl2m3Z3 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e@de6fdd ZAG d!d" d"ZBG d#d$ d$ZCG d%d& d&eCZDG d'd( d(eCZEere&	d;dddejFd)		+	,	-	,	.	/	0	1		2d<d3d4ZGe&d=d6d4ZG	d;dddejFd)	7	+	,	-	,	.	/	0	1		8d>d9d4ZGd d:lHmIZImJZJmKZKmLZLmMZMmNZN dS )?    N)datetime	timedeltatimezone)Enum)TYPE_CHECKING)INSTRUMENTERSPANDATA
SPANSTATUSSPANTEMPLATE)get_profiler_id)capture_internal_exceptionsget_current_thread_metais_valid_sample_rateloggernanosecond_timeshould_be_treated_as_error)CallableMappingMutableMapping)AnyDictIteratorListOptional	ParamSpecSetTupleTypeVarUnionoverload)	TypedDictUnpackPR)EventMeasurementUnitMeasurementValueSamplingContext)ContinuousProfile)Profilec                   @   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< 	 ded	< 	 eed
< 	 ded< 	 d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descriptionOptional[sentry_sdk.Hub]hubstatusOptional[Transaction]containing_transaction Optional[Union[datetime, float]]start_timestampzsentry_sdk.ScopescopeoriginnameN__name__
__module____qualname__str__annotations__bool rC   rC   F/home/ubuntu/.local/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baggageNr<   rC   rC   rC   rD   rF   l   s   
 rF   ProfileContextprofiler_idrJ   zsentry-tracec                   @   s2   e Zd ZdZdZdZdZdZdZde	fdd	Z
d
S )TransactionSource	componentcustomroutetaskurlviewreturnc                 C      | j S N)valueselfrC   rC   rD   __str__   s   zTransactionSource.__str__N)r=   r>   r?   	COMPONENTCUSTOMROUTETASKURLVIEWr@   rZ   rC   rC   rC   rD   rM      s    rM   )	endpointfunction_namehandler_namemethod_and_path_patternpath
route_nameroute_patternuri_templaterR   http_status_coderT   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)ri   rC   rC   rD   get_span_status_from_http_code   s4   
rw   c                   @   s0   e Zd ZdZdZdeddfddZdd
dZdS )_SpanRecorderz5Limits the number of spans recorded in a transaction.maxlenspansdropped_spansrz   rT   Nc                 C   s   |d | _ g | _d| _d S )N   r   ry   rY   rz   rC   rC   rD   __init__   s   

z_SpanRecorder.__init__spanSpanc                 C   s8   t | j| jkrd |_|  jd7  _d S | j| d S )Nr}   )lenr{   rz   _span_recorderr|   append)rY   r   rC   rC   rD   add   s   z_SpanRecorder.add)r   r   rT   N)r=   r>   r?   __doc__	__slots__intr   r   rC   rC   rC   rD   rx      s
    
rx   c                   @   s  e Zd ZdZdZ														dzddddd	dd
edddddddddddddddddeddddfddZdeddfddZ	e
defd d!Zejd"eddfd#d!Ze
defd$d%Zejd"eddfd&d%Zdefd'd(Zd{d)d*Z	+	,	"	,	-	,		d|d.d/Ze
d}d0d1Zejfd2ed3d4dd fd5d6Ze	7	8	3	4		9d~d:d;Zedd<	8	>		3	4		9dd?d@ZddBdCZe	D		3	4		ddEdFZdefdGdHZddJdKZdLed"d4ddfdMdNZdLed"d4ddfdOdPZddSdTZdUedVeddfdWdXZd"eddfdYdZZ 	[dded"e!d\d]ddfd^d_Z"	`	a	b			ddcddZ#ddfdgZ$dheddfdidjZ%defdkdlZ&		d		m	n		ddodpZ'ddqdrZ(ddsdtZ)ddvdwZ*ddxdyZ+dS )r   ak  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   _measurementsr8   _start_timestamp_monotonic_nsr4   	timestamp_tags_datar   r3   _context_manager_state_containing_transactionr9   r:   r;   _flags_flags_capacityNTmanualr+   Optional[str]r,   r-   r.   r/   Optional[bool]r0   r1   r3   r2   r4   r6   r5   r8   r7   r9   Optional[sentry_sdk.Scope]r:   r;   rT   c                 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)$r   r   r-   r.   r/   r0   r1   r4   r3   r9   r:   r   r   r   r   r   r   warningswarnDeprecationWarningr   nowr   utc
isinstancefloatfromtimestampr8   r   r   AttributeErrorr   r   update_active_threadset_profiler_idr   )rY   r+   r,   r-   r.   r/   r0   r1   r3   r4   r6   r8   r9   r:   r;   rC   rC   rD   r     sL   

zSpan.__init__rz   c                 C   s   | j d u rt|| _ d S d S rV   )r   rx   r~   rC   rC   rD   init_span_recorder\  s   
zSpan.init_span_recorderc                 C   s   | j s	t j| _ | j S rV   )r   uuiduuid4hexrX   rC   rC   rD   r+   `  s   zSpan.trace_idrW   c                 C   
   || _ d S rV   )r   rY   rW   rC   rC   rD   r+   g     
c                 C   s    | j st jdd  | _ | j S )N   )r   r   r   r   rX   rC   rC   rD   r,   k  s   zSpan.span_idc                 C   r   rV   )r   r   rC   rC   rD   r,   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/   r:   rX   rC   rC   rD   __repr__v  s   zSpan.__repr__c                 C   s(   | j pt }|j}| |_||f| _| S rV   )r9   
sentry_sdkget_current_scoper   r   )rY   r9   old_spanrC   rC   rD   	__enter__  s
   
zSpan.__enter__tyOptional[Any]tbc                 C   sh   |d urt ||r| tj t  | j\}}| `| | ||_W d    d S 1 s-w   Y  d S rV   )r   
set_statusr	   ru   r   r   finishr   )rY   r   rW   r   r9   r   rC   rC   rD   __exit__  s   

"zSpan.__exit__c                 C   rU   )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   rX   rC   rC   rD   r6     s   	zSpan.containing_transactioninstrumenterkwargsr   c                 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   r   r/   )r+   r-   r6   rC   )getr   r   r   r   
get_clientoptionsNoOpSpan
setdefaultr/   r   r+   r,   r6   r   r   )rY   r   r   configuration_instrumenterchildspan_recorderrC   rC   rD   start_child  s,   
zSpan.start_childenvironMapping[str, str]Transactionc                 K   s   t jt|fi |S )ag  
        DEPRECATED: Use :py:meth:`sentry_sdk.continue_trace`.

        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.
        )r   continue_from_headersEnvironHeaders)clsr   r   rC   rC   rD   continue_from_environ  s   zSpan.continue_from_environ_sample_randheadersr   c                K   sl   t d tj|t|d}|t|i t|t}|dur*|| |	  t
di |}d|_|S )a  
        DEPRECATED: Use :py:meth:`sentry_sdk.continue_trace`.

        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)
        z2Deprecated: use sentry_sdk.continue_trace instead.r   NFrC   )r   warningrI   from_incoming_headerr   BAGGAGE_HEADER_NAMEupdateextract_sentrytrace_dataSENTRY_TRACE_HEADER_NAMEfreezer   r.   )r   r   r   r   rJ   sentrytrace_kwargstransactionrC   rC   rD   r     s   


zSpan.continue_from_headersIterator[Tuple[str, str]]c                 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)r6   r   to_traceparentget_baggage	serializer   )rY   rJ   rC   rC   rD   iter_headers  s   zSpan.iter_headerstraceparentc                 K   s   |sdS | j t|ifi |S )z
        DEPRECATED: Use :py:meth:`sentry_sdk.continue_trace`.

        Create a ``Transaction`` with the given params, then add in data pulled from
        the given ``sentry-trace`` header value before returning the ``Transaction``.
        N)r   r   )r   r   r   rC   rC   rD   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,   )rY   r/   r   rC   rC   rD   r   6  s   

zSpan.to_traceparentOptional[Baggage]c                 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)r6   r   rX   rC   rC   rD   
to_baggageD  s   
zSpan.to_baggagekeyc                 C      || j |< d S rV   )r   rY   r   rW   rC   rC   rD   set_tagL     zSpan.set_tagc                 C   r   rV   )r   r   rC   rC   rD   set_dataO  r   zSpan.set_datadataDict[str, Any]c                 C   s   | j | d S rV   )r   r   rY   r   rC   rC   rD   update_dataR  s   zSpan.update_dataflagresultc                 C   s"   t | j| jk r|| j|< d S d S rV   )r   r   r   )rY   r   r   rC   rC   rD   set_flagU  s   zSpan.set_flagc                 C   r   rV   r4   r   rC   rC   rD   r   Y     
zSpan.set_status unitr%   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   )rW   r   Nr   r   r   r   rY   r;   rW   r   rC   rC   rD   set_measurement\     zSpan.set_measurement	thread_idOptional[int]thread_namec                 C   s<   |d ur|  tjt| |d ur|  tj| d S d S d S rV   )r   r   	THREAD_IDr@   THREAD_NAMErY   r   r   rC   rC   rD   
set_threadk  s   zSpan.set_threadrL   c                 C   s   |d ur|  tj| d S d S rV   )r   r   PROFILER_IDrY   rL   rC   rC   rD   r   t  s   zSpan.set_profiler_idhttp_statusc                 C   s0   |  dt| | tj| | t| d S )Nzhttp.status_code)r   r@   r   r   HTTP_STATUS_CODEr   rw   rY   r  rC   rC   rD   set_http_statusx  s
   zSpan.set_http_statusc                 C   s
   | j dkS )Nokr   rX   rC   rC   rD   
is_success  r   zSpan.is_successend_timestamp Optional[Union[float, datetime]]c                 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 }| }|rjtj| jv }| jduo_| jdp_| jd}|sd|rj| d| 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  )microsecondszai.zgen_ai.zgen_ai.conversation.id)r   r   r   r   r   r   r   r   r   r8   r   r   r   r   r   get_conversation_idr   GEN_AI_OPERATION_NAMEr   r0   
startswithr   "maybe_create_breadcrumbs_from_span)rY   r9   r
  elapsedconversation_id	has_ai_opis_ai_span_oprC   rC   rD   r     s4   




zSpan.finishc              
   C   s   | j | j| j| j| j| j| j| j| jd	}| j	r#| j	|d< | j	| j
d< t| jdkr/| j|d< | j
}|r8||d< i }|| j || j |rL||d< |S )z5Returns a JSON-compatible representation of the span.)	r+   r,   r-   r.   r0   r1   r8   r   r:   r4   r   measurementstagsr   )r+   r,   r-   r.   r0   r1   r8   r   r:   r4   r   r   r   r   r   r   )rY   rvr  r   rC   rC   rD   to_json  s0   

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   r:   r4   dynamic_sampling_contextz	thread.idzthread.namer   )r+   r,   r-   r0   r1   r:   r4   r6   r   r  r   r   r   r   r   )rY   r  r   r   r   rC   rC   rD   get_trace_context  s,   
zSpan.get_trace_contextOptional[ProfileContext]c                 C   s"   | j tj}|d u rd S d|iS )NrL   )r   r   r   r  r  rC   rC   rD   get_profile_context  s
   zSpan.get_profile_contextc                 C   s   t  \}}| || d S rV   )r   r  r   rC   rC   rD   r     s   
zSpan.update_active_thread)NNNTNNNNNNNNr   N)rT   r   r   r   rW   r   r   r   rT   NrT   r5   )r   r   r   r   rT   r   )r   r   r   r   r   r   rT   r   rT   r   )r   r   r   r   rT   r5   rT   r   r   r   rT   Nr   )r   r   r   r   rT   N)rL   r   rT   NNN)r9   r   r
  r  rT   r   rT   r   rT   r   )rT   r  )rT   N),r=   r>   r?   r   r   rB   r@   r   r   r   propertyr+   setterr,   r   r   r   r6   r   SENTRYr   classmethodr   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r  r	  r   r  r  r  r   rC   rC   rC   rD   r      s$   	

B


+
+




	

4
#
 	r   c                       sn  e Zd ZdZdZdddejfdedddd	d
eddddf fddZdefddZ	de
fddZdG fddZ								dH fddZedGddZ			 			!dId"d#Zdefd$d%Z		dJdd&	!	(	)	*	+		,dK fd-d.Z	dLdeded/d0ddfd1d2Zd3edd4ddfd5d6Zd7eddf fd8d9ZdM fd;d<ZdN fd>d?ZdOdAdBZ	C	D		dPdEdFZ  ZS )Qr   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.
    )
r;   rG   rH   sample_rater   	_contexts_profile_continuous_profile_baggager   r   Nr;   rH   r   rJ   r   rG   r   zUnpack[SpanKwargs]rT   c                    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 NrC   )superr   r;   rG   r*  rH   r   r+  r,  r-  r.  r   _generate_sample_randr+   )rY   r;   rH   rJ   rG   r   baggage_sample_randr   rC   rD   r   '  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=   r;   r0   r+   r,   r-   r/   rG   r:   rX   rC   rC   rD   r   C  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/   rX   rC   rC   rD   _possibly_startedS  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.)r4  r   debugr0  r   r,  rX   r3  rC   rD   r   ^  s   


zTransaction.__enter__r   r   rW   r   c                    sB   | j d ur| j ||| | jd ur| j  t ||| d S rV   )r,  r   r-  stopr0  )rY   r   rW   r   r3  rC   rD   r   m  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.
        rC   rX   rC   rC   rD   r6   x  s   	z"Transaction.containing_transaction	scope_arg1Optional[Union[sentry_sdk.Scope, sentry_sdk.Hub]]hub_argr   c                 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   Hubr9   )rY   r7  r9  scope_or_hubrC   rC   rD   _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   r;   )formatr0   r;   rX   rC   rC   rD   _get_log_representation  s   z#Transaction._get_log_representationr3   r9   r
  r  r3   r2   r   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   backpressurer*  r   )data_categoryr   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_coderD  event_processorr}   )rC  quantityz1Discarding transaction without sampling decision.c                 S   s   g | ]}|j d ur| qS rV   )r   r  ).0r   rC   rC   rD   
<listcomp>  s
    
z&Transaction.finish.<locals>.<listcomp>traceprofilerG   )typer   transaction_infocontextsr  r   r8   r{   _dropped_spansr  ))r   r=  r9   r   r   r   	is_activer   r/   r   r5  	transporthas_tracing_enabledr   monitordownsample_factorrecord_lost_eventr;   r   r0  r   r   r   r   r  r?  r@  r   r{   r|   r   r+  r  r  rG   r   r8   r,  validr   capture_event)rY   r9   r
  r3   clientreasonrF  	num_spansfinished_spanslen_diffr|   rO  profile_contexteventr3  rC   rD   r     s   



	





zTransaction.finishr   r%   c                 C   r   r   r   r   rC   rC   rD   r   <  r   zTransaction.set_measurementr   dict[str, Any]c                 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   rC   rC   rD   set_contextK  s   zTransaction.set_contextr  c                    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.responserF  N)r0  r  ra  r  r3  rC   rD   r  U  s   zTransaction.set_http_statusr   c                    s,   t   }| j|d< | j|d< | j|d< |S )z<Returns a JSON-compatible representation of the transaction.r;   rG   r/   )r0  r  r;   rG   r/   )rY   r  r3  rC   rD   r  \  s
   



zTransaction.to_jsonr   c                    s   t   }| jr| j|d< |S )Nr   )r0  r  r   )rY   trace_contextr3  rC   rD   r  f  s   

zTransaction.get_trace_contextrI   c                 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.  mutablerI   populate_from_transactionrX   rC   rC   rD   r   n  s   zTransaction.get_baggagesampling_contextr'   c                 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.
        FNtraces_samplerrH   traces_sample_rateTracing)rG   zN[Tracing] Discarding {transaction_description} because of invalid sample rate.)rE  r   z?[Tracing] Discarding {transaction_description} because {reason}z"traces_sampler returned 0 or Falseztraces_sample_rate is set to 0)rE  rZ  z,[Tracing] Starting {transaction_description}z}[Tracing] Discarding {transaction_description} because it's not included in the random sample (sampling rate = {sample_rate}))rE  r*  )r   r   r@  rS  r   r/   r   r*  callabler   r   r   r   r?  rT  rU  r5  r   )rY   rf  rY  rE  r*  rC   rC   rD   _set_initial_sampling_decisiony  sb   



z*Transaction._set_initial_sampling_decision)rT   r   r  )r7  r8  r9  r8  rT   r   r#  r9   r   r
  r  r3   r2   rT   r   r"  r$  r%  )rT   rI   rf  r'   rT   N)r=   r>   r?   r   r   rM   r\   r@   r   r   rB   r4  r   r   r&  r6   r=  r@  r   r   r   ra  r   r  r  r  r   rk  __classcell__rC   rC   r3  rD   r     s    

  



r   c                	   @   sr  e Zd ZdefddZedHddZejfdedd	dd fd
dZ	defddZ
dIddZdIddZdJddZdedd	ddfddZdedd	ddfddZdKdd Zdeddfd!d"Zd#eddfd$d%Zdefd&d'ZdLd(d)ZdMd*d+ZdMd,d-Z		dNdd.	0	1	2	3	4		5dOd6d7Z	8dPd9eded:d;ddfd<d=Zdedd>ddfd?d@ZdAeddfdBdCZ	D	E		dQdFdGZdS )Rr   rT   c                 C   s   d| j j S )Nz<%s>)r   r=   rX   rC   rC   rD   r     s   zNoOpSpan.__repr__r5   c                 C      d S rV   rC   rX   rC   rC   rD   r6     s   zNoOpSpan.containing_transactionr   r   r   c                 K   s   t  S rV   )r   )rY   r   r   rC   rC   rD   r     s   zNoOpSpan.start_childc                 C      dS )Nr   rC   rX   rC   rC   rD   r        zNoOpSpan.to_traceparentr   c                 C   ro  rV   rC   rX   rC   rC   rD   r     rq  zNoOpSpan.to_baggagec                 C   ro  rV   rC   rX   rC   rC   rD   r     rq  zNoOpSpan.get_baggager   c                 C   s   t dS r/  )iterrX   rC   rC   rD   r     s   zNoOpSpan.iter_headersr   rW   Nc                 C   ro  rV   rC   r   rC   rC   rD   r     rq  zNoOpSpan.set_tagc                 C   ro  rV   rC   r   rC   rC   rD   r     rq  zNoOpSpan.set_datar   r   c                 C   ro  rV   rC   r   rC   rC   rD   r     rq  zNoOpSpan.update_datac                 C   ro  rV   rC   r   rC   rC   rD   r     rq  zNoOpSpan.set_statusr  c                 C   ro  rV   rC   r  rC   rC   rD   r    rq  zNoOpSpan.set_http_statusc                 C   rp  )NTrC   rX   rC   rC   rD   r	    rq  zNoOpSpan.is_successc                 C      i S rV   rC   rX   rC   rC   rD   r  
  rq  zNoOpSpan.to_jsonc                 C   rs  rV   rC   rX   rC   rC   rD   r    rq  zNoOpSpan.get_trace_contextc                 C   rs  rV   rC   rX   rC   rC   rD   r    rq  zNoOpSpan.get_profile_contextrA  r9   r   r
  r  r3   r2   r   c                C   rp  )z_
        The `hub` parameter is deprecated. Please use the `scope` parameter, instead.
        NrC   )rY   r9   r
  r3   rC   rC   rD   r        
zNoOpSpan.finishr   r;   r   r%   c                 C   ro  rV   rC   r   rC   rC   rD   r        zNoOpSpan.set_measurementr`  c                 C   ro  rV   rC   r   rC   rC   rD   ra  $  rq  zNoOpSpan.set_contextrz   c                 C   ro  rV   rC   r~   rC   rC   rD   r   '  rq  zNoOpSpan.init_span_recorderrf  r'   c                 C   ro  rV   rC   )rY   rf  rC   rC   rD   rk  *  ru  z'NoOpSpan._set_initial_sampling_decisionr  r   r  r!  r$  r%  r#  rl  r"  rm  )r=   r>   r?   r@   r   r&  r6   r   r(  r   r   r   r   r   r   r   r   r   r   r  rB   r	  r  r  r  r   r   r   ra  r   rk  rC   rC   rC   rD   r     sn    









r   r0   r;   
attributestemplatefuncr0   r   r;   rw  Optional[dict[str, Any]]rx  r
   *Callable[[Callable[P, R]], Callable[P, R]]c                C   ro  rV   rC   )ry  r0   r;   rw  rx  rC   rC   rD   rK  2  rt  rK  Callable[P, R]c                 C   ro  rV   rC   )ry  rC   rC   rD   rK  >  ru  Optional[Callable[P, R]]AUnion[Callable[P, R], Callable[[Callable[P, R]], Callable[P, R]]]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_decoratorrv  )sentry_sdk.tracing_utilsr  )ry  r0   r;   rw  rx  r  	decoratorrC   rC   rD   rK  D  s   J)rI   r   r1  r   rS  r  rV   )ry  Nr0   r   r;   r   rw  rz  rx  r
   rT   r{  )ry  r|  rT   r|  )ry  r}  r0   r   r;   r   rw  rz  rx  r
   rT   r~  )Or   r   r   r   r   enumr   typingr   r   sentry_sdk.constsr   r   r	   r
   'sentry_sdk.profiler.continuous_profilerr   sentry_sdk.utilsr   r   r   r   r   r   collections.abcr   r   r   r   r   r   r   r   r   r   r   r   r   r   typing_extensionsr    r!   r"   r#   sentry_sdk._typesr$   r%   r&   r'   r(   (sentry_sdk.profiler.transaction_profilerr)   r*   rF   r@   rK   r   r   rM   r_   LOW_QUALITY_TRANSACTION_SOURCESr[   r]   SOURCE_FOR_STYLEr   rw   rx   r   r   r   DEFAULTrK  r  rI   r   r1  r   rS  r  rC   rC   rC   rD   <module>   s     	4;&    )   [Q
$[