o
    T۷i                     @   s   d dl mZ d dlZd dlZd dlZd dlZddlmZ ddlm	Z	 ddl
mZ ddlmZ ddlmZ ze W n eyC   eZY nw G d	d
 d
Zdd ejD ZdddZdS )    )defaultdictN   )Gauge)Metric)
MmapedDict)Sample)floatToGoStringc                   @   sH   e Zd ZdZdddZedddZedd	 Zed
d Zdd Z	dS )MultiProcessCollectorz+Collector for files for multi-process mode.Nc                 C   sx   |d u r"dt jv rdt jvrt jd t jd< tdt t jd}|r*t j|s.td|| _	|r:|
|  d S d S )Nprometheus_multiproc_dirPROMETHEUS_MULTIPROC_DIRzpprometheus_multiproc_dir variable has been deprecated in favor of the upper case naming PROMETHEUS_MULTIPROC_DIRz:env PROMETHEUS_MULTIPROC_DIR is not set or not a directory)osenvironwarningswarnDeprecationWarninggetpathisdir
ValueError_pathregister)selfregistryr    r   T/home/ubuntu/vllm_env/lib/python3.10/site-packages/prometheus_client/multiprocess.py__init__   s   zMultiProcessCollector.__init__Tc                 C   s   t | }t ||S )zMerge metrics from given mmap files.

        By default, histograms are accumulated, as per prometheus wire format.
        But if writing the merged data back to mmap files, use
        accumulate=False to avoid compound accumulation.
        )r	   _read_metrics_accumulate_metrics)files
accumulatemetricsr   r   r   merge#   s   
zMultiProcessCollector.mergec              	      s  i }i   fdd}| D ]w}t j|d}|d }zt|}W n ty7   |dkr6|d dr6Y q w |D ]H\}}}	}
||\}}}}}||}|d u r\t	|||}|||< |dkr{|d d d	 }|d |_
|||d
|ff ||	 q:|||| q:q|S )Nc                    sJ     | }|s#t| \}}}}tt| }|||||f } | < |S N)r   jsonloadstuplesorteditems)keyvalmetric_namenamelabels	help_text
labels_key	key_cacher   r   
_parse_key3   s   
z7MultiProcessCollector._read_metrics.<locals>._parse_key_r   gauger   live   pid)r   r   basenamesplitr   read_all_values_from_fileFileNotFoundError
startswithr   r   _multiprocess_mode
add_sample)r   r    r1   fpartstypfile_valuesr(   value	timestampr2   r*   r+   r,   r.   r-   metricr7   r   r/   r   r   .   s4   

z#MultiProcessCollector._read_metricsc              	   C   s  |   D ]i}tdd }tdd }tdd }|jD ]}|\}}}	}
}}|jdkr9|jdv r9tdd |D }|jdkr|jd	v rZ|| ||f|	}|	|k rY|	|| ||f< q|jd
v rv|| ||f|	}|	|kru|	|| ||f< q|jdv r|| ||f  |	7  < q|jdv r|| | }t|
pd}
||
k r|	|| ||f< |
|| |< q|	|| ||f< q|jdkr|D ]#}|d dkrt|d }tdd |D }|| |  |	7  <  nq|| ||f  |	7  < q|| ||f  |	7  < q|jdkrI| D ]D\}}d}t	| D ](\}}	|j
d |dt|ff f}|r1||	7 }||| |< q|	|| |< q|rG||| |j
d |f< qg |_| D ]\}}| D ]\\}}}	|jt|t||	 qXqPq|   S )Nc                   S      t tS r"   r   floatr   r   r   r   <lambda>[       z;MultiProcessCollector._accumulate_metrics.<locals>.<lambda>c                   S   rF   r"   rG   r   r   r   r   rI   \   rJ   c                   S   rF   r"   rG   r   r   r   r   rI   ]   rJ   r3   )minliveminmaxlivemaxsumlivesum
mostrecentlivemostrecentc                 s        | ]}|d  dkr|V  qdS )r   r7   Nr   .0lr   r   r   	<genexpr>j       z<MultiProcessCollector._accumulate_metrics.<locals>.<genexpr>)rK   rL   )rM   rN   )rO   rP   )rQ   rR   r   	histogramler   c                 s   rS   )r   rZ   Nr   rT   r   r   r   rW      rX   g        _bucket_count)valuesr   samplestyper=   r%   
setdefaultrH   r'   r&   r+   r   appendr   dict)r    r   rE   r^   sample_timestampsbucketssr+   r,   rC   rD   exemplarnative_histogram_valuecurrentcurrent_timestamprV   bucket_value
without_ler]   accbucket
sample_keyr2   samples_by_labelsname_r   r   r   r   X   s|   








z)MultiProcessCollector._accumulate_metricsc                 C   s$   t  tj| jd}| j|ddS )Nz*.dbT)r   )globr   r   joinr   r!   )r   r   r   r   r   collect   s   zMultiProcessCollector.collectr"   )T)
__name__
__module____qualname____doc__r   staticmethodr!   r   r   rs   r   r   r   r   r	      s    


)
Pr	   c                 C   s   h | ]	}| d r|qS )r4   )r<   )rU   mr   r   r   	<setcomp>   s    rz   c                 C   s^   |du rt jdt jd}tD ]}tt j|d| d|  dD ]}t | q$qdS )zBDo bookkeeping for when one process dies in a multi-process setup.Nr   r
   gauge_r2   z.db)r   r   r   _LIVE_GAUGE_MULTIPROCESS_MODESrq   r   rr   remove)r7   r   moder?   r   r   r   mark_process_dead   s   &r   r"   )collectionsr   rq   r#   r   r   r    r   metrics_corer   	mmap_dictr   r^   r   utilsr   r;   	NameErrorIOErrorr	   _MULTIPROC_MODESr|   r   r   r   r   r   <module>   s&     