o
    #if!t                  	   @   s  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	m
Z
 d dlmZ d dlmZmZ d dlmZmZ d dlZd dlmZmZmZmZmZmZ d dlmZmZ d dlmZmZm Z m!Z! d d	l"m#Z# e#rd 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"m0Z0 d dl"m1Z1 d dl"m2Z2 d dl"m3Z3 d dl"m4Z4 d dl"m5Z5 d dl"m6Z6 d dl"m7Z7 d dl"m8Z8 eddd Z9e:Z;e<eee e!gZ=ee>d!j?d"Z@ee>d#j?d$ZAee>d%j?d"ZBd&d' ZCd(d) ZDed*d+ ZEd,d- ZFG d.d/ d/e	ZGG d0d1 d1eGZHG d2d3 d3eGZIG d4d5 d5eGZJG d6d7 d7eGZKd8d9 ZLd:d; ZMeHeIeJeKd<ZNed=d> d?d> ed@d> dAd> dBd> dCd> dDZOG dEdF dFZPG dGdH dHZQdIdJ ZRdKdL ZSdMdN ZTdOdP ZU	Q	R			 d`dSdTZVeVZWG dUdV dVZX		W			 dadXdYZY	R			 dbdZd[ZZ	R			 dbd\d]Z:	R			 dbd^d_Z[dS )c    N)ABCabstractmethod)contextmanager)datetimetimezone)wrapspartial)
ContextVarnownanosecond_timeto_timestampserialize_frame
json_dumps)EnvelopeItem)TRANSACTION_SOURCE_ROUTETRANSACTION_SOURCE_VIEWTRANSACTION_SOURCE_COMPONENTTRANSACTION_SOURCE_TASK)TYPE_CHECKING)Any)Callable)Dict)	Generator)Iterable)List)Optional)Set)Tuple)Union)	BucketKey)DurationUnit)FlushedMetricValue)MeasurementUnit)MetricMetaKey)MetricTagValue)
MetricTags)MetricTagsInternal)
MetricType)MetricValue
in_metricsF)defaultz[^a-zA-Z0-9_]+ z[^a-zA-Z0-9_\-.]+_z[^a-zA-Z0-9_\-.\/]+c              	   C   s"   t ddddddd}| |S )Nz\nz\rz\tz\\z\u{7c}z\u{2c})
	\|,)str	maketrans	translate)valuetable r9   K/var/www/html/corbot_env/lib/python3.10/site-packages/sentry_sdk/metrics.py_sanitize_tag_valueI   s   

r;   c                 C   s2   zt | }W n
 ty   Y d S w t|dddS )NFT)include_local_variablesinclude_source_context)sys	_getframe	Exceptionr   )
stacklevelfrmr9   r9   r:   get_code_locationX   s   rC   c               	   c   s8    t  } t d z| V  W t |  dS t |  w )z5Enters recursion protection and returns the old flag.TN)_in_metricsgetset)old_in_metricsr9   r9   r:   recursion_protectiond   s   
rH   c                    s   t   fdd}|S )zYConvenient decorator that uses `recursion_protection` to
    make a function a noop.
    c                     sL   t  }|s | i |W  d    S W d    d S 1 sw   Y  d S N)rH   )argskwargsr*   funcr9   r:   new_funcv   s   "zmetrics_noop.<locals>.new_func)r   )rM   rN   r9   rL   r:   metrics_noopp   s   rO   c                   @   sD   e Zd ZdZedd Zeedd Zedd Zedd	 Z	d
