§
    xÅj7W  ã                   óÜ  — U 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	 d dl
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mZ d d	lmZmZmZmZmZ erDd d
lmZ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* d dlm+Z+m,Z,m-Z-m.Z.m/Z/m0Z0  e'de1e0e2dœ¦  «        Z3	 d dl4m5Z5 d dl6m7Z8 e8Z7de9d<    e5dd¦  «        Z:n# e;$ r ej<        Z:dZ7Y nw xY wda=de9d<   ddddddde>fd„Z?de>fd „Z@d;d!„ZAd<d#„ZBd;d$„ZCd;d%„ZDd;d&„ZEd;d'„ZFd;d(„ZGd=d*„ZHd+d,de>fd-„ZI G d.„ d/¦  «        ZJ G d0„ d1¦  «        ZK G d2„ d3eK¦  «        ZL G d4„ d5eK¦  «        ZMd6ZN G d7„ d8¦  «        ZO G d9„ d:¦  «        ZPdS )>é    N)Údeque)ÚdatetimeÚtimezone)ÚTYPE_CHECKING)ÚLRUCache)ÚVERSION)ÚEnvelope)ÚDEFAULT_SAMPLING_FREQUENCYÚextract_stack)Úcapture_internal_exceptionÚ	is_geventÚloggerÚnowÚset_in_app_in_frames)	ÚAnyÚCallableÚDequeÚDictÚListÚOptionalÚSetÚTypeÚUnion)Ú	TypedDict)ÚContinuousProfilerModeÚSDKInfo)ÚExtractedSampleÚFrameIdÚProcessedFrameÚProcessedStackÚStackIdÚThreadIdÚProcessedSample©Ú	timestampÚ	thread_idÚstack_id)Úget_original)Ú
ThreadPoolzOptional[Type[_ThreadPool]]r)   ÚtimeÚsleepzOptional[ContinuousScheduler]Ú
_schedulerÚoptionsúDict[str, Any]Úsdk_infor   Úcapture_funcúCallable[[Envelope], None]Úreturnc                 ó¼  — t           d u}|r"t          j        d¦  «         t          ¦   «          t	          ¦   «         rt
          j        }nt          j        }|                      d¦  «        �	| d         }n-|                      di ¦  «        }|                     d¦  «        p|}t          }|t          j        k    rt          || ||¦  «        a nE|t
          j        k    rt          || ||¦  «        a n"t          d                     |¦  «        ¦  «        ‚t          j        d                     t           j        ¬¦  «        ¦  «         |st          j        t          ¦  «         dS )	Nz0[Profiling] Continuous Profiler is already setupÚprofiler_modeÚ_experimentsÚcontinuous_profiling_modez$Unknown continuous profiler mode: {}z9[Profiling] Setting up continuous profiler in {mode} mode)ÚmodeT)r,   r   ÚdebugÚteardown_continuous_profilerr   ÚGeventContinuousSchedulerr7   ÚThreadContinuousSchedulerÚgetr
   Ú
