ó
6]c           @  sF  d  d l  m Z d  d l Z d  d l Z d d l m Z m Z d d l m Z m	 Z	 m
 Z
 d d l m Z y d  d l Z Wn e k
 r™ d  d l Z n Xd „  Z i d d	 6d
 d 6d d 6Z d „  Z e j d ƒ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z  d S(   iÿÿÿÿ(   t   unicode_literalsNi   (   t   Metrict   METRIC_LABEL_NAME_RE(   t   Exemplart   Samplet	   Timestamp(   t   floatToGoStringc         c  s)   x" t  t j |  ƒ ƒ D] } | Vq Wd S(   u^   Parse Openmetrics text format from a unicode string.

    See text_fd_to_metric_families.
    N(   t   text_fd_to_metric_familiest   StringIO(   t   textt   metric_family(    (    sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyt   text_string_to_metric_families   s    u   \u   \\u   
u   \nu   "u   \"c         C  s   t  |  j d ƒ S(   Ni    (   t   ESCAPE_SEQUENCESt   group(   t   match(    (    sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyt   _replace_escape_sequence#   s    u   \\[\\n"]c         C  s   t  j t |  ƒ S(   N(   t   ESCAPING_REt   subR   (   t   s(    (    sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyt   _replace_escaping*   s    c         C  sÖ   g  } t  } x¤ |  D]œ } | r | d k r; | j d ƒ nI | d k rW | j d ƒ n- | d k rs | j d ƒ n | j d | ƒ t  } q | d k r¢ t } q | j | ƒ q W| rÉ | j d ƒ n  d j | ƒ S(   Nu   \u   "u   nu   
u    (   t   Falset   appendt   Truet   join(   R	   t   resultt   slasht   char(    (    sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyt   _unescape_help.   s$    		c         C  sf   d j  |  ƒ }  |  |  j ƒ  k r9 t d j |  ƒ ƒ ‚ n  y t |  ƒ SWn t k
 ra t |  ƒ SXd  S(   Nu    u   Invalid value: {0!r}(   R   t   stript
   ValueErrort   formatt   intt   float(   t   value(    (    sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyt   _parse_valueI   s    c         C  s  d j  |  ƒ }  |  s d  S|  |  j ƒ  k rC t d j |  ƒ ƒ ‚ n  y t t |  ƒ d ƒ SWn¯ t k
 ryG |  j d d ƒ } t t | d ƒ t | d d  j d d ƒ ƒ ƒ SWqt k
 rt	 |  ƒ } t
 j | ƒ së t
 j | ƒ rt d j |  ƒ ƒ ‚ n  | SXn Xd  S(   Nu    u   Invalid timestamp: {0!r}i    u   .i   i	   u   0(   R   t   NoneR   R   R   R   R   t   splitt   ljustR    t   matht   isnant   isinf(   t	   timestampt   partst   ts(    (    sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyt   _parse_timestampS   s     5c         C  sI   d } x2 | | k r: |  | d | d k r: | d 7} q	 W| d d k S(   Ni    i   u   \i   (    (   R   t   charpost   num_bslashes(    (    sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyt   _is_character_escapedi   s
    c         C  sj  d } g  } g  } i  } d } x?|  D]7} | d k rb | d k rL d } qRd } | j  | ƒ nð| d k r“ | d k rƒ d } qR| j  | ƒ n¿| d k rÇ | d k r´ d	 } qRt d
 |  ƒ ‚ n‹| d	 k r`| d k rè d } qR| d k rPt j d j | ƒ ƒ st d
 |  ƒ ‚ n  d j | ƒ | d j | ƒ <g  } g  } d } qR| j  | ƒ nò | d k r©| d k rd } qR| d k r–d } qRt d
 |  ƒ ‚ n© | d k r#d	 } | d k r×| j  d ƒ qR| d k ró| j  d ƒ qR| d k r| j  d ƒ qR| j  d | ƒ n/ | d k rR| d k r?PqRt d
 |  ƒ ‚ n  | d 7} q% W| | f S(   Nu   startoflabelnamei    u   }u   endoflabelsu	   labelnameu   =u   labelvaluequoteu   "u
   labelvalueu   Invalid line: u   \u   labelvalueslashu    u   endoflabelvalueu   ,u   nu   
u    i   (   R   R   R   R   R   (   R	   t   statet	   labelnamet
   labelvaluet   labelst
   labels_lenR   (    (    sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyt    _parse_labels_with_state_machineq   sf    							c   
      C  sÔ  i  } |  r! d |  k r! t  ‚ n  |  } y…xz| r¦| j d ƒ } | |  } | | d } | sq | d d k rz t  ‚ n  | d } | s› | d d k r¤ t  ‚ n  | s» | d d k rÄ t  ‚ n  d } xI | t | ƒ k  r| j d | ƒ } t | |  | ƒ sPn  | d 7} qÍ W| d } | d | !} d | k rHt | ƒ } n  | | | <| | d } | j d ƒ rxd }	 n d }	 | |	 } | r- |	 d k r- t  ‚ q- q- W| SWn! t  k
 rÏt  d |  ƒ ‚ n Xd  S(	   Nu   =i   i    u   "u   ,iÿÿÿÿu   \u   Invalid labels: (   R   t   indext   lenR/   R   t
   startswith(
   R	   R3   t
   sub_labelst   value_startt
   label_namet   value_substrt   it	   quote_endt   label_valuet
   next_comma(    (    sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyt   _parse_labels°   sJ    		
	
		

	
c         C  s$  |  j  d ƒ } | d k rm |  j d ƒ } |  |  } |  | d } t | ƒ \ } } } t | i  | | | ƒ S|  |  } d } |  j | ƒ d k rÁ |  j d ƒ }	 |  | d |	 !}
 t |
 ƒ } n* t |  | d ƒ \ } } | t | ƒ }	 |  |	 d } t | ƒ \ } } } t | | | | | ƒ S(	   Nu   {iÿÿÿÿu    i   u    # i    u   }i   (	   t   findR6   t   _parse_remaining_textR   t   countt   rindexRA   R5   R7   (   R	   t   label_startt   name_endt   namet   remaining_textR!   R)   t   exemplart	   seperatort	   label_endt   labelR3   R4   (    (    sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyt   _parse_sampleð   s$    

c         C  s  |  j  d d ƒ } t | d ƒ } t | ƒ d k rA | d  d  f Sg  } g  } g  } d  } d } | d }  t |  ƒ } xø| D]ð}	 | d k rÏ |	 d k rª | rª d } ql|	 d k r¿ d } ql| j |	 ƒ q| | d k r|	 d k rð d } qlt d |  ƒ ‚ q| | d k r7|	 d k r$d	 } qlt d |  ƒ ‚ q| | d	 k r¡|	 d
 k rŽ|  j d
 ƒ |  j d ƒ }
 } t	 |  |
 d | !ƒ } d } qlt d |  ƒ ‚ q| | d k rÅ|	 d k rld } qlq| | d k rù|	 d k ræd } qlt d |  ƒ ‚ q| | d k rP|	 d k r+| r+t d |  ƒ ‚ ql|	 d k r@d } ql| j |	 ƒ q| | d k r| | j |	 ƒ q| q| W| d k r–| r–t d |  ƒ ‚ n  | d k r¼| r¼t d |  ƒ ‚ n  | d k rÛt d |  ƒ ‚ n  t
 | ƒ } d  } | d  k	 rtt g  | j ƒ  D]" \ } } t | ƒ t | ƒ ^ q	ƒ } | d k rSt d |  ƒ ‚ n  t | t | ƒ t
 | ƒ ƒ } n  | | | f S(   Nu    i   i    u	   timestampu   #u   exemplarspaceu   exemplarhashu   Invalid line: u   exemplarstartoflabelsu   {u   }u   exemplarparsedlabelsu   exemplarvaluespaceu   exemplarvalueu   exemplartimestampi@   u   Exmplar labels are too long: (   u   exemplarhashu   exemplarspaceu   exemplarstartoflabelsu   exemplarparsedlabels(   R$   R"   R7   R#   t   iterR   R   R6   RE   RA   R,   t   sumt   itemsR   (   R	   t
   split_textt   valR)   t   exemplar_valuet   exemplar_timestampt   exemplar_labelsR0   t   itR   RF   RL   R+   RJ   t   kt   vt   exemplar_length(    (    sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyRC     s€    
							;	c         C  s«   | d k r i  S| d k rE |  j  | k rE |  j j ƒ  } | d =| S| d k rk |  j j ƒ  } | | =| S| d	 k r¤ |  j  | d k r¤ |  j j ƒ  } | d =| S|  j S(
   Nu   infou   summaryu   quantileu   statesetu	   histogramu   gaugehistogramu   _bucketu   le(   u	   histogramu   gaugehistogram(   RH   R3   t   copy(   t   sampleRH   t   typt   d(    (    sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyt   _group_for_samplee  s    c   	        sS  d  } d  } ‡  ‡ ‡ ‡ f d †  } x|  D]
} | j t ˆ ƒ } t | ˆ d ƒ } | | k sq | j | k rœ | d  k	 r‡ | ƒ  n  d  ‰ d ‰  d ‰ n  | } | j } | d k rt | j d ƒ } | ˆ  k ré t d ˆ ƒ ‚ n  | j ˆ k  rt d ˆ ƒ ‚ n  | ‰  | j ‰ q+ | d k r+ | j ‰ q+ q+ W| d  k	 rO| ƒ  n  d  S(   Nc             sT   ˆ  t  d ƒ k r% t d ˆ ƒ ‚ n  ˆ d  k	 rP ˆ ˆ k rP t d ˆ ƒ ‚ n  d  S(   Nu   +Infu   +Inf bucket missing: u!   Count does not match +Inf value: (   R    R   R#   (    (   t   bucketRD   RH   R!   (    sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyt	   do_checks|  s    u	   histogramiÿÿÿÿi    u   _bucketu   leu   Buckets out of order: u   Bucket values out of order: u   _countu   _gcount(   u   _countu   _gcount(	   R#   RH   R7   R_   R)   R    R3   R   R!   (	   t   samplesRH   R   R)   Ra   R   t   suffixt   gt   b(    (   R`   RD   RH   R!   sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyt   _check_histogramx  s4    
		c         #  s»  d6 } g  } t } t ƒ  ‰  ‡  f d †  } xO|  D]G} | d d k rT | d  } n  | rm t d | ƒ ‚ n  | d k r‚ t } q1 | j d ƒ r| j d d ƒ } t | ƒ d	 k  rÈ t d
 | ƒ ‚ n  | d | k rñ | rñ t d | ƒ ‚ n  | d | k rw| d6 k	 r'| | | |	 |
 | ƒ Vn  | d } d6 }
 d6 }	 d6 } d6 } t ƒ  } d6 } t ƒ  } g  } | d g } n  | d d k ró| d6 k	 r¦t d | ƒ ‚ n  t | ƒ d	 k rËt | d ƒ } qt | ƒ d k rt d
 | ƒ ‚ qqx| d d k rÍ|	 d6 k	 r"t d | ƒ ‚ n  | d }	 |	 d k rKt d | ƒ ‚ n  i d d g d 6d d d d g d 6d d d d g d 6d d d g d 6d  g d! 6j	 |	 d g ƒ } g  | D] } | | ^ q´} qx| d d" k r	|
 d6 k	 rüt d# | ƒ ‚ n  | d }
 qxt d
 | ƒ ‚ q1 t
 | ƒ } | j | k r«| d6 k	 r]| | | |	 |
 | ƒ Vn  | j } d6 } d6 }
 d$ }	 g  } d6 } d6 } t ƒ  } t ƒ  } | j g } n  |	 d% k rÙ| | j k rÙt d& | ƒ ‚ n  |	 d7 k rL| d | j k rLt | j j	 d' d ƒ ƒ d( k  s9| j d' t | j d' ƒ k rLt d) | ƒ ‚ n  |	 d k rÌ| | j k rÌd( t | j j	 d* d ƒ ƒ k o“d k n s¹| j d* t | j d* ƒ k rÌt d+ | ƒ ‚ n  t t t | | |	 ƒ j ƒ  ƒ ƒ } | d6 k	 r'| | k r'| | k r't d, | ƒ ‚ n  | d6 k	 rª| | k rª| j d6 k | d6 k k rmt d- | ƒ ‚ n  | d6 k	 r³| | j k r³|	 d! k r³t d. | ƒ ‚ q³n	 t ƒ  } | j t t | j j ƒ  ƒ ƒ f } | j | k sò| | k r| j | ƒ n  | j | ƒ | } | j } | j | ƒ |	 d% k rY| j d8 k rYt d/ | ƒ ‚ n  |	 d! k r‡| j d k r‡t d0 | ƒ ‚ n  |	 d k rÄ| | j k rÄ| j d( k  rÄt d1 | ƒ ‚ n  | j t | ƒ d9 k rt j | j ƒ rt d2 | ƒ ‚ n  | j t | ƒ d: k r=| j d( k  r=t d3 | ƒ ‚ n  | j r1 |	 d; k oa| j j d ƒ r1 t d4 | ƒ ‚ q1 q1 W| d6 k	 r¢| | | |	 |
 | ƒ Vn  | s·t d5 ƒ ‚ n  d6 S(<   uß   Parse Prometheus text format from a file descriptor.

    This is a laxer parser than the main Go parser,
    so successful parsing does not imply that the parsed
    text meets the specification.

    Yields Metric's.
    c           sû   |  ˆ  k r t  d |  ƒ ‚ n  ˆ  j |  ƒ | d  k rA d } n  | d  k rV d } n  | d  k rk d } n  | r˜ |  j d | ƒ r˜ t  d |  ƒ ‚ n  | r½ | d k r½ t  d |  ƒ ‚ n  | d k rÙ t | |  ƒ n  t |  | | | ƒ } | | _ | S(   Nu   Duplicate metric: u   unknownu    u   _u!   Unit does not match metric name: u   infou   statesetu(   Units not allowed for this metric type: u	   histogramu   gaugehistogram(   u   infou   stateset(   u	   histogramu   gaugehistogram(   R   t   addR#   t   endswithRf   R   Rb   (   RH   t   documentationR]   t   unitRb   t   metric(   t   seen_metrics(    sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyt   build_metric«  s$    				iÿÿÿÿu   
u   Received line after # EOF: u   # EOFu   #u    i   i   u   Invalid line: i   u!   Received metadata after samples: i   u   HELPu   More than one HELP for metric: u   TYPEu   More than one TYPE for metric: u   untypedu   Invalid TYPE for metric: u   _totalu   _createdu   counteru   _countu   _sumu    u   summaryu   _bucketu	   histogramu   _gcountu   _gsumu   gaugehistogramu   _infou   infou   UNITu   More than one UNIT for metric: u   unknownu   statesetu   Stateset missing label: u   lei    u   Invalid le label: u   quantileu   Invalid quantile label: u   Invalid metric grouping: u*   Mix of timestamp presence within a group: u*   Timestamps went backwards within a group: u4   Stateset samples can only have values zero and one: u&   Info samples can only have value one: u$   Quantile values cannot be negative: u$   Counter-like samples cannot be NaN: u)   Counter-like samples cannot be negative: uG   Invalid line only histogram/gaugehistogram buckets can have exemplars: u   Missing # EOF at endN(   u	   histogramu   gaugehistogram(   i    i   (   u   _totalu   _sumu   _countu   _bucketu   _gcountu   _gsum(   u   _totalu   _sumu   _countu   _bucketu   _gcountu   _gsum(   u	   histogramu   gaugehistogram(   R#   R   t   setR   R   R8   R$   R7   R   t   getRN   RH   R3   R    R   t   tuplet   sortedR_   RQ   R)   R   Rg   R!   R&   R'   RJ   Rh   (   t   fdRH   t   allowed_namest   eofRm   t   lineR*   Rb   Ri   R]   Rj   R   t   seen_groupst   group_timestampt   group_timestamp_samplest   nR\   Rd   t	   series_id(    (   Rl   sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyR   œ  sê    			
		
 			! 2 $$'	$	*	(!   t
   __future__R    R&   t   ret   metrics_coreR   R   Rb   R   R   R   t   utilsR   R   t   ImportErrort   ioR   R   R   t   compileR   R   R   R"   R,   R/   R5   RA   RN   RC   R_   Rf   R   (    (    (    sC   lib/python2.7/site-packages/prometheus_client/openmetrics/parser.pyt   <module>   s8   		
				
			?	@		V		$