§
    xÅjéj  ã            	       óÖ  — U d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZmZ ddlmZ ddlmZ ddlZddlmZ ddlmZmZ ddlmZmZmZmZmZmZmZmZ erqdd	lm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z' dd
l(m)Z) ddl*m+Z+m,Z,m-Z- ddlm.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4  e)de5e4e6dœ¦  «        Z7 e)de$e0         e$e1         e$e7         e#e4e2f         dœ¦  «        Z8	 ddl9m:Z: ddl;m<Z= e=Z<de>d<    e:dd¦  «        Z?n# e@$ r ejA        Z?dZ<Y nw xY wdaBde>d<   dZCdddeDfd„ZEdddeDfd„ZFd)d„ZG e6d ¦  «        ZH G d!„ d"¦  «        ZI G d#„ d$e¦  «        ZJ G d%„ d&eJ¦  «        ZK G d'„ d(eJ¦  «        ZLdS )*a·  
This file is originally based on code from https://github.com/nylas/nylas-perftools,
which is published under the following license:

The MIT License (MIT)

Copyright (c) 2014 Nylas

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
é    N)ÚABCÚabstractmethod)Údeque)ÚTYPE_CHECKING)ÚLRUCache)ÚDEFAULT_SAMPLING_FREQUENCYÚextract_stack)Úcapture_internal_exceptionÚcapture_internal_exceptionsÚget_current_thread_metaÚ	is_geventÚis_valid_sample_rateÚloggerÚnanosecond_timeÚset_in_app_in_frames)ÚAnyÚCallableÚDequeÚDictÚListÚOptionalÚSetÚType)Ú	TypedDict)ÚEventÚProfilerModeÚSamplingContext)ÚExtractedSampleÚFrameIdÚProcessedFrameÚProcessedStackÚProcessedThreadMetadataÚStackIdÚThreadIdÚProcessedSample©Úelapsed_since_start_nsÚ	thread_idÚstack_idÚProcessedProfile©ÚframesÚstacksÚsamplesÚthread_metadata)Úget_original)Ú
ThreadPoolzOptional[Type[_ThreadPool]]r1   ÚtimeÚsleepúOptional[Scheduler]Ú
_scheduleré   ÚoptionsúDict[str, Any]Úreturnc                 ó´   — | d         }|�dS | d         }|�|dk    rdS | d                               d¦  «        }|�t          j        d¦  «         |dk    rdS dS )NÚprofiles_samplerTÚprofiles_sample_rater   Ú_experimentszy_experiments['profiles_sample_rate'] is deprecated. Please use the non-experimental profiles_sample_rate option directly.F)Úgetr   Úwarning)r7   r;   r<   s      úYC:\Projects\Historical\venv\Lib\site-packages\sentry_sdk/profiler/transaction_profiler.pyÚhas_profiling_enabledrA   r   s‹   € ØÐ1Ô2ÐØÐ#Øˆtà"Ð#9Ô:ÐØÐ'Ð,@À1Ò,DÐ,DØˆtà" >Ô2×6Ò6Ð7MÑNÔNÐØÐ'ÝŒðñ	
ô 	
ð 	
ð
   !Ò#Ð#Ø�4àˆ5ó    c                 óú  — t           �t          j        d¦  «         dS t          }t	          ¦   «         rt
          j        }nt          j        }|                      d¦  «        �	| d         }nC|                      di ¦  «                             d¦  «        }|�t          j	        d¦  «         |p|}|t          j        k    s|dk    rt          |¬¦  «        a nC|t
          j        k    rt          |¬¦  «        a n"t          d                     |¦  «        ¦  «        ‚t          j        d	                     t           j        ¬
