o
    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   Y/var/www/edux/Edux_v2/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 ]u}t j|d}|d }zt|}W n ty7   |dkr6|d dr6Y q w |D ]F\}}}	||\}
}}}}||
}|d u r[t	|
||}|||
< |dkry|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(   valuer2   r*   r+   r,   r.   r-   metricr7   r   r/   r   r   .   s4   

z#MultiProcessCollector._read_metricsc                 C   s  |   D ]}tt}tdd }|j}|jD ]}|\}}}	}
}|jdkrj|tdd |D f}|jdv rB|||	}|	|k rA|	||< q|jdv rU|||	}|	|krT|	||< q|jdv rc||  |	7  < q|	|||f< q|jd	kr|D ]#}|d
 dkrt|d }tdd |D }|| |  |	7  <  nqq|||f  |	7  < q|||f  |	7  < q|jd	kr| D ]9\}}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>a       z<MultiProcessCollector._accumulate_metrics.<locals>.<genexpr>)minlivemin)maxlivemax)sumlivesum	histogramr   ler   c                 s   rG   )r   rT   Nr   rH   r   r   r   rK   v   rL   g        _bucket_countc                 S   s$   g | ]\\}}}t |t||qS r   )r   dict)rI   name_r,   rC   r   r   r   
<listcomp>   s   $ z=MultiProcessCollector._accumulate_metrics.<locals>.<listcomp>)valuesr   rE   
setdefaultsamplestyper%   r=   r'   r&   r+   r   )r    r   rD   r\   bucketssamples_setdefaultsr+   r,   rC   	timestampexemplarwithout_pid_keycurrentrJ   bucket_value
without_lerZ   accbucket
sample_keyr   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   rl   r   r   r   r   r	      s    


)
<r	   c                 C   s   h | ]	}| d r|qS )r4   )r<   )rI   mr   r   r   	<setcomp>   s    rs   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_MODESrj   r   rk   remove)r7   r   moder?   r   r   r   mark_process_dead   s   &rx   r"   )collectionsr   rj   r#   r   r   r    r   metrics_corer   	mmap_dictr   r\   r   utilsr   r;   	NameErrorIOErrorr	   _MULTIPROC_MODESru   rx   r   r   r   r   <module>   s&     