ó
6]c           @  sÒ   d  d l  m Z d  d l m 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 y e Wn e k
 r¥ e Z n Xd	 Z d
 e f d „  ƒ  YZ d d „ Z d S(   iÿÿÿÿ(   t   unicode_literals(   t   defaultdictNi   (   t   Metric(   t
   MmapedDict(   t   Sample(   t   floatToGoStringu   Multiprocess metrict   MultiProcessCollectorc           B  sS   e  Z d  Z d d „ Z e e d „ ƒ Z e d „  ƒ Z e d „  ƒ Z	 d „  Z
 RS(   u+   Collector for files for multi-process mode.c         C  sm   | d  k r! t j j d ƒ } n  | s; t j j | ƒ rJ t d ƒ ‚ n  | |  _ | ri | j |  ƒ n  d  S(   Nu   prometheus_multiproc_diru:   env prometheus_multiproc_dir is not set or not a directory(	   t   Nonet   ost   environt   gett   patht   isdirt
   ValueErrort   _patht   register(   t   selft   registryR   (    (    s=   lib/python2.7/site-packages/prometheus_client/multiprocess.pyt   __init__   s    	c         C  s   t  j |  ƒ } t  j | | ƒ S(   uõ   Merge 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   t   _read_metricst   _accumulate_metrics(   t   filest
   accumulatet   metrics(    (    s=   lib/python2.7/site-packages/prometheus_client/multiprocess.pyt   merge#   s    c           sj  i  } i  ‰  ‡  f d †  } xH|  D]@} t  j j | ƒ j d ƒ } | d } y t j | ƒ } Wn6 t k
 r˜ | d k r’ | d d k r’ q" n  ‚  n XxÆ | D]¾ \ } } }	 | | ƒ \ }
 } } } | j |
 ƒ } | d  k rt	 |
 t
 | ƒ } | | |
 <n  | d k rK| d d	  } | d | _ | j | | d
 | f f | ƒ q  | j | | | ƒ q  Wq" W| S(   Nc           sf   ˆ  j  |  ƒ } | sb t j |  ƒ \ } } } t t | j ƒ  ƒ ƒ } | | | | f } ˆ  |  <n  | S(   N(   R
   t   jsont   loadst   tuplet   sortedt   items(   t   keyt   valt   metric_namet   namet   labelst
   labels_key(   t	   key_cache(    s=   lib/python2.7/site-packages/prometheus_client/multiprocess.pyt
   _parse_key3   s    u   _i    u   gaugei   u   liveallu   livesumi   iýÿÿÿu   pid(   u   liveallu   livesum(   R   R   t   basenamet   splitR   t   read_all_values_from_filet   FileNotFoundErrorR
   R   R   t   MP_METRIC_HELPt   _multiprocess_modet
   add_sample(   R   R   R%   t   ft   partst   typt   file_valuesR   t   valuet   posR    R!   R"   R#   t   metrict   pid(    (   R$   s=   lib/python2.7/site-packages/prometheus_client/multiprocess.pyR   .   s0    
#c         C  sý  xð|  j  ƒ  D]â} t t ƒ } t d „  ƒ } | j } x°| j D]¥} | \ } } }	 }
 } | j d k rI| t g  | D] } | d d k rx | ^ qx ƒ f } | j d k rÚ | | |	 ƒ } |	 | k  rF|	 | | <qFqæ| j d k r| | |	 ƒ } |	 | k rF|	 | | <qFqæ| j d k r6| | c |	 7<qæ|	 | | | f <qA | j d k rÐx‹ | D]T } | d d	 k r_t | d
 ƒ } t d „  | Dƒ ƒ } | | | c |	 7<Pq_q_W| | | f c |	 7<qA | | | f c |	 7<qA W| j d k r¯x³ | j ƒ  D]¢ \ } } d } xm t	 | j ƒ  ƒ D]Y \ } }	 | j
 d | d	 t | ƒ f f f } | rz| |	 7} | | | <q+|	 | | <q+W| r| | | j
 d | f <qqWn  g  | j ƒ  D]* \ \ } } }	 t | t | ƒ |	 ƒ ^ q¼| _ q W|  j  ƒ  S(   Nc           S  s
   t  t ƒ S(   N(   R   t   float(    (    (    s=   lib/python2.7/site-packages/prometheus_client/multiprocess.pyt   <lambda>\   t    u   gaugei    u   pidu   minu   maxu   livesumu	   histogramu   lei   c         s  s%   |  ] } | d  d k r | Vq d S(   i    u   leN(    (   t   .0t   l(    (    s=   lib/python2.7/site-packages/prometheus_client/multiprocess.pys	   <genexpr>v   s    g        u   _bucketu   _count(   t   valuesR   R5   t
   setdefaultt   samplest   typeR   R+   R   R   R!   R   R   t   dict(   R   R   R3   R<   t   bucketst   samples_setdefaultt   sR!   R"   R1   t	   timestampt   exemplarR9   t   without_pid_keyt   currentt   bucket_valuet
   without_leR:   t   acct   buckett
   sample_keyt   name_(    (    s=   lib/python2.7/site-packages/prometheus_client/multiprocess.pyR   X   sT    	5

!Dc         C  s4   t  j  t j j |  j d ƒ ƒ } |  j | d t ƒS(   Nu   *.dbR   (   t   globR   R   t   joinR   R   t   True(   R   R   (    (    s=   lib/python2.7/site-packages/prometheus_client/multiprocess.pyt   collect•   s    !N(   t   __name__t
   __module__t   __doc__R   R   t   staticmethodRN   R   R   R   RO   (    (    (    s=   lib/python2.7/site-packages/prometheus_client/multiprocess.pyR      s   	
*=c         C  s£   | d k r! t j j d ƒ } n  x< t j t j j | d j |  ƒ ƒ ƒ D] } t j | ƒ qI Wx< t j t j j | d j |  ƒ ƒ ƒ D] } t j | ƒ qˆ Wd S(   uB   Do bookkeeping for when one process dies in a multi-process setup.u   prometheus_multiproc_diru   gauge_livesum_{0}.dbu   gauge_liveall_{0}.dbN(	   R   R   R	   R
   RL   R   RM   t   formatt   remove(   R4   R   R-   (    (    s=   lib/python2.7/site-packages/prometheus_client/multiprocess.pyt   mark_process_deadš   s    ..(   t
   __future__R    t   collectionsR   RL   R   R   t   metrics_coreR   t	   mmap_dictR   R<   R   t   utilsR   R)   t	   NameErrort   IOErrorR*   t   objectR   R   RV   (    (    (    s=   lib/python2.7/site-packages/prometheus_client/multiprocess.pyt   <module>   s   
ƒ