U
    d                     @   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k
r   eZY nX 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   st   |d krDdt jkr8dt jkr8t jd t jd< tdt t jd}|rTt j|s\td|| _	|rp|
|  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   B/tmp/pip-unpacked-wheel-2bcd7zt2/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 ]}t j|d}|d }zt|}W n0 tk
rt   |dkrn|d drnY q Y nX |D ]\}}}	||\}
}}}}||
}|d krt	|
||}|||
< |dkr|d d d	 }|d |_
|||d
|ff | qz|||| qzq|S )Nc                    sJ     | }|sFt| \}}}}tt| }|||||f } | < |S N)r   jsonloadstuplesorteditems)keyvalmetric_namenamelabels	help_text
labels_keyZ	key_cacher   r   
_parse_key3   s    
z7MultiProcessCollector._read_metrics.<locals>._parse_key_r   gauger   live   pid)r   r   basenamesplitr   Zread_all_values_from_fileFileNotFoundError
startswithr   r   _multiprocess_modeZ
add_sample)r   r    r0   fpartstypZfile_valuesr(   valuer1   r*   r+   r,   r.   r-   metricr6   r   r/   r   r   .   s0    

z#MultiProcessCollector._read_metricsc                 C   s  |   D ]}tt}tdd }|j}|jD ],}|\}}}	}
}|jdkr|tdd |D f}|jdkr|||	}|	|k r|	||< nN|jdkr|||	}|	|kr|	||< n(|jdkr||  |	7  < n|	|||f< q.|jd	krH|D ]H}|d
 dkrt|d }tdd |D }|| |  |	7  <  q\q|||f  |	7  < q.|||f  |	7  < q.|jd	kr| D ]z\}}d}t	| D ]F\}}	|j
d |dt|ff f}|r||	7 }|||< n|	||< q|rr|||j
d |f< qrdd | D |_q|   S )Nc                   S   s   t tS r"   )r   floatr   r   r   r   <lambda>\       z;MultiProcessCollector._accumulate_metrics.<locals>.<lambda>r2   c                 s   s   | ]}|d  dkr|V  qdS )r   r6   Nr   .0lr   r   r   	<genexpr>a   s      z<MultiProcessCollector._accumulate_metrics.<locals>.<genexpr>)minZlivemin)maxZlivemax)sumZlivesumZ	histogramr   ler   c                 s   s   | ]}|d  dkr|V  qdS )r   rK   Nr   rD   r   r   r   rG   v   s      g        Z_bucket_countc                 S   s$   g | ]\\}}}t |t||qS r   )r   dict)rE   Zname_r,   r?   r   r   r   
<listcomp>   s    
 z=MultiProcessCollector._accumulate_metrics.<locals>.<listcomp>)valuesr   rA   
setdefaultsamplestyper%   r;   r'   r&   r+   r   )r    r   r@   rQ   ZbucketsZsamples_setdefaultsr+   r,   r?   	timestampZexemplarZwithout_pid_keycurrentrF   Zbucket_valueZ
without_lerO   accZbucketZ
sample_keyr   r   r   r   X   sV    








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.collect)N)T)
__name__
__module____qualname____doc__r   staticmethodr!   r   r   rY   r   r   r   r   r	      s   


)
<r	   c                 C   s   h | ]}| d r|qS )r3   )r:   )rE   mr   r   r   	<setcomp>   s     
 r`   c                 C   s^   |dkrt jdt jd}tD ]6}tt j|d| d|  dD ]}t | qHq"dS )zBDo bookkeeping for when one process dies in a multi-process setup.Nr   r
   Zgauge_r1   z.db)r   r   r   _LIVE_GAUGE_MULTIPROCESS_MODESrW   r   rX   remove)r6   r   moder<   r   r   r   mark_process_dead   s
    &rd   )N)collectionsr   rW   r#   r   r   r    r   Zmetrics_corer   Z	mmap_dictr   rQ   r   utilsr   r9   	NameErrorIOErrorr	   Z_MULTIPROC_MODESra   rd   r   r   r   r   <module>   s"   
 