¦  «        ¦  «         t                                ¦   «          t          j        t          ¦  «         dS )Nz%[Profiling] Profiler is already setupFÚprofiler_moder=   zk_experiments['profiler_mode'] is deprecated. Please use the non-experimental profiler_mode option directly.r3   ©Ú	frequencyzUnknown profiler mode: {}z.[Profiling] Setting up profiler in {mode} mode)ÚmodeT)r5   r   Údebugr   r   ÚGeventSchedulerrG   ÚThreadSchedulerr>   r?   Ú
ValueErrorÚformatÚsetupÚatexitÚregisterÚteardown_profiler)r7   rF   Údefault_profiler_moderD   s       r@   Úsetup_profilerrR   ˆ   sr  € õ ÐÝŒÐ<Ñ=Ô=Ð=Øˆuå*€Iå�{„{ð 5õ
 !0Ô 4ÐÐå /Ô 4Ðà‡{‚{�?Ñ#Ô#Ð/Ø Ô0ˆˆàŸš N°BÑ7Ô7×;Ò;¸OÑLÔLˆØÐ$ÝŒNðBñô ð ð &Ð>Ð)>ˆð 	�Ô-Ò-Ð-à˜GÒ#Ð#å$¨yÐ9Ñ9Ô9ˆ
ˆ
Ø	�/Ô.Ò	.Ð	.Ý$¨yÐ9Ñ9Ô9ˆ
ˆ
åÐ4×;Ò;¸MÑJÔJÑKÔKÐKå
„LØ8×?Ò?ÅZÄ_Ð?ÑUÔUñô ð õ ×ÒÑÔÐå
„OÕ%Ñ&Ô&Ð&àˆ4rB   c                  óJ   — t           �t                                ¦   «          d a d S ©N)r5   Úteardown© rB   r@   rP   rP   º   s%   € õ ÐÝ×ÒÑÔÐà€J€J€JrB   g   °ŽðBc                   óî   — e Zd Z	 	 d%dddeddddd	df
d
„Zd&d„Z	 	 	 	 d'd„Zd&d„Zd&d„Zd(d„Z		 	 	 	 	 	 	 	 d)d„Z
deddd	dfd„Zd*d„Z	 	 	 	 	 	 d+d!„Zd	efd"„Zed,d#„¦   «         Zej        d-d$„¦   «         ZdS ).ÚProfileNÚsampledzOptional[bool]Ústart_nsÚhubúOptional[sentry_sdk.Hub]Ú	schedulerr4   r9   c                 ó¾  — |€t           n|| _        t          j        ¦   «         j        | _        || _        t          ¦   «         d         pd| _        d | _	        	 || _
        n# t          $ r
 d| _
        Y nw xY wd| _        d| _        i | _        i | _        g | _        g | _        g | _        d| _        d | _        |�%|| _        t+          j        dt.          d¬¦  «         d S d S )Nr   Fz8The `hub` parameter is deprecated. Please do not use it.r6   ©Ú
stacklevel)r5   r]   ÚuuidÚuuid4ÚhexÚevent_idrY   r   Ú_default_active_thread_idÚactive_thread_idrZ   ÚAttributeErrorÚstop_nsÚactiveÚindexed_framesÚindexed_stacksr,   r-   r.   Úunique_samplesÚ_hubÚwarningsÚwarnÚDeprecationWarning)ÚselfrY   rZ   r[   r]   s        r@   Ú__init__zProfile.__init__Ç   s  € ð (1Ð'8�˜¸iˆŒå!œZ™\œ\Ô-ˆŒà)0ˆŒõ /FÑ.GÔ.GÈÔ.JÐ.OÈaˆÔ&Ø15ˆÔð	Ø!)ˆDŒMˆMøÝð 	ð 	ð 	ØˆDŒMˆMˆMð	øøøð ˆŒØ!ˆŒà46ˆÔØ46ˆÔØ.0ˆŒØ.0ˆŒØ02ˆŒàˆÔð 15ˆŒ	Øˆ?ØˆDŒIÝŒMØJÝ"Øðñ ô ð ð ð ð ˆ?s   ÁA  Á A4Á3A4c                 ó’   — t          ¦   «         d         | _        t          j        d                     | j        ¬¦  «        ¦  «         d S )Nr   z.[Profiling] updating active thread id to {tid})Útid)r   rf   r   rH   rL   ©rq   s    r@   Úupdate_active_thread_idzProfile.update_active_thread_idó   sR   € Ý 7Ñ 9Ô 9¸!Ô <ˆÔÝŒØ<×CÒCØÔ)ð Dñ ô ñ	
ô 	
ð 	
ð 	
ð 	
rB   Úsampling_contextr   c                 ó²  — | j         st          j        d¦  «         d| _         dS | j        €t          j        d¦  «         d| _         dS t	          j        ¦   «         }|                     ¦   «         s	d| _         dS |j        }t          | 	                    d¦  «        ¦  «        rA	  |d         |¦  «        }nZ# t          $ r! t          j        dd¬¦  «         d| _         Y dS w xY w|d	         �	|d	         }n|d
          	                    d	¦  «        }|€t          j        d¦  «         d| _         dS t          |d¬¦  «        st          j        d¦  «         d| _         dS t          j        ¦   «         t          |¦  «        k     | _         | j         rt          j        d¦  «         dS t          j        d                     t          |¦  «        ¬¦  «        ¦  «         dS )a  
        Sets the profile's sampling decision according to the following
        precedence rules:

        1. If the transaction to be profiled is not sampled, that decision
        will be used, regardless of anything else.

        2. Use `profiles_sample_rate` to decide.
        z@[Profiling] Discarding profile because transaction is discarded.FNz@[Profiling] Discarding profile because profiler was not started.r;   z7[Profiling] profiles_sampler raised; unsampling profileT)Úexc_infor<   r=   zA[Profiling] Discarding profile because profiling was not enabled.Ú	Profiling)Úsourcez>[Profiling] Discarding profile because of invalid sample rate.z [Profiling] Initializing profilezk[Profiling] Discarding profile because it's not included in the random sample (sample rate = {sample_rate}))Úsample_rate)rY   r   rH   r]   Ú
