a
    ܌xd4                     @   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   R/var/www/html/Ranjet/env/lib/python3.9/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 )_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   st   | j Z | |}t| j|}|r4td||D ]}|| j|< q8|| j|< W d   n1 sf0    Y  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   sJ   | j 0 | j| D ]}| j|= q| j|= W d   n1 s<0    Y  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y    Y n0 |s2| jr2|j}|s:g S g }ddgg dg dg ddgd}| D ]4}||j ||jg D ]}||j|  qqf|S )	z@Get names of timeseries the collector produces and clashes with.NZ_total_created)_sum_countr-   )_bucketr.   r/   r-   )r0   Z_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   sn   d}d}| j * t| j}| jr*|  }W d   n1 s>0    Y  |rR|V  |D ]}| E dH  qVd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   sn   | j T |r2| js$d| jv r$tdt | jd< n| jrF| jdd  || _W d    n1 s`0    Y  d S )Nr   z7CollectorRegistry already contains a target_info metric)r   r   r   r&   r   pop)r   rB   r   r   r   r    p   s    z!CollectorRegistry.set_target_infoc                 C   s0   | j  | jW  d    S 1 s"0    Y  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 metadatar4   r   r	   )r
   Z
add_sampler   )r   mr   r   r   r=   ~   s    z%CollectorRegistry._target_info_metric)r*   rB   r   c                 C   sL   |du 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*   rB   value)r   r*   rB   r:   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   rA   r    rD   r=   floatrI   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(   rN   r   r   r   r!      s    
zRestrictedRegistry.__init__r   c                 c   s   t  }d }| jj^ d| jv r0| jjr0| j }| jD ]*}|dkr6|| jjv r6|| jj|  q6W d    n1 sv0    Y  |r|V  |D ](}| D ]}|	| j}|r|V  qqd S )Nr   )
r$   rP   r   rO   r   r=   r   addr   Z_restricted_metric)r   r>   Ztarget_info_metricr*   r"   r:   rF   r   r   r   r      s    


2zRestrictedRegistry.collectN)	r   r   r   r   rL   r   r!   r
   r   r   r   r   r   r@      s   r@   T)r   )abcr   r   r<   	threadingr   typingr   r   r   r   Zmetrics_corer
   r   r   r   r@   ZREGISTRYr   r   r   r   <module>   s   |