ValueErrorÚformatÚatexitÚregister)r-   r/   r0   Úalready_initializedÚdefault_profiler_moder4   ÚexperimentsÚ	frequencys           úXC:\Projects\Historical\venv\Lib\site-packages\sentry_sdk/profiler/continuous_profiler.pyÚsetup_continuous_profilerrF   C   ss  € õ %¨DÐ0Ðàð 'ÝŒÐGÑHÔHÐHÝ$Ñ&Ô&Ð&å�{„{ð ?õ
 !:Ô >ÐÐå 9Ô >Ðà‡{‚{�?Ñ#Ô#Ð/Ø Ô0ˆˆð —k’k .°"Ñ5Ô5ˆð �OŠOÐ7Ñ8Ô8ÐQÐ<Qð 	õ +€IàÕ1Ô6Ò6Ð6Ý.Ø�w ¨,ñ
ô 
ˆ
ˆ
ð 
Õ3Ô8Ò	8Ð	8Ý.Ø�w ¨,ñ
ô 
ˆ
ˆ
õ Ð?×FÒFÀ}ÑUÔUÑVÔVÐVå
„LØC×JÒJÝ”ð 	Kñ 	
ô 	
ñô ð ð ð 6ÝŒÕ4Ñ5Ô5Ð5àˆ4ó    c                  ó,   — t           €dS t           j        S ©NF)r,   Úsampled© rG   rE   Úis_profile_session_sampledrL   |   s   € ÝÐØˆuÝÔÐrG   c                  ó€   — t           €d S t                                ¦   «         sd S t                                ¦   «          d S ©N)r,   Úis_auto_start_enabledÚmanual_startrK   rG   rE   Ú!try_autostart_continuous_profilerrQ   ‚   s@   € õ ÐØˆå×+Ò+Ñ-Ô-ð Øˆå×ÒÑÔÐÐÐrG   úUnion[ContinuousProfile, None]c                  óF   — t           €d S t                                ¦   «         S rN   )r,   Ú
auto_startrK   rG   rE   Ú!try_profile_lifecycle_trace_startrU   Ž   s   € ÝÐØˆtå× Ò Ñ"Ô"Ð"rG   c                  óJ   — t           €d S t                                ¦   «          d S rN   )r,   rP   rK   rG   rE   Ústart_profilerrW   •   s%   € ÝÐØˆå×ÒÑÔÐÐÐrG   c                  óZ   — t          j        dt          d¬¦  «         t          ¦   «          d S )NzWThe `start_profile_session` function is deprecated. Please use `start_profile` instead.é   ©Ú
stacklevel)ÚwarningsÚwarnÚDeprecationWarningrW   rK   rG   rE   Ústart_profile_sessionr_   œ   s8   € Ý„MØaÝØðñ ô ð õ
 ÑÔÐÐÐrG   c                  óJ   — t           €d S t                                ¦   «          d S rN   )r,   Úmanual_stoprK   rG   rE   Ústop_profilerrb   ¥   s%   € ÝÐØˆå×ÒÑÔÐÐÐrG   c                  óZ   — t          j        dt          d¬¦  «         t          ¦   «          d S )NzUThe `stop_profile_session` function is deprecated. Please use `stop_profile` instead.rY   rZ   )r\   r]   r^   rb   rK   rG   rE   Ústop_profile_sessionrd   ¬   s3   € Ý„MØ_ÝØðñ ô ð õ
 �O„O€O€O€OrG   c                  ó&   — t          ¦   «          d ad S rN   )rb   r,   rK   rG   rE   r9   r9   µ   s   € Ý�O„O€Oð €J€J€JrG   úUnion[str, None]c                  ó,   — t           €d S t           j        S rN   )r,   Úprofiler_idrK   rG   rE   Úget_profiler_idri   ¼   s   € ÝÐØˆtÝÔ!Ð!rG   Úsample_ratezUnion[float, None]c                 óR   — | sdS t          j         ¦   «         t          | ¦  «        k     S rI   )ÚrandomÚfloat)rj   s    rE   Ú+determine_profile_session_sampling_decisionrn   Â   s*   € ð ð ØˆuåŒ=‰?Œ?�U ;Ñ/Ô/Ò/Ð/rG   c                   ó&   — e Zd ZU dZeed<   dd„ZdS )ÚContinuousProfileTÚactiver2   Nc                 ó   — d| _         d S rI   )rq   ©Úselfs    rE   ÚstopzContinuousProfile.stopÏ   s   € ØˆŒˆˆrG   ©r2   N)Ú__name__Ú
__module__Ú__qualname__rq   ÚboolÚ__annotations__ru   rK   rG   rE   rp   rp   Ì   s:   € € € € € € Ø€FˆDÐÐÑðð ð ð ð ð rG   rp   c            
       ó¦   — e Zd ZU dZded<   deddddd	d
ddf
d„Zdefd„Zdd„Z	dd„Z
dd„Zdd„Zdd„Zdd„Zdd„Zedd„¦   «         Zdd„Zdd„ZdS ) ÚContinuousSchedulerÚunknownr   r7   rD   r-   r.   r/   r   r0   r1   r2   Nc                 ó˜  — d|z  | _         || _        || _        || _        | j                             d¦  «        | _        | j                             d¦  «        }t          |¦  «        | _        |                      ¦   «         | _	        d | _
        d | _        d| _        d| _        t          d¬¦  «        | _        t!          ¦   «         | _        d S )Ng      ð?Úprofile_lifecycleÚprofile_session_sample_rateFé€   )Úmaxlen)Úintervalr-   r/   r0   r<   Ú	lifecyclern   rJ   Úmake_samplerÚsamplerÚbufferÚpidÚrunningÚsoft_shutdownr   Únew_profilesÚsetÚactive_profiles)rt   rD   r-   r/   r0   r�   s         rE   Ú__init__zContinuousScheduler.__init__Ö   s¿   € ð ˜i™ˆŒØˆŒØ ˆŒØ(ˆÔàœ×)Ò)Ð*=Ñ>Ô>ˆŒØ&*¤l×&6Ò&6Ð7TÑ&UÔ&UÐ#ÝBØ'ñ
