o
    :Dia                     @   s   d dl Zd dlZd dlZddlmZ ddlmZmZm	Z	m
Z
mZmZ ddlmZmZmZmZmZ ddlmZ ddlmZ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,d- Z,dS ).    N   )Metric)_last_unquoted_char_next_unquoted_char_parse_value_split_quoted_unquote_unescapeparse_labels)
BucketSpanExemplarNativeHistogramSample	Timestamp)floatToGoString)_is_valid_legacy_metric_name_validate_metric_namec                 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/Datamplify/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_escaping2   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_help6   s$   

r0   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*   _zInvalid timestamp: r   .   	   0)r,   strip
ValueErrorr   intsplitljustr   mathisnanisinf)	timestamppartstsr   r   r   _parse_timestampQ   s$   
0rA   c                 C   sP   d}||kr"| |d |  dkr"|d7 }||kr"| |d |  dks|d dkS )Nr   r3   r   r   r   )r   charposnum_bslashesr   r   r   _is_character_escapedg   s   rD   c                 C   s  d}t | d}|dks|| d | v r?t | d}| d | }t|s(td|  | |d d  }t|\}}}t|i |||S | d | }t | d}	t| |d |	 d}
|sed	|
vr]t|
d	 }|
d	= nd	|
v rmtd
| |	d d  }t|\}}}t||
|||S )Nz # { zinvalid metric name:r3   }T__name__z$metric name specified more than oncer   )r   r   r7   _parse_remaining_textr   r	   )r   	separatorlabel_startname_endnameremaining_textvaluer>   exemplar	label_endlabelsr   r   r   _parse_sampleo   s.   


rT   c                 C   sb  |  dd}t|d }t|dkr|d d fS g }g }g }d }d}|d } t| }d}	|D ]}
|
dkr6|	 }	|	r9q-|dkrS|
dkrF|sFd}q-|
dkrMd	}q-||
 q-|d	krd|
dkr^d}q-td
|  |dkru|
dkrod}q-td
|  |dkr|
dkrt| d}t| d}t| |d | 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 rtd
|  t	|}d }|d ur,t
dd | D }|dkr"td|  t|t|t	|}|||fS )NrG   r3   r   r>   Fr    #exemplarspaceexemplarhashInvalid line: exemplarstartoflabelsrE   rH   Texemplarparsedlabelsexemplarvaluespaceexemplarvalueexemplartimestamp)rW   rV   rY   rZ   c                 s   s$    | ]\}}t |t | V  qd S r%   )len).0kvr   r   r   	<genexpr>   s   " z(_parse_remaining_text.<locals>.<genexpr>   zExemplar labels are too long: )r9   r   r^   iterr+   r7   r   r   r	   rA   sumitemsr   )r   
split_textvalr>   exemplar_valueexemplar_timestampexemplar_labelsstateit	in_quotesr/   rL   rR   r@   rQ   exemplar_lengthr   r   r   rJ      s   







rJ   c                 C   s  t | d}d}d}d}t | d}|dkrdS | | dkr,d}t | d| }}|dkr,tt | d|d	 }|dkr:dS t | d
|d	 }|dkrL||k rLdS t | d|}|dkrXt|r| |d	 | }	t|	d}
|}| d| }||rytd||sd|
vrt|
d }|
d= |
sd}
| |d }t|}t||
ddd|S | |d }|d	 }| d| }||rtd|t|}t|dddd|S )zJDetermines if the line has a native histogram sample, and parses it if so.rE   rF   r   Fz {NTrH   r3   rU   zIthe sample name of a native histogram with labels should have no suffixesrI   z=the sample name of a native histogram should have no suffixes)r   r7   r	   endswith_parse_nh_structr   )r   suffixeslabels_start
labels_endihas_metric_labelsnh_value_startrQ   nh_value_end
labelstextrS   rM   rN   nh_valuenat_hist_valuer   r   r   _parse_nh_sample   sZ   
	





r|   c                 C   s   d}t d}t d}tt || }|| }t|| }t|d }t|d }t|d }	t|d }
t|d }t|d	}t|d
}t|d}t|d}t|||	|
|||||d	S )Nz(\w+):\s*([^,}]+)z8(positive_spans|negative_spans):\[(\d+:\d+(,\d+:\d+)*)\]z8(positive_deltas|negative_deltas):\[(-?\d+(?:,-?\d+)*)\]countre   schemazero_threshold
zero_countpositive_spansnegative_spanspositive_deltasnegative_deltas)	count_value	sum_valuer~   r   r   	pos_spans	neg_spans
pos_deltas
neg_deltas)	recompiledictfindallr8   r   _compose_spans_compose_deltasr   )r   patternre_spans	re_deltasrf   span_matchesdeltasr   r   r~   r   r   r   r   r   r   r   r   r   rq   4  s4   






