Ë
    S>{i¢„  ã            	       óŠ  — d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlZddlmZmZ ddlmZ ddlmZ ddlmZmZmZmZmZmZ erÔ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% ddl&m'Z' ddl(Zddlm)Z)m*Z* e+Z, e'de+e,e-dœ«      Z.e!e-   Z/ e'de+e"e+   e+e-e"e+   dœ«      Z0 e'dde+i«      Z1 e'de!e0   e!e/   e!e.   e e,e1f   dœ«      Z2 e'dde+i«      Z3e%e+e-e+f   Z4e%e4df   Z5e%e-e-f   Z6e%e6e5e!e0   f   Z7e$e%e,e7f      Z8	 ddl9m:Z; dd l<m=Z=m>Z> dd!l?m@Z@  e=d"d#«      ZAd&„ ZDdaEd'ZFd(ZGd)„ ZHd*„ ZId+„ ZJd,ZKeKfd-„ZLd.„ ZMd/„ ZNerd0„ ZOnd1„ ZO e-d2«      ZPd<d3„ZQ G d4„ d5eR«      ZS G d6„ d7eR«      ZT G d8„ d9eT«      ZU G d:„ d;eT«      ZVy# eB$ r d$„ Z;ej†                  ZAd%„ Z>dZ@Y Œ|w xY w)=a·  
This file is originally based on code from https://github.com/nylas/nylas-perftools,
which is published under the following license:

The MIT License (MIT)

Copyright (c) 2014 Nylas

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

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

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
é    N)Údeque)ÚPY33ÚPY311)ÚLRUCache)ÚTYPE_CHECKING)Úcapture_internal_exceptionÚfilename_for_moduleÚis_valid_sample_rateÚloggerÚnanosecond_timeÚset_in_app_in_frames)Ú	FrameType)ÚAny)ÚCallable)ÚDeque)ÚDict)ÚList)ÚOptional)ÚSet)ÚSequence)ÚTuple)Ú	TypedDict)ÚSamplingContextÚProfilerModeÚProcessedSample©Úelapsed_since_start_nsÚ	thread_idÚstack_idÚProcessedFrame)Úabs_pathÚfilenameÚfunctionÚlinenoÚmoduleÚProcessedThreadMetadataÚnameÚProcessedProfile©ÚframesÚstacksÚsamplesÚthread_metadataÚProfileContextÚ
profile_id.)Úget_hub)Úget_originalÚis_module_patched)Ú
ThreadPoolÚtimeÚsleepc                   ó   — y ©N© r8   ó    úQ/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sentry_sdk/profiler.pyÚget_gevent_hubr;   ˆ   s   € àr9   c                   ó   — y©NFr8   )ÚargsÚkwargss     r:   r2   r2   Ž   s   € ð r9   c                  ó2   — t        d«      xs t        d«      S )NÚ	threadingÚ_thread)r2   r8   r9   r:   Ú	is_geventrC   –   s   € ä˜[Ó)ÒIÔ->¸yÓ-IÐIr9   ée   é   c                 óf   — | d   }|�y| d   }|�|dkD  ry| d   j                  d«      }|�|dkD  ryy)NÚprofiles_samplerTÚprofiles_sample_rater   Ú_experimentsF)Úget)ÚoptionsrG   rH   s      r:   Úhas_profiling_enabledrL   §   s_   € àÐ1Ñ2ÐØÐ#Øà"Ð#9Ñ:ÐØÐ'Ð,@À1Ò,DØà" >Ñ2×6Ñ6Ð7MÓNÐØÐ'Ð,@À1Ò,DØàr9   c                 óÌ  — t         �t        j                  d«       yt        st        j                  d«       yt
        }t        «       rt        j                  }nt        j                  }| j                  d«      �| d   }n%| j                  di «      j                  d«      xs |}|t        j                  k(  s|dk(  rt        |¬«      a n:|t        j                  k(  rt        |¬«      a nt        dj                  |«      «      ‚t        j                  d	j                  t         j                  ¬
«      «       t         j                  «        t        j                  t         «       y)Nz%[Profiling] Profiler is already setupFz+[Profiling] Profiler requires Python >= 3.3Úprofiler_moderI   r5   ©Ú	frequencyzUnknown profiler mode: {}z.[Profiling] Setting up profiler in {mode} mode)ÚmodeT)Ú
_schedulerr   Údebugr   ÚwarnÚDEFAULT_SAMPLING_FREQUENCYrC   ÚGeventSchedulerrQ   ÚThreadSchedulerrJ   Ú
ValueErrorÚformatÚsetupÚatexitÚregisterÚteardown_profiler)rK   rP   Údefault_profiler_moderN   s       r:   Úsetup_profilerr_   ¸   s"  € ô ÐÜ�‰Ð<Ô=ØåÜ�‰ÐAÔBØä*€Iä„{ô
 !0× 4Ñ 4Ñä /× 4Ñ 4Ðà‡{�{�?Ó#Ð/Ø Ñ0‰ð �K‰K˜¨Ó+×/Ñ/°Ó@ò %Ø$ð 	ð 	œ×-Ñ-Ò-à˜GÒ#ä$¨yÔ9‰
Ø	œ/×.Ñ.Ò	.Ü$¨yÔ9‰
äÐ4×;Ñ;¸MÓJÓKÐKä
‡L�LØ8×?Ñ?ÄZÇ_Á_Ð?ÓUôô ×ÑÔä
‡O�OÔ%Ô&àr9   c                  ó<   — t         �t         j                  «        d a y r7   )rR   Úteardownr8   r9   r:   r]   r]   ì   s   € ô
 ÐÜ×ÑÔà�Jr9   é€   c                 ór  — t        |¬«      }| �"| j                  }|j                  | «       |} | �Œ"t        d„ |D «       «      }g }t	        |«      D ]K  \  }}	|j                  |	«      }