ô 
ˆŒð ×(Ò(Ñ*Ô*ˆŒØ15ˆŒØ$(ˆŒàˆŒØ"ˆÔå8=ÀSÐ8IÑ8IÔ8IˆÔÝ9<¹¼ˆÔÐÐrG   c                 ó¤   — | j         t          j        ¦   «         k    rdS | j                             d¦  «        }|sdS |                     d¦  «        S )NFr5   Úcontinuous_profiling_auto_start)r‰   ÚosÚgetpidr-   r<   )rt   rC   s     rE   rO   z)ContinuousScheduler.is_auto_start_enabledò   sQ   € ð Œ8•r”y‘{”{Ò"Ð"Ø�5à”l×&Ò& ~Ñ6Ô6ˆØð 	Ø�5à�ŠÐ@ÑAÔAÐArG   rR   c                 óÒ   — | j         sd S | j        dk    rd S t          j        d¦  «         t	          ¦   «         }| j                             |¦  «         |                      ¦   «          |S )NÚtracez"[Profiling] Auto starting profiler)rJ   r…   r   r8   rp   rŒ   ÚappendÚensure_running)rt   Úprofiles     rE   rT   zContinuousScheduler.auto_start  sm   € ØŒ|ð 	Ø�4àŒ>˜WÒ$Ð$Ø�4åŒÐ9Ñ:Ô:Ð:å#Ñ%Ô%ˆàÔ× Ò  Ñ)Ô)Ð)Ø×ÒÑÔÐàˆrG   c                 óZ   — | j         sd S | j        dk    rd S |                      ¦   «          d S ©NÚmanual)rJ   r…   r—   rs   s    rE   rP   z ContinuousScheduler.manual_start  s;   € ØŒ|ð 	ØˆFàŒ>˜XÒ%Ð%ØˆFà×ÒÑÔÐÐÐrG   c                 óH   — | j         dk    rd S |                      ¦   «          d S rš   )r…   Úteardownrs   s    rE   ra   zContinuousScheduler.manual_stop  s%   € ØŒ>˜XÒ%Ð%ØˆFà�Š‰ŒˆˆˆrG   c                 ó   — t           ‚rN   ©ÚNotImplementedErrorrs   s    rE   r—   z"ContinuousScheduler.ensure_running   ó   € Ý!Ð!rG   c                 ó   — t           ‚rN   rŸ   rs   s    rE   r�   zContinuousScheduler.teardown#  r¡   rG   c                 ó   — t           ‚rN   rŸ   rs   s    rE   ÚpausezContinuousScheduler.pause&  r¡   rG   c                 ó\   — t          | j        | j        t          | j        ¦  «        | _        d S rN   )ÚProfileBufferr-   r/   ÚPROFILE_BUFFER_SECONDSr0   rˆ   rs   s    rE   Úreset_bufferz ContinuousScheduler.reset_buffer)  s(   € Ý#ØŒL˜$œ-Õ)?ÀÔARñ
ô 
ˆŒˆˆrG   rf   c                 ó:   — | j         r| j        €d S | j        j        S rN   )rŠ   rˆ   rh   rs   s    rE   rh   zContinuousScheduler.profiler_id.  s#   € àŒ|ð 	˜tœ{Ð2Ø�4ØŒ{Ô&Ð&rG   úCallable[..., bool]c                 ó¶   ‡ ‡‡— t          j        ¦   «         Št          d¬¦  «        Š‰ j        dk    rdddddt          fˆˆˆ fd„}ndddddt          fˆˆˆ fd	„}|S )
Né   )Úmax_sizer•   Úargsr   Úkwargsr2   c                  óŽ  •— ‰
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 ]}|j        s|                     |¦  «         Œ|D ]}‰
j                             |¦  «         Œ‰
j        �‰
j                             ||¦  «         dS )ú¯
                Take a sample of the stack on all the threads in the process.
                This should be called at a regular interval to collect samples.
                Tc                 óV   •— g | ]%\  }}t          |¦  «        t          |‰‰¦  «        f‘Œ&S rK   ©Ústrr   ©Ú.0ÚtidÚframeÚcacheÚcwds      €€rE   ú
