o
    ⹏i01                  	   @   s  d dl Zd dlZd dlZd dlmZmZmZmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZmZmZ dedee fd	d
ZddddZdee defddZedZedZdedefddZdedefddZdededefddZd6dededeeef fdd Z dededeeeef fd!d"Z!d7ded#e	e d$edefd%d&Z"ded#e	e defd'd(Z#d7d)d*Z$d+d, Z%dedee&e	e& f fd-d.Z'd/d0 Z(d1d2 Z)d3e
dee fd4d5Z*dS )8    N)DictIterableListMatchOptionalTextIOTuple   )Metric)Sample)_is_valid_legacy_metric_name_validate_labelname_validate_metric_nametextreturnc                 c   s    t t| E dH  dS )z]Parse Prometheus text format from a unicode string.

    See text_fd_to_metric_families.
    N)text_fd_to_metric_familiesStringIO)r    r   U/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/prometheus_client/parser.pytext_string_to_metric_families   s   r   \
")z\\z\nz\"matchc                 C   s   t | d S )Nr   )ESCAPE_SEQUENCESgroup)r   r   r   r   replace_escape_sequence   s   r   z\\[\\n]z\\[\\n"]sc                 C      t t| S N)HELP_ESCAPING_REsubr   r   r   r   r   _replace_help_escaping$      r#   c                 C   r   r   )ESCAPING_REr!   r   r"   r   r   r   _replace_escaping(   r$   r&   charposc                 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'   num_bslashesr   r   r   _is_character_escaped,   s   r*   Flabels_stringopenmetricsc                 C   sV  i }|   }|r|r|d dkrtd|  z|rt||\}}}|s,|r+td|  qt|\}}|s<t|s<td|rD|d dkrFtd}|t|k rh|d|}t|d | |s^n
|d7 }|t|k sN|d }	|	t|krxtd|  t|\}
}|d	krt| nt	| ||v rtd
|  |
||< |s|W S  ty   td|  w )Nr   ,zleading comma: zempty term in line: zunquoted UTF-8 metric namer   r	   zunexpected text after quote: __name__z$invalid line, duplicate label name: zInvalid labels: )
strip
ValueError
_next_term_unquote_unescaper   lenindexr*   r   r   )r+   r,   labels
sub_labels	name_term
value_term
label_namequoted_namei	quote_endlabel_value_r   r   r   parse_labels4   sL   
(r?   c                 C   s   | d dkr| dd } | sdS | d dkrt dt| d}|dkr=| | dkr=| d| }| |d d } t| d	}nd
}|dkrGt| }| d| }|sV|rVt d|| |d }|| | fS )a  Extract the next comma-separated label term from the text. The results
    are stripped terms for the label name, label value, and then the remainder
    of the string including the final , or }.
    
    Raises ValueError if the term is empty and we're in openmetrics mode.
    r   r-   r	   N) r@   r@   zmultiple commasz=,}=z,}r.   zempty term:)r0   _next_unquoted_charr3   r/   )r   r,   splitpos	labelnametermrestr   r   r   r1   j   s&   	

r1   chsstartidxc                 C   sd   d}|du r	t j}t| |d D ]\}}|dkr#t| || s#| }|s/||v r/||   S qdS )zReturn position of next unquoted character in tuple, or -1 if not found.
    
    It is always assumed that the first character being checked is not already
    inside quotes.
    FNr   rB   )string
