§ <ˆjº„ã ó<—dZddlZddlZddlZddlZddlZddlZddlZddlZddl m Z ddl Z ddl m Z mZddlmZddlmZddlmZmZmZmZmZmZe�r ddlmZdd lmZdd lmZdd lmZdd lm Z dd lm!Z!ddlm"Z"ddlm#Z#ddlm$Z$ddlm%Z%ddl&m'Z'ddl(Z ddlm)Z)m*Z*e+Z,e'de+e,e-dœ¦«Z.e!e-Z/e'de+e"e+e+e-e"e+dœ¦«Z0e'dde+i¦«Z1e'de!e0e!e/e!e.e e,e1fdœ¦«Z2e'dde+i¦«Z3e%e+e-e+fZ4e%e4dfZ5e%e-e-fZ6e%e6e5e!e0fZ7e$e%e,e7fZ8 ddl9m:Z;dd lZ>dd!l?m@Z@e=d"d#¦«ZAn#eB$rd$„Z;ejCZAd%„Z>dZ@YnwxYwd&„ZDdaEd'ZFd(ZGd)„ZHd*„ZId+„ZJd,ZKejL¦«ZMeMeKfd-„ZNd.„ZOd/„ZPerd0„ZQnd1„ZQe-d2¦«ZRd—td¦«ptd¦«S)NÚ threadingÚ_thread)r2r8r9r:Ú is_geventrC–s€å ˜[Ñ )Ô )Ð IÕ->¸yÑ-IÔ-IÐIr9éeécóŒ—|d}|�dS|d}|�|dkrdS|d d¦«}|�|dkrdSdS)NÚprofiles_samplerTÚprofiles_sample_raterÚ _experimentsF)Úget)ÚoptionsrGrHs r:Úhas_profiling_enabledrL§sp€àÐ1Ô2ÐØÐ#؈tà"Ð#9Ô:ÐØÐ'Ð,@À1Ò,DÐ,D؈tà" >Ô2×6Ò6Ð7MÑNÔNÐØÐ'Ð,@À1Ò,DÐ,D؈tà ˆ5r9có—t�tjd¦«dStstjd¦«dSt }t ¦«r tj}n tj}|  d¦«� |d}n+|  di¦«  d¦«p|}|tjks|dkrt|¬¦«anC|tjkrt|¬¦«an"td  |¦«¦«‚tjd   tj¬ ¦«¦«t  ¦«tjt ¦«d S) Nz%[Profiling] Profiler is already setupFz+[Profiling] Profiler requires Python >= 3.3Ú profiler_moderIr5©Ú frequencyzUnknown 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)rKrPÚdefault_profiler_moderNs r:Úsetup_profilerr_¸sp€õÐÝŒ Ð<Ñ=Ô=Ð=؈uå ðÝŒ ÐAÑBÔBÐB؈uå*€Iå�{„{ð5õ !0Ô 4ÐÐå /Ô 4Ðà‡{‚{�?Ñ#Ô#Ð/Ø Ô0ˆ ˆ ð �KŠK˜¨Ñ +Ô +× /Ò /°Ñ @Ô @ð %Ø$ð ð �Ô-Ò-Ð-à ˜GÒ #Ð #å$¨yÐ9Ñ9Ô9ˆ ˆ Ø �/Ô.Ò .Ð .Ý$¨yÐ9Ñ9Ô9ˆ ˆ åÐ4×;Ò;¸MÑJÔJÑKÔKÐKå „LØ8×?Ò?ÅZÄ_Ð?ÑUÔUñôðõ×ÒÑÔÐå „OÕ%Ñ&Ô&Ð&à ˆ4r9cóJ—t�t ¦«dadSr7)rRÚteardownr8r9r:r]r]ìs%€õ ÐÝ×ÒÑÔÐà€J€J€Jr9é€có¾—t|¬¦«}|� |j}| |¦«|}|­ td„|D¦«¦«}g}t |¦«D]^\}} | | ¦«} | €-t | |||¦«} | | | ¦«| | ¦«Œ_t|¦«t|¦«f} | ||fS)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. ©ÚmaxlenNc3ó4K—|]}t|¦«V—ŒdSr7)Úframe_id)Ú.0Ú raw_frames r:ú z extract_stack..s*èè€ÐFÐF¨i•h˜yÑ)Ô)ÐFÐFÐFÐFÐFÐFr9) rÚf_backÚappendÚtupleÚ enumeraterJÚ extract_frameÚsetÚlenÚhash) riÚcacheÚcwdÚmax_stack_depthÚ raw_framesrkÚ frame_idsr*ÚiÚfidÚframers r:Ú extract_stackr{þsø€õ ˜oÐ.Ñ.Ô.€Jà Ð ØÔ!ˆØ×Ò˜)Ñ$Ô$Ð$؈ ð Ð õ ÐFÐF¸:ÐFÑFÔFÑFÔF€IØ €FݘIÑ&Ô&ðð‰ˆˆ3Ø— ’ ˜#‘”ˆØ ˆ=Ý! # z°!¤}°cÑ:Ô:ˆEØ �IŠI�c˜5Ñ !Ô !Ð !Ø� Š �eÑÔÐÐõ�:‰Œ¥ Y¡¤Ð/€Hà �Y Ð &Ð&r9cóD—|jj|jt|¦«fSr7)Úf_codeÚ co_filenameÚf_linenoÚget_frame_name)ris r:rgrg.s €à Ô Ô (¨)Ô*<½nÈYÑ>WÔ>WÐ XÐXr9cóÞ—|jj} |jd}n#t$rd}YnwxYwtj ||¦«|t||¦«pd|d|jdœS)NÚ__name__rE)r!r%r"r#r$) r}r~Ú f_globalsÚ ExceptionÚosÚpathÚjoinr r)ryrirtr!r%s r:roro3s‹€àÔÔ+€HðØÔ$ ZÔ0ˆˆøÝ ðððØˆˆˆðøøøõ”G—L’L  hÑ/Ô/ØÝ'¨°Ñ9Ô9ÐA¸Tؘ”FØÔ$ð ð ðs Ž œ +ª+có—|jjSr7)r}Ú co_qualname)rzs r:r€r€Rs €àŒ|Ô'Ð'r9cóÊ—|j}|j}|j} |rU|ddkrId|jvr@|jdjjD](}||jvrd |j|¦«cSŒ)n#t$rYnwxYw |rP|ddkrDd|jvr;|jdjD](}||jvrd |j|¦«cSŒ)n#t$rYnwxYw|S)NrÚselfz{}.{}Úcls) r}Ú co_varnamesÚco_nameÚf_localsÚ __class__Ú__mro__Ú__dict__rYr‚ÚAttributeError)rzr}r�r'rŒs r:r€r€XsV€ð”ˆØÔ(ˆ ðŒ~ˆð ðð Bð  ”N fÒ,Ð,ؘeœnÐ,Ð,à œ>¨&Ô1Ô;ÔCðBðB�Cؘsœ|Ð+Ð+Ø&Ÿ~š~¨c¬l¸DÑAÔAÐAÐAÐAð,øøåð ð ð Ø ˆDð øøøð ðð Bð  ”N eÒ+Ð+ؘUœ^Ð+Ð+à œ>¨%Ô0Ô8ðBðB�Cؘsœ|Ð+Ð+Ø&Ÿ~š~¨c¬l¸DÑAÔAÐAÐAÐAð,øøåð ð ð Ø ˆDð øøøð ˆ s1—AA/Á-A/Á/ A<Á;A<ÂACÃCà C ÃC g°ŽðBcóh—|� |j}|�|Sn#t$rYnwxYwt¦«r(t¦«}|� |jS#t$rYnwxYw t j¦«j}|�|Sn#t$rYnwxYw t j¦«j}|�|Sn#t$rYnwxYwdS)zK Try to get the id of the current thread, with various fall backs. N)Úidentr“rCr;Ú thread_identrAÚcurrent_threadÚ main_thread)ÚthreadrÚ gevent_hubÚcurrent_thread_idÚmain_thread_ids r:Úget_current_thread_idr�‹s*€ðÐð Øœ ˆIØÐ$Ø Ð ð%øåð ð ð Ø ˆDð øøøõ �{„{ðÝ#Ñ%Ô%ˆ Ø Ð !ð à!Ô.Ð.øÝ!ð ð ð Ø�ð øøøð Ý%Ô4Ñ6Ô6Ô<ÐØ Ð (Ø$Ð $ð )øå ð ð ð Ø ˆð øøøð Ý"Ô.Ñ0Ô0Ô6ˆØ Ð %Ø!Ð !ð &øå ð ð ð Ø ˆð øøøð ˆ4sA„ � œ¿AÁ AÁAÁA4Á4 BÂBÂB"Â" B/Â.B/cóV—eZdZ d d„Zd„Zd„Zd„Zd„Zd„Zd„Z d „Z d „Z d „Z d „Z dS)ÚProfileNcó†—|€tn||_||_tj¦«j|_|j|_t¦«pd|_ d|_ |j |_ n#t$r d|_ YnwxYwd|_d|_i|_i|_g|_g|_g|_d|_||_dS)NrF)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__zProfile.__init__ºsÖ€ð(1Ð'8�˜¸iˆŒØˆŒåœ ™ œ Ô(ˆŒ ð #Ô*ˆŒ õ*?Ñ)@Ô)@Ð)EÀAˆÔ&Ø $ˆÔð Ø'ÔEˆDŒMˆMøÝð ð ð ØˆDŒMˆMˆMð øøøðˆŒ ؈Œ à ˆÔØ ˆÔ؈Œ ؈Œ ؈Œ àˆÔà#ˆ ÔÐÐsÁ A+Á+A?Á>A?có†—t¦«|_tjd |j¬¦«¦«dS)Nz.[Profiling] updating active thread id to {tid})Útid)r�r©r rSrY©r‹s r:Úupdate_active_thread_idzProfile.update_active_thread_idãsM€å 5Ñ 7Ô 7ˆÔÝŒ Ø <× CÒ CØÔ)ð Dñ ô ñ ô ð ð ð r9cóH—|jstjd¦«d|_dS|j€tjd¦«d|_dS|jpt jj}|j}|€ d|_dS|j }t|  d¦«¦«r|d|¦«}n,|d� |d}n|d  d¦«}|€tjd¦«d|_dSt|d ¬ ¦«stj d ¦«d|_dStj¦«t|¦«k|_|jrtjd ¦«dStjd  t|¦«¬¦«¦«dS)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.rGrHrIzA[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 rSr¡r¢Ú sentry_sdkÚHubÚcurrentÚclientrKÚcallablerJr ÚwarningÚrandomÚfloatrY)r‹Úsampling_contextr¢r¿rKr»s r:Ú_set_initial_sampling_decisionz&Profile._set_initial_sampling_decisionìsè€ðŒ|ð Ý ŒLØRñ ô ð ð!ˆDŒLØ ˆFð Œ>Ð !Ý ŒLØRñ ô ð ð!ˆDŒLØ ˆFàŒhÐ0�*œ.Ô0ˆØ”ˆð ˆ>Ø ˆDŒLØ ˆFà”.ˆå �G—K’KÐ 2Ñ3Ô3Ñ 4Ô 4ð NØ5˜'Ð"4Ô5Ð6FÑGÔGˆKˆKØ Ð+Ô ,Ð 8Ø!Ð"8Ô9ˆKˆKà! .Ô1×5Ò5Ð6LÑMÔMˆKð Ð Ý ŒLØSñ ô ð ð!ˆDŒLØ ˆFå# K¸ ÐDÑDÔDð Ý ŒNØPñ ô ð ð!ˆDŒLØ ˆFõ ”}‘”­¨{Ñ);Ô);Ò;ˆŒ à Œ<ð Ý ŒLÐ;Ñ <Ô <Ð <Ð <Ð <å ŒLØ}÷EòEÝ % kÑ 2Ô 2ðEñôñ ô ð ð ð r9cóæ—|jr|jrdS|js Jd¦«‚tjd¦«d|_|jst ¦«|_|j |¦«dS)NúNo scheduler specifiedz[Profiling] Starting profileT)r§r­r¡r rSr«r Ústart_profilingr¶s r:Ústartz Profile.start8s{€àŒ|ð ˜tœ{ð Ø ˆFàŒ~Ð7Ð7Ð7Ñ7Ô7ˆ~ÝŒ Ð3Ñ4Ô4Ð4؈Œ ØŒ}ð .Ý+Ñ-Ô-ˆDŒMØ Œ×&Ò& tÑ,Ô,Ð,Ð,Ð,r9cóØ—|jr|jsdS|js Jd¦«‚tjd¦«d|_|j |¦«t ¦«|_dS)NrÇz[Profiling] Stopping profileF)r§r­r¡r rSÚstop_profilingr r¬r¶s r:Ústopz Profile.stopDso€àŒ|ð  4¤;ð Ø ˆFàŒ~Ð7Ð7Ð7Ñ7Ô7ˆ~ÝŒ Ð3Ñ4Ô4Ð4؈Œ Ø Œ×%Ò% dÑ+Ô+Ð+Ý&Ñ(Ô(ˆŒ ˆ ˆ r9có®—|jptjj}|jd\}}|j}||_|||f|_| ¦«|S)Néÿÿÿÿ)r¢r¼r½r¾Ú_stackÚprofileÚ_context_manager_staterÉ)r‹r¢Ú_ÚscopeÚ old_profiles r:Ú __enter__zProfile.__enter__OsQ€àŒhÐ0�*œ.Ô0ˆà”:˜b”>‰ˆˆ5Ø”mˆ ؈Œ à'*¨E°;Ð&?ˆÔ#à � Š ‰ Œ ˆ àˆ r9cóV—| ¦«|j\}}}|`||_dSr7)rÌrÑrÐ)r‹ÚtyÚvalueÚtbrÒrÓrÔs r:Ú__exit__zProfile.__exit__]s/€à � Š ‰ Œ ˆ à $Ô ;шˆ5�+Ø Ð 'à#ˆŒ ˆ ˆ r9có⇗‰jsdS|‰jkrdS|‰jz }|tkr‰ ¦«dS‰xjdz c_t |¦«}|D�] \}\}}} |‰jvrœt|¦«D]J\} } | ‰jvrz!Profile.write..ƒs!ø€ÐQÐQÐQ¸8˜Ô,¨XÔ6ÐQÐQÐQr9r)r­r«ÚMAX_PROFILE_DURATION_NSrÌr°Ústrr¯rnr®rqr*rlr+r,r“rÚsysÚexc_info) r‹ÚtsÚsampleÚoffsetrrµrrwr*rxrgs ` r:Úwritez Profile.writefsÂø€àŒ{ð Ø ˆFà �” Ò Ð Ø ˆFà�d”mÑ#ˆØ Õ+Ò +Ð +Ø �IŠI‰KŒKˆKØ ˆFà ÐÔ˜qÑ ÐÔå!$ V¡¤Ðà28ð ;ñ ;Ñ .ˆCÑ.�(˜I vð ;ð 4Ô#6Ð6Ð6Ý'0°Ñ';Ô';ð:ð:™ ˜˜8Ø#¨4Ô+>Ð>Ð>ݬ>Ñ:Ô:Ð:Ð:Ñ:ð ;øøøð- ;ð ;sÁ/CD>Ä>*E,Å+E,cóh—d„tj¦«D¦«}|j|j|j|dœS)Ncó`—i|]+}t|j¦«dt|j¦«i“Œ,S)r')ràr•r')rhr™s r:ú z#Profile.process..˜sH€ð ð ð ðõ �” Ñ Ô Ø�˜FœKÑ(Ô(ð ð ð ð r9r))rArnr*r+r,)r‹r-s r:ÚprocesszProfile.process’sN€ð  ð õ$Ô-Ñ/Ô/ð  ñ ô ˆð”kØ”kØ”|Ø.ð  ð ð r9cóx—| ¦«}t|d|d|d|d¦«| d¦«|jd|| dd¦«|d d d t j¦«it j¦«t j¦«d œt j¦«t j ¦«d œ|d |ddt|j |j z ¦«|dddt|j €|jn|j ¦«dœgdœ 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 rJr¦rþÚmachineÚsystemrñÚpython_implementationÚpython_versionràr¬r«r©r¨)r‹Ú event_optrKrÐs r:Úto_jsonzProfile.to_json¦sZ€à—,’,‘.”.ˆåØ �HÔ Ø Ð$Ô %Ø Ð$Ô %Ø �NÔ #ñ  ô ð ð%Ÿ=š=¨Ñ7Ô7Øœ Ø ØØ —}’} Y°Ñ3Ô3Ø"Ð#4Ô5Øà¥Ô 0Ñ 2Ô 2ðõ!œÑ)Ô)Ý#Ô+Ñ-Ô-ððõ !Ô6Ñ8Ô8Ý#Ô2Ñ4Ô4ððð $ JÔ/Ø% mÔ4ð*-õ(+¨4¬<¸$¼-Ñ+GÑ'HÔ'HØ )¨*Ô 5°gÔ >¸zÔ JÝ(+àÔ0Ð8ðÔ6Ð6à!Ô2ñ)ô)ðððð'& ð& ð& r9cóp—|jptjj}|j}|€dSt |j¦«sdS|j�|js%|jr|j  dd¬¦«dS|j tkr9|jr|j  dd¬¦«tj d¦«dSdS)NFr»rÐ)Ú data_categoryÚinsufficient_dataz<[Profiling] Discarding profile because insufficient samples.T)r¢r¼r½r¾r¿rLrKr§Ú transportÚrecord_lost_eventr°ÚPROFILE_MINIMUM_SAMPLESr rS)r‹r¢r¿s r:Úvalidz Profile.validÙsÝ€àŒhÐ0�*œ.Ô0ˆØ”ˆØ ˆ>Ø�5å$ V¤^Ñ4Ô4ð Ø�5à Œ<Ð  t¤|Ð ØÔð ØÔ ×2Ò2Ø!°ð3ñôðð�5à Ô Õ!8Ò 8Ð 8ØÔð ØÔ ×2Ò2Ø'°yð3ñôðõ ŒLÐWÑ XÔ XÐ XØ�5àˆtr9)NN)r‚Ú __module__Ú __qualname__r³r·rÅrÉrÌrÕrÚrærêrrr8r9r:rŸrŸ¹sÍ€€€€€ð Øð '$ð'$ð'$ð'$ðR ð ð ðJðJðJðX -ð -ð -ð )ð )ð )ð ð ð ð$ð$ð$ð*;ð*;ð*;ðX ð ð ð(1 ð1 ð1 ðfððððr9rŸcóH—eZdZdZd„Zd„Zd„Zd„Zd„Zd„Z d„Z d „Z d „Z d S) Ú SchedulerÚunknowncóœ—d|z |_| ¦«|_td¬¦«|_t ¦«|_dS)Ngð?rbrd)ÚintervalÚ make_samplerÚsamplerrÚ new_profilesrpÚactive_profiles)r‹rPs r:r³zScheduler.__init__øsG€à˜i™ˆŒ à×(Ò(Ñ*Ô*ˆŒ õ"¨Ð-Ñ-Ô-ˆÔÝ"™uœuˆÔÐÐr9có.—| ¦«|Sr7)rZr¶s r:rÕzScheduler.__enter__s€à � Š ‰ Œ ˆ ؈ r9có.—| ¦«dSr7)ra)r‹r×rØrÙs r:rÚzScheduler.__exit__s€à � Š ‰Œˆˆˆr9có—t‚r7©ÚNotImplementedErrorr¶s r:rZzScheduler.setup ó€å!Ð!r9có—t‚r7rr¶s r:razScheduler.teardownr r9có—t‚r7rr¶s r:Úensure_runningzScheduler.ensure_runningr r9cób—| ¦«|j |¦«dSr7)r#rrl©r‹rÐs r:rÈzScheduler.start_profilings1€à ×ÒÑÔÐØ Ô× Ò  Ñ)Ô)Ð)Ð)Ð)r9có—dSr7r8r%s r:rËzScheduler.stop_profilingó€à ˆr9có`‡‡‡—tj¦«Štd¬¦«Šˆˆˆfd„}|S)Né)Úmax_sizecóx•—‰ js ‰ jsdSt‰ j¦«}t¦«} ˆˆ fd„t j¦« ¦«D¦«}n1#t$r$tt j ¦«¦«YdSwxYwt|¦«D]3}‰ j  ‰ j  ¦«¦«Œ4g}‰ jD]5}|j r| ||¦«Œ | |¦«Œ6|D]}‰ j |¦«ŒdS)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. NcóV•—g|]%\}}t|¦«t|‰‰¦«f‘Œ&Sr8)ràr{)rhrµrzrsrts €€r:rÞzAScheduler.make_sampler.._sample_stack..?sDø€ðððá"˜˜Uõ˜‘X”X�}¨U°E¸3Ñ?Ô?Ð@ðððr9)rrrqr ráÚ_current_framesÚitemsr“rrâÚrangeÚaddÚpopleftr­rærlÚremove) r>r?rÚnowrärÒÚinactive_profilesrÐrsrtr‹s €€€r:Ú _sample_stackz-Scheduler.make_sampler.._sample_stack&sŠø€ðÔ$ð ¨TÔ-Að ð�õ˜tÔ0Ñ1Ô1ˆLå!Ñ#Ô#ˆCð ðððððå&)Ô&9Ñ&;Ô&;×&AÒ&AÑ&CÔ&Cðñô��øõ"ð ð ð õ+­3¬<©>¬>Ñ:Ô:Ð:Ø��ð  øøøõ ˜<Ñ(Ô(ð Fð F�ØÔ$×(Ò(¨Ô):×)BÒ)BÑ)DÔ)DÑEÔEÐEÐEà "Ð àÔ/ð 6ð 6�Ø”>ð6Ø—M’M # vÑ.Ô.Ð.Ð.ð &×,Ò,¨WÑ5Ô5Ð5Ð5à,ð 5ð 5�ØÔ$×+Ò+¨GÑ4Ô4Ð4Ð4ð 5ð 5sµ2A(Á(*BÂB)r…Úgetcwdr)r‹r5rsrts` @@r:rzScheduler.make_sampler sLøøø€åŒi‰kŒkˆå #Ð&Ñ&Ô&ˆð= 5ð= 5ð= 5ð= 5ð= 5ð= 5ð= 5ð~Ðr9N) r‚rrrQr³rÕrÚrZrar#rÈrËrr8r9r:rrõs¥€€€€€Ø €Dð%ð%ð%ðððð ððð"ð"ð"ð"ð"ð"ð"ð"ð"ð*ð*ð*ð  ð ð ðEðEðEðEðEr9rcóB‡—eZdZdZdZdZˆfd„Zd„Zd„Zd„Z d„Z ˆxZ S) rWzr This scheduler is based on running a daemon thread that will call the sampler at a regular interval. r™zsentry.profiler.ThreadSchedulercó´•—tt|¦« |¬¦«d|_d|_d|_t j¦«|_dS)NrOF) ÚsuperrWr³Úrunningr™ÚpidrAÚLockÚlock©r‹rPr�s €r:r³zThreadScheduler.__init__qsNø€å �o˜tÑ$Ô$×-Ò-¸ Ð-ÑBÔBÐBðˆŒ ØˆŒ ؈ŒÝ”NÑ$Ô$ˆŒ ˆ ˆ r9có—dSr7r8r¶s r:rZzThreadScheduler.setup{r'r9cój—|jr)d|_|j�|j ¦«dSdSdSr=©r:r™r‡r¶s r:razThreadScheduler.teardownóE€à Œ<ð #Ø ˆDŒLØŒ{Ð&Ø” × Ò Ñ"Ô"Ð"Ð"Ð"ð #ð #à&Ð&r9cón—tj¦«}|jr |j|krdS|j5|jr|j|kr ddd¦«dS||_d|_t j|j|jd¬¦«|_ |j   ¦«ddd¦«dS#1swxYwYdS)NT)r'ÚtargetÚdaemon) r…Úgetpidr:r;r=rAÚThreadr'Úrunr™rÉ©r‹r;s r:r#zThreadScheduler.ensure_running†s€åŒi‰kŒkˆð Œ<ð ˜DœH¨šO˜OØ ˆFà ŒYð ð ðŒ|ð  ¤¨C¢ Øð  ð ð ñ ô ð ð ð ðˆDŒH؈DŒLõ $Ô*°´ À$Ä(ÐSWÐXÑXÔXˆDŒKØ ŒK× Ò Ñ Ô Ð ð ð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð s¯B*ÁA B*Â*B.Â1B.có —tj¦«}|jrh| ¦«tj¦«|z }||jkrt |j|z ¦«tj¦«}|j°fdSdSr7©r4Ú perf_counterr:rrÚ thread_sleep©r‹ÚlastÚelapseds r:rHzThreadScheduler.runžóŽ€åÔ Ñ"Ô"ˆàŒlð 'Ø �LŠL‰NŒNˆNõ Ô'Ñ)Ô)¨DÑ0ˆGؘœÒ&Ð&ݘTœ]¨WÑ4Ñ5Ô5Ð5õÔ$Ñ&Ô&ˆDðŒlð 'ð 'ð 'ð 'ð 'r9© r‚rrÚ__doc__rQr'r³rZrar#rHÚ __classcell__©r�s@r:rWrWhsŠø€€€€€ððð €DØ ,€Dð%ð%ð%ð%ð%ð ð ð ð#ð#ð#ð ð ð ð0'ð'ð'ð'ð'ð'ð'r9rWcóB‡—eZdZdZdZdZˆfd„Zd„Zd„Zd„Z d„Z ˆxZ S) rVas 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. Úgeventzsentry.profiler.GeventSchedulercó•—t€'td |j¦«¦«‚t t |¦« |¬¦«d|_d|_d|_ tj ¦«|_ dS)Nz"Profiler mode: {} is not availablerOF) r3rXrYrQr9rVr³r:r™r;rAr<r=r>s €r:r³zGeventScheduler.__init__Âswø€õ Ð ÝÐA×HÒHÈÌÑSÔSÑTÔTÐ Tå �o˜tÑ$Ô$×-Ò-¸ Ð-ÑBÔBÐBðˆŒ ØˆŒ ؈Œõ ”NÑ$Ô$ˆŒ ˆ ˆ r9có—dSr7r8r¶s r:rZzGeventScheduler.setupÔr'r9cój—|jr)d|_|j�|j ¦«dSdSdSr=rAr¶s r:razGeventScheduler.teardownØrBr9cóV—tj¦«}|jr |j|krdS|j5|jr|j|kr ddd¦«dS||_d|_t d¦«|_|j |j¦«ddd¦«dS#1swxYwYdS)NTrÜ) r…rFr:r;r=r3r™ÚspawnrHrIs r:r#zGeventScheduler.ensure_runningßs €åŒi‰kŒkˆð Œ<ð ˜DœH¨šO˜OØ ˆFà ŒYð (ð (ðŒ|ð  ¤¨C¢ Øð (ð (ð (ñ (ô (ð (ð (ð (ðˆDŒH؈DŒLå$ Q™-œ-ˆDŒKØ ŒK× Ò ˜dœhÑ 'Ô 'Ð 'ð (ð (ð (ñ (ô (ð (ð (ð (ð (ð (ð (ð (øøøð (ð (ð (ð (ð (ð (s¯BÁABÂB"Â%B"có —tj¦«}|jrh| ¦«tj¦«|z }||jkrt |j|z ¦«tj¦«}|j°fdSdSr7rKrNs r:rHzGeventScheduler.runôrQr9rRrUs@r:rVrV±sŠø€€€€€ð ð ð €DØ ,€Dð%ð%ð%ð%ð%ð$ ð ð ð#ð#ð#ð(ð(ð(ð*'ð'ð'ð'ð'ð'ð'r9rVr7)YrSr[r…rþrÂrárAr4r£Ú collectionsrr¼Úsentry_sdk._compatrrÚsentry_sdk._lru_cacherÚsentry_sdk._typesrÚsentry_sdk.utilsrr r r r r ÚtypesrÚtypingrrrrrrrrrÚtyping_extensionsrÚsentry_sdk.tracingrrràÚThreadIdÚintrÚProcessedStackr r&r(r.ÚFrameIdÚFrameIdsÚStackIdÚExtractedStackÚExtractedSamplerWr0r;Ú gevent.monkeyr1r2Úgevent.threadpoolr3rMÚ ImportErrorr5rCrRrUrrLr_r]ÚMAX_STACK_DEPTHr6ÚCWDr{rgror€rßr�ÚobjectrŸrrWrVr8r9r:úrusÄðððð6€ € € Ø € € € Ø€€€Ø € € € Ø € € € ØÐÐÐØ € € € Ø € € € ØÐÐÐÐÐàÐÐÐØ*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ø*Ð*Ð*Ð*Ð*Ð*Ø+Ð+Ð+Ð+Ð+Ð+ðððððððððððððððððñJ@ØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØÐÐÐÐÐØ+Ð+Ð+Ð+Ð+Ð+àÐÐÐØ?Ð?Ð?Ð?Ð?Ð?Ð?Ð?à€Hà�iØà&)Ø!Øð ð ñô€Oð˜#”Y€Nà�YØàØ  œ ØØØ˜s”mð  ð ñ ô €Nð(˜iØ!Ø �ˆ ñôÐð !�yØà˜>Ô*ؘ>Ô*ؘOÔ,Ø# HÐ.EÐ$EÔFð  ð ñôÐð�YØØ �sÐñô€Nð Ø Ø Ø ð ô€Gð �W˜c�\Ô"€Hð �C˜�HŒo€Gà˜7 H¨d°>Ô.BÐBÔC€Nؘu X¨~Ð%=Ô>Ô?€OðØ0Ð0Ð0Ð0Ð0Ð0Ø=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ø,Ð,Ð,Ð,Ð,Ð,à�< ¨Ñ0Ô0€L€LøØð ð ð ðððð”:€Lðððð €J€J€Jð øøøð JðJðJð € ð!Ðð Ððððð"1ð1ð1ðhððð€ð€b„i�k„k€ð Ø#ð -'ð-'ð-'ð-'ð`YðYðYð ððð: ð5ð(ð(ð(ð(ð -ð-ð-ð`˜#˜d™)œ)Ðð+ð+ð+ð+ð\yðyðyðyðyˆfñyôyðyðx pðpðpðpðp�ñpôpðpðfF'ðF'ðF'ðF'ðF'�iñF'ôF'ðF'ðRS'ðS'ðS'ðS'ðS'�iñS'ôS'ðS'ðS'ðS'sÅ" FÆFÆF