sentry_sdkÚ
get_clientÚ	is_activer7   Úcallabler>   Ú	Exceptionr?   r   ÚrandomÚfloatrL   )rq   rw   Úclientr7   r|   s        r@   Ú_set_initial_sampling_decisionz&Profile._set_initial_sampling_decisionû   s<  € ð Œ|ð 	ÝŒLØRñô ð ð !ˆDŒLØˆFð Œ>Ð!ÝŒLØRñô ð ð !ˆDŒLØˆFåÔ&Ñ(Ô(ˆØ×ÒÑ!Ô!ð 	Ø ˆDŒLØˆFà”.ˆå�G—K’KÐ 2Ñ3Ô3Ñ4Ô4ð 	NðØ9˜gÐ&8Ô9Ð:JÑKÔK��øÝð ð ð Ý”ØMØ!ðñ ô ð ð  %�”Ø��ðøøøð Ð+Ô,Ð8Ø!Ð"8Ô9ˆKˆKà! .Ô1×5Ò5Ð6LÑMÔMˆKð ÐÝŒLØSñô ð ð !ˆDŒLØˆFå# K¸ÐDÑDÔDð 	ÝŒNØPñô ð ð !ˆDŒLØˆFõ
 ”}‘”­¨{Ñ);Ô);Ò;ˆŒàŒ<ð 	ÝŒLÐ;Ñ<Ô<Ð<Ð<Ð<åŒLØ}÷  Eò  EÝ % kÑ 2Ô 2ð Eñ ô ñô ð ð ð s   Â#B5 Â5'C ÃC c                 óæ   — | j         r| j        rd S | j        s