|
€"t        |	||   |«      }
|j                  |	|
«       |j                  |
«       ŒM t        |«      t        |«      f}|||fS )aA  
    Extracts the stack starting the specified frame. The extracted stack
    assumes the specified frame is the top of the stack, and works back
    to the bottom of the stack.

    In the event that the stack is more than `MAX_STACK_DEPTH` frames deep,
    only the first `MAX_STACK_DEPTH` frames will be returned.
    ©Úmaxlenc              3   ó2   K  — | ]  }t        |«      –— Œ y ­wr7   )Úframe_id)Ú.0Ú	raw_frames     r:   ú	<genexpr>z extract_stack.<locals>.<genexpr>  s   è ø€ ÒF¨i”h˜y×)ÑFùs   ‚)
r   Úf_backÚappendÚtupleÚ	enumeraterJ   Úextract_frameÚsetÚlenÚhash)ri   ÚcacheÚcwdÚmax_stack_depthÚ
raw_framesrk   Ú	frame_idsr*   ÚiÚfidÚframer   s               r:   Úextract_stackr{   û   sÈ   € ô  ˜oÔ.€Jà
Ð
Ø×!Ñ!ˆØ×Ñ˜)Ô$Øˆ	ð Ñ
ô
 ÑF¸:ÔFÓF€IØ€FÜ˜IÓ&ò ‰ˆˆ3Ø—	‘	˜#“ˆØˆ=Ü! # z°!¡}°cÓ:ˆEØ�I‰I�c˜5Ô!Ø�‰�eÕðô$ �:‹¤ Y£Ð/€Hà�Y Ð&Ð&r9   c                 óZ   — | j                   j                  | j                  t        | «      fS r7   )Úf_codeÚco_filenameÚf_linenoÚget_frame_name)ri   s    r:   rg   rg   +  s&   € à×Ñ×(Ñ(¨)×*<Ñ*<¼nÈYÓ>WÐXÐXr9   c                 óò   — |j                   j                  }	 |j                  d   }t        j
                  j                  ||«      |t        ||«      xs d | d   |j                  dœS # t        $ r d }Y ŒNw xY w)NÚ__name__rE   )r!   r%   r"   r#   r$   )	r}   r~   Ú	f_globalsÚ	ExceptionÚosÚpathÚjoinr	   r   )ry   ri   rt   r!   r%   s        r:   ro   ro   0  s~   € à×Ñ×+Ñ+€HðØ×$Ñ$ ZÑ0ˆô  —G‘G—L‘L  hÓ/ØÜ'¨°Ó9ÒA¸TØ˜‘FØ×$Ñ$ñð øô ò ØŠðús   ˜A( Á(A6Á5A6c                 ó.   — | j                   j                  S r7   )r}   Úco_qualname)rz   s    r:   r€   r€   O  s   € à�|‰|×'Ñ'Ð'r9   c                 ó,  — | j                   }|j                  }|j                  }	 |rj|d   dk(  rbd| j                  v rT| j                  d   j                  j
                  D ].  }||j                  v sŒdj                  |j                  |«      c S  	 |r`|d   dk(  rXd| j                  v rJ| j                  d   j
                  D ].  }||j                  v sŒdj                  |j                  |«      c S  |S # t        $ r Y Œpw xY w# t        $ r Y |S w xY w)Nr   Úselfz{}.{}Úcls)
r}   Úco_varnamesÚco_nameÚf_localsÚ	__class__Ú__mro__Ú__dict__rY   r‚   ÚAttributeError)rz   r}   r�   r'   rŒ   s        r:   r€   r€   U  s$  € ð —‘ˆØ×(Ñ(ˆð �~‰~ˆð	ñ Ø ‘N fÒ,Ø˜eŸn™nÑ,à Ÿ>™>¨&Ñ1×;Ñ;×CÑCò B�CØ˜sŸ|™|Ò+Ø&Ÿ~™~¨c¯l©l¸DÓAÒAðBð	ñ Ø ‘N eÒ+Ø˜UŸ^™^Ñ+à Ÿ>™>¨%Ñ0×8Ñ8ò B�CØ˜sŸ|™|Ò+Ø&Ÿ~™~¨c¯l©l¸DÓAÒAðBð ˆøô- ò 	Ùð	ûô  ò 	Øð
 ˆð	ús=   ¦AC7 Á3C7 ÂC7 ÂAD ÃD Ã4D Ã7	DÄDÄ	DÄDg   °ŽðBc                 óz  — | �	 | j                   }|�|S 	 t        «       rt        «       }|�	 |j                  S 	 t        j                  «       j                   }|�|S 	 	 t        j                  «       j                   }|�|S 	 y# t        $ r Y Œww xY w# t        $ r Y Œcw xY w# t        $ r Y ŒNw xY w# t        $ r Y yw xY w)zK
    Try to get the id of the current thread, with various fall backs.
    N)Úidentr“   rC   r;   Úthread_identrA   Úcurrent_threadÚmain_thread)Úthreadr   Ú
gevent_hubÚcurrent_thread_idÚmain_thread_ids        r:   Úget_current_thread_idr�   ˆ  sû   € ð Ðð	ØŸ™ˆIØÐ$Ø Ð ð %ô „{Ü#Ó%ˆ
ØÐ!ðà!×.Ñ.Ð.ð
Ü%×4Ñ4Ó6×<Ñ<ÐØÐ(Ø$Ð$ð )ðÜ"×.Ñ.Ó0×6Ñ6ˆØÐ%Ø!Ð!ð &ð øô? ò 	Ùð	ûô "ò Ùðûô ò Ùðûô ò Øð ð	úsE   „B ¬B ¹!B Á!B. Â	BÂBÂ	BÂBÂ	B+Â*B+Â.	B:Â9B:c                   óT   — e Zd Z	 	 dd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
d
„ Zd„ Zd„ Zy)ÚProfileNc                 óš  — |€t         n|| _        || _        t        j                  «       j
                  | _        |j                  | _        t        «       xs d| _	        d | _
        	 |j                  | _        d| _        d| _        i | _        i | _        g | _        g | _        g | _        d| _        | |_        y # t        $ r
 d| _        Y ŒRw xY w)Nr   F)rR   Ú	schedulerÚhubÚuuidÚuuid4ÚhexÚevent_idÚsampledr�   Ú_default_active_thread_idÚactive_thread_idÚ_start_timestamp_monotonic_nsÚstart_nsr“   Ústop_nsÚactiveÚindexed_framesÚindexed_stacksr*   r+   r,   Úunique_samplesÚ_profile)r‹   Útransactionr¢   r¡   s       r:   Ú__init__zProfile.__init__·  sÄ   € ð (1Ð'8�¸iˆŒØˆŒäŸ
™
›×(Ñ(ˆŒð #×*Ñ*ˆŒô *?Ó)@Ò)EÀAˆÔ&Ø $ˆÔð	Ø'×EÑEˆDŒMð ˆŒØˆŒà ˆÔØ ˆÔØˆŒØˆŒØˆŒàˆÔà#ˆÕøô ò 	ØˆDŽMð	ús   Á&B7 Â7C
Ã	C
c                 ó€   — t        «       | _        t        j                  dj	                  | j                  ¬«      «       y )Nz.[Profiling] updating active thread id to {tid})Útid)r�   r©   r   rS   rY   ©r‹   s    r:   Úupdate_active_thread_idzProfile.update_active_thread_idà  s6   € ä 5Ó 7ˆÔÜ�‰Ø<×CÑCØ×)Ñ)ð Dó õ	
r9   c                 óB  — | j                   st        j                  d«       d| _         y| j                  €t        j                  d«       d| _         y| j                  xs t
        j                  j                  }|j                  }|€d| _         y|j                  }t        |j                  d«      «      r |d   |«      }n|d   �|d   }n|d   j                  d«      }|€t        j                  d«       d| _         yt        |d	¬
«      st        j                  d«       d| _         yt        j                  «       t        |«      k  | _         | j                   rt        j                  d«       yt        j                  dj!                  t        |«      ¬«      «       y)a  
        Sets the profile's sampling decision according to the following
        precdence rules:

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

        2. Use `profiles_sample_rate` to decide.
        z@[Profiling] Discarding profile because transaction is discarded.FNz@[Profiling] Discarding profile because profiler was not started.rG   rH   rI   zA[Profiling] Discarding profile because profiling was not enabled.Ú	Profiling)Úsourcez>[Profiling] Discarding profile because of invalid sample rate.z [Profiling] Initializing profilezk[Profiling] Discarding profile because it's not included in the random sample (sample rate = {sample_rate}))Úsample_rate)r§   r   rS   r¡   r¢   Ú
sentry_sdkÚHubÚcurrentÚclientrK   ÚcallablerJ   r
   ÚwarningÚrandomÚfloatrY   )r‹   Úsampling_contextr¢   r¿   rK   r»   s         r:   Ú_set_initial_sampling_decisionz&Profile._set_initial_sampling_decisioné  s}  € ð �|Š|Ü�L‰LØRôð !ˆDŒLØð �>‰>Ð!Ü�L‰LØRôð !ˆDŒLØà�h‰hÒ0œ*Ÿ.™.×0Ñ0ˆØ—‘ˆð ˆ>Ø ˆDŒLØà—.‘.ˆä�G—K‘KÐ 2Ó3Ô4Ø5˜'Ð"4Ñ5Ð6FÓG‰KØÐ+Ñ,Ð8Ø!Ð"8Ñ9‰Kà! .Ñ1×5Ñ5Ð6LÓMˆKð ÐÜ�L‰LØSôð !ˆDŒLØä# K¸ÕDÜ�N‰NØPôð !ˆDŒLØô
 —}‘}“¬¨{Ó);Ñ;ˆŒà�<Š<Ü�L‰LÐ;Õ<ä�L‰LØ}÷  Eñ  EÜ % kÓ 2ð Eó õr9   c                 ó   — | j                   r| j                  ry | j                  sJ d«       ‚t        j                  d«       d| _        | j
                  st        «       | _        | j                  j                  | «       y )NúNo scheduler specifiedz[Profiling] Starting profileT)r§   r­   r¡   r   rS   r«   r   Ústart_profilingr¶   s    r:   ÚstartzProfile.start5  s[   € à�|Š|˜tŸ{š{Øà�~Š~Ð7Ð7Ó7ˆ~Ü�‰Ð3Ô4ØˆŒØ�}Š}Ü+Ó-ˆDŒMØ�‰×&Ñ& tÕ,r9   c                 óè   — | j                   r| j                  sy | j                  sJ d«       ‚t        j                  d«       d| _        | j                  j                  | «       t        «       | _        y )NrÇ   z[Profiling] Stopping profileF)r§   r­   r¡   r   rS   Ústop_profilingr   r¬   r¶   s    r:   ÚstopzProfile.stopA  sT   € à�|Š| 4§;¢;Øà�~Š~Ð7Ð7Ó7ˆ~Ü�‰Ð3Ô4ØˆŒØ�‰×%Ñ% dÔ+Ü&Ó(ˆ�r9   c                 óÔ   — | j                   xs t        j                  j                  }|j                  d   \  }}|j
                  }| |_        |||f| _        | j                  «        | S )Néÿÿÿÿ)r¢   r¼   r½   r¾   Ú_stackÚprofileÚ_context_manager_staterÉ   )r‹   r¢   Ú_ÚscopeÚold_profiles        r:   Ú	__enter__zProfile.__enter__L  sX   € à�h‰hÒ0œ*Ÿ.™.×0Ñ0ˆà—:‘:˜b‘>‰ˆˆ5Ø—m‘mˆØˆŒà'*¨E°;Ð&?ˆÔ#à�
‰
Œàˆr9   c                 óV   — | j                  «        | j                  \  }}}| `||_        y r7   )rÌ   rÑ   rÐ   )r‹   ÚtyÚvalueÚtbrÒ   rÓ   rÔ   s          r:   Ú__exit__zProfile.__exit__Z  s*   € à�	‰	Œà $× ;Ñ ;Ñˆˆ5�+ØÐ'à#ˆ�r9   c                 ó<  — | j                   sy || j                  k  ry || j                  z
  }|t        kD  r| j                  «        y | xj                  dz  c_        t        |«      }|D ]ÿ  \  }\  }}}	 || j                  vrºt        |«      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)Né   r   )r­   r«   ÚMAX_PROFILE_DURATION_NSrÌ   r°   Ústrr¯   rn   r®   rq   r*   rl   r+   r,   r“   r   ÚsysÚexc_info)r‹   ÚtsÚsampleÚoffsetr   rµ   r   rw   r*   rx   rg   s              r:   ÚwritezProfile.writec  s|  € à�{Š{Øà�—‘ÒØà�d—m‘mÑ#ˆØÔ+Ò+Ø�I‰IŒKØà×Ò˜qÑ Õä!$ V£Ðà28ò 	;Ñ.ˆCÑ.�(˜I vð;ð  4×#6Ñ#6Ñ6Ü'0°Ó';ò :™˜˜8Ø#¨4×+>Ñ+>Ò>Ü<?À×@SÑ@SÓ<T˜D×/Ñ/°Ñ9Ø ŸK™K×.Ñ.¨v°a©yÕ9ð:ô
 58¸×8KÑ8KÓ4L�D×'Ñ'¨Ñ1Ø—K‘K×&Ñ&ØGPÖQ¸8˜×,Ñ,¨XÓ6ÒQôð —‘×#Ñ#à2HØ%(Ø$(×$7Ñ$7¸Ñ$Añöñ	;ùò Røô "ò ;ô +¬3¯<©<«>×:ð;ús+   Á4-E1Â"A=E1ÄE,
Ä53E1Å,E1Å1&FÆFc                 óê   — t        j                  «       D �ci c]-  }t        |j                  «      dt        |j                  «      i“Œ/ }}| j
                  | j                  | j                  |dœS c c}w )Nr'   r)   )rA   rn   rÞ   r•   r'   r*   r+   r,   )r‹   r™   r-   s      r:   ÚprocesszProfile.process�  sv   € ô $×-Ñ-Ó/ö	
