o
    ht                  	   @   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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 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,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 ej7de8dd  ed!d"d#Z9e:Z;e<ej=ej>ej?ej@gZAeeBd$jCd%ZDeeBd&jCd'ZEeeBd(jCd%ZFd)d* ZGd+d, ZHed-d. ZId/d0 ZJG d1d2 d2e
ZKG d3d4 d4eKZLG d5d6 d6eKZMG d7d8 d8eKZNG d9d: d:eKZOd;d< ZPd=d> ZQeLeMeNeOd?ZRed@dA dBdA edCdA dDdA dEdA dFdA dGZSG dHdI dIZTG dJdK dKZUdLdM ZVdNdO ZWdPdQ ZXdRdS ZY	T	U			 dcdVdWZZeZZ[G dXdY dYZ\		Z			 ddd[d\Z]	U			 ded]d^Z^	U			 ded_d`Z:	U			 dedadbZ_dS )f    N)ABCabstractmethod)contextmanager)datetimetimezone)wrapspartial)
ContextVarnownanosecond_timeto_timestampserialize_frame
json_dumps)EnvelopeItem)TransactionSource)TYPE_CHECKING)Any)Callable)Dict)	Generator)Iterable)List)Optional)Set)Tuple)Union)	BucketKey)DurationUnit)FlushedMetricValue)MeasurementUnit)MetricMetaKey)MetricTagValue)
MetricTags)MetricTagsInternal)
MetricType)MetricValuezThe sentry_sdk.metrics module is deprecated and will be removed in the next major release. Sentry will reject all metrics sent after October 7, 2024. Learn more: https://sentry.zendesk.com/hc/en-us/articles/26369339769883-Upcoming-API-Changes-to-Metrics   )
stacklevel
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 r8   T/var/www/html/pro-man-master/venv/lib/python3.10/site-packages/sentry_sdk/metrics.py_sanitize_tag_valueN   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   )r(   frmr8   r8   r9   get_code_location]   s   rA   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_metricsr8   r8   r9   recursion_protectioni   s   
rF   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)rF   )argskwargsr)   funcr8   r9   new_func{   s   "zmetrics_noop.<locals>.new_func)r   )rK   rL   r8   rJ   r9   metrics_noopu   s   rM   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 )Metricr8   c                 C      d S rG   r8   selffirstr8   r8   r9   __init__      zMetric.__init__c                 C   rO   rG   r8   rQ   r8   r8   r9   weight      zMetric.weightc                 C   rO   rG   r8   rQ   r6   r8   r8   r9   add   rT   z
Metric.addc                 C   rO   rG   r8   rU   r8   r8   r9   serialize_value   rT   zMetric.serialize_valueN)
__name__
__module____qualname__	__slots__r   rS   propertyrV   rY   rZ   r8   r8   r8   r9   rN      s    

rN   c                   @   4   e Zd ZdZdd Zedd Zdd Zdd	 Zd
S )CounterMetricr6   c                 C   s   t || _d S rG   floatr6   rP   r8   r8   r9   rS      s   zCounterMetric.__init__c                 C      dS N   r8   rU   r8   r8   r9   rV      rT   zCounterMetric.weightc                 C   s   |  j t|7  _ d S rG   )r6   rd   rX   r8   r8   r9   rY      s   zCounterMetric.addc                 C   s   | j fS rG   rb   rU   r8   r8   r9   rZ      s   zCounterMetric.serialize_valueN	r[   r\   r]   r^   rS   r_   rV   rY   rZ   r8   r8   r8   r9   ra          
ra   c                   @   r`   )GaugeMetriclastminmaxsumcountc                 C   s*   t |}|| _|| _|| _|| _d| _d S rf   rd   rl   rm   rn   ro   rp   rP   r8   r8   r9   rS      s   
zGaugeMetric.__init__c                 C   re   )N   r8   rU   r8   r8   r9   rV      rW   zGaugeMetric.weightc                 C   sJ   t |}|| _t| j|| _t| j|| _|  j|7  _|  jd7  _d S rf   rq   rX   r8   r8   r9   rY      s   zGaugeMetric.addc                 C   s   | j | j| j| j| jfS rG   rk   rU   r8   r8   r9   rZ      s   zGaugeMetric.serialize_valueNrh   r8   r8   r8   r9   rj      s    
rj   c                   @   r`   )DistributionMetricrb   c                 C   s   t |g| _d S rG   rc   rP   r8   r8   r9   rS         zDistributionMetric.__init__c                 C   
   t | jS rG   lenr6   rU   r8   r8   r9   rV         
zDistributionMetric.weightc                 C   s   | j t| d S rG   )r6   appendrd   rX   r8   r8   r9   rY      s   zDistributionMetric.addc                 C   s   | j S rG   rb   rU   r8   r8   r9   rZ      s   z"DistributionMetric.serialize_valueNrh   r8   r8   r8   r9   rs      ri   rs   c                   @   r`   )	SetMetricrb   c                 C   s   |h| _ d S rG   rb   rP   r8   r8   r9   rS     s   zSetMetric.__init__c                 C   ru   rG   rv   rU   r8   r8   r9   rV   	  rx   zSetMetric.weightc                 C   s   | j | d S rG   )r6   rY   rX   r8   r8   r9   rY     rt   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    )
isinstancer3   zlibcrc32encodeint)xr8   r8   r9   _hash  s   
z(SetMetric.serialize_value.<locals>._hashc                 3   s    | ]} |V  qd S rG   r8   ).0r6   r   r8   r9   	<genexpr>  s    z,SetMetric.serialize_value.<locals>.<genexpr>rb   rU   r8   r   r9   rZ     s   zSetMetric.serialize_valueNrh   r8   r8   r8   r9   rz      ri   rz   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   rZ   r3   _sanitize_tag_keyr:   getvalue)flushable_bucketsout_write	timestampbuckets
bucket_keymetricmetric_typemetric_namemetric_unitmetric_tagsserialized_valuerR   tag_key	tag_valuer8   r8   r9   _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   
setdefaultry   r   )	r   code_locationsr   keylocr   nameunitmrir8   r8   r9   _encode_locationsO  s   
r   )cgdsc                   C   
   t  d S )Ng     @@r   r8   r8   r8   r9   <lambda>i     
 r   c                   C   r   )Ng    .Ar   r8   r8   r8   r9   r   j  r   c                   C   r   )Ng      N@r
   r8   r8   r8   r9   r   l  r   c                   C   r   )N      @r   r8   r8   r8   r9   r   m  r   c                   C   s   t  d d S )Nr         8@r   r8   r8   r8   r9   r   n  s    c                   C   s   t  d d d S )Nr   r   g      @r   r8   r8   r8   r9   r   o  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 rG   r   rU   r8   r8   r9   rS   v  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@%srg   )r   rC   rm   rn   )rQ   tyr   r6   r   tags
