o
    Zhr                  	   @   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	 d dl
m
Z
 d dlmZmZ d dlZd dlmZmZm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e:d!j;d"Z<ee:d#ej=j;d$Z>e?Z@eAeee e!gZBd%d& ZCe	d'd( ZDd)d* ZEG d+d, d,eFZGG d-d. d.eGZHG d/d0 d0eGZIG d1d2 d2eGZJG d3d4 d4eGZKd5d6 ZLd7d8 ZMeHeIeJeKd9ZNed:d; d<d; ed=d; d>d; d?d; d@d; dAZOG dBdC dCeFZPG dDdE dEeFZQdFdG ZRdHdI ZSdJdK ZTdLdM ZU	N	O			 d]dPdQZVG dRdS dSeFZW		T			 d^dUdVZX	O			 d_dWdXZY	O			 d_dYdZZ?	O			 d_d[d\ZZdS )`    N)contextmanager)datetime)wrapspartial)	text_typeutc_from_timestamp	iteritems)
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[^\w\d\s_:/@\.{}\[\]$-]+ c                 C   s2   zt | }W n
 ty   Y d S w t|dddS )NFT)Zinclude_local_variablesZinclude_source_context)sys	_getframe	Exceptionr   )
stacklevelZfrm r2   I/var/www/html/lang_env/lib/python3.10/site-packages/sentry_sdk/metrics.pyget_code_locationG   s   r4   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)Zold_in_metricsr2   r2   r3   recursion_protectionS   s   
r8   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)r8   )argskwargsr*   funcr2   r3   new_funce   s   "zmetrics_noop.<locals>.new_func)r   )r=   r>   r2   r<   r3   metrics_noop_   s   r?   c                   @   s,   e Zd ZdZedd Zdd Zdd ZdS )	Metricr2   c                 C      t  r9   NotImplementedErrorselfr2   r2   r3   weightr   s   zMetric.weightc                 C   rA   r9   rB   rE   valuer2   r2   r3   addw   s   z
Metric.addc                 C   rA   r9   rB   rD   r2   r2   r3   serialize_value}      zMetric.serialize_valueN)__name__
__module____qualname__	__slots__propertyrF   rI   rJ   r2   r2   r2   r3   r@   o   s    
r@   c                   @   4   e Zd ZdZdd Zedd Zdd Zdd	 Zd
S )CounterMetricrH   c                 C   s   t || _d S r9   floatrH   rE   firstr2   r2   r3   __init__   s   zCounterMetric.__init__c                 C      dS N   r2   rD   r2   r2   r3   rF      s   zCounterMetric.weightc                 C   s   |  j t|7  _ d S r9   )rH   rU   rG   r2   r2   r3   rI      s   zCounterMetric.addc                 C   s   | j fS r9   rS   rD   r2   r2   r3   rJ      s   zCounterMetric.serialize_valueN	rL   rM   rN   rO   rX   rP   rF   rI   rJ   r2   r2   r2   r3   rR          
rR   c                   @   rQ   )GaugeMetriclastminmaxsumcountc                 C   s*   t |}|| _|| _|| _|| _d| _d S rZ   rU   r`   ra   rb   rc   rd   rV   r2   r2   r3   rX      s   
zGaugeMetric.__init__c                 C   rY   )N   r2   rD   r2   r2   r3   rF      s   zGaugeMetric.weightc                 C   sJ   t |}|| _t| j|| _t| j|| _|  j|7  _|  jd7  _d S rZ   re   rG   r2   r2   r3   rI      s   zGaugeMetric.addc                 C   s   | j | j| j| j| jfS r9   r_   rD   r2   r2   r3   rJ      s   zGaugeMetric.serialize_valueNr\   r2   r2   r2   r3   r^      s    
r^   c                   @   rQ   )DistributionMetricrS   c                 C   s   t |g| _d S r9   rT   rV   r2   r2   r3   rX         zDistributionMetric.__init__c                 C   
   t | jS r9   lenrH   rD   r2   r2   r3   rF         
zDistributionMetric.weightc                 C   s   | j t| d S r9   )rH   appendrU   rG   r2   r2   r3   rI      s   zDistributionMetric.addc                 C   s   | j S r9   rS   rD   r2   r2   r3   rJ      rK   z"DistributionMetric.serialize_valueNr\   r2   r2   r2   r3   rg      r]   rg   c                   @   rQ   )	SetMetricrS   c                 C   s   |h| _ d S r9   rS   rV   r2   r2   r3   rX      s   zSetMetric.__init__c                 C   ri   r9   rj   rD   r2   r2   r3   rF      rl   zSetMetric.weightc                 C   s   | j | d S r9   )rH   rI   rG   r2   r2   r3   rI      rh   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    )
isinstancestrzlibcrc32encodeint)xr2   r2   r3   _hash   s   
z(SetMetric.serialize_value.<locals>._hashc                 3   s    | ]} |V  qd S r9   r2   ).0rH   rw   r2   r3   	<genexpr>   s    z,SetMetric.serialize_value.<locals>.<genexpr>rS   rD   r2   ry   r3   rJ      s   zSetMetric.serialize_valueNr\   r2   r2   r2   r3   rn      r]   rn   c                 C   s4  t  }|j}| D ]\}}t|D ]\}}|\}}}	}
t|}||d |d ||	d | D ]}|d |t|d q5|d ||d |
r|d d}|
D ](\}}t|}|seqZ|rjd}n|d	 ||d |d |t|d qZ|d
 |t|d |d qq	|	 S )Nro      @   :   |asciis   |#TF   ,s   |T   
)
ioBytesIOwriter   _sanitize_keyrt   rJ   rq   _sanitize_valuegetvalue)flushable_bucketsout_write	timestampbuckets
bucket_keymetricmetric_typeZmetric_nameZmetric_unitZmetric_tagsZserialized_valuerW   Ztag_key	tag_valuer2   r2   r3   _encode_metrics  s@   
!r   c           	      C   sV   i }|D ]\}}|\}}}d |t||}d|d< ||g | qt| |dS )Nz{}:{}@{}locationtype)r   mapping)formatr   
setdefaultrm   r   )	r   code_locationsr   keylocr   nameunitZmrir2   r2   r3   _encode_locations2  s   
r   )cgdsc                   C   
   t  d S )Ng     @@r   r2   r2   r2   r3   <lambda>J     
 r   c                   C   r   )Ng    .Ar   r2   r2   r2   r3   r   K  r   c                   C   r   )Ng      N@r
   r2   r2   r2   r3   r   M  r   c                   C   r   )N      @r   r2   r2   r2   r3   r   N  r   c                   C   s   t  d d S )Nr         8@r   r2   r2   r2   r3   r   O  s    c                   C   s   t  d d d S )Nr   r   g      @r   r2   r2   r2   r3   r   P  s    )Z
nanosecondmicrosecondZ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 r9   r   rD   r2   r2   r3   rX   W  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@%sr[   )r   r6   ra   rb   )rE   tyr   rH   r   tags
export_keyr   oldv_minv_maxv_countv_sumr2   r2   r3   rI   ]  s   	


zLocalAggregator.addc              	   C   sJ   i }| j  D ]\\}}\}}}}||g t|||||d q|S )N)r   ra   rb   rd   rc   )r   itemsr   rm   _tags_to_dict)rE   rvr   r   r   r   r   r   r2   r2   r3   to_jsonu  s    	zLocalAggregator.to_jsonN)rL   rM   rN   rO   rX   rI   r   r2   r2   r2   r3   r   T  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)rE   Zcapture_funcZenable_code_locationsr2   r2   r3   rX     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)rE   pidr2   r2   r3   _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)r5   r7   r   r   r   waitFLUSHER_SLEEP_TIME_flushrD   r2   r2   r3   r     s   
zMetricsAggregator._flush_loopc                 C   s   |  |  |   d S r9   )_emit_flushable_buckets_flushable_locationsrD   r2   r2   r3   r     s   zMetricsAggregator._flushc           	      C   s   | j j | j}t | j | j }d}d}|r&| j }i | _d| _d| _n?g }t| jD ]\}}||kr<|	||f q-|D ]\}}t|D ]	\}}||j
7 }qG| j|= q?|  j|8  _W d    |S W d    |S 1 spw   Y  |S )Nr2   r   F)r   r   timer   r   r   r   r   r   rm   rF   )	rE   Zforce_flushcutoffr   Zweight_to_removeZbuckets_timestampr   r,   r   r2   r2   r3   r     s6   



z$MetricsAggregator._flushable_bucketsc                 C   s8   | j  | j}i | _W d    |S 1 sw   Y  |S r9   )r   r   )rE   	locationsr2   r2   r3   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   rp   r   r   ru   r   _serialize_tagsr   r   r   r6   rF   rI   METRIC_TYPESrecord_code_location_consider_force_flushrU   )rE   r   r   rH   r   r   r   local_aggregatorr1   Zbucket_timestampZserialized_tagsr   Zlocal_bucketsr   Zprevious_weightaddedZlocal_valuer2   r2   r3   rI     sB   



zMetricsAggregator.addc           	      C   s   | j sd S |d u rt }|||f}t|jddddd d}tt|}||f| jvrK| j||f t|d }|d urM| j	
|g ||f d S d S d S )Nr   r   r   r   r   tzinfo   )r   r   r   replaceru   r   r   rI   r4   r   r   rm   )	rE   r   r   r   r1   r   meta_keystart_of_dayr   r2   r2   r3   r   4  s$   	

z&MetricsAggregator.record_code_locationc                 C   sF   | j rdS |||f}t|jddddd d}tt|}||f| jvS )NFr   r   )r   r   r   ru   r   r   )rE   r   r   r   r   r   r   r2   r2   r3   need_code_loationQ  s   	

z#MetricsAggregator.need_code_loationc                 C   s(   | j d u rd S d| _| j  d | _ d S )NF)r   r   r   r7   rD   r2   r2   r3   killc  s
   


zMetricsAggregator.killc                 C   s   d| _ |   d S r   )r   r   rD   r2   r2   r3   flushl  s   zMetricsAggregator.flushc                 C   s2   t | j| j }|| jkrd| _| j  d S d S r   )rk   r   r   
MAX_WEIGHTr   r   r7   )rE   Ztotal_weightr2   r2   r3   r   r  s
   
z'MetricsAggregator._consider_force_flushc                 C   sj   t  }|rt|}|t|dd t|D ]\}}t||}|t|dd q|jr3| | |S d S )NZstatsd)payloadr   Zmetric_meta)r   r   Zadd_itemr   r   r   r   r   )rE   r   r   envelopeZencoded_metricsr   r   Zencoded_locationsr2   r2   r3   r   z  s   

zMetricsAggregator._emit)F)NNr   r9   )rL   rM   rN   r   r   r   rX   r   r   r   r   r   r?   rI   r   r   r   r   r   r   r2   r2   r2   r3   r     s2    
!;

	
r   c                 C   sx   | sdS g }t | D ]+\}}t|ttfr(|D ]}|d ur&||t|f qq
|d ur5||t|f q
tt|S )Nr2   )r   rp   listtuplerm   r   sorted)r   r   r   rH   Zinner_valuer2   r2   r3   r     s   r   c                 C   sT   i }| D ]#\}}| |}|d ur#t|tr|| q||g||< q|||< q|S r9   )r6   rp   r   rm   )r   r   Ztag_namer   	old_valuer2   r2   r3   r     s   


r   c                  C   s*   t jj} | j}|d ur|jd ur|jS d S r9   )
sentry_sdkHubcurrentclientmetrics_aggregator)hubr   r2   r2   r3   _get_aggregator  s   r   c                 C   sX  t jj}|j}|d u s|jd u rd d |fS |jdi }t|p d}|d|jd  |d|jd  |j	}d }|j
d}|tv rw|j}	|	rN|d|	 |jd urw|d}
|
d u r^d}
|d	}t |
k rw|d u sr|| |rw|j }|d
}|d urt }|s|| |sd d |fW  d    S W d    n1 sw   Y  |j||fS )NZ_experimentsr2   releaseenvironmentsourceZtransactionZmetrics_summary_sample_rate      ?Zshould_summarize_metricZbefore_emit_metric)r   r   r   r   r   optionsr6   dictr   scopeZ_transaction_infoGOOD_TRANSACTION_SOURCESZ_transaction_spanr   Z_get_local_aggregatorr8   )r   r   r   r   ZexperimentsZupdated_tagsr  r   Ztransaction_sourceZtransaction_nameZsample_rateZ should_summarize_metric_callbackZbefore_emit_callbackr*   r2   r2   r3   _get_aggregator_and_update_tags  sJ   





 r
  r  nonec              
   C   8   t | |\}}}|dur|d| |||||| dS dS )zIncrements a counter.Nr   r
  rI   r   rH   r   r   r   r1   
aggregatorr   r2   r2   r3   incr     
r  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 r9   )r   r   r   rH   r   enteredr	  r1   )rE   r   r   r   rH   r   r1   r2   r2   r3   rX     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)rH   	TypeError)rE   contextr2   r2   r3   _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description,r   )TIMING_FUNCTIONSr   r  r  r   Z
start_spanr   r	  r   r   rp   r   r   joinr   maprq   Zset_tag	__enter__r   r   r1   )rE   r   rH   r  r2   r2   r3   r    s   

z_Timing.__enter__c              
   C   st   | j sJ dt| j| j\}}}|d ur-t| j  | j }|d| j|| j|| j|d  | j 	||| d | _ d S )Nzdid not enterr   )
r	  r
  r   r   r  r   r  rI   r   __exit__)rE   exc_type	exc_valuetbr  r   r   elapsedr2   r2   r3   r  /  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 )Nr[   )r   r   r   r   r1   )timingr   r   r   r   r1   )r:   r;   frE   r2   r3   
timed_funcI  s   $z$_Timing.__call__.<locals>.timed_func)r  r   )rE   r&  r'  r2   r%  r3   __call__E  s   
z_Timing.__call__N)rL   rM   rN   rX   r  r  r  r(  r2   r2   r2   r3   r    s    r  r   c              
   C   sJ   |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
  rI   r  r  r2   r2   r3   r$  X  s   r$  c              
   C   r  )zEmits a distribution.Nr   r  r  r2   r2   r3   distributionr  r  r)  c              
   C   r  )zEmits a set.Nr   r  r  r2   r2   r3   r7     r  r7   c              
   C   r  )zEmits a gauge.Nr   r  r  r2   r2   r3   gauge  r  r*  )r  r  NNr   )Nr   NNr   )r  NNr   )[r   r   r   rer.   r   r   rr   
contextlibr   r   	functoolsr   r   r   Zsentry_sdk._compatr   r   r   Zsentry_sdk.utilsr	   r
   r   r   r   r   Zsentry_sdk.enveloper   r   Zsentry_sdk.tracingr   r   r   r   Zsentry_sdk._typesr   typingr   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r5   compilesubr   UNICODEr   r7   r   	frozensetr  r4   r8   r?   objectr@   rR   r^   rg   rn   r   r   r   r  r   r   r   r   r   r
  r  r  r$  r)  r*  r2   r2   r2   r3   <module>   s     

0/	6  2
Y