S )Metricr9   c                 C      d S rI   r9   selffirstr9   r9   r:   __init__      zMetric.__init__c                 C   rQ   rI   r9   rS   r9   r9   r:   weight      zMetric.weightc                 C   rQ   rI   r9   rS   r7   r9   r9   r:   add   rV   z
Metric.addc                 C   rQ   rI   r9   rW   r9   r9   r:   serialize_value   rV   zMetric.serialize_valueN)
__name__
__module____qualname__	__slots__r   rU   propertyrX   r[   r\   r9   r9   r9   r:   rP      s    

rP   c                   @   4   e Zd ZdZdd Zedd Zdd Zdd	 Zd
S )CounterMetricr7   c                 C   s   t || _d S rI   floatr7   rR   r9   r9   r:   rU      s   zCounterMetric.__init__c                 C      dS N   r9   rW   r9   r9   r:   rX      rV   zCounterMetric.weightc                 C   s   |  j t|7  _ d S rI   )r7   rf   rZ   r9   r9   r:   r[      s   zCounterMetric.addc                 C   s   | j fS rI   rd   rW   r9   r9   r:   r\      s   zCounterMetric.serialize_valueN	r]   r^   r_   r`   rU   ra   rX   r[   r\   r9   r9   r9   r:   rc          
rc   c                   @   rb   )GaugeMetriclastminmaxsumcountc                 C   s*   t |}|| _|| _|| _|| _d| _d S rh   rf   rn   ro   rp   rq   rr   rR   r9   r9   r:   rU      s   
zGaugeMetric.__init__c                 C   rg   )N   r9   rW   r9   r9   r:   rX      rY   zGaugeMetric.weightc                 C   sJ   t |}|| _t| j|| _t| j|| _|  j|7  _|  jd7  _d S rh   rs   rZ   r9   r9   r:   r[      s   zGaugeMetric.addc                 C   s   | j | j| j| j| jfS rI   rm   rW   r9   r9   r:   r\      s   zGaugeMetric.serialize_valueNrj   r9   r9   r9   r:   rl      s    
rl   c                   @   rb   )DistributionMetricrd   c                 C   s   t |g| _d S rI   re   rR   r9   r9   r:   rU         zDistributionMetric.__init__c                 C   
   t | jS rI   lenr7   rW   r9   r9   r:   rX         
zDistributionMetric.weightc                 C   s   | j t| d S rI   )r7   appendrf   rZ   r9   r9   r:   r[      s   zDistributionMetric.addc                 C   s   | j S rI   rd   rW   r9   r9   r:   r\      s   z"DistributionMetric.serialize_valueNrj   r9   r9   r9   r:   ru      rk   ru   c                   @   rb   )	SetMetricrd   c                 C   s   |h| _ d S rI   rd   rR   r9   r9   r:   rU      s   zSetMetric.__init__c                 C   rw   rI   rx   rW   r9   r9   r:   rX     rz   zSetMetric.weightc                 C   s   | j | d S rI   )r7   r[   rZ   r9   r9   r:   r[   	  rv   zSetMetric.addc                    s   dd   fdd| j D S )Nc                 S   s&   t | trt| dd@ S t| S )Nutf-8l    )
isinstancer4   zlibcrc32encodeint)xr9   r9   r:   _hash  s   
z(SetMetric.serialize_value.<locals>._hashc                 3   s    | ]} |V  qd S rI   r9   ).0r7   r   r9   r:   	<genexpr>  s    z,SetMetric.serialize_value.<locals>.<genexpr>rd   rW   r9   r   r:   r\     s   zSetMetric.serialize_valueNrj   r9   r9   r9   r:   r|      rk   r|   c                 C   s<  t  }|j}| D ]\}}| D ]\}}|\}}}	}
t|}t|	}	||d |d ||	d | D ]}|d |t|d q9|d ||d |
r|d d}|
D ](\}}t	|}|siq^|rnd}n|d	 ||d |d |t
|d q^|d
 |t|d |d qq	| S )Nr}      @   :   |asciis   |#TF   ,s   |T   
)ioBytesIOwriteitems_sanitize_metric_key_sanitize_unitr   r\   r4   _sanitize_tag_keyr;   getvalue)flushable_bucketsout_write	timestampbuckets
bucket_keymetricmetric_typemetric_namemetric_unitmetric_tagsserialized_valuerT   tag_key	tag_valuer9   r9   r:   _encode_metrics  sB   
"r   c           	      C   sZ   i }|D ]!\}}|\}}}d |t|t|}d|d< ||g | qt| |dS )Nz{}:{}@{}locationtype)r   mapping)formatr   r   
setdefaultr{   r   )	r   code_locationsr   keylocr   nameunitmrir9   r9   r:   _encode_locationsJ  s   
r   )cgdsc                   C   
   t  d S )Ng     @@r   r9   r9   r9   r:   <lambda>d     
 r   c                   C   r   )Ng    .Ar   r9   r9   r9   r:   r   e  r   c                   C   r   )Ng      N@r
   r9   r9   r9   r:   r   g  r   c                   C   r   )N      @r   r9   r9   r9   r:   r   h  r   c                   C   s   t  d d S )Nr         8@r   r9   r9   r9   r:   r   i  s    c                   C   s   t  d d d S )Nr   r   g      @r   r9   r9   r9   r:   r   j  s    )
nanosecondmicrosecondmillisecondsecondminutehourdayweekc                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	LocalAggregator_measurementsc                 C   s
   i | _ d S rI   r   rW   r9   r9   r:   rU   q  s   zLocalAggregator.__init__c                 C   s   d|||f }||f}| j |}|d ur.|\}	}
}}t|	|}	t|
|}
|d7 }||7 }n| }	 }
}d}|	|
||f| j |< d S )Nz%s:%s@%sri   )r   rE   ro   rp   )rS   tyr   r7   r   tags
export_keyr   oldv_minv_maxv_countv_sumr9   r9   r:   r[   w  s   	


zLocalAggregator.addc              	   C   sJ   i }| j  D ]\\}}\}}}}||g t|||||d q|S )N)r   ro   rp   rr   rq   )r   r   r   r{   _tags_to_dict)rS   rvr   r   r   r   r   r   r9   r9   r:   to_json  s    	zLocalAggregator.to_jsonN)r]   r^   r_   r`   rU   r[   r   r9   r9   r9   r:   r   n  s
    r   c                   @   s   e Zd ZdZdZdZ	d!ddZdd Zd	d
 Zdd Z	dd Z
dd Ze			d"ddZ	d#ddZedd Zdd Zedd Zdd Zdd  ZdS )$MetricsAggregatorg      $@i g      @Fc                 C   sf   i | _ || _t | _i | _d| _|| _d| _t	 | _
t | _d| _t | j | _d | _d | _d S )Nr   TF)r   _enable_code_locations_set_seen_locations_pending_locations_buckets_total_weight_capture_func_running	threadingLock_lockEvent_flush_event_force_flushrandomROLLUP_IN_SECONDS_flush_shift_flusher_flusher_pid)rS   capture_funcenable_code_locationsr9   r9   r:   rU     s   


