U
    diV                     @   s   d dl 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 dd ZedhZd	d
 ZddddZdd Ze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"d# Zd$d% Zd&d' Zd(d) Z dS )*    N   )MetricMETRIC_LABEL_NAME_RE)ExemplarSample	Timestamp)floatToGoStringc                 c   s   t t| E dH  dS )z^Parse Openmetrics text format from a unicode string.

    See text_fd_to_metric_families.
    N)text_fd_to_metric_familiesStringIO)text r   H/tmp/pip-unpacked-wheel-2bcd7zt2/prometheus_client/openmetrics/parser.pytext_string_to_metric_families   s    r   infc                 C   s    t | }|tkrdS | t|kS )NF)float_CANONICAL_NUMBERSr   )sfr   r   r   _isUncanonicalNumber   s    r   \
")z\\z\nz\"c                 C   s   t | d S )Nr   )ESCAPE_SEQUENCESgroup)matchr   r   r   _replace_escape_sequence&   s    r   z\\[\\n"]c                 C   s   t t| S N)ESCAPING_REsubr   )r   r   r   r   _replace_escaping-   s    r   c                 C   s   g }d}| D ]p}|rd|dkr(| d n6|dkr<| d n"|dkrP| d n| d|  d}q|dkrrd}q| | q|r| d d|S )NFr   r   nr   T )appendjoin)r   resultZslashcharr   r   r   _unescape_help1   s$    
r&   c                 C   sX   d | } | |  ksd| kr,td| z
t| W S  tk
rR   t|  Y S X d S )Nr!   _zInvalid value: )r#   strip
ValueErrorintr   )valuer   r   r   _parse_valueL   s    

r,   c                 C   s   d | } | sd S | |  ks&d| kr4td| ztt| dW S  tk
r   z<| dd}tt|d t|d d d ddW  Y S  tk
r   t| }t	|st
|rtd| | Y  Y S X Y nX d S )	Nr!   r'   zInvalid timestamp: r   .   	   0)r#   r(   r)   r   r*   splitljustr   mathisnanisinf)	timestamppartstsr   r   r   _parse_timestampV   s     
0r9   c                 C   s6   d}||kr*| |d |  dkr*|d7 }q|d dkS )Nr   r.   r   r   r   )r   ZcharposZnum_bslashesr   r   r   _is_character_escapedl   s    
r:   c                 C   s  d}g }g }i }d}| D ]}|dkrF|dkr4d}nd}| | n|dkrj|dkr\d}n
| | nd|dkr|dkrd	}ntd
|  n>|d	kr|dkrd}nd|dkrd|}t|std|  ||krtd|  d|||< g }g }d}n
| | n|dkrF|dkr(d}n|dkr8d}ntd
|  n|dkrd	}|dkrj| d n:|dkr| d n$|dkr| d n| d|  n(|dkr|dkr qntd
|  |d7 }q||fS )NZstartoflabelnamer   }Zendoflabels	labelname=Zlabelvaluequoter   
labelvalueInvalid line: r   Zlabelvalueslashr!   zInvalid line, bad label name: z$Invalid line, duplicate label name: Zendoflabelvalue,r    r    r.   )r"   r)   r#   r   r   )r   stater<   r>   labels
labels_lenr%   lnr   r   r    _parse_labels_with_state_machinet   sl    














rF   c           
      C   s  i }| rd| krt | }zR|rh|d}|d | }||d d  }|rX|d dkr\t |dd  }|rx|d dkr|t |r|d dkrt d}|t|k r|d|}t|d | |sq|d7 }q|d }|d| }d|krt|}t|st d|  ||krt d	|  |||< ||d d  }|drFd}	nd}	||	d  }|r|	dkrt q|W S  t k
r   t d
|  Y nX d S )Nr=   r.   r   r   r@   r   zinvalid line, bad label name: z$invalid line, duplicate label name: zInvalid labels: )r)   indexlenr:   r   r   r   
startswith)
r   rC   Z
sub_labelsZvalue_startZ
label_nameZvalue_substriZ	quote_endZlabel_valueZ
next_commar   r   r   _parse_labels   sR    


rL   c                 C   s   d}|  d}|dks&|| d | krj| d}| d | }| |d d  }t|\}}}t|i |||S | d | }|| kr| d}	| |d |	 }
t|
}n$t| |d d  \}}|t| }	| |	d d  }t|\}}}t|||||S )Nz # {rG   rA   r.   r;   r   )findrH   _parse_remaining_textr   rindexrL   rF   rI   )r   	separatorlabel_startZname_endnameZremaining_textr+   r6   exemplar	label_endlabelrC   rD   r   r   r   _parse_sample   s$    



rW   c                 C   sr  |  dd}t|d }t|dkr.|d d fS g }g }g }d }d}|d } t| }|D ]j}	|dkr|	dkrv|svd}n|	dkrd}n
||	 qV|dkr|	dkrd}ntd|  qV|dkr|	dkrd	}ntd|  qV|d	kr*|	d
kr| d
| d }
}t| |
d | }d}ntd|  qV|dkrD|	dkrd}qV|dkrl|	dkr^d}ntd|  qV|dkr|	dkr|std|  n|	dkrd}n
||	 qV|dkrV||	 qV|dkr|std|  |dkr|std|  |dkrtd|  t	|}d }|d k	rht
dd | D }|dkrTtd|  t|t|t	|}|||fS )NrA   r.   r   r6   #exemplarspaceexemplarhashr?   exemplarstartoflabelsrM   r;   exemplarparsedlabelsZexemplarvaluespaceZexemplarvalueZexemplartimestamp)rZ   rY   r[   r\   c                 s   s"   | ]\}}t |t | V  qd S r   )rI   ).0kvr   r   r   	<genexpr>c  s     z(_parse_remaining_text.<locals>.<genexpr>   zExemplar labels are too long: )r1   r,   rI   iterr"   r)   rH   rP   rL   r9   sumitemsr   )r   Z
split_textvalr6   Zexemplar_valueZexemplar_timestampZexemplar_labelsrB   itr%   rR   rU   r8   rT   Zexemplar_lengthr   r   r   rO     s    












