o
    ib                     @   s   d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 G dd de
ZG dd	 d	eZG d
d deZG dd deZG dd deZG dd deZG dd deZG dd de
ZdS )z
Metric roll-up classes.
    )defaultdictN)iternext)
MetricTypec                   @   s    e Zd ZdZdd Zdd ZdS )Metricz
    A base metric class that accepts points, slices them into time intervals
    and performs roll-ups within those intervals.
    c                 C      t  )z" Add a point to the given metric. NotImplementedErrorselfvalue r   O/home/ubuntu/.local/lib/python3.10/site-packages/datadog/threadstats/metrics.py	add_point      zMetric.add_pointc                 C   r   ). Flush all metrics up to the given timestamp. r   r
   	timestampintervalr   r   r   flush   r   zMetric.flushN)__name__
__module____qualname____doc__r   r   r   r   r   r   r      s    r   c                   @   ,   e Zd ZdZdZdd Zdd Zdd Zd	S )
Setz A set metric. gc                 C   s   || _ || _|| _t | _d S N)nametagshostsetr
   r   r   r   r   r   r   __init__$   s   zSet.__init__c                 C      | j | d S r   )r    addr	   r   r   r   r   *      zSet.add_pointc                 C   s"   |t | j| j| j| jtj|fgS r   )lenr    r   r   r   r   Gauger   r   r   r   r   -   s   "z	Set.flushNr   r   r   r   	stats_tagr"   r   r   r   r   r   r   r          r   c                   @   r   )
r'   z A gauge metric. r   c                 C   s   || _ || _|| _d | _d S r   r   r   r   r   r!   r   r   r   r"   6      
zGauge.__init__c                 C   s
   || _ d S r   )r   r	   r   r   r   r   <   s   
zGauge.add_pointc                 C      || j | j| j| jtj|fgS r   )r   r   r   r   r   r'   r   r   r   r   r   ?      zGauge.flushNr(   r   r   r   r   r'   1   r*   r'   c                   @   r   )
Counterz' A metric that tracks a counter value. cc                 C      || _ || _|| _g | _d S r   )r   r   r   countr!   r   r   r   r"   H   r,   zCounter.__init__c                 C   r#   r   )r2   appendr	   r   r   r   r   N   r%   zCounter.add_pointc                 C   s0   t | jd}||t| | j| j| jtj|fgS Nr   )sumr2   floatr   r   r   r   Rate)r
   r   r   r2   r   r   r   r   Q   s   $zCounter.flushNr(   r   r   r   r   r/   C   r*   r/   c                   @   r   )
Distributionz A distribution metric. dc                 C   r1   r   r+   r!   r   r   r   r"   [   r,   zDistribution.__init__c                 C   r#   r   )r   r3   r	   r   r   r   r   a   r%   zDistribution.add_pointc                 C   r-   r   )r   r   r   r   r   r8   r   r   r   r   r   d   r.   zDistribution.flushNr(   r   r   r   r   r8   V   r*   r8   c                   @   s4   e Zd ZdZdZdd Zdd Zdd Zd	d
 ZdS )	Histogramz A histogram metric. hc                 C   s\   || _ || _|| _td| _td| _g | _t | _	t
| j	| _d| _g | _g d| _d S )Nz-infinfi  )g      ?g333333?gffffff?gGz?)r   r   r   r6   maxminr5   	itertoolsr2   iter_counterr   sample_sizesamplespercentilesr!   r   r   r   r"   m   s   


zHistogram.__init__c                 C   sv   | j |kr| j n|| _ | j|k r| jn|| _| j| | j| jk r)| j| n
|| jtd| j< t	| j
| _d S r4   )r=   r>   r5   r3   r2   rA   rB   random	randranger   r@   r	   r   r   r   r   z   s   zHistogram.add_pointc              
   C   s  | j sg S || jd| j | j| jtj|f|| jd| j | j| jtj|f|| j t| d| j | j| jtj	|f|| 
 d| j | j| jtj|fg}t| j}| j  | jD ])}| jtt|| d  }d| jt|d f }||||| j| jtj|f qU|S )Nz%s.minz%s.maxz%s.countz%s.avg   z%s.%spercentiled   )r2   r>   r   r   r   r   r'   r=   r6   r7   averager&   rB   sortrC   introundr3   )r
   r   r   metricslengthpvalr   r   r   r   r      s*    	


 zHistogram.flushc                 C   s   t | j d}t|| j S r4   )r5   r6   r2   )r
   sum_metricsr   r   r   rH      s   zHistogram.averageN)	r   r   r   r   r)   r"   r   r   rH   r   r   r   r   r:   h   s    
r:   c                   @   s   e Zd ZdZdZdS )Timingz^
    A timing metric.
    Inherit from Histogram to workaround and support it in API mode
    msN)r   r   r   r   r)   r   r   r   r   rQ      s    rQ   c                   @   s,   e Zd ZdZdddZdddZd	d
 ZdS )MetricsAggregatorzK
    A small class to handle the roll-ups of multiple metrics at once.
    
   c                 C   s"   t  | _tdd | _|| _d S )Nc                   S   s   i S r   r   r   r   r   r   <lambda>   s    z,MetricsAggregator.__init__.<locals>.<lambda>)	threadingRLock_lockr   _metrics_roll_up_interval)r
   roll_up_intervalr   r   r   r"      s   

zMetricsAggregator.__init__rF   Nc           
      C   s   ||| j   }|||rtt|nd f}	| j% |	| j| vr*||||| j| |	< | j| |	 | W d    d S 1 s?w   Y  d S r   )rZ   tuplesortedrX   rY   r   )
r
   metricr   r   r   metric_classsample_rater   r   keyr   r   r   r      s   "zMetricsAggregator.add_pointc                    s   |t dkrt d n||| j   | j2  fdd| j D }g }|D ]}t| j| D ]}|||| j7 }q2q&W d   |S 1 sJw   Y  |S )r   r<   c                    s   g | ]}| k r|qS r   r   ).0ir   r   r   
<listcomp>   s    z+MetricsAggregator.flush.<locals>.<listcomp>N)	r6   rZ   rX   rY   keyslistpopvaluesr   )r
   r   past_intervalsrL   rc   mr   rd   r   r      s   

zMetricsAggregator.flush)rT   )rF   N)r   r   r   r   r"   r   r   r   r   r   r   rS      s
    

	rS   )r   collectionsr   rD   r?   rV   datadog.util.compatr   datadog.threadstats.constantsr   objectr   r   r'   r/   r8   r:   rQ   rS   r   r   r   r   <module>   s   :	