
    lh,Y                        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rad 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 e8Z7 e5dd      Z9da<d Z=d Z>d Z?d Z@d  ZAd! ZBd" ZCd# ZDd$ ZEd% ZF G d& d'      ZG G d( d)      ZH G d* d+eH      ZI G d, d-eH      ZJd.ZK G d/ d0      ZL G d1 d2      ZMy# e:$ r ejv                  Z9dZ7Y vw xY w)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                 n   t         t        j                  d       yt               rt        j
                  }nt        j
                  }| j                  d      | d   }n'| j                  di       }|j                  d      xs |}t        }|t        j
                  k(  rt        || ||      a n<|t        j
                  k(  rt	        || ||      a nt        dj                  |            t        j                  dj                  t         j
                               t        j                  t               y	)
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          y/var/www/pru.catia.catastroantioquia-mas.com/tasa/lib/python3.12/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.w,

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

 ?FF}UVV
LLCJJ 	K 	
 OO01    c                  d    t         y t         j                         sy t         j                          y N)r1   is_auto_start_enabledmanual_start rC   rA   !try_autostart_continuous_profilerrI   }   s(    
 ++-rC   c                  8    t         y t         j                         S rE   )r1   
auto_startrH   rC   rA   !try_profile_lifecycle_trace_startrL      s      ""rC   c                  :    t         y t         j                          y rE   )r1   rG   rH   rC   rA   start_profilerrN      s    rC   c                  P    t        j                  dt        d       t                y )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                  :    t         y t         j                          y rE   )r1   manual_stoprH   rC   rA   stop_profilerrY      s    rC   c                  P    t        j                  dt        d       t                y )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                      t                d ay rE   )rY   r1   rH   rC   rA   r:   r:      s    O JrC   c                  0    t         y t         j                  S rE   )r1   profiler_idrH   rC   rA   get_profiler_idr_      s    !!!rC   c                 H    | syt        j                          t        |       k  S NF)randomfloat)sample_rates    rA   +determine_profile_session_sampling_decisionre      s      ==?U;///rC   c                   "    e Zd ZU dZeed<   d Zy)ContinuousProfileTactivec                     d| _         y ra   )rh   selfs    rA   stopzContinuousProfile.stop   s	    rC   N)__name__
__module____qualname__rh   bool__annotations__rl   rH   rC   rA   rg   rg      s    FDrC   rg   c                   b    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zed        Zd Zd Zy)ContinuousSchedulerunknownc                 z   d|z  | _         || _        || _        || _        | j                  j	                  d      | _        | j                  j	                  d      }t        |      | _        | j                         | _	        d | _
        d | _        d| _        d| _        t        d      | _        t!               | _        y )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)rk   r@   r;   r<   r=   rw   s         rA   __init__zContinuousScheduler.__init__   s    i ())*=>&*ll&6&67T&U#B'
 ((*"!-"urC   c                     | j                   t        j                         k(  ry| j                  j	                  d      }|sy|j	                  d      S )NFr.   continuous_profiling_auto_start)r   osgetpidr;   r5   )rk   r?   s     rA   rF   z)ContinuousScheduler.is_auto_start_enabled   sC     88ryy{"ll&&~6@AArC   c                     | j                   sy | j                  dk7  ry t        j                  d       t	               }| j
                  j                  |       | j                          |S )Ntracez"[Profiling] Auto starting profiler)r|   r{   r   r2   rg   r   appendensure_running)rk   profiles     rA   rK   zContinuousScheduler.auto_start  sU    ||>>W$9:#%  )rC   c                 ^    | j                   sy | j                  dk7  ry | j                          y Nmanual)r|   r{   r   rj   s    rA   rG   z ContinuousScheduler.manual_start  s'    ||>>X%rC   c                 D    | j                   dk7  ry | j                          y r   )r{   teardownrj   s    rA   rX   zContinuousScheduler.manual_stop   s    >>X%rC   c                     t         rE   NotImplementedErrorrj   s    rA   r   z"ContinuousScheduler.ensure_running'      !!rC   c                     t         rE   r   rj   s    rA   r   zContinuousScheduler.teardown+  r   rC   c                     t         rE   r   rj   s    rA   pausezContinuousScheduler.pause/  r   rC   c                 n    t        | j                  | j                  t        | j                        | _        y rE   )ProfileBufferr;   r<   PROFILE_BUFFER_SECONDSr=   r   rj   s    rA   reset_bufferz ContinuousScheduler.reset_buffer3  s&    #LL$--)?ARAR
