a
    ܌xdiV                     @   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   \/var/www/html/Ranjet/env/lib/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   result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isnanisinf)	timestamppartstsr   r   r   _parse_timestampV   s     
0r:   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|  ||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&   lnr   r   r    _parse_labels_with_state_machinet   sl    














rG   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   rA   r   zinvalid line, bad label name: z$invalid line, duplicate label name: zInvalid labels: )r*   indexlenr;   r   r   r   
startswith)
r   rD   Z
sub_labelsZvalue_startZ
label_nameZvalue_substriZ	quote_endZlabel_valueZ
next_commar   r   r   _parse_labels   sR    


rM   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 # {rH   rB   r/   r<   r   )findrI   _parse_remaining_textr   rindexrM   rG   rJ   )r   	separatorlabel_startZname_endnameZremaining_textr,   r7   exemplar	label_endlabelrD   rE   r   r   r   _parse_sample   s$    



rX   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 )NrB   r/   r   r7   #exemplarspaceexemplarhashr@   exemplarstartoflabelsrN   r<   exemplarparsedlabelsZexemplarvaluespaceZexemplarvalueZexemplartimestamp)r[   rZ   r\   r]   c                 s   s"   | ]\}}t |t | V  qd S r   )rJ   ).0kvr   r   r   	<genexpr>c      z(_parse_remaining_text.<locals>.<genexpr>   zExemplar labels are too long: )r2   r-   rJ   iterr"   r*   rI   rQ   rM   r:   sumitemsr   )r   Z
split_textvalr7   Zexemplar_valueZexemplar_timestampZexemplar_labelsrC   itr&   rS   rV   r9   rU   Zexemplar_lengthr   r   r   rP     s    












rP   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)rT   rD   copy)samplerT   typdr   r   r   _group_for_sampleo  s    


rv   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_sumrT   r,   r   r   	do_checks  s    z#_check_histogram.<locals>.do_checksrn   Fr   rp   rq   TzBuckets out of order: zBucket values out of order: )_count_gcount)_sum)_gsum)rT   rJ   rv   r7   r   rD   r*   r,   )	samplesrT   r   r7   ry   r   suffixgbr   rw   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!   rz   r|   r   )rz   r|   rp   r   )r{   r}   rp   _info)counterrj   rn   ro   ri   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: )ri   rl   z(Units not allowed for this metric type: rm   )setgetr*   addendswithr   r   r~   )rT   documentationrt   unitr~   r   Zmetric)
seen_namestype_suffixesr   r   build_metric  s&    
z0text_fd_to_metric_families.<locals>.build_metricrH   r   zReceived line after # EOF: zReceived blank linez# EOFTrY   rB         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    )rT   r   r   
<listcomp>  rb   z.text_fd_to_metric_families.<locals>.<listcomp>r!   ZUNITzMore than one UNIT for metric: r   rl   zStateset missing label: rp   rq   NaNzInvalid le label: z!Bucket value must be an integer: rz   r{   z Count value must be an integer: rj   r   rk   zInvalid quantile label: zInvalid metric grouping: z*Mix of timestamp presence within a group: ri   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   r|   rz   rp   r{   r}   z$Counter-like samples cannot be NaN: )r   r|   rz   rp   r{   z)Counter-like samples cannot be negative: rm   )r   zTInvalid line only histogram/gaugehistogram buckets and counters can have exemplars: zMissing # EOF at end)r   r*   rK   r2   rJ   r'   r   rX   rT   rD   r   
isinstancer,   r+   
is_integerr   tuplesortedrv   rf   r7   r"   r   r4   r5   rU   r   )fdZallowed_nameseofr   liner8   r~   r   rt   r   r   Zseen_groupsZgroup_timestampZgroup_timestamp_samplesrs   r   Z	series_idr   )rT   r   r   r   r	     s   	









 

 


"$


r	   )!ior
   r4   reZmetrics_corer   r   r~   r   r   r   utilsr   r   r   r   r   r   r   compiler   r   r'   r-   r:   r;   rG   rM   rX   rP   rv   r   r	   r   r   r   r   <module>   s4   


BDV;