export_keyr   oldv_minv_maxv_countv_sumr8   r8   r9   rY   |  s   	


zLocalAggregator.addc              	   C   sJ   i }| j  D ]\\}}\}}}}||g t|||||d q|S )N)r   rm   rn   rp   ro   )r   r   r   ry   _tags_to_dict)rQ   rvr   r   r   r   r   r   r8   r8   r9   to_json  s    	zLocalAggregator.to_jsonN)r[   r\   r]   r^   rS   rY   r   r8   r8   r8   r9   r   s  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)rQ   capture_funcenable_code_locationsr8   r8   r9   rS     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)rQ   pidr8   r8   r9   _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)rB   rD   r   r   r   waitFLUSHER_SLEEP_TIME_flushrU   r8   r8   r9   r     s   
zMetricsAggregator._flush_loopc                 C   s   |  |  |   d S rG   )_emit_flushable_buckets_flushable_locationsrU   r8   r8   r9   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 )Nr8   r   F)r   r   timer   r   r   r   r   ry   valuesrV   )rQ   force_flushcutoffr   weight_to_removebuckets_timestampr   r   r8   r8   r9   r     s6   



z$MetricsAggregator._flushable_bucketsc                 C   s8   | j  | j}i | _W d    |S 1 sw   Y  |S rG   )r   r   )rQ   	locationsr8   r8   r9   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   r   _serialize_tagsr   r   r   rC   rV   rY   METRIC_TYPESrecord_code_location_consider_force_flushrd   )rQ   r   r   r6   r   r   r   local_aggregatorr(   bucket_timestampserialized_tagsr   local_bucketsr   previous_weightaddedlocal_valuer8   r8   r9   rY     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   rY   rA   r   r   ry   )	rQ   r   r   r   r(   r   meta_keystart_of_dayr   r8   r8   r9   r   U  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   )rQ   r   r   r   r   r  r  r8   r8   r9   need_code_locationr  s   	

z$MetricsAggregator.need_code_locationc                 C   s(   | j d u rd S d| _| j  d | _ d S )NF)r   r   r   rD   rU   r8   r8   r9   kill  s
   