J d¦   «         ‚t          j        d¦  «         d| _        | j        st          ¦   «         | _        | j                             | ¦  «         d S )NúNo scheduler specifiedz[Profiling] Starting profileT)rY   ri   r]   r   rH   rZ   r   Ústart_profilingru   s    r@   ÚstartzProfile.startM  s{   € ØŒ|ð 	˜tœ{ð 	ØˆFàŒ~Ð7Ð7Ð7Ñ7Ô7ˆ~ÝŒÐ3Ñ4Ô4Ð4ØˆŒØŒ}ð 	.Ý+Ñ-Ô-ˆDŒMØŒ×&Ò& tÑ,Ô,Ð,Ð,Ð,rB   c                 ó¤   — | j         r| j        sd S | j        s
J d¦   «         ‚t          j        d¦  «         d| _        t          ¦   «         | _        d S )Nr‡   z[Profiling] Stopping profileF)rY   ri   r]   r   rH   r   rh   ru   s    r@   ÚstopzProfile.stopX  sY   € ØŒ|ð 	 4¤;ð 	ØˆFàŒ~Ð7Ð7Ð7Ñ7Ô7ˆ~ÝŒÐ3Ñ4Ô4Ð4ØˆŒÝ&Ñ(Ô(ˆŒˆˆrB   c                 ó‚   — t          j        ¦   «         }|j        }| |_        ||f| _        |                      ¦   «          | S rT   )r}   Úget_isolation_scopeÚprofileÚ_context_manager_stater‰   )rq   ÚscopeÚold_profiles      r@   Ú	__enter__zProfile.__enter__a  s=   € ÝÔ.Ñ0Ô0ˆØ”mˆØˆŒà',¨kÐ&:ˆÔ#à�
Š
‰ŒˆàˆrB   ÚtyúOptional[Any]ÚvalueÚtbc                 ó¢   — t          ¦   «         5  |                      ¦   «          | j        \  }}| `||_        d d d ¦  «         d S # 1 swxY w Y   d S rT   )r   r‹   r�   rŽ   )rq   r“   r•   r–   r�   r‘   s         r@   Ú__exit__zProfile.__exit__l  s›   € õ )Ñ*Ô*ð 	(ð 	(Ø�IŠI‰KŒKˆKà!%Ô!<ÑˆE�;ØÐ+à'ˆEŒMð	(ð 	(ð 	(ñ 	(ô 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(ð 	(øøøð 	(ð 	(ð 	(ð 	(ð 	(ð 	(s   �(AÁAÁAÚtsÚsampler   c                 óâ  ‡ — ‰ j         sd S |‰ j        k     rd S |‰ j        z
  }|t          k    r‰                      ¦   «          d S ‰ xj        dz  c_        t          |¦  «        }|D �]	\  }\  }}}	 |‰ j        vrœt          |¦  «        D ]J\  }	}
|
‰ j        vr<t          ‰ j        ¦  «        ‰ j        |
<   ‰ j
                             ||	         ¦  «         ŒKt          ‰ j        ¦  «        ‰ j        |<   ‰ j                             ˆ fd„|D ¦   «         ¦  «         ‰ j                             ||‰ j        |         dœ¦  «         ŒÚ# t          $ r$ t          t!          j        ¦   «         ¦  «         Y �Œw xY wd S )Né   c                 ó*   •— g | ]}‰j         |         ‘ŒS rV   )rj   )Ú.0Úframe_idrq   s     €r@   ú
<listcomp>z!Profile.write.<locals>.<listcomp>“  s!   ø€ ÐQÐQÐQ¸8˜Ô,¨XÔ6ÐQÐQÐQrB   r&   )ri   rZ   ÚMAX_PROFILE_DURATION_NSr‹   rl   Ústrrk   Ú	enumeraterj   Úlenr,   Úappendr-   r.   rg   r
   Úsysry   )rq   r™   rš   Úoffsetr'   rt   r)   Ú	frame_idsr,   ÚirŸ   s   `          r@   ÚwritezProfile.writew  sÂ  ø€ ØŒ{ð 	ØˆFà�”ÒÐØˆFà�d”mÑ#ˆØÕ+Ò+Ð+Ø�IŠI‰KŒKˆKØˆFàÐÔ˜qÑ ÐÔå!$ V¡¤Ðà28ð 	;ñ 	;Ñ.ˆCÑ.�(˜I vð;ð  4Ô#6Ð6Ð6Ý'0°Ñ';Ô';ð :ð :™˜˜8Ø#¨4Ô+>Ð>Ð>Ý<?ÀÔ@SÑ<TÔ<T˜DÔ/°Ñ9Ø œK×.Ò.¨v°a¬yÑ9Ô9Ð9øå47¸Ô8KÑ4LÔ4L�DÔ'¨Ñ1Ø”K×&Ò&ØQÐQÐQÐQÀyÐQÑQÔQñô ð ð ”×#Ò#à2HØ%(Ø$(Ô$7¸Ô$Aðð ñô ð ð øõ "ð ;ð ;ð ;õ +­3¬<©>¬>Ñ:Ô:Ð:Ð:Ñ:ð;øøøð-	;ð 	;s   Á/CD>Ä>*E,Å+E,r*   c                 óh   — d„ t          j        ¦   «         D ¦   «         }| j        | j        | j        |dœS )Nc                 ó`   — i | ]+}t          |j        ¦  «        d t          |j        ¦  «        i“Œ,S )Úname)r¢   Úidentr­   )rž   Úthreads     r@   ú
<dictcomp>z#Profile.process.<locals>.<dictcomp>¦  sN   € ð A
ð A
ð A
ð õ �”ÑÔØ�˜FœKÑ(Ô(ð ðA
ð A
ð A
rB   r+   )Ú	threadingr£   r,   r-   r.   )rq   r/   s     r@   ÚprocesszProfile.process¢  sS   € ðA
ð A
õ $Ô-Ñ/Ô/ð	A
ñ A
ô A
ˆð ”kØ”kØ”|Ø.ð	
ð 
ð 	
rB   Ú	event_optr   r7   r8   c                 óx  — |                       ¦   «         }t          |d         |d         |d         |d         ¦  «         |                     d¦  «        | j        d||                     dd¦  «        |d	         d
dt	          j        ¦   «         it	          j        ¦   «         t	          j        ¦   «         dœt	          j        ¦   «         t	          j	        ¦   «         dœ|d         |d         dt          | j        | j        z
  ¦  «        |d         d         d         t          | j        €| j        n| j        ¦  «        dœgdœS )Nr,   Úin_app_excludeÚin_app_includeÚproject_rootÚenvironmentÚpythonÚreleaseÚ Ústart_timestampÚ1Úarchitecture)r­   Úversionrd   ÚtransactionÚ0ÚcontextsÚtraceÚtrace_id)Úidr­   Úrelative_start_nsÚrelative_end_nsrÄ   rf   )r¸   rd   ÚplatformrŽ   rº   Ú	timestampr¿   ÚdeviceÚosÚruntimeÚtransactions)r²   r   r>   rd   rÈ   ÚmachineÚsystemrº   Úpython_implementationÚpython_versionr¢   rh   rZ   rf   re   )rq   r³   r7   rŽ   s       r@   Úto_jsonzProfile.to_json´  s\  € ð —,’,‘.”.ˆåØ�HÔØÐ$Ô%ØÐ$Ô%Ø�NÔ#ñ		
ô 	
ð 	
ð %Ÿ=š=¨Ñ7Ô7ØœØ ØØ —}’} Y°Ñ3Ô3Ø"Ð#4Ô5Øà¥Ô 0Ñ 2Ô 2ðõ !œÑ)Ô)Ý#Ô+Ñ-Ô-ðð õ
 !Ô6Ñ8Ô8Ý#Ô2Ñ4Ô4ðð ð $ JÔ/Ø% mÔ4ð *-õ (+¨4¬<¸$¼-Ñ+GÑ'HÔ'HØ )¨*Ô 5°gÔ >¸zÔ JÝ(+àÔ0Ð8ð Ô6Ð6à!Ô2ñ)ô )ðð ðð'&
