bg+t ddlZddlZddlmZmZddlZddlmZddlmZm Z m Z ddl m Z ddlm Z ddlmZer6ddlZddlmZdd lmZdd lmZdd lmZdd lmZdd lmZddlZddlmZmZmZdZdZdZdZdZdZ dZ!dZ"egZ#e!e!e!eee!eeed Z$Gdde%Z&Gdde%Z'Gdde'Z(Gdde'Z)d"d Z*dd!l+m,Z,m-Z-m.Z.m/Z/m0Z0dS)#N)datetime timedelta) INSTRUMENTER)is_valid_sample_rateloggernanosecond_time)PY2)SPANDATA) TYPE_CHECKING)Any)Dict)Iterator)List)Optional)Tuple)EventMeasurementUnitSamplingContextbaggagez sentry-tracecustomurlrouteview componenttask) endpoint function_name handler_namemethod_and_path_patternpath route_name route_pattern uri_templaterc"eZdZdZdZdZdZdS) _SpanRecorderz5Limits the number of spans recorded in a transaction.maxlenspansc(|dz |_g|_dS)Nr&selfr's I/opt/cloudlinux/venv/lib64/python3.11/site-packages/sentry_sdk/tracing.py__init__z_SpanRecorder.__init__@sqj  ct|j|jkr d|_dS|j|dSN)lenr(r'_span_recorderappend)r,spans r-addz_SpanRecorder.addJsA tz??T[ ( ("&D    J  d # # # # #r/N)__name__ __module__ __qualname____doc__ __slots__r.r6r/r-r%r%;s=??#I$$$$$r/r%ceZdZdZdZ ddZdZdZdZd Z e d Z e j fd Zd Zed ZedZdZedZdZdZdZdZdZdZdZddZdZdZdS)Span)trace_idspan_idparent_span_idsame_process_as_parentsampledop descriptionstart_timestamp_start_timestamp_monotonic_nsstatus timestamp_tags_datar3hub_context_manager_state_containing_transactionc |d|vrttSt|S)z_ Backwards-compatible implementation of Span and Transaction creation. transaction)object__new__ Transaction)clskwargss r-rRz Span.__new__gs3 F " ">>+.. .~~c"""r/NTc |ptjj|_|ptjjdd|_||_||_||_||_||_ | |_ ||_ i|_ i|_ | |_| ptj|_ t%|_n#t($rYnwxYwd|_d|_dS)N)uuiduuid4hexr?r@rArBrCrDrErHrLrJrKrNrutcnowrFrrGAttributeErrorrIr3) r,r?r@rArBrCrDrErLrHrPcontaining_transactionrFs r-r.z Span.__init__us !4DJLL$4 7$*,,"2233"7 ,&<# &   '=$.C(/2C2C 2A1B1BD . .    D "s(B<< C C c@|jt||_dSdSr1)r3r%r+s r-init_span_recorderzSpan.init_span_recorders)   &"/"7"7D    ' &r/cd|jjd|jd|jd|jd|jd|jd|jdS) N) __class__r7rDrEr?r@rArCr,s r-__repr__z Span.__repr__sZ '''     ###   r/c|jptjj}|jd\}}|j}||_|||f|_|S)N)rL sentry_sdkHubcurrent_stackr5rM)r,rL_scopeold_spans r- __enter__zSpan.__enter__sDh0*.0:b>5: '*E8&<# r/c||d|j\}}}|`||||_dS)Ninternal_error) set_statusrMfinishr5)r,tyvaluetbrLrqrrs r-__exit__z Span.__exit__sM   OO, - - -#:UH  ' C r/c|jSr1)rNrhs r-r]zSpan.containing_transactions ++r/c R|jptjj}|j}|o |jd}||krt S|d|jtd|j |j |j d|}|j o |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. instrumenterrC)r?rAr]r<)rLrlrmrnclientoptionsNoOpSpan setdefaultrCr>r?r@r]r3r6)r,r~rUrLrconfiguration_instrumenterchild span_recorders r- start_childzSpan.start_childsh0*.0%+%N~0N" 5 5 5:: )T\222 ]<#'#>       ' VD,G,V   %   e $ $ $ r/c Dtjd|jdi|S)zGDeprecated: use :py:meth:`sentry_sdk.tracing.Span.start_child` instead.z:Deprecated: use Span.start_child instead of Span.new_span.r<)rwarningrr,rUs r-new_spanz Span.new_spans. STTTt))&)))r/c z|turtjdtjt |fi|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 `continue_from_headers` in that it assumes header names in the form "HTTP_HEADER_NAME" - such as you would get from a wsgi environ - rather than the form "header-name". zXDeprecated: use Transaction.continue_from_environ instead of Span.continue_from_environ.)r>rrrScontinue_from_headersEnvironHeaders)rTenvironrUs r-continue_from_environzSpan.continue_from_environsI $;; N9   01H1HSSFSSSr/c |turtjdtj|t }|t |it|t}|)||| tdi|}d|_ |S)z Create a transaction with the given params (including any data pulled from the 'sentry-trace' and 'baggage' headers). zXDeprecated: use Transaction.continue_from_headers instead of Span.continue_from_headers.NFr<) r>rrBaggagefrom_incoming_headergetBAGGAGE_HEADER_NAMEupdateextract_sentrytrace_dataSENTRY_TRACE_HEADER_NAMEfreezerSrB)rTheadersrUrsentrytrace_kwargsrPs r-rzSpan.continue_from_headerss $;; N9   .w{{;N/O/OPP *G45555 KK0 1 1    ) MM, - - - NN   !++F++ -2 *r/c#Kt|fV|jr:|j}|rt |fVdSdSdS)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)rto_traceparentr] get_baggage serializer)r,rs r- iter_headerszSpan.iter_headers7s'(;(;(=(=====  & 31==??IIKKG 3)7222222 3 3 3 3r/c \tjd|sdS|jt|ifi|S)a DEPRECATED: Use :py:meth:`sentry_sdk.tracing.Transaction.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)rrrr)rT traceparentrUs r-from_traceparentzSpan.from_traceparentEsY  A    4(s( %{ 3  7=   r/cp|jdurd}n|jdurd}nd}|jd|j}||d|z }|S)NT1F0-)rCr?r@)r,rCrs r-rzSpan.to_traceparent^s` <4  GG \U " "GGG!% =   KGG- -Kr/cF|jr|jSdSr1)r]rrhs r- to_baggagezSpan.to_baggagems'  & =.::<< <tr/c||j|<dSr1)rJr,keyrys r-set_tagz Span.set_tags 3r/c||j|<dSr1)rKrs r-set_dataz Span.set_datawrr/c||_dSr1rHr,rys r-rvzSpan.set_status{s  r/c|dt||tj||dkr|ddSd|cxkrdkrnn|dkr|ddS|dkr|ddS|d kr|d dS|d kr|d dS|d kr|ddS|dkr|ddS|ddSd|cxkrdkrqnnn|dkr|ddS|dkr|ddS|dkr|ddS|ddS|ddS)Nzhttp.status_codeiokiipermission_deniedi not_foundiresource_exhaustedifailed_preconditioniunauthenticatedialready_existsinvalid_argumentiXideadline_exceededi unimplementedi unavailableru unknown_error)rstrrr HTTP_STATUS_CODErvr, http_statuss r-set_http_statuszSpan.set_http_statuss0 K 0 0    h/===    OOD ! ! ! ! ! K % % % %# % % % % %c!! 344444## ,,,,,## 455555## 566666## 122222## 011111 233333 K % % % %# % % % % %c!! 344444##00000## ..... 011111 OOO , , , , ,r/c|jdkS)Nrrrhs r- is_successzSpan.is_successs{d""r/c@|jdS|p|jptjj} |r||_n6t |jz }|jt|dz z|_n(#t$rtj |_YnwxYwt||dS)Ni) microseconds) rIrLrlrmrnrrGrFrr\rr["maybe_create_breadcrumbs_from_span)r,rL end_timestampelapseds r-rwz Span.finishs > %47TX7!7 / !.)++d.PP!%!5 !(4999" / / /%_..DNNN / +3555tsAA&&"B  B c |j|j|j|j|j|j|j|jd}|jr|j|j d<|j }|r||d<|j }|r||d<|S)N)r?r@rArBrDrErFrIrHtagsdata) r?r@rArBrDrErFrIrHrJrK)r,rvrrs r-to_jsonz Span.to_jsons |"1&*&A'+#3    ; /#';DJx z  BvJz  BvJ r/c|j|j|j|j|jd}|jr |j|d<|jr.|j|d<|S)N)r?r@rArDrErHdynamic_sampling_context) r?r@rArDrErHr]rr)r,rs r-get_trace_contextzSpan.get_trace_contexts |"1'+    ; ';BxL  & U+7799RRTT *  r/) NNNTNNNNNNNNNN)r7r8r9r;rRr.r_rirsr{propertyr]rSENTRYrr classmethodrrrrrrrrrvrrrwrrr<r/r-r>r>RsI( # # # #  #'#'#'#'#V888       ,,X,(4':@*** TT[T,%%[%N 3 3 3  [ 0          "-"-"-H###04r/r>ceZdZdZdddefdZdZfdZfdZe dZ dd Z dd Z d Z fd Zd ZdZxZS)rS)namesourceparent_sampled sample_rate _measurements _contexts_profile_baggageNc |s-d|vr)tjd|d}tj|fi|||_||_d|_||_i|_ i|_ d|_ ||_ dS)NrPz^Deprecated: use Transaction(name=...) to create transactions instead of Span(transaction=...).) rrpopr>r.rrrrrrrr)r,rrrrrUs r-r.zTransaction.__init__s - // N4   ::m,,D d%%f%%%  ,  r/cd|jjd|jd|jd|jd|jd|jd|jd|jd S) Nraz(name=z, op=rbrcrdrez , source=rf) rgr7rrDr?r@rArCrrhs r-rizTransaction.__repr__s` '''   ###    r/ctt||j|j|Sr1)superrSrsr)r,rgs r-rszTransaction.__enter__(s@ k4  **,,, = $ M # # % % % r/c|j|j|||tt||||dSr1)rr{rrS)r,rxryrzrgs r-r{zTransaction.__exit__1sM = $ M " "2ub 1 1 1 k4  ))"eR88888r/c|Sr1r<rhs r-r]z"Transaction.containing_transaction8s  r/c |jdS|p|jptjj}|j}|dS|jitjd|j rLt|j r8|j r|j j dkrd}nd}|j |ddS|jstjdd|_t"||||js|jtjd dSd |jjD}d|_i}||j|d |id|jd |ji||j|j|j|d }|j*|jr|j|d<d|_|j|d<||S)Nz.Discarding transaction because sampled = Falser* backpressurerrP) data_categoryzCTransaction has no name, falling back to ``.zz1Discarding transaction without sampling decision.cDg|]}|j |Sr1)rIr).0r5s r- z&Transaction.finish..os2   ~) LLNN)))r/tracer)typerPtransaction_infocontextsrrIrFr(profile measurements)rIrLrlrmrnrr3rdebug transporthas_tracing_enabledrmonitordownsample_factorrecord_lost_eventrrr>rwrCr(rrrrrJrFrvalidr capture_event)r,rLrrreasonfinished_spansrevents r-rwzTransaction.finishAs > %47TX7!7 >4   & LI J J J  X$7$G$G X>+fn&F&J&J+FF*F 2262WWW4y 2 NU   2DI D#}---| |#RSSS4  +1   #'''$"8"8":":;<<<"9!)4; 7 J#3#    = $)<)<)>)> $#}E)  DM $ 2n  '''r/c ||d|j|<dS)N)ryunit)r)r,rryrs r-set_measurementzTransaction.set_measurements-2D#A#A4   r/c||j|<dSr1)rrs r- set_contextzTransaction.set_contexts#sr/ctt|}|j|d<|j|d<|j|d<|S)NrrrC)rrSrrrrC)r,rrgs r-rzTransaction.to_jsonsD ; % % - - / /Y6 {8  9  r/ch|jr |jjrtj||_|jS)zd The first time a new baggage with sentry items is made, it will be frozen. )rmutablerpopulate_from_transactionrhs r-rzTransaction.get_baggages6 } D 5 D#=dCCDM}r/c p|jptjj}|j}|r|jpi}d|jr d|jzdznd|j}|rt|s d|_ dS|j t|j |_ dSt|dr|d|n|d |d n|d }t|d s1t!jd |d|_ dSt||_ |jr|xj |jjzc_ |j sVt!jd|t|drdndd|_ dSt+j|j k|_ |j r*t!jd|dSt!jd||j dS)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}>raz> r)rDrFNtraces_samplerrtraces_sample_rateTracing)rzN[Tracing] Discarding {transaction_description} because of invalid sample rate.)transaction_descriptionz?[Tracing] Discarding {transaction_description} because {reason}z"traces_sampler returned 0 or Falseztraces_sample_rate is set to 0)r rz,[Tracing] Starting {transaction_description}z}[Tracing] Discarding {transaction_description} because it's not included in the random sample (sampling rate = {sample_rate}))r r)rLrlrmrnrrformatrDrrrCfloatrcallablerrrrrrrrandom)r,sampling_contextrLrrr rs r-_set_initial_sampling_decisionz*Transaction._set_initial_sampling_decisions,h0*.0,fn3"<"C"C(,7dg $$Rty#D# #   099  DL F < #$T\22D  F $45566  %G$ %&6 7 7 7 $$45A!!12212 $K BBB  N`gg,Ch    !DL F -- > A    @ @    LQXX,C$GKK0@$A$ABB><<= Y   !DL F })99 <  L>EE,CF      LPWW,C $ 0W     r/r)r)r7r8r9r;TRANSACTION_SOURCE_CUSTOMr.rirsr{rr]rwrrrrr __classcell__)rgs@r-rSrSs" I(     <   99999XO(O(O(O(bBBBB$$$   hhhhhhhr/rScreZdZdZejfdZdZdZdZ dZ dZ dZ d Z d Zd Zd Zd ZddZdS)rc|jjSr1)rgr7rhs r-rizNoOpSpan.__repr__s ~&&r/c tSr1)r)r,r~rUs r-rzNoOpSpan.start_childs zzr/c |jdi|SNr<)rrs r-rzNoOpSpan.new_span#st))&)))r/cdS)Nrr<rhs r-rzNoOpSpan.to_traceparent'srr/cdSr1r<rhs r-rzNoOpSpan.to_baggage+tr/c tdSr)iterrhs r-rzNoOpSpan.iter_headers/s Bxxr/cdSr1r<rs r-rzNoOpSpan.set_tag3 r/cdSr1r<rs r-rzNoOpSpan.set_data7r!r/cdSr1r<rs r-rvzNoOpSpan.set_status;r!r/cdSr1r<rs r-rzNoOpSpan.set_http_status?r!r/cdS)NTr<rhs r-rzNoOpSpan.is_successCrr/ciSr1r<rhs r-rzNoOpSpan.to_jsonG r/ciSr1r<rhs r-rzNoOpSpan.get_trace_contextKr'r/NcdSr1r<)r,rLrs r-rwzNoOpSpan.finishOr!r/r)r7r8r9rirrrrrrrrrrvrrrrrwr<r/r-rrs'''(4':***                  r/rcHtrddlm}nddlm}|r ||S|S)av Decorator to start a child span under the existing current transaction. If there is no current transaction, then nothing will be traced. .. code-block:: :caption: Usage import sentry_sdk @sentry_sdk.trace def my_function(): ... @sentry_sdk.trace async def my_async_function(): ... r)start_child_span_decorator)r sentry_sdk.tracing_utils_py2r+sentry_sdk.tracing_utils_py3)funcr+s r-rrTsU& LKKKKKKKKKKKKK *))$///))r/)rrrrrr1)1rXrrrrlsentry_sdk.constsrsentry_sdk.utilsrrrsentry_sdk._compatr r sentry_sdk._typesr typingr r rrrrsentry_sdk.profilerrrrrrrTRANSACTION_SOURCE_URLTRANSACTION_SOURCE_ROUTETRANSACTION_SOURCE_VIEWTRANSACTION_SOURCE_COMPONENTTRANSACTION_SOURCE_TASKLOW_QUALITY_TRANSACTION_SOURCESSOURCE_FOR_STYLErQr%r>rSrrsentry_sdk.tracing_utilsrrrrrr<r/r-r=s ((((((((******JJJJJJJJJJ""""""&&&&&&++++++ JMMMIIIIIIIIII ) %" * # -107 ".-, #  $$$$$F$$$.XXXXX6XXXv jjjjj$jjjZ 7 7 7 7 7 t7 7 7 t****Dr/