<listcomp>zKContinuousScheduler.make_sampler.<locals>._sample_stack.<locals>.<listcomp>R  óD   ø€ ð ð ð á&˜C õ ˜S™œ¥=°¸¸sÑ#CÔ#CÐDðð ð rG   F)rŒ   rŽ   Úlenr   ÚsysÚ_current_framesÚitemsÚAttributeErrorr   Úexc_infoÚrangeÚaddÚpopleftrq   r–   Úremoverˆ   Úwrite)r®   r¯   rŒ   ÚtsÚsampleÚ_Úinactive_profilesr˜   r¹   rº   rt   s           €€€rE   Ú_sample_stackz7ContinuousScheduler.make_sampler.<locals>._sample_stack;  sˆ  ø€ ð Ô(ð  °Ô1Eð  Ø˜4õ  # 4Ô#4Ñ5Ô5�å‘U”U�ð	!ðð ð ð ð å*-Ô*=Ñ*?Ô*?×*EÒ*EÑ*GÔ*Gðñ ô �F�Føõ &ð !ð !ð !õ /­s¬|©~¬~Ñ>Ô>Ð>Ø ˜5˜5ð	!øøøõ  ˜|Ñ,Ô,ð Jð J�AØÔ(×,Ò,¨TÔ->×-FÒ-FÑ-HÔ-HÑIÔIÐIÐIØ$&Ð!à#Ô3ð :ð :�GØ"œ>ð :ð
 *×0Ò0°Ñ9Ô9Ð9øà0ð 9ð 9�GØÔ(×/Ò/°Ñ8Ô8Ð8Ð8à”;Ð*Ø”K×%Ò% b¨&Ñ1Ô1Ð1à�us   µ2A( Á(*BÂBc                  ó2  •— t          ¦   «         }	 ˆˆfd„t          j        ¦   «                              ¦   «         D ¦   «         }n1# t          $ r$ t          t          j        ¦   «         ¦  «         Y dS w xY w‰j        �‰j                             ||¦  «         dS )r±   c                 óV   •— g | ]%\  }}t          |¦  «        t          |‰‰¦  «        f‘Œ&S rK   r³   rµ   s      €€rE   r»   zKContinuousScheduler.make_sampler.<locals>._sample_stack.<locals>.<listcomp>…  r¼   rG   F)	r   r¾   r¿   rÀ   rÁ   r   rÂ   rˆ   rÇ   )r®   r¯   rÈ   rÉ   r¹   rº   rt   s       €€€rE   rÌ   z7ContinuousScheduler.make_sampler.<locals>._sample_stack|  s¸   ø€ õ ‘U”U�ð	!ðð ð ð ð å*-Ô*=Ñ*?Ô*?×*EÒ*EÑ*GÔ*Gðñ ô �F�Føõ &ð !ð !ð !õ /­s¬|©~¬~Ñ>Ô>Ð>Ø ˜5˜5ð	!øøøð ”;Ð*Ø”K×%Ò% b¨&Ñ1Ô1Ð1à�us   ‘2A Á*A2Á1A2)r’   Úgetcwdr   r…   rz   )rt   rÌ   r¹   rº   s   ` @@rE   r†   z ContinuousScheduler.make_sampler4  sµ   øøø€ ÝŒi‰kŒkˆå #Ð&Ñ&Ô&ˆàŒ>˜WÒ$Ð$ð= Uð =°eð =Åð =ð =ð =ð =ð =ð =ð =ð =ð =ðB Uð °eð Åð ð ð ð ð ð ð ð ð0 ÐrG   c                 ól  — t          j        ¦   «         }| j        rz|                      ¦   «         | _        t          j        ¦   «         |z
  }|| j        k     rt          | j        |z
  ¦  «         | j        rd| _        nt          j        ¦   «         }| j        °z| j        }|�|                     ¦   «          d S d S rI   )	r*   Úperf_counterrŠ   r‡   r‹   r„   Úthread_sleeprˆ   Úflush)rt   ÚlastÚelapsedrˆ   s       rE   ÚrunzContinuousScheduler.run–  s¾   € ÝÔ Ñ"Ô"ˆàŒlð 	'Ø!%§¢¡¤ˆDÔõ
 Ô'Ñ)Ô)¨DÑ0ˆGØ˜œÒ&Ð&Ý˜Tœ]¨WÑ4Ñ5Ô5Ð5ð Ô!ð Ø$�”ð õ Ô$Ñ&Ô&ˆDð+ Œlð 	'ð. ”ˆØÐØ�LŠL‰NŒNˆNˆNˆNð ÐrG   ©r2   rR   rv   ©r2   rf   )r2   rª   )rw   rx   ry   r7   r{   Úintr�   rz   rO   rT   rP   ra   r—   r�   r¤   r¨   Úpropertyrh   r†   rÖ   rK   rG   rE   r}   r}   Ó   sd  € € € € € € Ø%.€DÐ
