
    gh,Y                        S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKJ	r	  S SK
J
r
Jr  S SKJr  S SKJr  S SKJr  S SKJrJr  S SKJrJrJrJrJr  S S	KJr  \(       aa  S S
KJr  S SKJr  S SKJr  S SKJ r   S SKJ!r!  S SKJ"r"  S SKJ#r#  S SKJ$r$  S SKJ%r%  S SK&J'r'  S SK(J)r)J*r*  S SKJ+r+J,r,J-r-J.r.J/r/J0r0  \'" S\1\.\2S.5      r3 S SK4J5r5  S SK6J7r8  \8r7\5" SS5      r9Sq<S r=S r>S r?S r@S  rAS! rBS" rCS# rDS$ rES% rF " S& S'5      rG " S( S)5      rH " S* S+\H5      rI " S, S-\H5      rJS.rK " S/ S05      rL " S1 S25      rMg! \: a    \Rv                  r9Sr7 Nwf = f)3    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)
ThreadPooltimesleepc                    [         b  [        R                  " S5        g[        5       (       a  [        R
                  nO[        R
                  nU R                  S5      b  U S   nO,U R                  S0 5      nUR                  S5      =(       d    Un[        nU[        R
                  :X  a  [        X`X5      q O;U[        R
                  :X  a  [	        X`X5      q O[        SR                  U5      5      e[        R                  " SR                  [         R
                  S95        [        R                  " [        5        g	)
Nz0[Profiling] Continuous Profiler is already setupFprofiler_mode_experimentscontinuous_profiling_modez$Unknown continuous profiler mode: {}z9[Profiling] Setting up continuous profiler in {mode} mode)modeT)
_schedulerr   debugr   GeventContinuousSchedulerr0   ThreadContinuousSchedulergetr	   
ValueErrorformatatexitregisterteardown_continuous_profiler)optionssdk_infocapture_funcdefault_profiler_moder-   experiments	frequencys          j/home/kali/devsecops-assessor/venv/lib/python3.13/site-packages/sentry_sdk/profiler/continuous_profiler.pysetup_continuous_profilerrB   J   s    GH{{
 !: > > 9 > >{{?#/0 kk."5 OO78Q<Q 	 +I1666.

 
388	8.

 ?FF}UVV
LLCJJ 	K 	
 OO01    c                  p    [         c  g [         R                  5       (       d  g [         R                  5         g N)r1   is_auto_start_enabledmanual_start rC   rA   !try_autostart_continuous_profilerrI   }   s+    
 ++--rC   c                  :    [         c  g [         R                  5       $ rE   )r1   
auto_startrH   rC   rA   !try_profile_lifecycle_trace_startrL      s      ""rC   c                  <    [         c  g [         R                  5         g rE   )r1   rG   rH   rC   rA   start_profilerrN      s    rC   c                  L    [         R                  " S[        SS9  [        5         g )NzWThe `start_profile_session` function is deprecated. Please use `start_profile` instead.   
stacklevel)warningswarnDeprecationWarningrN   rH   rC   rA   start_profile_sessionrV      s!     MMa
 rC   c                  <    [         c  g [         R                  5         g rE   )r1   manual_stoprH   rC   rA   stop_profilerrY      s    rC   c                  L    [         R                  " S[        SS9  [        5         g )NzUThe `stop_profile_session` function is deprecated. Please use `stop_profile` instead.rP   rQ   )rS   rT   rU   rY   rH   rC   rA   stop_profile_sessionr[      s      MM_
 OrC   c                      [        5         S qg rE   )rY   r1   rH   rC   rA   r:   r:      s    O JrC   c                  2    [         c  g [         R                  $ rE   )r1   profiler_idrH   rC   rA   get_profiler_idr_      s    !!!rC   c                 T    U (       d  g[         R                   " 5       [        U 5      :  $ NF)randomfloat)sample_rates    rA   +determine_profile_session_sampling_decisionre      s      ==?U;///rC   c                   *    \ rS rSr% Sr\\S'   S rSrg)ContinuousProfile   Tactivec                     SU l         g ra   ri   selfs    rA   stopContinuousProfile.stop   s	    rC   rk   N)	__name__
__module____qualname____firstlineno__ri   bool__annotations__rn   __static_attributes__rH   rC   rA   rg   rg      s    FDrC   rg   c                   j    \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 rS r\S 5       rS rS rSrg)ContinuousScheduler   unknownc                 n   SU-  U l         X l        X0l        X@l        U R                  R	                  S5      U l        U R                  R	                  S5      n[        U5      U l        U R                  5       U l	        S U l
        S U l        SU l        SU l        [        SS9U l        [!        5       U l        g )Ng      ?profile_lifecycleprofile_session_sample_rateF   )maxlen)intervalr;   r<   r=   r5   	lifecyclere   sampledmake_samplersamplerbufferpidrunningsoft_shutdownr   new_profilessetactive_profiles)rm   r@   r;   r<   r=   r}   s         rA   __init__ContinuousScheduler.__init__   s    i ())*=>&*ll&6&67T&U#B'
 ((*"!-"urC   c                     U R                   [        R                  " 5       :X  a  gU R                  R	                  S5      nU(       d  gUR	                  S5      $ )NFr.   continuous_profiling_auto_start)r   osgetpidr;   r5   )rm   r?   s     rA   rF   )ContinuousScheduler.is_auto_start_enabled   sC     88ryy{"ll&&~6@AArC   c                     U R                   (       d  g U R                  S:w  a  g [        R                  " S5        [	        5       nU R
                  R                  U5        U R                  5         U$ )Ntracez"[Profiling] Auto starting profiler)r   r   r   r2   rg   r   appendensure_running)rm   profiles     rA   rK   ContinuousScheduler.auto_start  sU    ||>>W$9:#%  )rC   c                 j    U R                   (       d  g U R                  S:w  a  g U R                  5         g Nmanual)r   r   r   rl   s    rA   rG    ContinuousScheduler.manual_start  s'    ||>>X%rC   c                 F    U R                   S:w  a  g U R                  5         g r   )r   teardownrl   s    rA   rX   ContinuousScheduler.manual_stop   s    >>X%rC   c                     [         erE   NotImplementedErrorrl   s    rA   r   "ContinuousScheduler.ensure_running'      !!rC   c                     [         erE   r   rl   s    rA   r   ContinuousScheduler.teardown+  r   rC   c                     [         erE   r   rl   s    rA   pauseContinuousScheduler.pause/  r   rC   c                 n    [        U R                  U R                  [        U R                  5      U l        g rE   )ProfileBufferr;   r<   PROFILE_BUFFER_SECONDSr=   r   rl   s    rA   reset_buffer ContinuousScheduler.reset_buffer3  s&    #LL$--)?ARAR
rC   c                 J    U R                   c  g U R                   R                  $ rE   )r   r^   rl   s    rA   r^   ContinuousScheduler.profiler_id9  s!     ;;{{&&&rC   c                    ^ ^^ [         R                  " 5       m[        SS9mT R                  S:X  a
  UUU 4S jnU$ UUU 4S jnU$ )N   )max_sizer   c            
      "  > TR                   (       d  TR                  (       d  g[        TR                   5      n[        5       n [        R
                  " 5       R                  5        VVs/ s H  u  pE[        U5      [        UT
T5      4PM     nnn[        U5       H6  nTR                  R                  TR                   R                  5       5        M8     / nTR                   H'  n	U	R                  (       a  M  UR!                  U	5        M)     U H  n	TR                  R#                  U	5        M      TR$                  b  TR$                  R'                  X65        gs  snnf ! [         a!    [        [        R                  " 5       5         gf = f)
Take a sample of the stack on all the threads in the process.
This should be called at a regular interval to collect samples.
TF)r   r   lenr   sys_current_framesitemsstrr
   AttributeErrorr   exc_inforangeaddpopleftri   r   remover   write)argskwargsr   tstidframesample_inactive_profilesr   cachecwdrm   s             rA   _sample_stack7ContinuousScheduler.make_sampler.<locals>._sample_stackH  sM    ((1E1E  #4#4#45U	! +.*=*=*?*E*E*G*GJC S=s#CD*G  ( |,A((,,T->->-F-F-HI -$&!#33G">>>
 *009  4  1G((//8  1 ;;*KK%%b1M & ! /s||~> 	!s$   &E# +$EE# E# #(FFc            
      n  > [        5       n [        R                  " 5       R                  5        VVs/ s H  u  p4[	        U5      [        UTT5      4PM     nnnTR                  b  TR                  R                  X%5        gs  snnf ! [         a!    [        [        R                  " 5       5         gf = f)r   F)r   r   r   r   r   r
   r   r   r   r   r   )	r   r   r   r   r   r   r   r   rm   s	         rA   r   r     s     U	! +.*=*=*?*E*E*G*GJC S=s#CD*G   ;;*KK%%b1 & ! /s||~> 	!s"   &B	 $BB	 B	 	(B43B4)r   getcwdr   r   )rm   r   r   r   s   ` @@rA   r    ContinuousScheduler.make_sampler@  s?    iik#&>>W$>v 32 rC   c                    [         R                  " 5       nU R                  (       a  U R                  5       U l        [         R                  " 5       U-
  nX R
                  :  a  [        U R
                  U-
  5        U R                  (       a  SU l        O([         R                  " 5       nU R                  (       a  M  U R                  b"  U R                  R                  5         S U l        g g ra   )	r*   perf_counterr   r   r   r   thread_sleepr   flush)rm   lastelapseds      rA   runContinuousScheduler.run  s      "ll!%D
 '')D0G&T]]W45 !!$  $$&D+ lll. ;;"KKDK #rC   )r   r   r=   r   r   r   r;   r   r   r   r   r<   r   N)rp   rq   rr   rs   r0   r   rF   rK   rG   rX   r   r   r   r   propertyr^   r   r   rv   rH   rC   rA   rx   rx      sU    D%.B"""""
 ' 'cJrC   rx   c                   @   ^  \ rS rSrSrSrSrU 4S jrS rS r	Sr
U =r$ )	r4   i  zf
This scheduler is based on running a daemon thread that will call
the sampler at a regular interval.
threadz)sentry.profiler.ThreadContinuousSchedulerc                 h   > [         TU ]  XX45        S U l        [        R                  " 5       U l        g rE   )superr   r   	threadingLocklockrm   r@   r;   r<   r=   	__class__s        rA   r   "ThreadContinuousScheduler.__init__  s'    XDNN$	rC   c                 ,   SU l         [        R                  " 5       nU R                  (       a  U R                  U:X  a  g U R
                     U R                  (       a  U R                  U:X  a
   S S S 5        g Xl        SU l        U R                  5         [        R                  " U R                  U R                  SS9U l         U R                  R                  5         S S S 5        g ! [         a    SU l        S U l         N#f = f! , (       d  f       g = f)NFT)nametargetdaemon)r   r   r   r   r   r   r   r   Threadr   r   r   startRuntimeErrorrm   r   s     rA   r   (ThreadContinuousScheduler.ensure_running  s     #iik <<DHHOYY ||C Y HDL 
 $**		$((SWXDK#!!#) Y*   #  %"	#+ Ys1   #D7ADC''D?DDD
Dc                     U R                   (       a  SU l         U R                  b!  U R                  R                  5         S U l        S U l        g ra   r   r   joinr   rl   s    rA   r   "ThreadContinuousScheduler.teardown  8    << DL;;"KKDKrC   r   r   r   r   r   r   )rp   rq   rr   rs   __doc__r0   r   r   r   r   rv   __classcell__r   s   @rA   r4   r4     s)    
 D6D%$#L	 	rC   r4   c                   <   ^  \ rS rSrSrSrU 4S jrS rS rSr	U =r
$ )r3   i  aK  
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.
geventc                    > [         c$  [        SR                  U R                  5      5      e[        TU ]  XX45        S U l        [        R                  " 5       U l	        g )Nz"Profiler mode: {} is not available)
r)   r6   r7   r0   r   r   r   r   r   r   r   s        rA   r   "GeventContinuousScheduler.__init__  sJ     AHHSTTXDNN$	rC   c                    SU l         [        R                  " 5       nU R                  (       a  U R                  U:X  a  g U R
                     U R                  (       a  U R                  U:X  a
   S S S 5        g Xl        SU l        U R                  5         [        S5      U l         U R                  R                  U R                  5        S S S 5        g ! [         a    SU l        S U l         N#f = f! , (       d  f       g = f)NFT   )r   r   r   r   r   r   r   r)   r   spawnr   r   r   s     rA   r   (GeventContinuousScheduler.ensure_running"  s     #iik <<DHHOYY ||C Y HDL $Q-DK#!!$((+! Y"   #  %"	## Ys0   #C17-C1%%CC.+C1-C..C11
C?c                     U R                   (       a  SU l         U R                  b!  U R                  R                  5         S U l        S U l        g ra   r   rl   s    rA   r   "GeventContinuousScheduler.teardownD  r   rC   r   )rp   rq   rr   rs   r   r0   r   r   r   rv   r   r   s   @rA   r3   r3     s$     D	% #D	 	rC   r3   <   c                   ,    \ rS rSrS rS rS rS rSrg)r   iS  c                 @   Xl         X l        X0l        X@l        [        R
                  " 5       R                  U l        [        5       U l	        [        5       U l        [        R                  " [        R                  5      R                  5       U R                  -
  U l        g rE   )r;   r<   buffer_sizer=   uuiduuid4hexr^   ProfileChunkchunkr   start_monotonic_timer   r   utcr%   start_timestamp)rm   r;   r<   r  r=   s        rA   r   ProfileBuffer.__init__T  so     &(::<++!^
 %(E! LL&002T5N5NN 	rC   c                     U R                  U5      (       a.  U R                  5         [        5       U l        [	        5       U l        U R                  R                  U R                  U-   U5        g rE   )should_flushr   r  r  r   r	  r   r  )rm   monotonic_timer   s      rA   r   ProfileBuffer.writek  sN    ^,,JJL%DJ(+D%

-->GrC   c                 8    XR                   -
  U R                  :  $ rE   )r	  r  )rm   r  s     rA   r  ProfileBuffer.should_flusht  s    
  9 99T=M=MMMrC   c                     U R                   R                  U R                  U R                  U R                  5      n[        5       nUR                  U5        U R                  U5        g rE   )r  to_jsonr^   r;   r<   r   add_profile_chunkr=   )rm   r  envelopes      rA   r   ProfileBuffer.flush{  sK    

""4#3#3T\\4==Q:""5)(#rC   )r  r=   r  r;   r^   r<   r	  r  N)	rp   rq   rr   rs   r   r   r  r   rv   rH   rC   rA   r   r   S  s    
.HN$rC   r   c                   &    \ rS rSrS rS rS rSrg)r  i  c                     [         R                  " 5       R                  U l        0 U l        0 U l        / U l        / U l        / U l        g rE   )	r  r  r  chunk_idindexed_framesindexed_stacksframesstackssamplesrl   s    rA   r   ProfileChunk.__init__  s:    

((  rC   c                    U GH  u  nu  pEn X@R                   ;  a  [        U5       HU  u  pxXR                  ;  d  M  [        U R                  5      U R                  U'   U R                  R                  Xg   5        MW     [        U R                   5      U R                   U'   U R                  R                  U Vs/ s H  oR                  U   PM     sn5        U R                  R                  UUU R                   U   S.5        GM     g s  snf ! [         a#    [        [        R                  " 5       5         GM;  f = f)Nr$   )r  	enumerater  r   r  r   r  r  r   r   r   r   )	rm   r   r   r   r'   	frame_idsr  iframe_ids	            rA   r   ProfileChunk.write  s   28.C.(v; #6#66'0';#+>+>><?@S@S<TD//9 KK..vy9 (<
 588K8K4LD''1KK&&GPQy8,,X6yQ ##%'%($($7$7$A 39 R " ; +3<<>::;s)   ,DA>D<D
3DD(D?>D?c                    U R                   U R                  U R                  [        R                  " 5        Vs0 s H.  n[        UR                  5      S[        UR                  5      0_M0     snS.n[        US   US   US   US   5        U R                  US   [        S.SUUS	S
.nS H'  nX'   c  M
  [        X'   5      R                  5       Xg'   M)     U$ s  snf )Nr   )r  r  r  thread_metadatar  in_app_excludein_app_includeproject_root)r   versionpython2)r  
client_sdkplatformr   r^   r,  )releaseenvironmentdist)r  r  r  r   r"  r   identr   r   r  r   strip)rm   r^   r;   r<   r   r   payloadkeys           rA   r  ProfileChunk.to_json  s     kkkk||
 (113	  4F FLL!C,$  4	 	

 	H$%$%N#		
  (" !&

 4C|'"7<0668 4 ? s   5C
)r  r  r  r  r  r  N)rp   rq   rr   rs   r   r   r  rv   rH   rC   rA   r  r    s    ;:%rC   r  )Nr8   r   rb   r   r   r*   r  rS   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"   rc   intr#   gevent.monkeyr(   gevent.threadpoolr)   _ThreadPoolr   ImportErrorr+   r1   rB   rI   rL   rN   rV   rY   r[   r:   r_   re   rg   rx   r4   r3   r   r   r  rH   rC   rA   <module>rG     sU    	  
      ' % ( *  !+A   !	
O*;J0L 
0f#"0 h hV? 3 ?DF 3 FR  -$ -$`M MC  ::LJs   D> >EE