ð ô �—‘ÓØœ˜FŸK™KÓ(ð ñ ð
ˆð 
ð —k‘kØ—k‘kØ—|‘|Ø.ñ	
ð 	
ùò
s   —2A0c                 óR  — | j                  «       }t        |d   |d   |d   |d   «       |j                  d«      | j                  d||j                  dd«      |d	   d
dt	        j
                  «       it	        j                  «       t	        j                  «       dœt	        j                  «       t	        j                  «       dœ|d   |d   dt        | j                  | j                  z
  «      |d   d   d   t        | j                  €| j                  n| j                  «      dœgdœS )Nr*   Úin_app_excludeÚin_app_includeÚproject_rootÚenvironmentÚpythonÚreleaseÚ Ústart_timestampÚ1Úarchitecture)r'   Úversionr¦   r²   Ú0ÚcontextsÚtraceÚtrace_id)Úidr'   Úrelative_start_nsÚrelative_end_nsrö   r©   )rë   r¦   ÚplatformrÐ   rí   Ú	timestamprò   Údevicer…   ÚruntimeÚtransactions)ræ   r   rJ   r¦   rú   ÚmachineÚsystemrí   Úpython_implementationÚpython_versionrÞ   r¬   r«   r©   r¨   )r‹   Ú	event_optrK   rÐ   s       r:   Úto_jsonzProfile.to_json£  s7  € à—,‘,“.ˆäØ�HÑØÐ$Ñ%ØÐ$Ñ%Ø�NÑ#ô		