"Ð.Ð.Ñ.ð?àð?ð "ð?ð ð	?ð
 3ð?ð 
ð?ð ?ð ?ð ?ð8B tð Bð Bð Bð Bðð ð ð ð ð ð ð ðð ð ð ð"ð "ð "ð "ð"ð "ð "ð "ð"ð "ð "ð "ð
ð 
ð 
ð 
ð
 ð'ð 'ð 'ñ „Xð'ð
`ð `ð `ð `ðDð ð ð ð ð rG   r}   c            
       ó\   ‡ — e Zd ZU dZdZded<   dZdeddd	d
ddddf
ˆ fd„Zdd„Z	dd„Z
ˆ xZS )r;   zr
    This scheduler is based on running a daemon thread that will call
    the sampler at a regular interval.
    Úthreadr   r7   z)sentry.profiler.ThreadContinuousSchedulerrD   r-   r.   r/   r   r0   r1   r2   Nc                 óŽ   •— t          ¦   «                              ||||¦  «         d | _        t          j        ¦   «         | _        d S rN   )Úsuperr�   rÜ   Ú	threadingÚLockÚlock©rt   rD   r-   r/   r0   Ú	__class__s        €rE   r�   z"ThreadContinuousScheduler.__init__¾  s=   ø€ õ 	‰Œ×Ò˜ G¨X°|ÑDÔDÐDà48ˆŒÝ”NÑ$Ô$ˆŒ	ˆ	ˆ	rG   c                 óä  — d| _         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 nw xY wd d d ¦  «         d S # 1 swxY w Y   d S )NFT)ÚnameÚtargetÚdaemon)r‹   r’   r“   rŠ   r‰   rá   r¨   rß   ÚThreadrå   rÖ   rÜ   ÚstartÚRuntimeError©rt   r‰   s     rE   r—   z(ThreadContinuousScheduler.ensure_runningÊ  sl  € Ø"ˆÔåŒi‰kŒkˆð Œ<ð 	˜DœH¨šO˜OØˆFàŒYð 	#ð 	#ð Œ|ð  ¤¨C¢ Øð	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð ˆDŒHØˆDŒLð ×ÒÑÔÐõ
 $Ô*°´	À$Ä(ÐSWÐXÑXÔXˆDŒKð#Ø”×!Ò!Ñ#Ô#Ð#Ð#øÝð #ð #ð #ð  %�”Ø"�”��ð	#øøøð+	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#ð 	#ð 	#s<   ¶C%ÁAC%Â B:Â9C%Â:CÃC%ÃCÃC%Ã%C)Ã,C)c                 ót   — | j         rd| _         | j        �"| j                             ¦   «          d | _        d S d S rI   ©rŠ   rÜ   Újoinrs   s    rE   r�   z"ThreadContinuousScheduler.teardownî  óB   € ØŒ<ð 	!Ø ˆDŒLàŒ;Ð"ØŒK×ÒÑÔÐØˆDŒKˆKˆKð #Ð"rG   rv   )rw   rx   ry   Ú__doc__r7   r{   rå   rÙ   r�   r—   r�   Ú__classcell__©rã   s   @rE   r;   r;   µ  sº   ø€ € € € € € ðð ð
 &.€DÐ
"Ð-Ð-Ñ-Ø6€Dð
%àð
%ð "ð
%ð ð	
%ð
 3ð
%ð 
ð
%ð 
%ð 
%ð 
%ð 
%ð 
%ð"#ð "#ð "#ð "#ðHð ð ð ð ð ð ð rG   r;   c            
       óX   ‡ — e Zd ZU dZdZded<   dedddd	d
dddf
ˆ fd„Zdd„Zdd„Z	ˆ xZ
S )r:   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   r7   rD   r-   r.   r/   r   r0   r1   r2   Nc                 óê   •— t           €'t          d                     | j        ¦  «        ¦  «        ‚t	          ¦   «                              ||||¦  «         d | _        t          j        ¦   «         | _	        d S )Nz"Profiler mode: {} is not available)
r)   r=   r>   r7   rÞ   r�   rÜ   rß   rà   rá   râ   s        €rE   r�   z"GeventContinuousScheduler.__init__  sb   ø€ õ ÐÝÐA×HÒHÈÌÑSÔSÑTÔTÐTå‰Œ×Ò˜ G¨X°|ÑDÔDÐDà/3ˆŒÝ”NÑ$Ô$ˆŒ	ˆ	ˆ	rG   c                 óÌ  — d| _         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 nw xY wd d d ¦  «         d S # 1 swxY w Y   d S )NFTé   )r‹   r’   r“   rŠ   r‰   rá   r¨   r)   rÜ   ÚspawnrÖ   rê   rë   s     rE   r—   z(GeventContinuousScheduler.ensure_running  s]  € Ø"ˆÔåŒi‰kŒkˆð Œ<ð 	˜DœH¨šO˜OØˆFàŒYð 	#ð 	#ð Œ|ð  ¤¨C¢ Øð	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð ˆDŒHØˆDŒLð ×ÒÑÔÐå$ Q™-œ-ˆDŒKð#Ø”×!Ò! $¤(Ñ+Ô+Ð+Ð+øÝð #ð #ð #ð  %�”Ø"�”��ð	#øøøð#	#ð 	#ð 	#ñ 	#ô 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#ð 	#øøøð 	#ð 	#ð 	#ð 	#ð 	#ð 	#s;   ¶CÁ6CÂB.Â-CÂ.C	ÃCÃC	Ã	CÃCÃ Cc                 ót   — | j         rd| _         | j        �"| j                             ¦   «          d | _        d S d S rI   rí   rs   s    rE   r�   z"GeventContinuousScheduler.teardown6  rï   rG   rv   )rw   rx   ry   rð   r7   r{   rÙ   r�   r—   r�   rñ   rò   s   @rE   r:   r:   ÷  sµ   ø€ € € € € € ðð ð &.€DÐ
"Ð-Ð-Ñ-ð%àð%ð "ð%ð ð	%ð
 3ð%ð 
