o
    pfmV                     @   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   ]/home/ertert/spirit/venv/lib/python3.10/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 ]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   result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r:   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 )Nstartoflabelnamer   }endoflabels	labelname=labelvaluequoter   
labelvalueInvalid line: r   labelvalueslashr!   zInvalid line, bad label name: z$Invalid line, duplicate label name: endoflabelvalue,r    r    r/   )r"   r*   r#   r   r   )r   staterA   rD   labels
labels_lenr&   lnr   r   r    _parse_labels_with_state_machinet   sn   


rN   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 )NrB   r/   r   r   rH   r   zinvalid line, bad label name: z$invalid line, duplicate label name: zInvalid labels: )r*   indexlenr=   r   r   r   
startswith)
r   rK   
sub_labelsvalue_start
label_namevalue_substri	quote_endlabel_value
next_commar   r   r   _parse_labels   sX   


3r[   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 # {rO   rI   r/   r?   r   )findrP   _parse_remaining_textr   rindexr[   rN   rQ   )r   	separatorlabel_startname_endnameremaining_textr,   r7   exemplar	label_endlabelrK   rL   r   r   r   _parse_sample   s$   



rh   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 )NrI   r/   r   r7   #exemplarspaceexemplarhashrE   exemplarstartoflabelsr\   r?   exemplarparsedlabelsexemplarvaluespaceexemplarvalueexemplartimestamp)rk   rj   rl   rm   c                 s   s$    | ]\}}t |t | V  qd S r   )rQ   ).0kvr   r   r   	<genexpr>c  s   " z(_parse_remaining_text.<locals>.<genexpr>   zExemplar labels are too long: )r2   r-   rQ   iterr"   r*   rP   r_   r[   r:   sumitemsr   )r   
split_textvalr7   exemplar_valueexemplar_timestampexemplar_labelsrJ   itr&   ra   rf   r9   re   exemplar_lengthr   r   r   r^     s   




r^   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)rc   rK   copy)samplerc   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counthas_gsumhas_negative_bucketshas_negative_gsumhas_sumrc   r,   r   r   	do_checks  s   z#_check_histogram.<locals>.do_checksr   Fr   r   r   TzBuckets out of order: zBucket values out of order: )_count_gcount)_sum)_gsum)rc   rQ   r   r7   r   rK   r*   r,   )	samplesrc   r   r7   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   r   r   )r   r   r   _info)counterr   r   r   r   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: )r   r   z(Units not allowed for this metric type: r   )setgetr*   addendswithr   r   r   )rc   documentationr   unitr   r   metric)
seen_namestype_suffixesr   r   build_metric  s&   
z0text_fd_to_metric_families.<locals>.build_metricrO   r   zReceived line after # EOF: zReceived blank linez# EOFTri   rI         rE   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   )rq   r    )rc   r   r   
<listcomp>  s    z.text_fd_to_metric_families.<locals>.<listcomp>r!   UNITzMore than one UNIT for metric: r   r   zStateset missing label: r   r   NaNzInvalid le label: z!Bucket value must be an integer: r   r   z Count value must be an integer: r   r   r   zInvalid quantile label: zInvalid metric grouping: z*Mix of timestamp presence within a group: r   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   r   r   r   z$Counter-like samples cannot be NaN: )r   r   r   r   r   z)Counter-like samples cannot be negative: r   )r   zTInvalid line only histogram/gaugehistogram buckets and counters can have exemplars: zMissing # EOF at end)r   r*   rR   r2   rQ   r'   r   rh   rc   rK   r   
isinstancer,   r+   
is_integerr   tuplesortedr   rx   r7   r"   r   r4   r5   re   r   )fdallowed_nameseofr   liner8   r   r   r   r   r   seen_groupsgroup_timestampgroup_timestamp_samplesr   r   	series_idr   )rc   r   r   r   r	     s
  	





 
* 


"$
r	   )!ior
   r4   remetrics_corer   r   r   r   r   r   utilsr   r   r   r   r   r   r   compiler   r   r'   r-   r:   r=   rN   r[   rh   r^   r   r   r	   r   r   r   r   <module>   s6   


BDV;