B
    +d4                 @   s   d dl mZmZ d dlZd dlmZ d dlmZmZm	Z	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ZeddZdS )    )ABCabstractmethodN)Lock)DictIterableListOptional   )Metricc               @   s"   e Zd Zeee dddZdS )	Collector)returnc             C   s   d S )N )selfr   r   g/work/yifan.wang/ringdown/master-ringdown-env/lib/python3.7/site-packages/prometheus_client/registry.pycollect   s    zCollector.collectN)__name__
__module____qualname__r   r   r
   r   r   r   r   r   r   
   s   r   c               @   s   e Zd Zee dddZdS )_EmptyCollector)r   c             C   s   g S )Nr   )r   r   r   r   r      s    z_EmptyCollector.collectN)r   r   r   r   r
   r   r   r   r   r   r      s   r   c               @   s   e Zd ZdZdeeeeef  dddZe	dddd	Z
e	ddd
dZdd Zee dddZee ddddZeeeef  ddddZeeeef  dddZdd Zd eeeeef  ee dddZdS )!CollectorRegistryzMetric collector registry.

    Collectors must have a no-argument method 'collect' that returns a list of
    Metric objects. The returned metrics should be consistent with the Prometheus
    exposition formats.
    FN)auto_describetarget_infoc             C   s.   i | _ i | _|| _t | _i | _| | d S )N)_collector_to_names_names_to_collectors_auto_describer   _lock_target_infoset_target_info)r   r   r   r   r   r   __init__   s    zCollectorRegistry.__init__)	collectorr   c          	   C   sd   | j T | |}t| j|}|r4td|x|D ]}|| j|< q:W || j|< W dQ R X dS )z Add a collector to the registry.z.Duplicated timeseries in CollectorRegistry: {}N)r   
_get_namessetr   intersection
ValueErrorformatr   )r   r   names
duplicatesnamer   r   r   register%   s    

zCollectorRegistry.registerc          	   C   s:   | j * x| j| D ]}| j|= qW | j|= W dQ R X dS )z%Remove a collector from the registry.N)r   r   r   )r   r   r'   r   r   r   
unregister2   s    zCollectorRegistry.unregisterc             C   s   d}y
|j }W n tk
r"   Y nX |s4| jr4|j}|s<g S g }ddgdddgddddgdddgd	gd
}xB| D ]8}||j x&||jg D ]}||j|  qW qrW |S )z@Get names of timeseries the collector produces and clashes with.NZ_totalZ_createdZ_sum_countZ_bucketZ_gsumZ_gcount_info)countersummaryZ	histogramZgaugehistograminfo)ZdescribeAttributeErrorr   r   appendr'   gettype)r   r   Z	desc_funcresultZtype_suffixesmetricsuffixr   r   r   r    9   s(    



zCollectorRegistry._get_names)r   c          	   c   s^   d}d}| j   t| j}| jr*|  }W dQ R X |r>|V  x|D ]}| E dH  qDW dS )z3Yields metrics from the collectors in the registry.N)r   copyr   r   _target_info_metricr   )r   
collectorstir   r   r   r   r   V   s    
zCollectorRegistry.collectRestrictedRegistry)r%   r   c             C   s   t |}t|| S )a  Returns object that only collects some metrics.

        Returns an object which upon collect() will return
        only samples with the given names.

        Intended usage is:
            generate_latest(REGISTRY.restricted_registry(['a_timeseries']))

        Experimental.)r!   r:   )r   r%   r   r   r   restricted_registryc   s    
z%CollectorRegistry.restricted_registry)labelsr   c          	   C   sZ   | j J |r2| js$d| jkr$tdt | jd< n| jrF| jdd  || _W d Q R X d S )Nr   z7CollectorRegistry already contains a target_info metric)r   r   r   r#   r   pop)r   r<   r   r   r   r   p   s    z!CollectorRegistry.set_target_infoc          	   C   s   | j  | jS Q R X d S )N)r   r   )r   r   r   r   get_target_infoz   s    z!CollectorRegistry.get_target_infoc             C   s    t ddd}|d| jd |S )NtargetzTarget metadatar.   r   r	   )r
   Z
add_sampler   )r   mr   r   r   r7   ~   s    z%CollectorRegistry._target_info_metric)r'   r<   r   c             C   sL   |dkri }x:|   D ].}x(|jD ]}|j|kr"|j|kr"|jS q"W qW dS )z~Returns the sample value, or None if not found.

        This is inefficient, and intended only for use in unittests.
        N)r   Zsamplesr'   r<   value)r   r'   r<   r4   sr   r   r   get_sample_value   s    z"CollectorRegistry.get_sample_value)FN)N)r   r   r   __doc__boolr   r   strr   r   r(   r)   r    r   r
   r   r;   r   r>   r7   floatrC   r   r   r   r   r      s   
r   c               @   s2   e Zd Zee edddZee dddZdS )r:   )r%   registryc             C   s   t || _|| _d S )N)r!   	_name_set	_registry)r   r%   rH   r   r   r   r      s    
zRestrictedRegistry.__init__)r   c          	   c   s   t  }d }| jjX d| jkr0| jjr0| j }x4| jD ]*}|dkr8|| jjkr8|| jj|  q8W W d Q R X |rz|V  x4|D ],}x&| D ]}|	| j}|r|V  qW qW d S )Nr   )
r!   rJ   r   rI   r   r7   r   addr   Z_restricted_metric)r   r8   Ztarget_info_metricr'   r   r4   r@   r   r   r   r      s    

 
zRestrictedRegistry.collectN)	r   r   r   r   rF   r   r   r
   r   r   r   r   r   r:      s   r:   T)r   )abcr   r   r6   	threadingr   typingr   r   r   r   Zmetrics_corer
   r   r   r   r:   ZREGISTRYr   r   r   r   <module>   s   |