
    Xha                     "   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 Z ed	      hZd
 ZddddZd Z ej<                  d      Zd Z d Z!d Z"d Z#d Z$d Z%d Z&d Z'd Z(d Z)d Z*d Z+d Z,y)    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              #   \   K   t        t        j                  |             E d{    y7 w)z^Parse Openmetrics text format from a unicode string.

    See text_fd_to_metric_families.
    N)text_fd_to_metric_familiesStringIO)texts    X/var/www/html/myenv/lib/python3.12/site-packages/prometheus_client/openmetrics/parser.pytext_string_to_metric_familiesr      s!     
 *(*;*;D*ABBBs   ",*,infc                 F    t        |       }|t        vry| t        |      k7  S )NF)float_CANONICAL_NUMBERSr   )sfs     r   _isUncanonicalNumberr      s'    aA"""""    \
")z\\z\nz\"c                 2    t         | j                  d         S )Nr   )ESCAPE_SEQUENCESgroup)matchs    r   _replace_escape_sequencer(   +   s    EKKN++r    z\\[\\n"]c                 6    t         j                  t        |       S N)ESCAPING_REsubr(   )r   s    r   _replace_escapingr-   2   s    ??3Q77r    c                 N   g }d}| D ]y  }|r\|dk(  r|j                  d       nB|dk(  r|j                  d       n+|dk(  r|j                  d       n|j                  d|z          d}a|dk(  rd}i|j                  |       { |r|j                  d       dj                  |      S )NFr!   r#   nr"   T )appendjoin)r   resultslashchars       r   _unescape_helpr6   6   s    FE $t|d#c"d#dTk*Et|d#$" d776?r    c           
         dj                  |       } | sy | | j                         k7  sd| v rt        d|       	 t        t	        |       d      S # t        $ r 	 | j                  dd      }t        t	        |d         t	        |d   d d j                  dd                  cY S # t        $ rJ t        |       }t        j                  |      st        j                  |      rt        d|       |cY cY S w xY ww xY w)	Nr0   _zInvalid timestamp: r   .   	   0)r2   strip
ValueErrorr   intsplitljustr   mathisnanisinf)	timestamppartstss      r   _parse_timestamprH   Q   s    	"IIOO%%	)9.ym<==Y++ 
		OOC+ESq]Ca!0B0B1c0J,KLL 	y!Bzz"~B #6ym!DEEI	
s1   A 	C<AB%"C<%AC83C<7C88C<c                 n    d}||kD  r'| |dz
  |z
     dk(  r|dz  }||kD  r| |dz
  |z
     dk(  r|dz  dk(  S )Nr   r:   r!   r    )r   charposnum_bslashess      r   _is_character_escapedrM   g   s_    L\!1|+,4 \!1|+,4!q  r    c                    d}t        | d      }|dk(  s|| d | v rPt        | d      }| d | }t        |      st        d| z         | |dz   d  }t        |      \  }}}t	        |i |||      S | d | }t        | d      }	t        | |dz   |	 d      }
|sd	|
vrt        |
d	   }|
d	= nd	|
v rt        d
      | |	dz   d  }t        |      \  }}}t	        ||
|||      S )Nz # { zinvalid metric name:r:   }T__name__z$metric name specified more than oncer   )r   r   r>   _parse_remaining_textr   r
   )r   	separatorlabel_startname_endnameremaining_textvaluerE   exemplar	label_endlabelss              r   _parse_sampler^   o   s'   I%dC0KbIl{);;&tS1IX+D13d:;;hlm,%:>%J"y(dBy(;;D#D#.I${Qy94@FV#j!:	v	?@@)a-.)N!6~!FE9h$y(;;r    c                 @   | j                  dd      }t        |d         }t        |      dk(  r|d d fS g }g }g }d }d}|d   } t        |       }d}	|D ](  }
|
dk(  r|	 }	|	r|dk(  r$|
dk(  r|sd}|
dk(  rd	}&|j	                  |
       8|d	k(  r|
dk(  rd}Et        d
| z         |dk(  r|
dk(  rd}`t        d
| z         |dk(  r@|
dk(  r-t        | d      }t        | d      }t        | |dz   | d      }d}t        d
| z         |dk(  r	|
dk(  sd}|dk(  r|
dk(  rd}t        d
| z         |dk(  r0|
dk(  r|st        d
| z         |
dk(  rd}|j	                  |
       |dk(  s|j	                  |
       + |dk(  r|st        d
| z         |dk(  r|st        d
| z         |dv rt        d
| z         t        |      }d }|Rt        d |j                         D              }|dkD  rt        d| z         t        |t        |      t        |            }|||fS )NrQ   r:   r   rE   Fr#   #exemplarspaceexemplarhashInvalid line: exemplarstartoflabelsrO   rR   Texemplarparsedlabelsexemplarvaluespaceexemplarvalueexemplartimestamp)rb   ra   rd   re   c              3   P   K   | ]  \  }}t        |      t        |      z      y wr*   )len).0kvs      r   	<genexpr>z(_parse_remaining_text.<locals>.<genexpr>   s      R$!Qc!fs1voRs   $&   zExemplar labels are too long: )r@   r   rj   iterr1   r>   r   r   r
   rH   sumitemsr   )r   
split_textvalrE   exemplar_valueexemplar_timestampexemplar_labelsstateit	in_quotesr5   rV   r\   rG   r[   exemplar_lengths                   r   rT   rT      s   C#J
z!}
%C
:!D$INOEa=D	dBI .,3;%IKs{9'&  &n$s{' !1D!899o%s{/ !1D!899--s{1$</c:	".tK!OI/NPT"U. !1D!899,,s{,**s{' !1D!899o%s{> !1D!899+%%d+))%%d+].,b I)D011 ##,>)D011 bb)D011	)	$BH"R/:O:O:QRRS =DEE(/0
 Hr    c                    t        | d      }d}d}d}t        | d      }|dk(  ry| |   dk(  rd}t        | d|      x}}|dk(  rt        t        | d|d	z         }|dk(  ryt        | d
|d	z         }|dk7  r||k  ryt        | d|      }|dk(  rt        |rp| |d	z   | }	t        |	d      }
|}| d| }|j                  |      rt        d|      |sd|
vrt        |
d   }|
d= |
sd}
| |d }t	        |      }t        ||
ddd|      S | |d }|d	z
  }| d| }|j                  |      rt        d|      t	        |      }t        |dddd|      S )zJDetermines if the line has a native histogram sample, and parses it if so.rO   rP   r   Fz {NTrR   r:   r`   zIthe sample name of a native histogram with labels should have no suffixesrS   z=the sample name of a native histogram should have no suffixes)r   r>   r
   endswith_parse_nh_structr   )r   suffixeslabels_start
labels_endihas_metric_labelsnh_value_startr[   nh_value_end
labelstextr]   rW   rX   nh_valuenat_hist_values                  r   _parse_nh_sampler      s   &tS1LJ 	
AD$'ABw Aw#~ ,T3::
Q )sAE:N #4a!e4H2~(^3&tS.ALr,*:6
j$/IX=="hjnoo'  *%Dz"()(3dFD$nEE (!A%IX=="\^bcc)(3dD$dNCCr    c                    d}t        j                  d      }t        j                  d      }t        t        j                  ||             }|j                  |       }t        |j                  |             }t	        |d         }t	        |d         }t	        |d         }	t        |d         }
t	        |d         }t        |d	      }t        |d
      }t        |d      }t        |d      }t        |||	|
|||||	      S )Nz(\w+):\s*([^,}]+)z8(positive_spans|negative_spans):\[(\d+:\d+(,\d+:\d+)*)\]z8(positive_deltas|negative_deltas):\[(-?\d+(?:,-?\d+)*)\]countrq   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findallr?   r   _compose_spans_compose_deltasr   )r   patternre_spans	re_deltasrr   span_matchesdeltasr   r   r   r   r   r   r   r   r   s                   r   r~   r~   4  s   "GzzUVH

VWIGT*+E##D)L)##D)*FeGn%KE%L!Ix!F5!123NU<()J|-=>I|-=>I ):;J ):;J%
 
r    c                 8   i }| D ]S  }|d   }|d   j                  d      D cg c]*  }t        t        t        |j                  d                  , }}|||<   U ||vryg }||   D ]   \  }}	|j	                  t        ||	             " t        |      }
|
S c c}w )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   r:   ,:N)r@   tuplemapr?   r1   r   )r   
spans_namespansr'   keypairrZ   	out_spansstartendout_spans_tuples              r   r   r   U  s     E Ah ?DAhnnS>QRds3

301RRc
 IJ' 1
s 	E3/01
 I&O Ss   /Bc                     || vry| j                  |      }|!|j                         r|j                  d      }t        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              3   N   K   | ]  }t        |j                                 y wr*   )r?   r=   )rk   xs     r   rn   z"_compose_deltas.<locals>.<genexpr>z  s     ;S^;s   #%)getr=   r@   r   )r   deltas_name
out_deltaselemsout_deltas_tuples        r   r   r   p  sW     & K(J*"2"2"4  % ;U;;r    c                 @   |dk(  ri S |dk(  r.| j                   |k(  r| j                  j                         }|d= |S |dk(  r| j                  j                         }||= |S |dv r1| j                   |dz   k(  r| j                  j                         }|d= |S | j                  S )Ninfosummaryquantilestateset	histogramgaugehistogram_bucketle)rX   r]   copy)samplerX   typds       r   _group_for_sampler   ~  s    
f}	
iFKK4/MM jM
jMM dG
--&++	AQ2QMM dG==r    c                 b  	
 d }d }	
fd}| D ]  }|j                   t              d  }t        |d      }t        |      dk(  r8||k7  s|j                  |k7  r| |        d 
d 	ddddd|}|j                  }|dk(  r`t	        |j
                  d         }|dk  rd	|	k  rt        dz         |j                  k  rt        d	z         |	|j                  |d
v r|j                  
|dv rd|dv sd|j                  dk  sd
 | |        y y )Nc                  "    t        d      k7  rt        dz         k7  rt        dz         rt        dz         rt        dz         sst        dz         rrt        dz         srt        dz         y y )	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>   )bucketr   has_gsumhas_negative_bucketshas_negative_gsumhas_sumrX   rZ   s   r   	do_checksz#_check_histogram.<locals>.do_checks  s    U6]"4t;<<%@4GHHu}JTQRRLtSTT8):PSWWXXGG$NOO#(9UX\\]] ):#r    r   r   Fr   r   TzBuckets out of order: zBucket values out of order: )_count_gcount)_sum)_gsum)rX   rj   r   rE   r   r]   r>   rZ   )samplesrX   r&   rE   r   r   suffixgbr   r   r   r   r   r   rZ   s    `       @@@@@@@r   _check_histogramr     sj   EI^ ^   #)D	
#a{3v;!:	1 EF#( GH %EKK	Yahhtn%A1u'+$!a6k !9D!@AAww !?$!FGGFGGE,,GGExGy Hww{$(!G#)J  r    c           
   #     K   d}g }d}t               ddgg dg dg ddgd	fd
}d}d}| D ]k  }|d   dk(  r|dd }|rt        d|z         |st        d      |dk(  rd}6|j                  d      rFt        |dd      }t	        |      dk  rt        d|z         t        |d         \  }	}
|
st        |	      st        |	|k(  rrt        d|z         |	|k7  r5| |||       |	}d}d}d}d}t               }d}t               }g }|	g}|d   dk(  r t        d|z         t        |d         }|d   dk(  rM|t        d|z         |d   }|dk(  rt        d|z         j                  |dg      D cg c]  }||z   	 }}a|d   d k(  rt        d!|z         |d   }t        d|z         |d"k(  r*d}t        |t        d"               }|d}t        |      }nd}t        |      }|j                  |vrl|sj| |||       t        |j                        \  }	}
|
st        |	      st        |	}d}d}d#}g }d}d}t               }t               }|j                  g}|d$k(  r||j                  vrt        d%|z         |d&z   |j                  k(  rE|j                  j                  d'd(      d(k(  st        |j                  d'         rt        d)|z         |d&z   |j                  k(  rBt        |j                   t"              s(|j                   j%                         st        d*|z         |d+z   |j                  k(  s|d,z   |j                  k(  rBt        |j                   t"              s(|j                   j%                         st        d-|z         |d.k(  rf||j                  k(  rWd/t'        |j                  j                  d0d            cxk  rdk  rn nt        |j                  d0         rt        d1|z         |s)t        t)        t+        |||      j-                                     }||k7  r|v rt        d2|z         |J||k(  rE|j.                  du du k7  rt        d3|z         |,||j.                  kD  r|d4k7  rt        d5|z         t               }|j                  t        t)        |j                  j-                                     f}|j.                  k7  s|vrj1                  |       j3                  |       |}|j.                  }j3                  |       nj1                  |       |d$k(  r|j                   d6vrt        d7|z         |d4k(  r|j                   dk7  rt        d8|z         |d.k(  r,||j                  k(  r|j                   d/k  rt        d9|z         |j                  t	        |      d d:v r-t5        j6                  |j                         rt        d;|z         |j                  t	        |      d d<v r|j                   d/k  rt        d=|z         |j8                  s|d>v r|j                  j;                  d&      r?|d?v r|j                  j;                  d      r`t        d@|z          | |||       |st        dA      yc c}w w)BzParse 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)r0   r   r   r   )r   r   r   r   )r   r   r   _info)counterr   r   r   r   c                    |d}t        j                  |g       dgz         D ].  }| |z   v rt        d| z   |z         j                  | |z          0 |d}|d}|r"| j	                  d|z         st        d| z         |r|dv rt        d| z         |dv rt        ||        t        |        t        | |||      }||_        |S )	Nunknownr0   zClashing name: r8   z!Unit does not match metric name: )r   r   z(Units not allowed for this metric type: r   )	setr   r>   addr}   r   r   r   r   )	rX   documentationr   unitr   r   metric
seen_namestype_suffixess	          r   build_metricz0text_fd_to_metric_families.<locals>.build_metric  s    ;C-++C4t;< 	*Ff}
* !2T!9F!BCCNN4&=)	*  M<DcDj1@4GHHC//G$NOO11Wd+d#mS$7 r    rP   r"   zReceived line after # EOF: zReceived blank linez# EOFTr`   rQ         rc   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: r0   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   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>   
startswithr   rj   r	   r   r6   r   r   r   r^   rX   r]   r   
isinstancerZ   r?   
is_integerr   sortedr   rr   rE   r1   r   rB   rC   r[   r}   )fdrX   allowed_nameseofr   is_nhr   linerF   candidate_namequotedr   r   r   r&   seen_groupsgroup_timestampgroup_timestamp_samplesr/   r   r   	series_idr   r   s                         @@r   r   r     s     DM
CJj)5>9	M. E
C J@8t9D:TABB2337?C__S!!$Q/E5zA~ !1D!899%6uQx%@"NF">~"N  %' !Dt!KLL%#&t]CwOO% $!e"&*-%'!/ 0Qx6! ,$%F%MNN .uQx 8qV#?$%F%MNNAh)#$%@4%GHH3@3D3DS2$3O Pa P PqV##$%F%MNNQx !1D!899k!)$mK6P0QR>!E*40F&t,{{-/#&t]CwOO):6;;)G&&B>&R$$% $"&*-%'!e!'j T%> !;d!BCCy FKK/**475@0t1DE !5!<==y FKK/'c:6<<CZCZC\ !Dt!KLLFKK/4)3Cv{{3R'c:6<<CZCZC\ !Cd!JKKy TV[[%85):)::r)J#KPqP0z1JK !;d!BCC&!264!E!K!K!MNO$e[8H$%@4%GHH$e((D0o6MN()UX\)\]]&2IYIY7Y^aek^k()UX\)\]].1e+#[[%v}}7J7J7L0M*NO	##6)Kb:bNN6*'++I6"("2"2"v&j V\\%? !WZ^!^__f}!2 !ID!PQQiDFKK$7FLL1<L !G$!NOO{{3t9:&*eejnjtjtLLk" !G$!NOO{{3t9:&*\\agamampqaq !Lt!STT;;@T@TU^@_{*v{{/C/CH/M !wz~!~UJ@X 4T7CC/00 C !Qs%   E?[Z?R?[[1[2[)-ior   rB   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-   r6   rH   rM   r^   rT   r   r~   r   r   r   r   r   rJ   r    r   <module>r     s      	 !  O N # LC El^ #  , bjj%86,!<>YxGDTB6&:z1r    