o
    );ciV                     @   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   o/Users/cmarchbanks/go/src/github.com/prometheus/client_python/build/lib/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 ]8}|r2|dkr| d n|dkr| d n|dkr(| d n| d|  d}q|dkr9d}q| | q|rF| d d|S )NFr   r   nr   T )appendjoin)r   resultZslashcharr   r   r   _unescape_help1   s$   

r&   c                 C   sR   d | } | |  ksd| v rtd| zt| W S  ty(   t|  Y S w )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 rtd| ztt| dW S  tyj   z| dd}tt|d t|d d d ddW  Y S  tyi   t| }t	|s\t
|rctd| | Y  Y S w w )	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   sP   d}||kr"| |d |  dkr"|d7 }||kr"| |d |  dks|d dkS )Nr   r.   r   r   r   )r   charposnum_bslashesr   r   r   _is_character_escapedl   s   r<   c                 C   s  d}g }g }i }d}| D ]}|dkr!|dkrd}nd}| | n|dkr2|dkr,d}n| | n|dkrC|dkr=d	}ntd
|  |d	kr|dkrNd}n|dkrzd|}t|sbtd|  ||v rltd|  d|||< g }g }d}n]| | nW|dkr|dkrd}nL|dkrd}nEtd
|  |dkrd	}|dkr| d n/|dkr| d n%|dkr| d n| d|  n|dkr|dkr ||fS 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   sn   


rG   c           
      C   s  i }| r
d| vr
t | }z|r|d}|d | }||d d  }|r*|d dkr,t |dd  }|r:|d dkr<t |rD|d dkrFt d}|t|k rh|d|}t|d | |s^n
|d7 }|t|k sN|d }|d| }d|v rzt|}t|st d|  ||v rt d	|  |||< ||d d  }|drd}	nd}	||	d  }|r|	dkrt |s|W S  t y   t d
|  w )Nr?   r.   r   r   rB   r   zinvalid line, bad label name: z$invalid line, duplicate label name: zInvalid labels: )r)   indexlenr<   r   r   r   
startswith)
r   rE   
sub_labelsvalue_start
label_namevalue_substri	quote_endlabel_value
next_commar   r   r   _parse_labels   sX   


3rT   c                 C   s   d}|  d}|dks|| d | v r5| d}| d | }| |d d  }t|\}}}t|i |||S | d | }|| vrQ| d}	| |d |	 }
t|
}nt| |d d  \}}|t| }	| |	d d  }t|\}}}t|||||S )Nz # {rH   rC   r.   r=   r   )findrI   _parse_remaining_textr   rindexrT   rG   rJ   )r   	separatorlabel_startname_endnameZremaining_textr+   r6   exemplar	label_endlabelrE   rF   r   r   r   _parse_sample   s$   



