
    tniX                        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mZ d dlmZmZmZmZmZ d d	lmZ erdd d
lmZ d dlmZ d dlmZ d dlm Z  d dlm!Z! d dlm"Z" d dlm#Z# d dlm$Z$ d dlm%Z% d dl&m'Z' d dl(m)Z)m*Z* d dlm+Z+m,Z,m-Z-m.Z.m/Z/m0Z0  e'de1e.e2d          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@dCd)ZAdDd+ZBdCd,ZCdCd-ZDdCd.ZEdCd/ZFdCd0ZGdEd2ZHd3d4d&e>fd5ZI G d6 d7          ZJ G d8 d9          ZK G d: d;eK          ZL G d< d=eK          ZMd>ZN G d? d@          ZO G dA dB          ZPdS )F    N)deque)datetimetimezone)VERSION)Envelope)LRUCache)DEFAULT_SAMPLING_FREQUENCYextract_stack)capture_internal_exception	is_geventloggernowset_in_app_in_frames)TYPE_CHECKING)Any)Callable)Deque)Dict)List)Optional)Set)Type)Union)	TypedDict)ContinuousProfilerModeSDKInfo)ExtractedSampleFrameIdStackIdThreadIdProcessedFrameProcessedStack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           d/var/www/html/gpu-tools/venv/lib/python3.11/site-packages/sentry_sdk/profiler/continuous_profiler.pysetup_continuous_profilerrF   J   ss    %D0 'GHHH$&&&{{ ?
 !: > 9 >{{?##/0 kk."55 OO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_   
 OOOOOrG   c                  &    t                       d ad S rN   )rb   r,   rK   rG   rE   r9   r9      s    OOO JJJrG   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:         FD     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&67T&U&U#B'
 
 ((**15$("8=S8I8I8I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     8ry{{""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_buffer0  s(    #L$-)?AR
 
rG   rf   c                 ,    | j         d S | j         j        S rN   )r   rh   rs   s    rE   rh   zContinuousScheduler.profiler_id5  s    ;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>Y  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_stackB  s    (  1E  4  #4#455UU	!    *-*=*?*?*E*E*G*G  FF & ! ! ! /s|~~>>> 55	!  |,, J JA(,,T->-F-F-H-HIIII$&!#3 : :G"> :
 *009990 9 9G(//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     UU	!    *-*=*?*?*E*E*G*G  FF & ! ! ! /s|~~>>> 55	! ;*K%%b&111us   2A *A21A2)r   getcwdr   r   rz   )rt   r   r   r   s   ` @@rE   r   z ContinuousScheduler.make_sampler;  s    ikk#&&&>W$$=U =e = = = = = = = = = =BU e         0 rG   c                    t          j                    }| j        rz|                                 | _        t          j                    |z
  }|| j        k     rt          | j        |z
             | j        rd| _        nt          j                    }| j        z| j        "| j                                         d | _        d S d S rI   )	r*   perf_counterr   r   r   r   thread_sleepr   flush)rt   lastelapseds      rE   runzContinuousScheduler.run  s     ""l 	'!%D
 '))D0G&&T]W4555 ! $  $&&D+ l 	'. ;"KDKKK #"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=     	GX|DDD48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   "ikk < 	DHOOFY 	# 	# | C	# 	# 	# 	# 	# 	# 	# 	# DHDL 
 $*	$(SWXXXDK#!!#### # # #  %"	#+	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s<   C%AC% B:9C%:CC%CC%%C),C)c                 ~    | j         rd| _         | j         | j                                         d | _        d | _        d S rI   r   r   joinr   rs   s    rE   r   z"ThreadContinuousScheduler.teardown  A    < 	! DL;"KDKrG   rv   )rw   rx   ry   __doc__r7   r{   r   r   r   r   r   __classcell__r   s   @rE   r;   r;     s          
 &.D
"---6D
%
% "
% 	
%
 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GX|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]   "ikk < 	DHOOFY 	# 	# | C	# 	# 	# 	# 	# 	# 	# 	# DHDL $Q--DK#!!$(++++ # # #  %"	##	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	# 	#s;   C6CB.-C.C	CC		CC Cc                 ~    | j         rd| _         | j         | j                                         d | _        d | _        d S rI   r   rs   s    rE   r   z"GeventContinuousScheduler.teardown?  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__N  s      &(:<<+!^^
 %(EE! L&&0022T5N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.writej  sb    ^,, 	.JJLLL%DJ(+D%
->GGGGGrG   c                 (    || j         z
  | j        k    S rN   )r  r   )rt   r  s     rE   r  zProfileBuffer.should_flushr  s      99T=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.flushw  sY    
""4#3T\4=QQ::""5)))(#####rG   rv   )
rw   rx   ry   r   r   rm   r   rz   r  r   rK   rG   rE   r   r   M  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__  s;    
(4646.0.002rG   r   r   r   c                 "    |D ]	\  }\  }}}	 | j         vrt          |          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Q8,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.(Iv; 4#666'0';'; : :8#4+>>><?@S<T<TD/9 K..vay999478K4L4LD'1K&&QQQQy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            FL!!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 	9Cs|'"73<006688rG   rv   )rw   rx   ry   r   rm   r   r   r  rK   rG   rE   r  r  ~  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   sentry_sdk.constsr   sentry_sdk.enveloper   sentry_sdk._lru_cacher   sentry_sdk.profiler.utilsr	   r
   sentry_sdk.utilsr   r   r   r   r   typingr   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<     sR    				  



              ' ' ' ' ' ' ' ' % % % % % % ( ( ( ( ( ( * * * * * *                     !           ++++++AAAAAAAA                 i!	
 	
 O******;;;;;;0;J-;;;<00LL   :LJJJ
 /3
+ 2 2 2666 /6 
	6 6 6 6rD    	 	 	 	# # # #               " " " "0%0	0 0 0 0       _ _ _ _ _ _ _ _DA A A A A 3 A A AHG G G G G 3 G G GT  .$ .$ .$ .$ .$ .$ .$ .$bL L L L L L L L L Ls   C% %C65C6