ð &
ð &	
rB   c                 ó|  — t          j        ¦   «         }|                     ¦   «         sdS t          |j        ¦  «        sdS | j        �| j        s%|j        r|j                             dd¬¦  «         dS | j        t          k     r9|j        r|j                             dd¬¦  «         t          j        d¦  «         dS dS )NFr|   rŽ   )Údata_categoryÚinsufficient_dataz<[Profiling] Discarding profile because insufficient samples.T)r}   r~   r   rA   r7   rY   Ú	transportÚrecord_lost_eventrl   ÚPROFILE_MINIMUM_SAMPLESr   rH   )rq   r„   s     r@   ÚvalidzProfile.validè  sâ   € ÝÔ&Ñ(Ô(ˆØ×ÒÑ!Ô!ð 	Ø�5å$ V¤^Ñ4Ô4ð 	Ø�5àŒ<Ð t¤|ÐØÔð ØÔ ×2Ò2Ø!°ð 3ñ ô ð ð �5àÔÕ!8Ò8Ð8ØÔð ØÔ ×2Ò2Ø'°yð 3ñ ô ð õ ŒLÐWÑXÔXÐXØ�5àˆtrB   c                 óH   — t          j        dt          d¬¦  «         | j        S )Nz;The `hub` attribute is deprecated. Please do not access it.r6   r_   ©rn   ro   rp   rm   ru   s    r@   r[   zProfile.hub  s.   € åŒØIÝØð	
ñ 	
ô 	
ð 	
ð
 ŒyÐrB   c                 óL   — t          j        dt          d¬¦  «         || _        d S )Nz8The `hub` attribute is deprecated. Please do not set it.r6   r_   rÛ   )rq   r•   s     r@   r[   zProfile.hub
  s1   € åŒØFÝØð	
ñ 	
ô 	
ð 	
ð
 ˆŒ	ˆ	ˆ	rB   )NN©r9   N)rw   r   r9   N)r9   rX   ©r“   r”   r•   r”   r–   r”   r9   N)r9   r*   )r³   r   r7   r8   r9   r8   )r9   r\   )r•   r\   r9   N)Ú__name__Ú
__module__Ú__qualname__Úintrr   rv   r…   r‰   r‹   r’   r˜   rª   r²   rÒ   ÚboolrÙ   Úpropertyr[   ÚsetterrV   rB   r@   rX   rX   Æ   sÞ  € € € € € ð
 +/Ø+/ð*ð *à!ð*ð ð*ð (ð	*ð
 )ð*ð 
ð*ð *ð *ð *ðX
ð 
ð 
ð 
ðPØ 1ðPà	ðPð Pð Pð Pðd	-ð 	-ð 	-ð 	-ð)ð )ð )ð )ð	ð 	ð 	ð 	ð	(Ø!ð	(Ø*9ð	(Ø?Nð	(à	ð	(ð 	(ð 	(ð 	(ð);˜ð );Ð%6ð );¸4ð );ð );ð );ð );ðV
ð 
ð 
ð 
ð$2
Ø ð2
Ø+;ð2
à	ð2
ð 2
ð 2
ð 2
ðh�tð ð ð ð ð2 ðð ð ñ „Xðð 	„Zðð ð ñ „Zðð ð rB   rX   c                   ó–   — e Zd ZU dZded<   deddfd„Zdd„Z	 	 	 	 	 	 	 	 dd„Ze	dd„¦   «         Z
e	dd„¦   «         Zdd„Zdd„Zdd„ZdS )Ú	SchedulerÚunknownr   rG   rF   r9   Nc                 óœ   — d|z  | _         |                      ¦   «         | _        t          d¬¦  «        | _        t          ¦   «         | _        d S )Ng      ð?é€   )Úmaxlen)ÚintervalÚmake_samplerÚsamplerr   Únew_profilesÚsetÚactive_profiles)rq   rF   s     r@   rr   zScheduler.__init__  sG   € Ø˜i™ˆŒà×(Ò(Ñ*Ô*ˆŒõ /4¸3Ð.?Ñ.?Ô.?ˆÔÝ/2©u¬uˆÔÐÐrB   c                 ó.   — |                       ¦   «          | S rT   )rM   ru   s    r@   r’   zScheduler.__enter__   s   € Ø�
Š
‰ŒˆØˆrB   r“   r”   r•   r–   c                 ó.   — |                       ¦   «          d S rT   )rU   )rq   r“   r•   r–   s       r@   r˜   zScheduler.__exit__$  s   € ð 	�Š‰ŒˆˆˆrB   c                 ó   — d S rT   rV   ru   s    r@   rM   zScheduler.setup)  ó   € àˆrB   c                 ó   — d S rT   rV   ru   s    r@   rU   zScheduler.teardown-  rõ   rB   c                 ó   — dS )z¶
        Ensure the scheduler is running. By default, this method is a no-op.
        The method should be overridden by any implementation for which it is
        relevant.
        NrV   ru   s    r@   Úensure_runningzScheduler.ensure_running1  s	   € ð ˆtrB   rŽ   rX   c                 ób   — |                       ¦   «          | j                             |¦  «         d S rT   )rø   rï   r¥   )rq   rŽ   s     r@   rˆ   zScheduler.start_profiling9  s1   € Ø×ÒÑÔÐØÔ× Ò  Ñ)Ô)Ð)Ð)Ð)rB   úCallable[..., None]c                 ób   ‡ ‡‡— t          j        ¦   «         Št          d¬¦  «        Šdˆˆˆ fd„}|S )	Né   )Úmax_sizeÚargsr   Úkwargsr9   c                  óx  •— ‰