zMetricsAggregator.__init__c              	   C   s   | j sdS t }| j|krdS | jA | j|kr"	 W d   dS || _tj| jd| _d| j_	z| j
  W n tyK   d| _ Y W d   dS w W d   dS 1 sWw   Y  dS )zFor forking processes we might need to restart this thread.
        This ensures that our process actually has that thread running.
        FTN)target)r   osgetpidr   r   r   Thread_flush_loopr   daemonstartRuntimeError)rS   pidr9   r9   r:   _ensure_thread  s0   


z MetricsAggregator._ensure_threadc                 C   sF   t d | js| jr!| jr| j| j |   | js| jsd S d S NT)rD   rF   r   r   r   waitFLUSHER_SLEEP_TIME_flushrW   r9   r9   r:   r     s   
zMetricsAggregator._flush_loopc                 C   s   |  |  |   d S rI   )_emit_flushable_buckets_flushable_locationsrW   r9   r9   r:   r     s   zMetricsAggregator._flushc                 C   s   | j h | j}t | j | j }d}d}|r&| j }i | _d| _d| _n=g }| j D ]\}}||kr<|||f q-|D ]\}}|	 D ]}||j
7 }qG| j|= q?|  j|8  _W d    |S W d    |S 1 snw   Y  |S )Nr9   r   F)r   r   timer   r   r   r   r   r{   valuesrX   )rS   force_flushcutoffr   weight_to_removebuckets_timestampr   r   r9   r9   r:   r     s6   