zMetricsAggregator.killc                 C   s   d| _ |   d S r   )r   r   rU   r8   r8   r9   flush  s   zMetricsAggregator.flushc                 C   s2   t | j| j }|| jkrd| _| j  d S d S r   )rw   r   r   
MAX_WEIGHTr   r   rD   )rQ   total_weightr8   r8   r9   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   )rQ   r   r   envelopeencoded_metricsr   r   encoded_locationsr8   r8   r9   r     s   

zMetricsAggregator._emit)F)NNr   rG   )r[   r\   r]   r   r  r   rS   r   r   r   r   r   rM   rY   r   r  r  r  r   r   r8   r8   r8   r9   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 )Nr8   )r   r|   listtuplery   r3   sorted)r   r   r   r6   inner_valuer8   r8   r9   r     s   r   c                 C   sT   i }| D ]#\}}| |}|d ur#t|tr|| q||g||< q|||< q|S rG   )rC   r|   r  ry   )r   r   tag_namer   	old_valuer8   r8   r9   r     s   


r   c                  C   s$   t  } |  r| jd ur| jS d S rG   )
sentry_sdk
get_client	is_activemetrics_aggregator)clientr8   r8   r9   _get_aggregator  s   
r'  c                 C   s  t  }| r|jd u rd d |fS t|pd}|d|jd  |d|jd  t  }d }|j	d}|t
v rO|j}	|	rE|d|	 |jd urO|j }|j	di }
|
	d}|d urt }|sx|| |||sxd d |fW  d    S W d    n1 sw   Y  |j||fS )Nr8   releaseenvironmentsourcetransaction_experimentsbefore_emit_metric)r"  r#  r$  r%  dictr   optionsget_current_scope_transaction_inforC   GOOD_TRANSACTION_SOURCES_transaction_span_get_local_aggregatorrF   )r   r6   r   r   r&  updated_tagsscoper  transaction_sourcetransaction_nameexperimentsbefore_emit_callbackr)   r8   r8   r9   _get_aggregator_and_update_tags  s4   



 r<        ?nonec              
   C   <   t | |||\}}}|dur|d| |||||| dS dS )zIncrements a counter.Nr   r<  rY   r   r6   r   r   r   r(   
aggregatorr  r8   r8   r9   	increment     

rC  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 rG   )r   r   r   r6   r   enteredr4  r(   )rQ   r   r   r   r6   r   r(   r8   r8   r9   rS     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)r6   	TypeError)rQ   contextr8   r8   r9   _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)opr   r2   r   )TIMING_FUNCTIONSr   rF  rI  r"  
start_spanr   r4  r   r   r|   r  r  joinr  mapr3   set_tag	__enter__r'  r   r(   )rQ   r   r6   rB  r8   r8   r9   rP  4  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   )r4  r<  r   r6   r   r   rK  rF  rY   r   __exit__)rQ   exc_type	exc_valuetbrB  r  r   elapsedr8   r8   r9   rQ  G  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 )Nrg   )r   r   r   r   r(   )timingr   r   r   r   r(   )rH   rI   frQ   r8   r9   
timed_funcd  s   $z$_Timing.__call__.<locals>.timed_func)rI  r   )rQ   rY  rZ  r8   rX  r9   __call__`  s   
z_Timing.__call__N)r[   r\   r]   rS   rI  rP  rQ  r[  r8   r8   r8   r9   rE    s    rE  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   )r<  rY   rE  rA  r8   r8   r9   rW  s  s   
rW  c              
   C   r?  )zEmits a distribution.Nr   r@  rA  r8   r8   r9   distribution  rD  r\  c              
   C   r?  )zEmits a set.Nr   r@  rA  r8   r8   r9   rD     rD  rD   c              
   C   r?  )zEmits a gauge.Nr   r@  rA  r8   r8   r9   gauge  rD  r]  )r=  r>  NNr   )Nr   NNr   )r>  NNr   )`r   r   r   rer=   r   r   warningsr}   abcr   r   
contextlibr   r   r   	functoolsr   r   r"  sentry_sdk.utilsr	   r
   r   r   r   r   sentry_sdk.enveloper   r   sentry_sdk.tracingr   typingr   r   r   r   r   r   r   r   r   r   r   sentry_sdk._typesr   r   r   r    r!   r"   r#   r$   r%   r&   warnDeprecationWarningrB   rD   r   	frozensetROUTEVIEW	COMPONENTTASKr2  compilesubr   r   r   r:   rA   rF   rM   rN   ra   rj   rs   rz   r   r   r   rK  r   r   r   r   r'  r<  rC  incrrE  rW  r\  r]  r8   r8   r8   r9   <module>   s     	
00	6  

$
\