rO   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)rS   rC   copy)samplerS   typdr   r   r   _group_for_sampleo  s    


rt   c           	         sB  d }d } fdd}| D ]}|j td  }t|d}||ks\|j|kr|d k	rj|  d d  ddddd|}|j}|dkrt|jd }|dk rd d k	r| krtd	 |jk rtd
 | |jq&|dkr|jq&|dkrdq&|dkr&d|jdk r&dq&|d k	r>|  d S )Nc                      s    t dkrtd d k	r4kr4td rLd krLtd rdd krdtd ssd k	rtd rrtd srtd d S )	Nz+Infz+Inf bucket missing: z!Count does not match +Inf value: z+_count must be present if _sum is present: z-_gcount must be present if _gsum is present: z1_sum/_gsum must be present if _count is present: z(Cannot have _sum with negative buckets: z6Cannot have negative _gsum with non-negative buckets: )r   r)   r   ZbucketcountZhas_gsumZhas_negative_bucketsZhas_negative_gsumZhas_sumrS   r+   r   r   	do_checks  s    z#_check_histogram.<locals>.do_checksrl   Fr   rn   ro   TzBuckets out of order: zBucket values out of order: )_count_gcount)_sum)_gsum)rS   rI   rt   r6   r   rC   r)   r+   )	samplesrS   r   r6   rw   r   suffixgbr   ru   r   _check_histogram  sL    





r   c                 #   s  d g }d}t  ddgddddgddddgd	d
dgdgdfdd}| D ]n}|d dkrn|dd }|r~td| |std|dkrd}qP|dr|dd}t|dk rtd| |d  kr|rtd| |d  krD dk	r| |||	|V  |d  d}	d}d}d}
t  }d}t  }g }|d g}|d dkrv|dk	rhtd| t|d }n|d dkr|dk	rtd | |d }|d!krtd"|  fd#d$|dgD }n:|d d%kr|	dk	rtd&| |d }	ntd| qPt|}|j|krt dk	rB| |||	|V  |j d}d}	d'}g }d}
d}t  }t  }|jg}|d(kr |j	krtd)|  d |jkr|j	d*d+d+kst
|j	d* rtd,|  d |jkrt|jts|j std-|  d |jks, d	 |jkrRt|jtsR|j sRtd.| |d/kr |jkrd0t|j	d1d  krdkrn nt
|j	d1 rtd2| ttt| | }|
dk	r||
kr||krtd3| |
dk	rR||
krR|jdk|dkkr$td4| |dk	rX||jkrX|d5krXtd6| nt  }|jtt|j	 f}|j|ks||kr|| || |}
|j}|| |d(kr|jd7krtd8| |d5kr|jdkrtd9| |d/kr  |jkr |jd0k r td:| |jt d d;krRt|jrRtd<| |jt d d=kr|jd0k rtd>| |jrP|d?kr|jdsP|d@kr|jdsPtdA| qP dk	r| |||	|V  |stdBdS )CzParse 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.
    NF_totalZ_createdr!   rx   rz   rn   ry   r{   _info)counterrh   rl   rm   rg   c                    s   |d krd}t |g dg D ].}| |  krBtd|  |  | |  q"|d kr^d}|d krjd}|r| d| std|  |r|dkrtd|  |dkrt||  t| |||}||_|S )	Nunknownr!   zClashing name: r'   z!Unit does not match metric name: )rg   rj   z(Units not allowed for this metric type: rk   )setgetr)   addendswithr   r   r|   )rS   documentationrr   unitr|   r}   Zmetric)
seen_namestype_suffixesr   r   build_metric  s&    
z0text_fd_to_metric_families.<locals>.build_metricrG   r   zReceived line after # EOF: zReceived blank linez# EOFTrX   rA         r?   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: c                    s   g | ]} | qS r   r   )r]   r    )rS   r   r   
<listcomp>  s     z.text_fd_to_metric_families.<locals>.<listcomp>ZUNITzMore than one UNIT for metric: r   rj   zStateset missing label: ro   NaNzInvalid le label: z!Bucket value must be an integer: z Count value must be an integer: rh   r   ri   zInvalid quantile label: zInvalid metric grouping: z*Mix of timestamp presence within a group: rg   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: )r   rz   rx   rn   ry   r{   z$Counter-like samples cannot be NaN: )r   rz   rx   rn   ry   z)Counter-like samples cannot be negative: rk   )r   zTInvalid line only histogram/gaugehistogram buckets and counters can have exemplars: zMissing # EOF at end)r   r)   rJ   r1   rI   r&   r   rW   rS   rC   r   
isinstancer+   r*   
is_integerr   tuplesortedrt   rd   r6   r"   r   r3   r4   rT   r   )fdZallowed_nameseofr   liner7   r|   r   rr   r   r   Zseen_groupsZgroup_timestampZgroup_timestamp_samplesrq   r~   Z	series_idr   )rS   r   r   r   r	     s   	











 
 
 


"$


r	   )!ior
   r3   reZmetrics_corer   r   r|   r   r   r   utilsr   r   r   r   r   r   r   compiler   r   r&   r,   r9   r:   rF   rL   rW   rO   rt   r   r	   r   r   r   r   <module>   s4   


BDV;