ð%ð %ð %ð %ð %ð %ð#ð #ð #ð #ð@ð ð ð ð ð ð ð rG   r:   é<   c            
       óV   — e Zd Zdddddedddd	f
d
„Zdedddd	fd„Zdedefd„Zdd„Z	d	S )r¦   r-   r.   r/   r   Úbuffer_sizer0   r1   r2   Nc                 ó>  — || _         || _        || _        || _        t	          j        ¦   «         j        | _        t          ¦   «         | _	        t          ¦   «         | _        t          j
        t          j        ¦  «                             ¦   «         | j        z
  | _        d S rN   )r-   r/   rü   r0   ÚuuidÚuuid4Úhexrh   ÚProfileChunkÚchunkr   Ústart_monotonic_timer   r   Úutcr%   Ústart_timestamp)rt   r-   r/   rü   r0   s        rE   r�   zProfileBuffer.__init__C  s   € ð ˆŒØ ˆŒØ&ˆÔØ(ˆÔåœ:™<œ<Ô+ˆÔÝ!‘^”^ˆŒ
õ %(¡E¤EˆÔ!õ ŒL�œÑ&Ô&×0Ò0Ñ2Ô2°TÔ5NÑNð 	ÔÐÐrG   Úmonotonic_timerÉ   r   c                 óê   — |                       |¦  «        r:|                      ¦   «          t          ¦   «         | _        t	          ¦   «         | _        | j                             | j        |z   |¦  «         d S rN   )Úshould_flushrÓ   r  r  r   r  rÇ   r  )rt   r  rÉ   s      rE   rÇ   zProfileBuffer.write_  sb   € Ø×Ò˜^Ñ,Ô,ð 	.Ø�JŠJ‰LŒLˆLÝ%™œˆDŒJÝ(+©¬ˆDÔ%àŒ
×Ò˜Ô-°Ñ>ÀÑGÔGÐGÐGÐGrG   c                 ó(   — || j         z
  | j        k    S rN   )r  rü   )rt   r  s     rE   r  zProfileBuffer.should_flushg  s   € ð  Ô 9Ñ9¸TÔ=MÒMÐMrG   c                 óÌ   — | j                              | j        | j        | j        ¦  «        }t          ¦   «         }|                     |¦  «         |                      |¦  «         d S rN   )r  Úto_jsonrh   r-   r/   r	   Úadd_profile_chunkr0   )rt   r  Úenvelopes      rE   rÓ   zProfileBuffer.flushl  sY   € Ø”
