
    ei                         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e      Z G d d	      Z G d
 d      Z G d d      Z ed      Zy)    N)Lock)DictIterableListOptionalProtocol   )Metricc                       e Zd Zdee   fdZy)	Collectorreturnc                      y)zCollect metrics.N selfs    \/var/www/html/glpi_dashboard/venv/lib/python3.12/site-packages/prometheus_client/registry.pycollectzCollector.collect	   s        N__name__
__module____qualname__r   r
   r   r   r   r   r   r      s    &) r   r   c                       e Zd Zdee   fdZy)_EmptyCollectorr   c                     g S Nr   r   s    r   r   z_EmptyCollector.collect   s    	r   Nr   r   r   r   r   r      s    &) r   r   c                       e Zd ZdZddedeeeef      fdZde	ddfdZ
de	ddfd	Zd
 Zdee   fdZdee   ddfdZdeeeef      ddfdZdeeeef      fdZd Zddedeeeef      dee   fdZy)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.
    Nauto_describetarget_infoc                 |    i | _         i | _        || _        t               | _        i | _        | j                  |       y r   )_collector_to_names_names_to_collectors_auto_describer   _lock_target_infoset_target_info)r   r   r    s      r   __init__zCollectorRegistry.__init__   s9    ?A :<!+V
68[)r   	collectorr   c                 2   | j                   5  | j                  |      }t        | j                        j	                  |      }|rt        dj                  |            |D ]  }|| j                  |<    || j                  |<   ddd       y# 1 sw Y   yxY w)z Add a collector to the registry.z.Duplicated timeseries in CollectorRegistry: {}N)r%   
_get_namessetr#   intersection
ValueErrorformatr"   )r   r)   names
duplicatesnames        r   registerzCollectorRegistry.register"   s    ZZ 		8OOI.ET667DDUKJ DKK"$% %  <2;))$/<27D$$Y/		8 		8 		8s   A7BBc                     | j                   5  | j                  |   D ]  }| j                  |=  | j                  |= ddd       y# 1 sw Y   yxY w)z%Remove a collector from the registry.N)r%   r"   r#   )r   r)   r2   s      r   
unregisterzCollectorRegistry.unregister/   sT    ZZ 	400; 4--d34((3	4 	4 	4s   /AAc                 p   d}	 |j                   }|s| j                  r|j                  }|sg S g }ddgg dg dg ddgd} |       D ]\  }|j	                  |j
                         |j                  |j                  g       D ]   }|j	                  |j
                  |z          " ^ |S # t        $ r Y w xY w)	z@Get names of timeseries the collector produces and clashes with.N_total_created)_sum_countr8   )_bucketr9   r:   r8   )r;   _gsum_gcount_info)countersummary	histogramgaugehistograminfo)describeAttributeErrorr$   r   appendr2   gettype)r   r)   	desc_funcresulttype_suffixesmetricsuffixs          r   r+   zCollectorRegistry._get_names6   s    		!**I T00!))II *-5B=I
  k 	4FMM&++&'++FKK< 4fkkF234	4 +  		s   B) )	B54B5c              #     K   d}d}| j                   5  t        j                  | j                        }| j                  r| j	                         }ddd       |r| |D ]  }|j                         E d{     y# 1 sw Y   /xY w7 w)z3Yields metrics from the collectors in the registry.N)r%   copyr"   r&   _target_info_metricr   )r   
collectorstir)   s       r   r   zCollectorRegistry.collectS   s     
ZZ 	04#;#;<J  --/	0 H# 	+I ((***	+	0 	0 +s(   B<A=&B5B	6B=BBr0   RestrictedRegistryc                 0    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,   rS   )r   r0   s     r   restricted_registryz%CollectorRegistry.restricted_registry`   s     E
!%..r   labelsc                 "   | j                   5  |r=| j                  sd| j                  v rt        d      t	               | j                  d<   n(| j                  r| j                  j                  dd        || _        d d d        y # 1 sw Y   y xY w)Nr    z7CollectorRegistry already contains a target_info metric)r%   r&   r#   r.   r   pop)r   rV   s     r   r'   z!CollectorRegistry.set_target_infom   s}    ZZ 	'((]d>W>W-W$%^__;J;L))-8""))--mTB &D	' 	' 	's   A/BBc                 ^    | j                   5  | j                  cd d d        S # 1 sw Y   y xY wr   )r%   r&   r   s    r   get_target_infoz!CollectorRegistry.get_target_infow   s'    ZZ 	%$$	% 	% 	%s   #,c                 Z    t        ddd      }|j                  d| j                  d       |S )NtargetzTarget metadatarC   r    r	   )r
   
add_sampler&   )r   ms     r   rP   z%CollectorRegistry._target_info_metric{   s,    8.7	]D$5$5q9r   r2   c                     |i }| j                         D ]B  }|j                  D ]1  }|j                  |k(  s|j                  |k(  s#|j                  c c S  D y)z~Returns the sample value, or None if not found.

        This is inefficient, and intended only for use in unittests.
        N)r   samplesr2   rV   value)r   r2   rV   rL   ss        r   get_sample_valuez"CollectorRegistry.get_sample_value   sZ    
 >Flln 	#F^^ #66T>ahh&&877N#	# r   )FNr   )r   r   r   __doc__boolr   r   strr(   r   r3   r5   r+   r   r
   r   rU   r'   rZ   rP   floatrc   r   r   r   r   r      s    *d *$sTWx.AY *8) 8 84I 4$ 4:+&) +/# /;O /'htCH~&> '4 '%$sCx.!9 %
S (4S>2J V^_dVe r   r   c                   4    e Zd Zdee   defdZdee   fdZy)rS   r0   registryc                 2    t        |      | _        || _        y r   )r,   	_name_set	_registry)r   r0   ri   s      r   r(   zRestrictedRegistry.__init__   s    U!r   r   c              #   0  K   t               }d }| j                  j                  5  d| j                  v r0| j                  j                  r| j                  j                         }| j                  D ]I  }|dk7  s	|| j                  j                  v s"|j                  | j                  j                  |          K 	 d d d        |r| |D ]9  }|j                         D ]$  }|j                  | j                        }|s!| & ; y # 1 sw Y   NxY ww)Nr    )
r,   rl   r%   rk   r&   rP   r#   addr   _restricted_metric)r   rQ   target_info_metricr2   r)   rL   r^   s          r   r   zRestrictedRegistry.collect   s     U
!^^!! 	N.4>>3N3N%)^^%G%G%I" N=(TT^^5X5X-XNN4>>#F#Ft#LMN	N $$# 	I#++- --dnn=G		N 	Ns0   #DAD
9D
*D
=AD	D
DDN)	r   r   r   r   rf   r   r(   r
   r   r   r   r   rS   rS      s+    "hsm "7H "&) r   rS   T)r   )rO   	threadingr   typingr   r   r   r   r   metrics_corer
   r   r   r   rS   REGISTRYr   r   r   <module>ru      sM      ; ;   
 
y yx . 40r   