j         s	‰
j        sdS t          ‰
j         ¦  «        }t          ¦   «         }	 ˆˆ	fd„t	          j        ¦   «                              ¦   «         D ¦   «         }n1# t          $ r$ t          t	          j	        ¦   «         ¦  «         Y dS w xY wt          |¦  «        D ]3}‰
j                             ‰
j                              ¦   «         ¦  «         Œ4g }‰
j        D ]5}|j        r|                     ||¦  «         Œ |                     |¦  «         Œ6|D ]}‰
j                             |¦  «         ŒdS )z£
            Take a sample of the stack on all the threads in the process.
            This should be called at a regular interval to collect samples.
            Nc                 óV   •— g | ]%\  }}t          |¦  «        t          |‰‰¦  «        f‘Œ&S rV   )r¢   r	   )rž   rt   ÚframeÚcacheÚcwds      €€r@   r    zAScheduler.make_sampler.<locals>._sample_stack.<locals>.<listcomp>Z  sD   ø€ ð ð ð á"˜˜Uõ ˜‘X”X�}¨U°E¸3Ñ?Ô?Ð@ðð ð rB   )rï   rñ   r¤   r   r¦   Ú_current_framesÚitemsrg   r
   ry   ÚrangeÚaddÚpopleftri   rª   r¥   Úremove)rþ   rÿ   rï   Únowrš   Ú_Úinactive_profilesrŽ   r  r  rq   s           €€€r@   Ú_sample_stackz-Scheduler.make_sampler.<locals>._sample_stackB  sŠ  ø€ ð Ô$ð ¨TÔ-Að ð �õ ˜tÔ0Ñ1Ô1ˆLå!Ñ#Ô#ˆCð	ðð ð ð ð å&)Ô&9Ñ&;Ô&;×&AÒ&AÑ&CÔ&Cðñ ô ��øõ "ð ð ð õ +­3¬<©>¬>Ñ:Ô:Ð:Ø��ð	øøøõ  ˜<Ñ(Ô(ð Fð F�ØÔ$×(Ò(¨Ô):×)BÒ)BÑ)DÔ)DÑEÔEÐEÐEà "ÐàÔ/ð 6ð 6�Ø”>ð 6Ø—M’M # vÑ.Ô.Ð.Ð.ð &×,Ò,¨WÑ5Ô5Ð5Ð5à,ð 5ð 5�ØÔ$×+Ò+¨GÑ4Ô4Ð4Ð4ð5ð 5s   µ2A( Á(*BÂB)rþ   r   rÿ   r   r9   N)rË   Úgetcwdr   )rq   r  r  r  s   ` @@r@   rí   zScheduler.make_sampler=  sQ   øøø€ ÝŒi‰kŒkˆå #Ð&Ñ&Ô&ˆð<	5ð <	5ð <	5ð <	5ð <	5ð <	5ð <	5ð <	5ð| ÐrB   )r9   rç   rÞ   rÝ   )rŽ   rX   r9   N)r9   rú   )rß   rà   rá   rG   Ú__annotations__râ   rr   r’   r˜   r   rM   rU   rø   rˆ   rí   rV   rB   r@   rç   rç     s  € € € € € € Ø$€Dˆ.Ð$Ð$Ñ$ð5 #ð 5¨$ð 5ð 5ð 5ð 5ðð ð ð ðØ!ðØ*9ðØ?Nðà	ðð ð ð ð
 ðð ð ñ „^ðð ðð ð ñ „^ððð ð ð ð*ð *ð *ð *ðCð Cð Cð Cð Cð CrB   rç   c                   ó`   ‡ — e Zd ZU dZdZded<   dZdeddfˆ fd	„Zdd
„Z	dd„Z
dd„Zdd„Zˆ xZS )rJ   zr
    This scheduler is based on running a daemon thread that will call
    the sampler at a regular interval.
    r¯   r   rG   zsentry.profiler.ThreadSchedulerrF   r9   Nc                 ó¦   •— t          ¦   «                              |¬¦  «         d| _        d | _        d | _        t          j        ¦   «         | _        d S )NrE   F)Úsuperrr   Úrunningr¯   Úpidr±   ÚLockÚlock©rq   rF   Ú	__class__s     €r@   rr   zThreadScheduler.__init__Œ  sH   ø€ Ý‰Œ×Ò 9ÐÑ-Ô-Ð-ð ˆŒØ48ˆŒØ$(ˆŒÝ”NÑ$Ô$ˆŒ	ˆ	ˆ	rB   c                 ó   — d S rT   rV   ru   s    r@   rM   zThreadScheduler.setup•  ó   € ØˆrB   c                 ój   — | j         r)d| _         | j        �| j                             ¦   «          d S d S d S ©NF©r  r¯   Újoinru   s    r@   rU   zThreadScheduler.teardown˜  óE   € ØŒ<ð 	#Ø ˆDŒLØŒ{Ð&Ø”× Ò Ñ"Ô"Ð"Ð"Ð"ð	#ð 	#à&Ð&rB   c                 óÈ  — t          j        ¦   «         }| j        r| j        |k    rdS | j        5  | j        r| j        |k    r	 ddd¦  «         dS || _        d| _        t          j        | j        | j        d¬¦  «        | _	        	 | j	         
                    ¦   «          n*# t          $ r d| _        d| _	        Y ddd¦  «         dS w xY w	 ddd¦  «         dS # 1 swxY w Y   dS )aE  
        Check that the profiler has an active thread to run in, and start one if
        that's not the case.

        Note that this might fail (e.g. in Python 3.12 it's not possible to
        spawn new threads at interpreter shutdown). In that case self.running
        will be False after running this function.
        NT)r­   ÚtargetÚdaemonF)rË   Úgetpidr  r  r  r±   ÚThreadr­   Úrunr¯   r‰   ÚRuntimeError©rq   r  s     r@   rø   zThreadScheduler.ensure_runningž  s~  € õ Œi‰kŒkˆð Œ<ð 	˜DœH¨šO˜OØˆFàŒYð 	ð 	ð Œ|ð  ¤¨C¢ Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð ˆDŒHØˆDŒLõ
 $Ô*°´	À$Ä(ÐSWÐXÑXÔXˆDŒKðØ”×!Ò!Ñ#Ô#Ð#Ð#øÝð ð ð ð  %�”Ø"�”Øð+	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð øøøð $ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s;   ¯CÁ4CÂBÂCÂCÂ7CÃCÃCÃCÃCc                 ó
  — t          j        ¦   «         }| j        rh|                      ¦   «          t          j        ¦   «         |z
  }|| j        k     rt          | j        |z
  ¦  «         t          j        ¦   «         }| j        °fd S d S rT   ©r2   Úperf_counterr  rî   rì   Úthread_sleep©rq   ÚlastÚelapseds      r@   r&  zThreadScheduler.runÄ  óŽ   € ÝÔ Ñ"Ô"ˆàŒlð 	'Ø�LŠL‰NŒNˆNõ
 Ô'Ñ)Ô)¨DÑ0ˆGØ˜œÒ&Ð&Ý˜Tœ]¨WÑ4Ñ5Ô5Ð5õ Ô$Ñ&Ô&ˆDð Œlð 	'ð 	'ð 	'ð 	'ð 	'rB   rÝ   ©rß   rà   rá   Ú__doc__rG   r  r­   râ   rr   rM   rU   rø   r&  Ú__classcell__©r  s   @r@   rJ   rJ   ƒ  s¿   ø€ € € € € € ðð ð
 $€Dˆ.Ð#Ð#Ñ#Ø,€Dð% #ð %¨$ð %ð %ð %ð %ð %ð %ðð ð ð ð#ð #ð #ð #ð$ð $ð $ð $ðL'ð 'ð 'ð 'ð 'ð 'ð 'ð 'rB   rJ   c                   ó`   ‡ — e Zd ZU dZdZded<   dZdeddfˆ fd	„Zdd
