
    Yf                        d dl Z d dlZd dlmZmZ d dlmZ d dlZd dlm	Z	 d dl
mZ d dlmZ d dl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Zedd       Zd Zedd       ZdZdZd Z G d d      Zy)    N)ThreadLock)contextmanager)Envelope)Session)TYPE_CHECKING)format_timestamp)Any)Callable)Dict)	Generator)List)Optional)Unionc                     | t         j                  j                  } | j                  j                  }|6| j
                  r| j
                  j                  ni }|j                  dd      }|S )z<Utility function to find out if session tracking is enabled.auto_session_trackingF)
sentry_sdkHubcurrentscope_force_auto_session_trackingclientoptionsget)hubshould_trackclient_optionss      S/var/www/highfloat_scraper/venv/lib/python3.12/site-packages/sentry_sdk/sessions.py is_auto_session_tracking_enabledr      s]    
 {nn$$9999L/2zz++r%))*A5I    c              #      K   | t         j                  j                  } t        |       }|r| j	                  |       	 d |r| j                          yy# |r| j                          w w xY ww)z8Starts and stops a session automatically around a block.Nsession_mode)r   r   r   r   start_sessionend_session)r   r#   r   s      r   r   r   '   sf      {nn$$3C8L|4OO <OO s   <A/A A/A,,A/c                     | j                   }|0t        j                         j                  }|j	                  dd      }|S )a  
    Utility function to find out if session tracking is enabled.

    TODO: This uses the new scopes. When the Hub is removed, the function
    is_auto_session_tracking_enabled should be removed and this function
    should be renamed to is_auto_session_tracking_enabled.
    r   F)r   r   
get_clientr   r   )r   r   r   s      r   &is_auto_session_tracking_enabled_scoper(   9   sB     55L#..088%))*A5Ir    c              #      K   t        |       }|r| j                  |       	 d |r| j                          yy# |r| j                          w w xY ww)z
    Starts and stops a session automatically around a block.

    TODO: This uses the new scopes. When the Hub is removed, the function
    auto_session_tracking should be removed and this function
    should be renamed to auto_session_tracking.
    r"   N)r(   r$   r%   )r   r#   r   s      r   auto_session_tracking_scoper*   J   sV      :%@L6  < s    A; AAA)exitedabnormalcrashedd   c                 L    t        |      t        | j                               dS )N)attrs
aggregates)dictlistvalues)aggregate_statesr0   s     r   make_aggregate_enveloper6   b   s     %[5E5L5L5N0OPPr    c                   :    e Zd Z	 d	dZd Zd Zd Zd Zd Zd Z	y)
SessionFlusherc                     || _         || _        g | _        i | _        d | _        t               | _        t               | _        d | _        d| _	        y )NT)
capture_funcflush_intervalpending_sessionspending_aggregates_threadr   _thread_lock_aggregate_lock_thread_for_pid_running)selfr:   r;   s      r   __init__zSessionFlusher.__init__h   sN     ), ""$ F#v#r    c                 l   | j                   }g | _         | j                  5  | j                  }i | _        d d d        t               }|D ]J  }t	        |j
                        t        k(  r| j                  |       t               }|j                  |       L j                         D ]W  \  }}t	        |j
                        t        k(  r| j                  |       t               }|j                  t        ||             Y t	        |j
                        dkD  r| j                  |       y y # 1 sw Y   xY w)Nr   )r<   r@   r=   r   lenitemsMAX_ENVELOPE_ITEMSr:   add_sessionadd_sessionsr6   )rC   r<   r=   envelopesessionr0   statess          r   flushzSessionFlusher.flushx   s   00 "!! 	)!%!8!8&(D#	) :' 	*G8>>"&88!!(+#:  )	* 0557 	JME68>>"&88!!(+#:!!"9&%"HI	J x~~"h' #'	) 	)s   D**D3c                      j                   t        j                         k(  r j                  y j                  5   j                   t        j                         k(  r j                  
	 ddd       y fd}t        |      }d|_        	 |j                          | _        t        j                          _         ddd       y# t        $ r d _	        Y ddd       yw xY w# 1 sw Y   yxY w)a%  
        Check that we have an active thread to run in, or create one if not.

        Note that this might fail (e.g. in Python 3.12 it's not possible to
        spawn new threads at interpreter shutdown). In that case self._running
        will be False after running this function.
        Nc                       j                   rIt        j                   j                          j                   r j	                           j                   rHy y N)rB   timesleepr;   rN   rC   s   r   r>   z/SessionFlusher._ensure_running.<locals>._thread   s5    mmJJt223}}

 mmr    )targetTF)
rA   osgetpidr>   r?   r   daemonstartRuntimeErrorrB   )rC   r>   threads   `  r   _ensure_runningzSessionFlusher._ensure_running   s     299;.4<<3K 	/##ryy{2t||7O	/ 	/% 7+F FM "DL#%99;D -	/0     !&'	/ 	/	/0 s5   /C$4C$C C$C!C$ C!!C$$C-c                 z   | j                   5  |j                  d      }t        t        |j	                                     }|j
                  }| j                  j                  |i       }|j                  |i       }d|vrt        |j
                        |d<   |j                  dk(  r|j                  dd      dz   |d<   nh|j                  dk(  r|j                  dd      dz   |d<   n@|j                  dkD  r|j                  dd      dz   |d<   n|j                  d	d      dz   |d	<   d d d        y # 1 sw Y   y xY w)
NF)with_user_infostartedr-   r      r,   erroredr+   )r@   get_json_attrstuplesortedrG   truncated_startedr=   
setdefaultr	   statusr   errors)rC   rL   r0   primary_keysecondary_keyrM   states          r   add_aggregate_sessionz$SessionFlusher.add_aggregate_session   s)    !! 	=**%*@Eu{{} 56K#55M,,77RHF%%mR8E%#3G4M4M#Ni  ~~*#(99Y#:Q#>i :-$)IIj!$<q$@j!!##(99Y#:Q#>i "'))Ha"81"<h%	= 	= 	=s   DD11D:c                     |j                   dk(  r| j                  |       n)| j                  j                  |j	                                | j                          y )Nrequest)r#   rl   r<   appendto_jsonr\   )rC   rL   s     r   rI   zSessionFlusher.add_session   sG     9,&&w/!!(():;r    c                     d| _         y )NF)rB   rT   s    r   killzSessionFlusher.kill   s	    r    c                 $    | j                          y rQ   )rr   rT   s    r   __del__zSessionFlusher.__del__   s    		r    N)<   )
__name__
__module____qualname__rD   rN   r\   rl   rI   rr   rt    r    r   r8   r8   g   s+      (6#J=>r    r8   rQ   )Napplication)rz   ) rV   rR   	threadingr   r   
contextlibr   r   sentry_sdk.enveloper   sentry_sdk.sessionr   sentry_sdk._typesr   sentry_sdk.utilsr	   typingr
   r   r   r   r   r   r   r   r   r(   r*   TERMINAL_SESSION_STATESrH   r6   r8   ry   r    r   <module>r      s    	  " %  ( & + - "  ""    & <  Q
@ @r    