a
    9ahV                     @   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   Clib/python3.9/site-packages/prometheus_client/openmetrics/parser.pytext_string_to_metric_families   s    r   infc                 C   s    t | }|tv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   sV   d | } | |  ksd| v r,td| z
t| W S  tyP   t|  Y S 0 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| v r4td| ztt| dW S  ty   z<| dd}tt|d t|d d d ddW  Y S  ty   t| }t	|st
|rtd| | Y  Y S 0 Y n0 d S )	Nr!   r'   zInvalid timestamp: r   .   	   0)r#   r(   r)   r   r*   splitljustr   mathisnanZisinf)	timestamppartstsr   r   r   _parse_timestampV   s     
0r8   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    
r9   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|  ||v 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%   Zlnr   r   r    _parse_labels_with_state_machinet   sl    














rD   c           
      C   s  i }| rd| v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|v rt|}t|st d|  ||v rt d	|  |||< ||d d  }|drFd}	nd}	||	d  }|r|	dkrt q|W S  t y   t d
|  Y n0 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lenr9   r   r   r   
startswith)
r   rB   Z
sub_labelsZvalue_startZ
label_nameZvalue_substriZ	quote_endZlabel_valueZ
next_commar   r   r   _parse_labels   sR    


rJ   c                 C   s   d}|  d}|dks&|| d | v rj| d}| d | }| |d d  }t|\}}}t|i |||S | d | }|| vr| d}	| |d |	 }
t|
}n$t| |d d  \}}|t| }	| |	d d  }t|\}}}t|||||S )Nz # {rE   r@   r.   r:   r   )findrF   _parse_remaining_textr   rindexrJ   rD   rG   )r   	separatorlabel_startZname_endnameZremaining_textr+   r5   exemplar	label_endZlabelrB   rC   r   r   r   _parse_sample   s$    



rT   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v rtd|  t	|}d }|d urht
dd | D }|dkrTtd|  t|t|t	|}|||fS )Nr@   r.   r   r5   #exemplarspaceexemplarhashr>   exemplarstartoflabelsrK   r:   exemplarparsedlabelsZexemplarvaluespaceZexemplarvalueZexemplartimestamp)rW   rV   rX   rY   c                 s   s"   | ]\}}t |t | V  qd S r   )rG   ).0kvr   r   r   	<genexpr>c      z(_parse_remaining_text.<locals>.<genexpr>   zExmplar labels are too long: )r1   r,   rG   iterr"   r)   rF   rN   rJ   r8   sumitemsr   )r   Z
split_textvalr5   Zexemplar_valueZexemplar_timestampZexemplar_labelsrA   itr%   rP   rS   r7   rR   Zexemplar_lengthr   r   r   rM     s    












rM   c                 C   s~   |dkri S |dkr2| j |kr2| j }|d= |S |dkrN| j }||= |S |dv rx| j |d krx| j }|d= |S | jS )Ninfosummaryquantilestateset	histogramgaugehistogram_bucketle)rQ   rB   copy)samplerQ   typdr   r   r   _group_for_sampleo  s    


rr   c           	         sB  d }d } fdd}| D ]}|j td  }t|d}||ks\|j|kr|d urj|  d d  ddddd|}|j}|dkrt|jd }|dk rd d ur| krtd	 |jk rtd
 | |jq&|dv r|jq&|dv rdq&|dv r&d|jdk r&dq&|d ur>|  d S )Nc                      s    t dkrtd d ur4kr4td rLd u rLtd rdd u rdtd ssd u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_sumrQ   r+   r   r   	do_checks  s    z#_check_histogram.<locals>.do_checksrj   Fr   rl   rm   TzBuckets out of order: zBucket values out of order: )_count_gcount)_sum)_gsum)rQ   rG   rr   r5   r   rB   r)   r+   )	samplesrQ   r   r5   ru   r   suffixgbr   rs   r   _check_histogram  sL    





r~   c                 #   s  d g }d}t  ddgg dg dg ddgd	fd
d}| D ]n}|d dkrd|dd }|rttd| |std|dkrd}qF|dr|dd}t|dk rtd| |d  kr|rtd| |d  kr: dur| |||	|V  |d  d}	d}d}d}
t  }d}t  }g }|d g}|d dkrl|dur^td| t|d }n|d dkr|durtd| |d }|dkrtd|  fd d!|d"gD }n:|d d#kr|	durtd$| |d }	ntd| qFt|}|j|vrj dur8| |||	|V  |j d}d}	d%}g }d}
d}t  }t  }|jg}|d&kr |j	v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rHt|jtsH|j sHtd/| |d0kr |jkrd1t|j	d2d  krdkrn nt
|j	d2 rtd3| ttt| | }|
dur||
kr||v rtd4| |
durH||
krH|jdu |du krtd5| |durN||jkrN|d6krNtd7| nt  }|jtt|j	 f}|j|ks|||vr|| || |}
|j}|| |d&kr|jd8vrtd9| |d6kr|jdkrtd:| |d0kr |jkr|jd1k rtd;| |jt d d<v rHt|jrHtd=| |jt d d>v rx|jd1k rxtd?| |jrF|d@v r|jd(sF|dAv r|jdsFtdB| qF dur| |||	|V  |stdCdS )DzParse 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_total_created)r!   rv   rx   r   )rv   rx   rl   r   )rw   ry   rl   _info)counterrf   rj   rk   re   c                    s   |d u rd}t |g dg D ].}| |  v rBtd|  |  | |  q"|d u r^d}|d u rjd}|r| d| std|  |r|dv rtd|  |dv rt||  t| |||}||_|S )	Nunknownr!   zClashing name: r'   z!Unit does not match metric name: )re   rh   z(Units not allowed for this metric type: ri   )setgetr)   addendswithr~   r   rz   )rQ   documentationrp   unitrz   r{   Zmetric)
seen_namestype_suffixesr   r   build_metric  s&    
z0text_fd_to_metric_families.<locals>.build_metricrE   r   zReceived line after # EOF: zReceived blank linez# EOFTrU   r@         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   )rZ   r    )rQ   r   r   
<listcomp>  r^   z.text_fd_to_metric_families.<locals>.<listcomp>r!   ZUNITzMore than one UNIT for metric: r   rh   zStateset missing label: rl   rm   ZNaNzInvalid le label: z!Bucket value must be an integer: rv   rw   z Count value must be an integer: rf   r   rg   zInvalid quantile label: zInvalid metric grouping: z*Mix of timestamp presence within a group: re   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   rx   rv   rl   rw   ry   z$Counter-like samples cannot be NaN: )r   rx   rv   rl   rw   z)Counter-like samples cannot be negative: ri   )r   zTInvalid line only histogram/gaugehistogram buckets and counters can have exemplars: zMissing # EOF at end)r   r)   rH   r1   rG   r&   r   rT   rQ   rB   r   
isinstancer+   r*   
is_integerr   tuplesortedrr   rb   r5   r"   r   r3   r4   rR   r   )fdZallowed_nameseofr   liner6   rz   r   rp   r   r   Zseen_groupsZgroup_timestampZgroup_timestamp_samplesro   r|   Z	series_idr   )rQ   r   r   r   r	     s   	









 

 


"$


r	   )!ior
   r3   reZmetrics_corer   r   rz   r   r   r   Zutilsr   r   r   r   r   r   r   compiler   r   r&   r,   r8   r9   rD   rJ   rT   rM   rr   r~   r	   r   r   r   r   <module>   s4   


BDV;