U
    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   >/tmp/pip-unpacked-wheel-2bcd7zt2/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 )_EmptyCollectorr   c                 C   s   g S r   r   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 r   )_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   s`   | j P | |}t| j|}|r4td||D ]}|| j|< q8|| j|< W 5 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   s6   | j & | j| D ]}| j|= q| j|= W 5 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}z
|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
}| D ]4}||j ||jg D ]}||j|  qqp|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_namesr   c              	   c   sZ   d}d}| j   t| j}| jr*|  }W 5 Q R X |r>|V  |D ]}| E dH  qBdS )z3Yields metrics from the collectors in the registry.N)r   copyr   r   _target_info_metricr   )r   
collectorsZ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 5 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W  5 Q R  S Q R X d S r   )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 metadatar1   r   r	   )r
   Z
add_sampler   )r   mr   r   r   r:   ~   s    z%CollectorRegistry._target_info_metric)r*   r>   r   c                 C   sL   |dkri }|   D ]2}|jD ]&}|j|kr|j|kr|j    S qq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>   r7   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@   r:   floatrE   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 r   )r$   	_name_set	_registry)r   r(   rJ   r   r   r   r!      s    
zRestrictedRegistry.__init__r   c              	   c   s   t  }d }| jjT d| jkr0| jjr0| j }| jD ]*}|dkr6|| jjkr6|| jj|  q6W 5 Q R X |rv|V  |D ](}| D ]}|	| j}|r|V  qqzd S )Nr   )
r$   rL   r   rK   r   r:   r   addr   Z_restricted_metric)r   r;   Ztarget_info_metricr*   r"   r7   rB   r   r   r   r      s    


zRestrictedRegistry.collectN)	r   r   r   r   rH   r   r!   r
   r   r   r   r   r   r<      s   r<   T)r   )abcr   r   r9   	threadingr   typingr   r   r   r   Zmetrics_corer
   r   r   r   r<   ZREGISTRYr   r   r   r   <module>   s   |