z$MetricsAggregator._flushable_bucketsc                 C   s8   | j  | j}i | _W d    |S 1 sw   Y  |S rI   )r   r   )rS   	locationsr9   r9   r:   r     s   
z&MetricsAggregator._flushable_locationsNr   c	                 C   s8  |   r	| jd u rd S |d u rt }n	t|trt|}t|| j | j }	t|}
||||
f}| j	A | j
|	i }||}|d urN|j}|| nt| | }||< d}|j| }|d urn| ||||d | W d    n1 sxw   Y  |   |d urt|dkr|n|}||||||
 d S d S )Nr      r   )r   r   r   r~   r   r   r   r   _serialize_tagsr   r   r   rE   rX   r[   METRIC_TYPESrecord_code_location_consider_force_flushrf   )rS   r   r   r7   r   r   r   local_aggregatorrA   bucket_timestampserialized_tagsr   local_bucketsr   previous_weightaddedlocal_valuer9   r9   r:   r[     sB   



zMetricsAggregator.addc           	      C   s   | j sd S |d u rt }|||f}t|tjjddddd d}tt|}||f| j	vrN| j	
||f t|d }|d urP| j|g ||f d S d S d S )Nr   r   r   r   r   tzinfo   )r   r   r   fromtimestampr   utcreplacer   r   r   r[   rC   r   r   r{   )	rS   r   r   r   rA   r   meta_keystart_of_dayr   r9   r9   r:   r  P  s$   	

z&MetricsAggregator.record_code_locationc                 C   sL   | j rdS |||f}t|tjjddddd d}tt|}||f| jvS )NFr   r  )	r   r   r  r   r  r  r   r   r   )rS   r   r   r   r   r  r  r9   r9   r:   need_code_locationm  s   	

z$MetricsAggregator.need_code_locationc                 C   s(   | j d u rd S d| _| j  d | _ d S )NF)r   r   r   rF   rW   r9   r9   r:   kill  s
   


zMetricsAggregator.killc                 C   s   d| _ |   d S r   )r   r   rW   r9   r9   r:   flush  s   zMetricsAggregator.flushc                 C   s2   t | j| j }|| jkrd| _| j  d S d S r   )ry   r   r   
MAX_WEIGHTr   r   rF   )rS   total_weightr9   r9   r:   r    s
   
z'MetricsAggregator._consider_force_flushc                 C   sj   t  }|rt|}|t|dd | D ]\}}t||}|t|dd q|jr3| | |S d S )Nstatsd)payloadr   metric_meta)r   r   add_itemr   r   r   r   )rS   r   r   envelopeencoded_metricsr   r   encoded_locationsr9   r9   r:   r     s   

zMetricsAggregator._emit)F)NNr   rI   )r]   r^   r_   r   r  r   rU   r   r   r   r   r   rO   r[   r  r  r  r  r  r   r9   r9   r9   r:   r     s2    
!=

	
r   c                 C   sx   | sdS g }|   D ]+\}}t|ttfr(|D ]}|d ur&||t|f qq
|d ur5||t|f q
tt|S )Nr9   )r   r~   listtupler{   r4   sorted)r   r   r   r7   inner_valuer9   r9   r:   r     s   r   c                 C   sT   i }| D ]#\}}| |}|d ur#t|tr|| q||g||< q|||< q|S rI   )rE   r~   r  r{   )r   r   tag_namer   	old_valuer9   r9   r:   r     s   