×"Ò" 4Ô#3°T´\À4Ä=ÑQÔQˆÝ‘:”:ˆØ×"Ò" 5Ñ)Ô)Ð)Ø×Ò˜(Ñ#Ô#Ð#Ð#Ð#rG   rv   )
rw   rx   ry   rÙ   r�   rm   rÇ   rz   r  rÓ   rK   rG   rE   r¦   r¦   B  sÅ   € € € € € ð
à!ð
ð ð
ð ð	
ð
 3ð
ð 
ð
ð 
ð 
ð 
ð8H Eð HÐ3Dð HÈð Hð Hð Hð HðN¨5ð N°Tð Nð Nð Nð Nð
$ð $ð $ð $ð $ð $rG   r¦   c                   óB   — e Zd Zdd„Zdeddddfd„Zded	d
dddd
fd„ZdS )r  r2   Nc                 ó†   — t          j        ¦   «         j        | _        i | _        i | _        g | _        g | _        g | _        d S rN   )	rþ   rÿ   r   Úchunk_idÚindexed_framesÚindexed_stacksÚframesÚstacksÚsamplesrs   s    rE   r�   zProfileChunk.__init__t  s;   € Ýœ
™œÔ(ˆŒà46ˆÔØ46ˆÔØ.0ˆŒØ.0ˆŒØ02ˆŒˆˆrG   rÈ   rÉ   r   c                 ó"  ‡ — |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 )Nc                 ó*   •— g | ]}‰j         |         ‘ŒS rK   )r  )r¶   Úframe_idrt   s     €rE   r»   z&ProfileChunk.write.<locals>.<listcomp>Š  s!   ø€ ÐQÐQÐQ¸8˜Ô,¨XÔ6ÐQÐQÐQrG   r$   )r  Ú	enumerater  r½   r  r–   r  r  rÁ   r   r¾   rÂ   )	rt   rÈ   rÉ   r·   r'   Ú	frame_idsr  Úir  s	   `        rE   rÇ   zProfileChunk.write}  sW  ø€ Ø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ñô ð ð ”×#Ò#à%'Ø%(Ø$(Ô$7¸Ô$Aðð ñô ð ð øõ "ð ;ð ;ð ;õ +­3¬<©>¬>Ñ:Ô:Ð:Ð:Ñ:ð;øøøð-	;ð 	;s   �CCÃ*DÄDrh   r-   r.   r/   r   c                 ób  — | j         | j        | j        d„ t          j        ¦   «         D ¦   «         dœ}t          |d         |d         |d         |d         ¦  «         | j        |d         t          dœd	||d
dœ}dD ]4}||         �*t          ||         ¦  «         	                    ¦   «         ||<   Œ5|S )Nc                 ó`   — i | ]+}t          |j        ¦  «        d t          |j        ¦  «        i“Œ,S )rå   )r´   Úidentrå   )r¶   rÜ   s     rE   ú
<dictcomp>z(ProfileChunk.to_json.<locals>.<dictcomp>   sH   € ð  ð  ð  ð õ �F”LÑ!Ô!Ø�C ¤Ñ,Ô,ð$ð ð  ð  rG   )r  r  r  Úthread_metadatar  Úin_app_excludeÚin_app_includeÚproject_rootrå   )rå   ÚversionÚpythonÚ2)r  Ú
client_sdkÚplatformr˜   rh   r$  )ÚreleaseÚenvironmentÚdist)
r  r  r  rß   r  r   r  r   r´   Ústrip)rt   rh   r-   r/   r˜   ÚpayloadÚkeys          rE   r  zProfileChunk.to_json™  sô   € ð ”kØ”kØ”|ð ð  õ (Ô1Ñ3Ô3ð	 ñ  ô  ð	

ð 

ˆõ 	Ø�HÔØÐ$Ô%ØÐ$Ô%Ø�NÔ#ñ		
ô 	
ð 	
ð œà  Ô(Ý"ðð ð !ØØ&Øð

ð 

ˆð 4ð 	9ð 	9ˆCØ�sŒ|Ð'Ý" 7¨3¤<Ñ0Ô0×6Ò6Ñ8Ô8�˜‘øàˆrG   rv   )rw   rx   ry   r�   rm   rÇ   r´   r  rK   rG   rE   r  r  s  s†   € € € € € ð3ð 3ð 3ð 3ð;˜ð ;Ð'8ð ;¸Tð ;ð ;ð ;ð ;ð8&Øð&Ø)9ð&ØENð&à	ð&ð &ð &ð &ð &ð &rG   r  rv   r×   rØ   )Qr?   r’   rl   r¾   rß   r*   rþ   r\   Úcollectionsr   r   r   Útypingr   Úsentry_sdk._lru_cacher   Úsentry_sdk.constsr   Úsentry_sdk.enveloper	   Úsentry_sdk.profiler.utilsr
   r   Úsentry_sdk.utilsr   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"   rm   rÙ   r#   Úgevent.monkeyr(   Úgevent.threadpoolr)   Ú_ThreadPoolr{   rÒ   ÚImportErrorr+   r,   rz   rF   rL   rQ   rU   rW   r_   rb   rd   r9   ri   rn   rp   r}   r;   r:   r§   r¦   r  rK   rG   rE   ú<module>r<     sê  ðØ €€€€Ø 	€	€	€	Ø €€€Ø 
€
€
€
Ø Ð Ð Ð Ø €€€Ø €€€Ø €€€Ø Ð Ð Ð Ð Ð Ø 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ð 'Ø  Ð  Ð  Ð  Ð  Ð  à *Ð *Ð *Ð *Ð *Ð *Ø %Ð %Ð %Ð %Ð %Ð %Ø (Ð (Ð (Ð (Ð (Ð (ðð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ØSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSÐSà+Ð+Ð+Ð+Ð+Ð+àAÐAÐAÐAÐAÐAÐAÐAðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð  �iØàØ!Øð	
ð 	
ñô €OðØ*Ð*Ð*Ð*Ð*Ð*Ø;Ð;Ð;Ð;Ð;Ð;à0;€JÐ-Ð;Ð;Ñ;Ø�< ¨Ñ0Ô0€L€LøØð ð ð Ø”:€LØ€J€J€Jðøøøð
 /3€
Ð+Ð 2Ð 2Ñ 2ð6Øð6àð6ð /ð6ð 
ð	6ð 6ð 6ð 6ðr Dð ð ð ð ð	ð 	ð 	ð 	ð#ð #ð #ð #ðð ð ð ðð ð ð ðð ð ð ðð ð ð ðð ð ð ð"ð "ð "ð "ð0Ø%ð0à	ð0ð 0ð 0ð 0ðð ð ð ð ñ ô ð ð_ð _ð _ð _ð _ñ _ô _ð _ðD?ð ?ð ?ð ?ð ?Ð 3ñ ?ô ?ð ?ðDEð Eð Eð Eð EÐ 3ñ Eô Eð EðP Ð ð.$ð .$ð .$ð .$ð .$ñ .$ô .$ð .$ðbLð Lð Lð Lð Lñ Lô Lð Lð Lð Ls   Â%C ÃCÃC