o
    װi                     @   s   d dl Z d dlmZ d dlmZmZmZmZmZ ddl	m
Z
 G dd deZG dd	 d	ZG d
d dZG dd dZeddZdS )    N)Lock)DictIterableListOptionalProtocol   )Metricc                   @      e Zd Zdee fddZdS )	Collectorreturnc                 C   s   dS )zCollect metrics.N selfr   r   N/home/ubuntu/.local/lib/python3.10/site-packages/prometheus_client/registry.pycollect	   s    zCollector.collectN__name__
__module____qualname__r   r	   r   r   r   r   r   r          r   c                   @   r
   )_EmptyCollectorr   c                 C   s   g S Nr   r   r   r   r   r      s   z_EmptyCollector.collectNr   r   r   r   r   r      r   r   c                   @   s   e Zd ZdZd dedeeeef  fddZde	d	dfd
dZ
de	d	dfddZdd Zd	ee fddZdee d	dfddZdeeeef  d	dfddZd	eeeef  fddZdd Zd!dedeeeef  d	ee f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   sv   | j . | |}t| j|}|rtd||D ]}|| j|< q|| j|< W d   dS 1 s4w   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   sL   | j  | j| D ]}| j|= q	| j|= W d   dS 1 sw   Y  dS )z%Remove a collector from the registry.N)r   r   r   )r   r#   r+   r   r   r   
unregister/   s
   

"zCollectorRegistry.unregisterc                 C   s   d}z|j }W n	 ty   Y nw |s| jr|j}|sg S g }ddgg dg dg ddgd}| D ]}||j ||jg D ]
}||j|  qBq3|S )	z@Get names of timeseries the collector produces and clashes with.N_total_created)_sum_countr/   )_bucketr0   r1   r/   )r2   _gsum_gcount_info)countersummary	histogramgaugehistograminfo)describeAttributeErrorr   r   appendr+   gettype)r   r#   	desc_funcresulttype_suffixesmetricsuffixr   r   r   r$   6   s.   


zCollectorRegistry._get_namesc                 c   sp    d}d}| j  t| j}| jr|  }W d   n1 s w   Y  |r*|V  |D ]	}| E dH  q,dS )z3Yields metrics from the collectors in the registry.N)r   copyr   r    _target_info_metricr   )r   
collectorstir#   r   r   r   r   S   s   zCollectorRegistry.collectr)   RestrictedRegistryc                 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']), escaping)

        Experimental.)r%   rI   )r   r)   r   r   r   restricted_registry`   s   

z%CollectorRegistry.restricted_registrylabelsc                 C   sp   | j + |r| jsd| jv rtdt | jd< n
| jr#| jdd  || _W d    d S 1 s1w   Y  d S )Nr   z7CollectorRegistry already contains a target_info metric)r   r    r   r'   r   pop)r   rK   r   r   r   r!   m   s   "z!CollectorRegistry.set_target_infoc                 C   s0   | j  | jW  d    S 1 sw   Y  d S r   )r   r    r   r   r   r   get_target_infow   s   $z!CollectorRegistry.get_target_infoc                 C   s    t ddd}|d| jd |S )NtargetzTarget metadatar:   r   r   )r	   
add_sampler    )r   mr   r   r   rF   {   s   z%CollectorRegistry._target_info_metricr+   c                 C   sL   |du ri }|   D ]}|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   samplesr+   rK   value)r   r+   rK   rC   sr   r   r   get_sample_value   s   
z"CollectorRegistry.get_sample_value)FNr   )r   r   r   __doc__boolr   r   strr"   r   r,   r-   r$   r   r	   r   rJ   r!   rM   rF   floatrT   r   r   r   r   r      s     
,r   c                   @   s4   e Zd Zdee defddZdee fddZdS )	rI   r)   registryc                 C   s   t || _|| _d S r   )r%   	_name_set	_registry)r   r)   rY   r   r   r   r"      s   

zRestrictedRegistry.__init__r   c                 c   s    t  }d }| jj/ d| jv r| jjr| j }| jD ]}|dkr1|| jjv r1|| jj|  qW d    n1 s<w   Y  |rF|V  |D ]}| D ]}|	| j}|r[|V  qNqHd S )Nr   )
r%   r[   r   rZ   r    rF   r   addr   _restricted_metric)r   rG   target_info_metricr+   r#   rC   rP   r   r   r   r      s,   


zRestrictedRegistry.collectN)	r   r   r   r   rW   r   r"   r	   r   r   r   r   r   rI      s    rI   T)r   )rE   	threadingr   typingr   r   r   r   r   metrics_corer	   r   r   r   rI   REGISTRYr   r   r   r   <module>   s    |