o
    pfs                     @   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   W/home/ertert/spirit/venv/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 ]}tt}tt}tdd }|j}|jD ]}|\}}	}
}}|jdkr|tdd |	D f}|jdv rG|||
}|
|k rF|
||< q|jdv rZ|||
}|
|krY|
||< q|jdv rh||  |
7  < q|jd	v r|| }t|pud
}||k r|
||< |||< 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r| D ]:\}	}d}t	| D ]!\}}
|j
d |	dt|ff f}|r||
7 }|||< q|
||< q|r|||j
d |	f< qdd | D |_q|   S )Nc                   S   s   t tS r"   )r   floatr   r   r   r   <lambda>]   s    z;MultiProcessCollector._accumulate_metrics.<locals>.<lambda>r3   c                 s        | ]}|d  dkr|V  qdS )r   r7   Nr   .0lr   r   r   	<genexpr>b       z<MultiProcessCollector._accumulate_metrics.<locals>.<genexpr>)minlivemin)maxlivemax)sumlivesum)
mostrecentlivemostrecentr   	histogramler   c                 s   rH   )r   rW   Nr   rI   r   r   r   rL   }   rM   g        _bucket_countc                 S   s$   g | ]\\}}}t |t||qS r   )r   dict)rJ   name_r,   rC   r   r   r   
<listcomp>   s   $ z=MultiProcessCollector._accumulate_metrics.<locals>.<listcomp>)valuesr   rF   
setdefaultsamplestyper%   r=   r'   r&   r+   r   )r    r   rE   r_   sample_timestampsbucketssamples_setdefaultsr+   r,   rC   rD   exemplarwithout_pid_keycurrentcurrent_timestamprK   bucket_value
without_ler]   accbucket
sample_keyr   r   r   r   X   sp   










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   rp   r   r   r   r   r	      s    


)
Cr	   c                 C   s   h | ]	}| d r|qS )r4   )r<   )rJ   mr   r   r   	<setcomp>   s    rw   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_MODESrn   r   ro   remove)r7   r   moder?   r   r   r   mark_process_dead   s   &r|   r"   )collectionsr   rn   r#   r   r   r    r   metrics_corer   	mmap_dictr   r_   r   utilsr   r;   	NameErrorIOErrorr	   _MULTIPROC_MODESry   r|   r   r   r   r   <module>   s&     