ð %Ÿ=™=¨Ó7ØŸ™Ø ØØ —}‘} Y°Ó3Ø"Ð#4Ñ5Øà¤× 0Ñ 0Ó 2ðô !Ÿ™Ó)Ü#×+Ñ+Ó-ñô
 !×6Ñ6Ó8Ü#×2Ñ2Ó4ñð $ JÑ/Ø% mÑ4ð *-ô (+¨4¯<©<¸$¿-¹-Ñ+GÓ'HØ )¨*Ñ 5°gÑ >¸zÑ JÜ(+à×0Ñ0Ð8ð ×6Ò6à!×2Ñ2ó)ñðñ'&
ð &	
r9   c                 óÆ  — | j                   xs t        j                  j                  }|j                  }|€yt        |j                  «      sy| j                  �| j                  s*|j                  r|j                  j                  dd¬«       y| j                  t        k  r?|j                  r|j                  j                  dd¬«       t        j                  d«       yy)NFr»   rÐ   )Údata_categoryÚinsufficient_dataz<[Profiling] Discarding profile because insufficient samples.T)r¢   r¼   r½   r¾   r¿   rL   rK   r§   Ú	transportÚrecord_lost_eventr°   ÚPROFILE_MINIMUM_SAMPLESr   rS   )r‹   r¢   r¿   s      r:   ÚvalidzProfile.validÖ  sÁ   € à�h‰hÒ0œ*Ÿ.™.×0Ñ0ˆØ—‘ˆØˆ>Øä$ V§^¡^Ô4Øà�<‰<Ð t§|¢|Ø×ÒØ× Ñ ×2Ñ2Ø!°ð 3ô ð à×ÑÔ!8Ò8Ø×ÒØ× Ñ ×2Ñ2Ø'°yð 3ô ô �L‰LÐWÔXØàr9   )NN)r‚   Ú
__module__Ú__qualname__r³   r·   rÅ   rÉ   rÌ   rÕ   rÚ   rä   ræ   r  r  r8   r9   r:   rŸ   rŸ   ¶  sF   „ ð Øó	'$òR
òJòX
-ò	)òò$ò*;òX
ò(1
ófr9   rŸ   c                   óF   — e Zd ZdZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zy)Ú	SchedulerÚunknownc                 ó‚   — d|z  | _         | j                  «       | _        t        d¬«      | _        t        «       | _        y )Ng      ð?rb   rd   )ÚintervalÚmake_samplerÚsamplerr   Únew_profilesrp   Úactive_profiles)r‹   rP   s     r:   r³   zScheduler.__init__õ  s6   € à˜i™ˆŒà×(Ñ(Ó*ˆŒô "¨Ô-ˆÔÜ"›uˆÕr9   c                 ó&   — | j                  «        | S r7   )rZ   r¶   s    r:   rÕ   zScheduler.__enter__ÿ  s   € à�
‰
ŒØˆr9   c                 ó$   — | j                  «        y r7   )ra   )r‹   r×   rØ   rÙ   s       r:   rÚ   zScheduler.__exit__  s   € à�‰�r9   c                 ó   — t         ‚r7   ©ÚNotImplementedErrorr¶   s    r:   rZ   zScheduler.setup  ó   € ä!Ð!r9   c                 ó   — t         ‚r7   r  r¶   s    r:   ra   zScheduler.teardown  r  r9   c                 ó   — t         ‚r7   r  r¶   s    r:   Úensure_runningzScheduler.ensure_running  r  r9   c                 óZ   — | j                  «        | j                  j                  |«       y r7   )r  r  rl   ©r‹   rÐ   s     r:   rÈ   zScheduler.start_profiling  s"   € à×ÑÔØ×Ñ× Ñ  Õ)r9   c                  ó   — y r7   r8   r!  s     r:   rË   zScheduler.stop_profiling  ó   € àr9   c                 óZ   ‡ ‡‡— t        j                  «       Št        d¬«      Šˆˆˆ fd„}|S )Né   )Úmax_sizec            
      óÀ  •— ‰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 ]2  }	|	j                  r|	j!                  ||«       Œ"|j#                  |	«       Œ4 |D ]  }	‰j                  j%                  |	«       Œ yc c}}w # t        $ r  t        t	        j                  «       «       Y yw xY w)z£
            Take a sample of the stack on all the threads in the process.
            This should be called at a regular interval to collect samples.
            N)r  r  rq   r   rß   Ú_current_framesÚitemsrÞ   r{   r“   r   rà   ÚrangeÚaddÚpopleftr­   rä   rl   Úremove)r>   r?   r  Únowrµ   rz   râ   rÒ   Úinactive_profilesrÐ   rs   rt   r‹   s             €€€r:   Ú_sample_stackz-Scheduler.make_sampler.<locals>._sample_stack#  sM  ø€ ð ×$Ò$¨T×-AÒ-Að ô ˜t×0Ñ0Ó1ˆLä!Ó#ˆCð	ô '*×&9Ñ&9Ó&;×&AÑ&AÓ&C÷á"˜˜Uô ˜“Xœ}¨U°E¸3Ó?Ò@ð�ñ ô( ˜<Ó(ò F�Ø×$Ñ$×(Ñ(¨×):Ñ):×)BÑ)BÓ)DÕEðFð !#Ðà×/Ñ/ò 6�Ø—>’>Ø—M‘M # vÕ.ð &×,Ñ,¨WÕ5ð6ð -ò 5�Ø×$Ñ$×+Ñ+¨GÕ4ñ5ùóGøô "ò ô +¬3¯<©<«>Ô:Ùð	ús#   »%D4 Á "D.ÂD4 Ä.D4 Ä4&EÅE)r…   Úgetcwdr   )r‹   r0  rs   rt   s   ` @@r:   r  zScheduler.make_sampler  s&   ú€ ä�i‰i‹kˆä #Ô&ˆö=	5ð~ Ðr9   N)r‚   r  r  rQ   r³   rÕ   rÚ   rZ   ra   r  rÈ   rË   r  r8   r9   r:   r  r  ò  s5   „ Ø€Dò%òò