rC   c                 H    | j                   y | j                   j                  S rE   )r   r^   rj   s    rA   r^   zContinuousScheduler.profiler_id9  s!     ;;{{&&&rC   c                      t        j                         t        d       j                  dk(  r	 fd}|S  fd}|S )N   )max_sizer   c            
         j                   sj                  syt        j                         }t               }	 t	        j
                         j                         D cg c]  \  }}t        |      t        |
      f }}}t        |      D ]5  }j                  j                  j                   j                                7 g }j                  D ]   }	|	j                  r|j!                  |	       " |D ]  }	j                  j#                  |	        j$                  j$                  j'                  ||       yc c}}w # t        $ r  t        t	        j                                Y yw xY w)
                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popleftrh   r   remover   write)argskwargsr   tstidframesample_inactive_profilesr   cachecwdrk   s             rA   _sample_stackz7ContinuousScheduler.make_sampler.<locals>._sample_stackH  s]    ((1E1E  #4#4#45U	! +.*=*=*?*E*E*G&C S=s#CDF ( |, JA((,,T->->-F-F-HIJ$&!#33 :G">>
 *009:  1 9G((//89 ;;*KK%%b&1M & ! /s||~> 	!s#   %E
  "EE
 E
 
&E32E3c            
      d   t               }	 t        j                         j                         D cg c]  \  }}t	        |      t        |      f }}}j                  j                  j                  ||       yc c}}w # t        $ r  t        t        j                                Y yw xY w)r   F)r   r   r   r   r   r
   r   r   r   r   r   )	r   r   r   r   r   r   r   r   rk   s	         rA   r   z7ContinuousScheduler.make_sampler.<locals>._sample_stack  s     U	! +.*=*=*?*E*E*G&C S=s#CDF  ;;*KK%%b&1 & ! /s||~> 	!s"   %B "B B  B &B/.B/)r   getcwdr   r{   )rk   r   r   r   s   ` @@rA   r}   z ContinuousScheduler.make_sampler@  s?    iik#&>>W$>v 32 rC   c                    t        j                         }| j                  r| j                         | _        t        j                         |z
  }|| j
                  k  rt        | j
                  |z
         | j                  rd| _        n!t        j                         }| j                  r| j                  "| j                  j                          d | _        y y ra   )	r*   perf_counterr   r~   r   rz   thread_sleepr   flush)rk   lastelapseds      rA   runzContinuousScheduler.run  s      "ll!%D
 '')D0G&T]]W45 !!$  $$&D+ ll. ;;"KKDK #rC   N)rm   rn   ro   r0   r   rF   rK   rG   rX   r   r   r   r   propertyr^   r}   r   rH   rC   rA   rs   rs      sU    D%.B"""""
 ' 'cJrC   rs   c                   6     e Zd ZdZdZdZ fdZd Zd Z xZ	S )r4   zr
    This scheduler is based on running a daemon thread that will call
    the sampler at a regular interval.
    threadz)sentry.profiler.ThreadContinuousSchedulerc                 j    t         |   ||||       d | _        t        j                         | _        y rE   )superr   r   	threadingLocklockrk   r@   r;   r<   r=   	__class__s        rA   r   z"ThreadContinuousScheduler.__init__  s+    GX|DNN$	rC   c                    d| _         t        j                         }| j                  r| j                  |k(  ry | j
                  5  | j                  r| j                  |k(  r
	 d d d        y || _        d| _        | j                          t        j                  | j                  | j                  d      | _        	 | j                  j                          d d d        y # t        $ r d| _        d | _        Y "w xY w# 1 sw Y   y xY w)NFT)nametargetdaemon)r   r   r   r   r   r   r   r   Threadr   r   r   startRuntimeErrorrk   r   s     rA   r   z(ThreadContinuousScheduler.ensure_running  s     #iik <<DHHOYY 	# ||C	# 	# DHDL 
 $**		$((SWXDK#!!#)	# 	#*   #  %"	#+	# 	#s1   C:*AC::CC74C:6C77C::Dc                     | j                   rd| _         | j                  !| j                  j                          d | _        d | _        y ra   r   r   joinr   rj   s    rA   r   z"ThreadContinuousScheduler.teardown  8    << DL;;"KKDKrC   )
rm   rn   ro   __doc__r0   r   r   r   r   __classcell__r   s   @rA   r4   r4     s$    
 D6D%$#L	rC   r4   c                   2     e Zd ZdZdZ fdZd Zd Z xZS )r3   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.
    geventc                     t         $t        dj                  | j                              t        |   ||||       d | _        t        j                         | _	        y )Nz"Profiler mode: {} is not available)
r)   r6   r7   r0   r   r   r   r   r   r   r   s        rA   r   z"GeventContinuousScheduler.__init__  sN     AHHSTTGX|DNN$	rC   c                    d| _         t        j                         }| j                  r| j                  |k(  ry | j
                  5  | j                  r| j                  |k(  r
	 d d d        y || _        d| _        | j                          t        d      | _        	 | j                  j                  | j                         d d d        y # t        $ r d| _        d | _        Y "w xY w# 1 sw Y   y xY w)NFT   )r   r   r   r   r   r   r   r)   r   spawnr   r   r   s     rA   r   z(GeventContinuousScheduler.ensure_running"  s     #iik <<DHHOYY 	# ||C	# 	# DHDL $Q-DK#!!$((+!	# 	#"   #  %"	##	# 	#s0   C$*.C$%CC!C$ C!!C$$C-c                     | j                   rd| _         | j                  !| j                  j                          d | _        d | _        y ra   r   rj   s    rA   r   z"GeventContinuousScheduler.teardownD  r   rC   )	rm   rn   ro   r   r0   r   r   r   r   r   s   @rA   r3   r3     s     D	% #D	rC   r3   <   c                   $    e Zd Zd Zd Zd Zd Zy)r   c                 D   || _         || _        || _        || _        t	        j
                         j                  | _        t               | _	        t               | _        t        j                  t        j                        j                         | j                  z
  | _        y rE   )r;   r<   buffer_sizer=   uuiduuid4hexr^   ProfileChunkchunkr   start_monotonic_timer   r   utcr%   start_timestamp)rk   r;   r<   r   r=   s        rA   r   zProfileBuffer.__init__T  sw     &(::<++!^
 %(E! LL&002T5N5NN 	rC   c                     | j                  |      r.| j                          t               | _        t	               | _        | j                  j                  | j                  |z   |       y rE   )should_flushr   r   r   r   r   r   r   )rk   monotonic_timer   s      rA   r   zProfileBuffer.writek  sK    ^,JJL%DJ(+D%

-->GrC   c                 :    || j                   z
  | j                  k\  S rE   )r   r   )rk   r   s     rA   r   zProfileBuffer.should_flusht  s     
  9 99T=M=MMMrC   c                     | j                   j                  | j                  | j                  | j                        }t               }|j                  |       | j                  |       y rE   )r   to_jsonr^   r;   r<   r   add_profile_chunkr=   )rk   r   envelopes      rA   r   zProfileBuffer.flush{  sK    

""4#3#3T\\4==Q:""5)(#rC   N)rm   rn   ro   r   r   r   r   rH   rC   rA   r   r   S  s    
.HN$rC   r   c                       e Zd Zd Zd Zd Zy)r   c                     t        j                         j                  | _        i | _        i | _        g | _        g | _        g | _        y rE   )	r   r   r   chunk_idindexed_framesindexed_stacksframesstackssamplesrj   s    rA   r   zProfileChunk.__init__  s:    

((  rC   c                 p   |D ]  \  }\  }}}	 || j                   vrt        |      D ]T  \  }}|| j                  vst        | j                        | j                  |<   | j                  j                  ||          V t        | j                         | j                   |<   | j                  j                  |D cg c]  }| j                  |    c}       | j                  j                  ||| j                   |   d        y c c}w # t        $ r! t        t        j                                Y 1w xY w)Nr$   )r   	enumerater   r   r   r   r   r  r   r   r   r   )	rk   r   r   r   r'   	frame_idsr   iframe_ids	            rA   r   zProfileChunk.write  s%   28 	;.C.(Iv; 4#6#66'0'; :8#4+>+>><?@S@S<TD//9 KK..vay9:
 588K8K4LD''1KK&&GPQ8,,X6Q ##%'%($($7$7$A	; R " ; +3<<>:;s)   -DA=D9D
3DD&D54D5c                    | j                   | j                  | j                  t        j                         D ci c]-  }t        |j                        dt        |j                        i/ c}d}t        |d   |d   |d   |d          | j                  |d   t        dd||d	d
}dD ]'  }||   	t        ||         j                         ||<   ) |S c c}w )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)rk   r^   r;   r<   r   r   payloadkeys           rA   r   zProfileChunk.to_json  s     kkkk||
 (113	   FLL!C,$  	

 	H$%$%N#		
  (" !&

 4 	9Cs|'"73<0668	9 ? s   2C
N)rm   rn   ro   r   r   r   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   rs   r4   r3   r   r   r   rH   rC   rA   <module>r&     sU    	  
      ' % ( *  !+A   !	
O*;J0L 
0f#"0 h hV? 3 ?DF 3 FR  -$ -$`M MC  ::LJs   D9 9EE