B
    .l\>                 @   s   d dl m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W n ek
rl   d dlZY nX dd Zd	d
 Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )    )unicode_literalsN   )MetricMETRIC_LABEL_NAME_RE)ExemplarSample	Timestamp)floatToGoStringc             c   s"   xt t| D ]
}|V  qW dS )z^Parse Openmetrics text format from a unicode string.

    See text_fd_to_metric_families.
    N)text_fd_to_metric_familiesStringIO)textZmetric_family r   Clib/python3.7/site-packages/prometheus_client/openmetrics/parser.pytext_string_to_metric_families   s    r   c             C   s   g }d}xx| D ]p}|rf|dkr*| d n6|dkr>| d n"|dkrR| d n| d|  d}q|dkrtd}q| | qW |r| d d|S )NF\"n
T )appendjoin)r   resultZslashcharr   r   r   _unescape_help   s$    

r   c             C   sJ   d | } | |  kr$td| yt| S  tk
rD   t| S X d S )Nr   zInvalid value: {0!r})r   strip
ValueErrorformatintfloat)valuer   r   r   _parse_value7   s    
r    c             C   s   d | } | sd S | |  kr,td| ytt| dS  tk
r   y6| dd}tt|d t|d d d ddS  tk
r   t| }t	
|st	|rtd| |S X Y nX d S )Nr   zInvalid timestamp: {0!r}r   .   	   0)r   r   r   r   r   r   splitljustr   mathisnanZisinf)	timestamppartstsr   r   r   _parse_timestampA   s     
*r,   c             C   s  d}g }g }i }x| D ]}|dkrD|dkr4d}nd}| | q|dkrf|dkrZd}n
| | q|dkr|dkr|d}ntd	| q|dkr|d
krd}nP|dkrtd|std	| d||d|< g }g }d}n
| | q|dkr*|dkrd}n|dkrd}ntd	| q|dkrd}|d
krN| d
 n:|dkrd| d n$|dkrz| d n| d
|  q|dkr|dkrP qtd	| qW |S )NZstartoflabelname}Zendoflabels	labelname=Zlabelvaluequoter   
labelvaluezInvalid line: r   Zlabelvalueslashr   Zendoflabelvalue,r   r    )r   r   r   matchr   )itr   stater.   r0   labelsr   r   r   r   _parse_labelsW   sb    







r7   c             C   sb  g }g }g }i }g }g }d }d}t | }	xT|	D ]J}
|dkrp|
dkrVt|	| }d}n|
dkrdd}n
||
 q0|dkr|
dkrd}n
||
 q0|dkr|
dkr|sd}n|
dkrd}n
||
 q0|dkr|
dkrd}ntd	|  q0|dkr|
dkrd
}ntd	|  q0|d
krD|
dkr6t|	| }d}ntd	|  q0|dkrj|
dkr^d}n
||
 q0|dkr0||
 q0W |dkr|std	|  |dkr|std	|  |dkrtd	|  |std	|  d|}t|}t|}d }|d k	rLtdd | D d }|dkr8td|  t	|t|t|}t
d|||||S )Nname{r   r2   r)   #exemplarspaceexemplarhashzInvalid line: exemplarstartoflabelsZexemplarvalueZexemplartimestamp)r<   r;   r=   r   c             S   s$   g | ]\}}t |t | d  qS )   )len).0kvr   r   r   
<listcomp>   s    z!_parse_sample.<locals>.<listcomp>r   @   zExmplar labels are too long: )iterr7   r   r   r   r    r,   sumitemsr   r   )r   r8   r   r)   r6   Zexemplar_valueZexemplar_timestampZexemplar_labelsr5   r4   r   valr+   exemplarZexemplar_lengthr   r   r   _parse_sample   s    












rJ   c             C   s~   |dkri S |dkr2| j |kr2| j }|d= |S |dkrN| j }||= |S |dkrx| j |d krx| j }|d= |S | jS )Ninfosummaryquantilestateset)	histogramgaugehistogram_bucketle)r8   r6   copy)sampler8   typdr   r   r   _group_for_sample   s    