ò"ò"ò"ò*ò
óEr9   r  c                   óB   ‡ — e Zd ZdZdZdZˆ fd„Zd„ Zd„ Zd„ Z	d„ Z
ˆ xZS )	rW   zr
    This scheduler is based on running a daemon thread that will call
    the sampler at a regular interval.
    r™   zsentry.profiler.ThreadSchedulerc                 óŠ   •— t         t        | �  |¬«       d| _        d | _        d | _        t        j                  «       | _        y )NrO   F)	ÚsuperrW   r³   Úrunningr™   ÚpidrA   ÚLockÚlock©r‹   rP   r�   s     €r:   r³   zThreadScheduler.__init__n  s:   ø€ äŒo˜tÑ-¸	Ð-ÔBð ˆŒØˆŒØˆŒÜ—N‘NÓ$ˆ�	r9   c                  ó   — y r7   r8   r¶   s    r:   rZ   zThreadScheduler.setupx  r#  r9   c                 óz   — | j                   r/d| _         | j                  �| j                  j                  «        y y y r=   ©r5  r™   r‡   r¶   s    r:   ra   zThreadScheduler.teardown|  ó4   € à�<Š<Ø ˆDŒLØ�{‰{Ð&Ø—‘× Ñ Õ"ð 'ð r9   c                 ó¢  — t        j                  «       }| j                  r| j                  |k(  ry | j                  5  | j                  r| j                  |k(  r
	 d d d «       y || _        d| _        t        j                  | j                  | j                  d¬«      | _	        | j                  j                  «        d d d «       y # 1 sw Y   y xY w)NT)r'   ÚtargetÚdaemon)r…   Úgetpidr5  r6  r8  rA   ÚThreadr'   Úrunr™   rÉ   ©r‹   r6  s     r:   r  zThreadScheduler.ensure_runningƒ  s    € ä�i‰i‹kˆð �<Š<˜DŸH™H¨šOØà�Y‰Yñ 	 ð �|Š| §¡¨C¢Ø÷	 ð 	 ð ˆDŒHØˆDŒLô
 $×*Ñ*°·	±	À$Ç(Á(ÐSWÔXˆDŒKØ�K‰K×ÑÔ÷	 ÷ 	 ñ 	 ús   ½CÁ#ACÃCc                 ó$  — t        j                  «       }| j                  rp| j                  «        t        j                  «       |z
  }|| j                  k  rt        | j                  |z
  «       t        j                  «       }| j                  rŒoy y r7   ©r4   Úperf_counterr5  r  r  Úthread_sleep©r‹   ÚlastÚelapseds      r:   rC  zThreadScheduler.run›  ók   € ä× Ñ Ó"ˆà�lŠlØ�L‰LŒNô
 ×'Ñ'Ó)¨DÑ0ˆGØ˜Ÿ™Ò&Ü˜TŸ]™]¨WÑ4Ô5ô ×$Ñ$Ó&ˆDð �l�lr9   ©r‚   r  r  Ú__doc__rQ   r'   r³   rZ   ra   r  rC  Ú__classcell__©r�   s   @r:   rW   rW   e  s-   ø„ ñð
 €DØ,€Dô%òò#ò ö0'r9   rW   c                   óB   ‡ — e Zd ZdZdZdZˆ fd„Zd„ Zd„ Zd„ Z	d„ Z