„Z	dd„Z
dd„Zdd„Zˆ xZS )rI   as  
    This scheduler is based on the thread scheduler but adapted to work with
    gevent. When using gevent, it may monkey patch the threading modules
    (`threading` and `_thread`). This results in the use of greenlets instead
    of native threads.

    This is an issue because the sampler CANNOT run in a greenlet because
    1. Other greenlets doing sync work will prevent the sampler from running
    2. The greenlet runs in the same thread as other greenlets so when taking
       a sample, other greenlets will have been evicted from the thread. This
       results in a sample containing only the sampler's code.
    Úgeventr   rG   zsentry.profiler.GeventSchedulerrF   r9   Nc                 ó  •— t           €'t          d                     | j        ¦  «        ¦  «        ‚t	          ¦   «                              |¬¦  «         d| _        d | _        d | _        t          j
        ¦   «         | _        d S )Nz"Profiler mode: {} is not availablerE   F)r1   rK   rL   rG   r  rr   r  r¯   r  r±   r  r  r  s     €r@   rr   zGeventScheduler.__init__ç  so   ø€ ÝÐÝÐA×HÒHÈÌÑSÔSÑTÔTÐTå‰Œ×Ò 9ÐÑ-Ô-Ð-ð ˆŒØ/3ˆŒØ$(ˆŒõ
 ”NÑ$Ô$ˆŒ	ˆ	ˆ	rB   c                 ó   — d S rT   rV   ru   s    r@   rM   zGeventScheduler.setup÷  r  rB   c                 ój   — | j         r)d| _         | j        �| j                             ¦   «          d S d S d S r  r  ru   s    r@   rU   zGeventScheduler.teardownú  r   rB   c                 ó°  — t          j        ¦   «         }| j        r| j        |k    rd S | j        5  | j        r| j        |k    r	 d d d ¦  «         d S || _        d| _        t          d¦  «        | _        	 | j                             | j        ¦  «         n*# t          $ r d| _        d | _        Y d d d ¦  «         d S w xY w	 d d d ¦  «         d S # 1 swxY w Y   d S )NTrœ   F)