rW   c       	         s   d }d } fdd}x| D ]}|j td  }t|d}||ksT|j|krn|d k	rb|  d d d|}|j}|dkrt|jd }| krtd |jk rtd	 | |jq |d
kr |jq W |d k	r|  d S )Nc                  s8    t dkrtd d k	r4kr4td d S )Nz+Infz+Inf bucket missing: z!Count does not match +Inf value: )r   r   r   )bucketcountr8   r   r   r   	do_checks  s    z#_check_histogram.<locals>.do_checksrO   r   rQ   rR   zBuckets out of order: zBucket values out of order: )_count_gcount)r8   r?   rW   r)   r   r6   r   r   )	samplesr8   groupr)   rZ   ssuffixgbr   )rX   rY   r8   r   r   _check_histogram  s4    


rd   c             #   s  d g }d}t  fdd}xP| D ]F}|d dkrD|dd }|rTtd| |dkrbd	}q&|d
r0|dd}t|dk rtd| |d  kr|rtd| |d  kr dk	r| |||	|V  |d  d}	d}d}d}
t  }d}t  }g }|d g}|d dkrh|dk	r0td| t|dkrLt|d }nt|dkr.td| n|d dkr|dk	rtd| |d }|dkrtd| ddgddddgddddgdddgd gd!|dg} fd"d#|D }n:|d d$kr"|	dk	rtd%| |d }	ntd| q&t|}|j|kr dk	r`| |||	|V  |j d}d}	d&}g }d}
d}t  }t  }|jg}|d'kr |j	krtd(| |d)kr d |jkrt
|j	d*dd+k s |j	d* t|j	d* krtd,| |d-krr |jkrrd+t
|j	d.d  krHdkrfn n|j	d. t|j	d. krrtd/| ttt| | }|
dk	r||
kr||krtd0| |
dk	r||
kr|jdk|dkkrtd1| |dk	r||jkr|d2krtd3| nt  }|jtt|j	 f}|j|ksJ||krT|| || |}
|j}|| |d'kr|jd4krtd5| |d2kr|jdkrtd6| |d-kr |jkr|jd+k rtd7| |jt d d8krt|jrtd9| |jt d d8krF|jd+k rFtd:| |jr&|d)krb|jds&td;| q&W  dk	r| |||	|V  |std<dS )=zParse 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.
    NFc                s   |  krt d|   |  |d kr*d}|d kr6d}|d krBd}|r`| d| s`t d|  |rx|dkrxt d|  |dkrt||  t| |||}||_|S )	NzDuplicate metric: unknownr   _z!Unit does not match metric name: )rK   rN   z(Units not allowed for this metric type: )rO   rP   )r   addendswithrd   r   r^   )r8   documentationrU   unitr^   Zmetric)seen_metricsr   r   build_metric4  s$    

z0text_fd_to_metric_families.<locals>.build_metricr[   r   zReceived line after # EOF: z# EOFTr:   r2   r>      zInvalid line: r   z!Received metadata after samples: r"   ZHELPzMore than one HELP for metric: ZTYPEzMore than one TYPE for metric: ZuntypedzInvalid TYPE for metric: _totalZ_createdr\   _sumr   rQ   r]   _gsumZ_info)ZcounterrL   rO   rP   rK   c                s   g | ]} | qS r   r   )r@   r   )r8   r   r   rC   {  s    z.text_fd_to_metric_families.<locals>.<listcomp>ZUNITzMore than one UNIT for metric: re   rN   zStateset missing label: )rO   rP   rR   r   zInvalid le label: rL   rM   zInvalid quantile label: zInvalid metric grouping: z*Mix of timestamp presence within a group: rK   z*Timestamps went backwards within a group: )r   r"   z4Stateset samples can only have values zero and one: z&Info samples can only have value one: z$Quantile values cannot be negative: )rn   ro   r\   rQ   r]   rp   z$Counter-like samples cannot be NaN: z)Counter-like samples cannot be negative: zGInvalid line only histogram/gaugehistogram buckets can have exemplars: zMissing # EOF at end)setr   
startswithr%   r?   r   getrJ   r8   r6   r   r	   tuplesortedrW   rG   r)   r   rg   r   r'   r(   rI   rh   )fdZallowed_nameseofrl   liner*   r^   ri   rU   rj   r_   Zseen_groupsZgroup_timestampZgroup_timestamp_samplesrT   rb   Z	series_idr   )r8   rk   r   r
   %  s    	










* 


"&$

r
   )Z
__future__r   r'   Zmetrics_corer   r   r^   r   r   r   Zutilsr	   r   ImportErrorior   r   r    r,   r7   rJ   rW   rd   r
   r   r   r   r   <module>   s"   	
=Z$