r   c                  C   s*   t jj} | j}|d ur|jd ur|jS d S rI   )
sentry_sdkHubcurrentclientmetrics_aggregator)hubr(  r9   r9   r:   _get_aggregator  s   r+  c                 C   s"  t jj}|j}|d u s|jd u rd d |fS t|pd}|d|jd  |d|jd  t j	 }d }|j
d}	|	tv rS|j}
|
rI|d|
 |jd urS|j }|jdi }|d}|d urt }|s||| |||s|d d |fW  d    S W d    n1 sw   Y  |j||fS )Nr9   releaseenvironmentsourcetransaction_experimentsbefore_emit_metric)r%  r&  r'  r(  r)  dictr   optionsScopeget_current_scope_transaction_inforE   GOOD_TRANSACTION_SOURCES_transaction_span_get_local_aggregatorrH   )r   r7   r   r   r*  r(  updated_tagsscoper  transaction_sourcetransaction_nameexperimentsbefore_emit_callbackr*   r9   r9   r:   _get_aggregator_and_update_tags  s6   




 rA        ?nonec              
   C   <   t | |||\}}}|dur|d| |||||| dS dS )zIncrements a counter.Nr   rA  r[   r   r7   r   r   r   rA   
aggregatorr  r9   r9   r:   	increment     

rH  c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )_Timingc                 C   s4   || _ || _|| _|| _|| _d | _d | _|| _d S rI   )r   r   r   r7   r   enteredr9  rA   )rS   r   r   r   r7   r   rA   r9   r9   r:   rU     s   

z_Timing.__init__c                 C   s   | j d urtd| d S )Nz0cannot use timing as %s when a value is provided)r7   	TypeError)rS   contextr9   r9   r:   _validate_invocation*  s
   
z_Timing._validate_invocationc                 C   s   t | j  | _| d tjd| jd| _| jr:| j	 D ]\}}t
|ttfr2dttt|}| j|| q| j  t }|d urQ|d| j| j| j | S )Nzcontext-managerzmetric.timing)opdescriptionr3   r   )TIMING_FUNCTIONSr   rK  rN  r%  
start_spanr   r9  r   r   r~   r   r  joinr!  mapr4   set_tag	__enter__r+  r  rA   )rS   r   r7   rG  r9   r9   r:   rV  1  s   

z_Timing.__enter__c              
   C   s|   | j sJ dt| j| j| j| j\}}}|d ur1t| j  | j }|d| j|| j|| j	|d  | j 
||| d | _ d S )Nzdid not enterr   )r9  rA  r   r7   r   r   rQ  rK  r[   r   __exit__)rS   exc_type	exc_valuetbrG  r  r   elapsedr9   r9   r:   rW  D  s*   

z_Timing.__exit__c                    s$    d t  fdd}|S )N	decoratorc                     sR   t jjjjjd d  | i |W  d    S 1 s"w   Y  d S )Nri   )r   r   r   r   rA   )timingr   r   r   r   rA   )rJ   rK   frS   r9   r:   
timed_funca  s   $z$_Timing.__call__.<locals>.timed_func)rN  r   )rS   r_  r`  r9   r^  r:   __call__]  s   
z_Timing.__call__N)r]   r^   r_   rU   rN  rV  rW  ra  r9   r9   r9   r:   rJ    s    rJ  r   c              
   C   sN   |durt | |||\}}}|dur|d| |||||| t| |||||S )a#  Emits a distribution with the time it takes to run the given code block.

    This method supports three forms of invocation:

    - when a `value` is provided, it functions similar to `distribution` but with
    - it can be used as a context manager
    - it can be used as a decorator
    Nr   )rA  r[   rJ  rF  r9   r9   r:   r]  p  s   
r]  c              
   C   rD  )zEmits a distribution.Nr   rE  rF  r9   r9   r:   distribution  rI  rb  c              
   C   rD  )zEmits a set.Nr   rE  rF  r9   r9   r:   rF     rI  rF   c              
   C   rD  )zEmits a gauge.Nr   rE  rF  r9   r9   r:   gauge  rI  rc  )rB  rC  NNr   )Nr   NNr   )rC  NNr   )\r   r   r   rer>   r   r   r   abcr   r   
contextlibr   r   r   	functoolsr   r   r%  sentry_sdk.utilsr	   r
   r   r   r   r   sentry_sdk.enveloper   r   sentry_sdk.tracingr   r   r   r   sentry_sdk._typesr   typingr   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   rD   rF   r   	frozensetr7  compilesubr   r   r   r;   rC   rH   rO   rP   rc   rl   ru   r|   r   r   r  rQ  r   r   r   r   r+  rA  rH  incrrJ  r]  rb  rc  r9   r9   r9   r:   <module>   s     	
00	6  
%
\