whitespace	enumerater*   )r   rH   rI   	in_quotesr;   cr   r   r   rC      s   rC   c                 C   sj   t | d }d}|du rtj}|dkr3| | dkr!t| |s!| }|s+| | |v r+|S |d8 }|dksdS )zGReturn position of last unquoted character in list, or -1 if not found.r	   FNr   r   rB   )r3   rJ   rK   r*   )r   rH   r;   rM   r   r   r   _last_unquoted_char   s   rO   c                 C   s   dg}d}|t | k rWt| ||}|dkr"| |d |d< t | }q||kr+|d7 }q|dkr@t ||kr@| |d |d< 	 |S | || |d< |d }|d |t | k s|S )zfSplits on split_ch similarly to strings.split, skipping separators if
    they are inside quotes.
    r@   r   rB   Nr	   )r3   rC   append)r   	separatormaxsplittokensx	split_posr   r   r   _split_quoted   s(   
rV   c                 C   sl   | s| dfS d}|   } | d dkr*t| dks| d dkr"td| dd } d}d| v r2t| } | |fS )	z.Returns the string, and true if it was quoted.Fr   r   r	   rB   zmissing close quoteTr   )r/   r3   r0   r&   )r   quotedr   r   r   r2      s   r2   c                 C   sp   |   } d}|| vrd}dd | |D }|st| d fS t|d }t|dkr2t|d d nd }||fS )	N 	c                 S   s   g | ]
}|  r|  qS r   )r/   ).0valuer   r   r   
<listcomp>   s    z._parse_value_and_timestamp.<locals>.<listcomp>r   r	   rB   i  )lstripsplitfloat_parse_valuer3   )r   rQ   valuesr[   	timestampr   r   r   _parse_value_and_timestamp   s    rc   c                 C   sR   d | } | |  ksd| v rtd| zt| W S  ty(   t|  Y S w )Nr@   r>   zInvalid value: )joinr/   r0   intr_   )r[   r   r   r   r`      s   

r`   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  d| }t| |d | d}	|smd	|	vret|	d	 }|	d	= nd	|	v rutd
| |d d  }t|\}}t||	||S )Nz # {rB   z 	zinvalid metric name:r	   }Fr.   z$metric name specified more than once)rC   r/   r   r0   rc   r   r?   )
r   rQ   label_startname_endnameremaining_textr[   rb   	label_endr5   r   r   r   _parse_sample   s.   

rm   fdc              
   #   s0   d d}d}g }g }dt dt dt dtt dtf
dd	}| D ]}| }|d
rt|dd}t|dk r6qd\}}	t|dkr]|d dkrM|d dkrMqt|d \}}	|	s]t	|s]t
|d dkr| kr| dkrs| |||V  | d}g }|g}t|dkrt|d }qd}q|d dkrt|dk rt
| kr dkr| |||V  | d}g }|d }dgdgg dg dd|dg} fdd|D }q|dkrqt|}
|
j|vr dkr| |||V  d d}d}g }g }||
d |||
gV  q||
 q dkr| |||V  dS dS )zParse 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.
    r@   untypedrj   documentationtypsamplesr   c                 S   sn   |dkr,|  dr| d d } ng }|D ]}|t|d d g|dd  R   |}qt| ||}||_|S )Ncounter_totalir   r	   )endswithrP   r   r
   rr   )rj   rp   rq   rr   new_samplesr   metricr   r   r   build_metric"  s   
&z0text_fd_to_metric_families.<locals>.build_metric#N   r(   )r@   Fr	   TYPEHELP   )_count_sumr@   )r~   r   _bucket)rs   gaugesummary	histogramc                    s   g | ]} | qS r   r   )rZ   nrj   r   r   r\   ^  s    z.text_fd_to_metric_families.<locals>.<listcomp>r   )strr   r   r
   r/   
startswithrV   r3   r2   r   r0   r#   getrm   rj   rP   )rn   rp   rq   rr   allowed_namesrx   linepartscandidate_namerW   sampler   r   r   r     s   	"


r   )F)r   )+ior   rerJ   typingr   r   r   r   r   r   r   metrics_corer
   rr   r   
validationr   r   r   r   r   r   r   compiler    r%   r#   r&   re   boolr*   r?   r1   rC   rO   rV   r2   r_   rc   r`   rm   r   r   r   r   r   <module>   s8    $	

  6 "