rË   r$  r  r  r  r1   r¯   Úspawnr&  r'  r(  s     r@   rø   zGeventScheduler.ensure_running   sm  € ÝŒi‰kŒkˆð Œ<ð 	˜DœH¨šO˜OØˆFàŒYð 	ð 	ð Œ|ð  ¤¨C¢ Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð ˆDŒHØˆDŒLå$ Q™-œ-ˆDŒKðØ”×!Ò! $¤(Ñ+Ô+Ð+Ð+øÝð ð ð ð  %�”Ø"�”Øð%	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ðøøøð ,ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s;   ¯CÁ"CÁ3BÂCÂB:Â+CÂ9B:Â:CÃCÃCc                 ó
  — t          j        ¦   «         }| j        rh|                      ¦   «          t          j        ¦   «         |z
  }|| j        k     rt          | j        |z
  ¦  «         t          j        ¦   «         }| j        °fd S d S rT   r*  r-  s      r@   r&  zGeventScheduler.run  r0  rB   rÝ   r1  r4  s   @r@   rI   rI   Ö  s¾   ø€ € € € € € ðð ð $€Dˆ.Ð#Ð#Ñ#Ø,€Dð% #ð %¨$ð %ð %ð %ð %ð %ð %ð ð ð ð ð#ð #ð #ð #ðð ð ð ð6'ð 'ð 'ð 'ð 'ð 'ð 'ð 'rB   rI   rÝ   )Mr2  rN   rË   rÈ   r‚   r¦   r±   r2   ra   rn   Úabcr   r   Úcollectionsr   Útypingr   r}   Úsentry_sdk._lru_cacher   Úsentry_sdk.profiler.utilsr   r	   Úsentry_sdk.utilsr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Útyping_extensionsr   Úsentry_sdk._typesr   r   r   r   r   r    r!   r"   r#   r$   r¢   râ   r%   r*   Úgevent.monkeyr0   Úgevent.threadpoolr1   Ú_ThreadPoolr  r,  ÚImportErrorr3   r5   rØ   rã   rA   rR   rP   r¡   rX   rç   rJ   rI   rV   rB   r@   ú<module>rI     sc  ððð ð ð6 €€€Ø 	€	€	€	Ø €€€Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø  Ð  Ð  Ð  Ð  Ð  à Ð Ð Ð Ø *Ð *Ð *Ð *Ð *Ð *ðð ð ð ð ð ð ð ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð ð !ØLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLà+Ð+Ð+Ð+Ð+Ð+àFÐFÐFÐFÐFÐFÐFÐFÐFÐFðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð  �iØà&)Ø!Øð	
ð 	
ñô €Oð !�yØà˜>Ô*Ø˜>Ô*Ø˜OÔ,Ø# HÐ.EÐ$EÔFð		
ð 	
ñô Ðð	Ø*Ð*Ð*Ð*Ð*Ð*Ø;Ð;Ð;Ð;Ð;Ð;à0;€JÐ-Ð;Ð;Ñ;Ø�< ¨Ñ0Ô0€L€LøØð ð ð Ø”:€Là€J€J€Jðøøøð %)€
Ð!Ð (Ð (Ñ (ð
 Ð ðÐ#3ð ¸ð ð ð ð ð,/Ð,ð /°ð /ð /ð /ð /ðdð ð ð ð ˜#˜d™)œ)Ð ðKð Kð Kð Kð Kñ Kô Kð Kð\
lð lð lð lð l�ñ lô lð lð^P'ð P'ð P'ð P'ð P'�iñ P'ô P'ð P'ðfT'ð T'ð T'ð T'ð T'�iñ T'ô T'ð T'ð T'ð T's   ÃC6 Ã6DÄD