r`   c                 C   sH  |  dd}t|d }t|dkr|d d fS g }g }g }d }d}|d } t| }|D ]}	|dkrG|	dkr:|s:d}q+|	dkrAd}q+||	 q+|dkrX|	dkrRd}q+td|  |dkri|	dkrcd	}q+td|  |d	kr|	d
kr| d
| d}
}t| |
d | }d}q+td|  |dkr|	dkrd}q+|dkr|	dkrd}q+td|  |dkr|	dkr|std|  |	dkrd}q+||	 q+|dkr||	 q+|dkr|std|  |dkr|std|  |dv rtd|  t	|}d }|d urt
dd | D }|dkrtd|  t|t|t	|}|||fS )NrC   r.   r   r6   #exemplarspaceexemplarhashrA   exemplarstartoflabelsrU   r=   exemplarparsedlabelsZexemplarvaluespaceZexemplarvalueZexemplartimestamp)rc   rb   rd   re   c                 s   s$    | ]\}}t |t | V  qd S r   )rJ   ).0kvr   r   r   	<genexpr>c  s   " z(_parse_remaining_text.<locals>.<genexpr>   zExemplar labels are too long: )r1   r,   rJ   iterr"   r)   rI   rX   rT   r9   sumitemsr   )r   Z
split_textvalr6   Zexemplar_valueZexemplar_timestampZexemplar_labelsrD   itr%   rZ   r^   r8   r]   Zexemplar_lengthr   r   r   rW     s   




rW   c                 C   s~   |dkri S |dkr| j |kr| j }|d= |S |dkr'| j }||= |S |dv r<| j |d kr<| j }|d= |S | jS )Ninfosummaryquantilestateset	histogramgaugehistogram_bucketle)r\   rE   copy)sampler\   typdr   r   r   _group_for_sampleo  s   


r}   c           	         s>  d }d } fdd}| D ]}|j td  }t|d}||ks-|j|krB|d ur4|  d d  ddddd|}|j}|dkrwt|jd }|dk rXd d urf| krftd	 |jk rqtd
 | |jq|dv r|jq|dv rdq|dv rd|jdk rdq|d ur|  d S d S )Nc                      s    t dkrtd d urkrtd r&d u r&td r2d u r2td s@s@d ur@td rJrJtd sTrVtd d S 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   bucketcountZhas_gsumZhas_negative_bucketsZhas_negative_gsumZhas_sumr\   r+   r   r   	do_checks  s   z#_check_histogram.<locals>.do_checksru   Fr   rw   rx   TzBuckets out of order: zBucket values out of order: )_count_gcount)_sum)_gsum)r\   rJ   r}   r6   r   rE   r)   r+   )	samplesr\   r   r6   r   r   suffixgbr   r~   r   _check_histogram  sP   


r   c                 #   s   d g }d}t  ddgg dg dg ddgd	fd
d}| D ]}|d dkr3|dd }|r;td| |sAtd|dkrHd}q$|dr|dd}t|dk r_td| |d  krm|rmtd| |d  kr dur| |||	|V  |d  d}	d}d}d}
t  }d}t  }g }|d g}|d dkr|durtd| t|d }q$|d dkr|durtd| |d }|dkrtd|  fd d!|d"gD }q$|d d#kr|	durtd$| |d }	q$td| t|}|j|vr+ dur| |||	|V  |j d}d}	d%}g }d}
d}t  }t  }|jg}|d&kr< |j	vr<td'|  d( |jkr\|j	d)d*d*ksVt
|j	d) r\td+|  d( |jkrwt|jtsw|j swtd,|  d- |jks d. |jkrt|jts|j st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r||
kr|jdu |du krtd5| |dur||jkr|d6krtd7| nt  }|jtt|j	 f}|j|ks4||vr9|| || |}
|j}|| |d&krY|jd8vrYtd9| |d6krj|jdkrjtd:| |d0kr |jkr|jd1k rtd;| |jt d d<v rt|jrtd=| |jt d d>v r|jd1k rtd?| |jr|d@v r|jd(s|dAv r|jdstdB| q$ 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!   r   r   r   )r   r   rw   r   )r   r   rw   _info)counterrq   ru   rv   rp   c                    s   |d u rd}t |g dg D ]}| |  v r!td|  |  | |  q|d u r/d}|d u r5d}|rD| d| sDtd|  |rP|dv rPtd|  |dv rYt||  t| |||}||_|S )	Nunknownr!   zClashing name: r'   z!Unit does not match metric name: )rp   rs   z(Units not allowed for this metric type: rt   )setgetr)   addendswithr   r   r   )r\   documentationr{   unitr   r   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# EOFTra   rC         rA   r   z!Received metadata after samples: r.   HELPzMore than one HELP for metric: TYPEzMore than one TYPE for metric: untypedzInvalid TYPE for metric: c                    s   g | ]} | qS r   r   )rf   r    )r\   r   r   
<listcomp>  s    z.text_fd_to_metric_families.<locals>.<listcomp>r!   ZUNITzMore than one UNIT for metric: r   rs   zStateset missing label: rw   rx   NaNzInvalid le label: z!Bucket value must be an integer: r   r   z Count value must be an integer: rq   r   rr   zInvalid quantile label: zInvalid metric grouping: z*Mix of timestamp presence within a group: rp   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   r   rw   r   r   z$Counter-like samples cannot be NaN: )r   r   r   rw   r   z)Counter-like samples cannot be negative: rt   )r   zTInvalid line only histogram/gaugehistogram buckets and counters can have exemplars: zMissing # EOF at end)r   r)   rK   r1   rJ   r&   r   r`   r\   rE   r   
isinstancer+   r*   
is_integerr   tuplesortedr}   rm   r6   r"   r   r3   r4   r]   r   )fdallowed_nameseofr   liner7   r   r   r{   r   r   Zseen_groupsZgroup_timestampZgroup_timestamp_samplesrz   r   Z	series_idr   )r\   r   r   r   r	     s
  	





 
* 


"$
r	   )!ior
   r3   remetrics_corer   r   r   r   r   r   utilsr   r   r   r   r   r   r   compiler   r   r&   r,   r9   r<   rG   rT   r`   rW   r}   r   r	   r   r   r   r   <module>   s6   


BDV;