rq   c           
      C   st   i }| D ]}|d }dd |d  dD }|||< q||vr!dS g }|| D ]\}}|t|| q't|}	|	S )zTakes a list of span matches (expected to be a list of tuples) and a string 
    (the expected span list name) and processes the list so that the values extracted 
    from the span matches can be used to compose a tuple of BucketSpan objectsr   c                 S   s    g | ]}t tt|d qS ):)tuplemapr8   r9   )r_   pairr   r   r   
<listcomp>`  s     z"_compose_spans.<locals>.<listcomp>r3   ,N)r9   r+   r
   r   )
r   
spans_namespansr#   keyrP   	out_spansstartendout_spans_tupler   r   r   r   U  s   
r   c                 C   sF   || vrdS |  |}|dur| r|d}tdd |D }|S )zTakes a list of deltas matches (a dictionary) and a string (the expected delta list name),
    and processes its elements to compose a tuple of integers representing the deltasNr   c                 s   s    | ]	}t | V  qd S r%   )r8   r6   )r_   xr   r   r   rb   z  s    z"_compose_deltas.<locals>.<genexpr>)getr6   r9   r   )r   deltas_name
out_deltaselemsout_deltas_tupler   r   r   r   p  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)rN   rS   copy)samplerN   typdr   r   r   _group_for_sample~  s   


r   c           	         sL  d }d } fdd}| D ]}|j td  }t|d}t|dkr+q||ks4|j|krI|d ur;|  d d  ddddd|}|j}|dkr~t|jd }|dk r_d d urm| krmtd	 |jk rxt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   r7   r   bucketr}   has_gsumhas_negative_bucketshas_negative_gsumhas_sumrN   rP   r   r   	do_checks  s   z#_check_histogram.<locals>.do_checksr   r   Fr   r   TzBuckets out of order: zBucket values out of order: )_count_gcount)_sum)_gsum)rN   r^   r   r>   r   rS   r7   rP   )	samplesrN   r"   r>   r   r   suffixgbr   r   r   _check_histogram  sT   


r   c                 #   sh   d g }d}t  ddgg dg dg ddgd	fd
d}d}d}| D ]}|d dkr7|dd }|r?td| |sEtd|dkrLd}q(|drt|dd}t|dk rdtd| t|d \}}	|	stt|stt| kr|
rtd| | kr dur| ||||
V  | d}d}d}d}t  }d}t  }g }
|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| |d%kr$d}t	|t
d% }|du r#d}t|}nd}t|}|j|vrj|sj durA| ||||
V  t|j\}}	|	sRt|sRt| 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st|jd* rtd,|  d) |jkrt|jts|j std-|  d. |jksƈ d/ |jkrt|jts|j std0| |d1kr |jkrd2t|jd3d  krdkrn nt|jd3 rtd4| |st
tt| | }|dur+||kr+||v r+td5| |dur\||kr\|jdu |du krEtd6| |dur[||jkr[|d7kr[td8| nt  }|jt
t|j f}|j|ksv||vr{|
| || |}|j}|| n|
| |d'kr|jd9vrtd:| |d7kr|jdkrtd;| |d1krɈ |jkr|jd2k rtd<| |jt d d=v rt|jrtd>| |jt d d?v r|jd2k rtd@| |jr|dAv r
|jd)s|dBv r|jdstdC| q( dur+| ||||
V  |s2tdDdS )EzParse 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|  t| |||}||_|S )	Nunknownr*   zClashing name: r1   z!Unit does not match metric name: )r   r   z(Units not allowed for this metric type: r   )	setr   r7   addrp   r   r   r   r   )rN   documentationr   unitr   r   metric)
seen_namestype_suffixesr   r   build_metric  s(   
z0text_fd_to_metric_families.<locals>.build_metricrF   r   zReceived line after # EOF: zReceived blank linez# EOFTrU   rG         rX   r   z!Received metadata after samples: r3   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   )r_   r)   )rN   r   r   r   +  s    z.text_fd_to_metric_families.<locals>.<listcomp>r*   UNITzMore than one UNIT for metric: r   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   r3   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   r7   
startswithr   r^   r   r   r0   r   r|   r   rT   rN   rS   r   
isinstancerP   r8   
is_integerr   sortedr   rf   r>   r+   r   r;   r<   rQ   rp   )fdallowed_nameseofr   is_nhr   liner?   candidate_namequotedr   r   r   r"   seen_groupsgroup_timestampgroup_timestamp_samplesr   r   	series_idr   )rN   r   r   r   r     s.  	





 
* 


"$
r   )-ior   r;   r   metrics_corer   parserr   r   r   r   r   r	   r   r
   r   r   r   r   utilsr   
validationr   r   r   r   r   r   r!   r$   r   r&   r(   r0   rA   rD   rT   rJ   r|   rq   r   r   r   r   r   r   r   r   r   <module>   s<    

\J!=