ˆ xZS )	rV   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.
    Úgeventzsentry.profiler.GeventSchedulerc                 óÞ   •— t         €$t        dj                  | j                  «      «      ‚t        t
        | �  |¬«       d| _        d | _        d | _	        t        j                  «       | _        y )Nz"Profiler mode: {} is not availablerO   F)r3   rX   rY   rQ   r4  rV   r³   r5  r™   r6  rA   r7  r8  r9  s     €r:   r³   zGeventScheduler.__init__¿  s_   ø€ ô ÐÜÐA×HÑHÈÏÉÓSÓTÐTäŒo˜tÑ-¸	Ð-ÔBð ˆŒØˆŒØˆŒô
 —N‘NÓ$ˆ�	r9   c                  ó   — y r7   r8   r¶   s    r:   rZ   zGeventScheduler.setupÑ  r#  r9   c                 óz   — | j                   r/d| _         | j                  �| j                  j                  «        y y y r=   r<  r¶   s    r:   ra   zGeventScheduler.teardownÕ  r=  r9   c                 óv  — t        j                  «       }| j                  r| j                  |k(  ry | j                  5  | j                  r| j                  |k(  r
	 d d d «       y || _        d| _        t        d«      | _        | j                  j                  | j                  «       d d d «       y # 1 sw Y   y xY w)NTrÜ   )	r…   rA  r5  r6  r8  r3   r™   ÚspawnrC  rD  s     r:   r  zGeventScheduler.ensure_runningÜ  s�   € ä�i‰i‹kˆð �<Š<˜DŸH™H¨šOØà�Y‰Yñ 	(ð �|Š| §¡¨C¢Ø÷	(ð 	(ð ˆDŒHØˆDŒLä$ Q›-ˆDŒKØ�K‰K×Ñ˜dŸh™hÔ'÷	(÷ 	(ñ 	(ús   ½B/Á#AB/Â/B8c                 ó$  — t        j                  «       }| j                  rp| j                  «        t        j                  «       |z
  }|| j                  k  rt        | j                  |z
  «       t        j                  «       }| j                  rŒoy y r7   rF  rI  s      r:   rC  zGeventScheduler.runñ  rL  r9   rM  rP  s   @r:   rV   rV   ®  s-   ø„ ñð €DØ,€Dô%ò$ò#ò(ö*'r9   rV   r7   )WrN  r[   r…   rú   rÂ   rß   rA   r4   r£   Úcollectionsr   r¼   Úsentry_sdk._compatr   r   Úsentry_sdk._lru_cacher   Úsentry_sdk._typesr   Úsentry_sdk.utilsr   r	   r
   r   r   r   Útypesr   Útypingr   r   r   r   r   r   r   r   r   Útyping_extensionsr   Úsentry_sdk.tracingr   r   rÞ   ÚThreadIdÚintr   ÚProcessedStackr    r&   r(   r.   ÚFrameIdÚFrameIdsÚStackIdÚExtractedStackÚExtractedSamplerR  r0   r;   Úgevent.monkeyr1   r2   Úgevent.threadpoolr3   rH  ÚImportErrorr5   rC   rR   rU   r
  rL   r_   r]   ÚMAX_STACK_DEPTHr{   rg   ro   r€   rÝ   r�   ÚobjectrŸ   r  rW   rV   r8   r9   r:   ú<module>ro     sx  ðñó6 Û 	Û Û Û 
Û Û Û Ý ã ß *Ý *Ý +÷÷ ñ ÝÝÝÝÝÝÝÝÝÝÝ+ãß?à€HáØà&)Ø!Øñ	
ó€Oð ˜#‘Y€NáØàØ  ™ØØØ˜s‘mñ	
ó	€Nñ (Ø!Ø	�ˆóÐñ
 !Øà˜>Ñ*Ø˜>Ñ*Ø˜OÑ,Ø# HÐ.EÐ$EÑFñ		
óÐñ ØØ	�sÐó€Nð
 ØØØð	ñ€Gð
 �W˜c�\Ñ"€Hð �C˜�H‰o€Gà˜7 H¨d°>Ñ.BÐBÑC€NØ˜u X¨~Ð%=Ñ>Ñ?€OðÝ0ß=Ý,á ¨Ó0€Lò"Jð
 €
ð !Ð ð
 Ð òò"1òhð €ð $ó	-'ò`Yò
ñ: 	ó(ò-ñ` ˜d›)Ð ó+ô\yˆfô yôx	p�ô pôfF'�iô F'ôRS'�iõ S'øðQ ò òð —:‘:€Lòð
 ‚Jðús   Ä(F& Æ&GÇG