
    ]CimV                         S SK rS SKrS SKrSSKJrJr  SSKJrJ	r	J
r
  SSKJr  S r\" S5      1rS rS	S
SS.rS r\R&                  " S5      rS rS rS rS rS rS rS rS rS rS rS rS r g)    N   )MetricMETRIC_LABEL_NAME_RE)ExemplarSample	Timestamp)floatToGoStringc              #   ^   #    [        [        R                  " U 5      5       Sh  vN   g N7f)zVParse Openmetrics text format from a unicode string.

See text_fd_to_metric_families.
N)text_fd_to_metric_familiesStringIO)texts    ^/home/james-whalen/.local/lib/python3.13/site-packages/prometheus_client/openmetrics/parser.pytext_string_to_metric_familiesr      s      
 *(*;*;D*ABBBs   #-+-infc                 J    [        U 5      nU[        ;  a  gU [        U5      :g  $ )NF)float_CANONICAL_NUMBERSr	   )sfs     r   _isUncanonicalNumberr      s'    aA"""""    \
")z\\z\nz\"c                 2    [         U R                  S5         $ )Nr   )ESCAPE_SEQUENCESgroup)matchs    r   _replace_escape_sequencer   &   s    EKKN++r   z\\[\\n"]c                 6    [         R                  [        U 5      $ N)ESCAPING_REsubr   )r   s    r   _replace_escapingr$   -   s    ??3Q77r   c                 r   / nSnU  H  nU(       a`  US:X  a  UR                  S5        ODUS:X  a  UR                  S5        O,US:X  a  UR                  S5        OUR                  SU-   5        SnMj  US:X  a  SnMt  UR                  U5        M     U(       a  UR                  S5        SR                  U5      $ )NFr   r   nr   T )appendjoin)r   resultslashchars       r   _unescape_helpr-   1   s    FEt|d#c"d#dTk*Et|d# " d776?r   c                     SR                  U 5      n X R                  5       :w  d  SU ;   a  [        SU < 35      e [        U 5      $ ! [         a    [	        U 5      s $ f = f)Nr'   _zInvalid value: )r)   strip
ValueErrorintr   )values    r   _parse_valuer4   L   s[    GGENE?5)4555z U|s   
A AAc           
      ,   SR                  U 5      n U (       d  g X R                  5       :w  d  SU ;   a  [        SU < 35      e [        [	        U 5      S5      $ ! [         a     U R                  SS5      n[        [	        US   5      [	        US   S S R                  SS5      5      5      s $ ! [         aW    [        U 5      n[        R                  " U5      (       d  [        R                  " U5      (       a  [        SU < 35      eUs s $ f = ff = f)	Nr'   r/   zInvalid timestamp: r   .   	   0)r)   r0   r1   r   r2   splitljustr   mathisnanisinf)	timestamppartstss      r   _parse_timestamprB   V   s    	"IOO%%	)9.ym<==Y++ 
		OOC+ESq]Ca!0B0B1c0J,KLL 	y!Bzz"~~B #6ym!DEEI	
s2   A 
D#AB.+D.AD
DDDc                 p    SnX:  a(  XS-
  U-
     S:X  a  US-  nX:  a  XS-
  U-
     S:X  a  M  US-  S:H  $ )Nr   r7   r   r    )r   charposnum_bslashess      r   _is_character_escapedrG   l   sW    L!1|+,4 !1|+,4!q  r   c                 x   Sn/ n/ n0 nSnU  GH  nUS:X  a  US:X  a  SnGOSnUR                  U5        GOyUS:X  a  US:X  a  SnGOiUR                  U5        GOVUS:X  a  US:X  a  S	nGOF[        S
U -   5      eUS	:X  a  US:X  a  SnGO(US:X  ag  SR                  U5      n[        R                  " U5      (       d  [        SU -   5      eXt;   a  [        SU -   5      eSR                  U5      XG'   / n/ nSnOUR                  U5        OUS:X  a   US:X  a  SnOUS:X  a  SnO[        S
U -   5      eUS:X  a_  S	nUS:X  a  UR                  S5        OcUS:X  a  UR                  S5        OKUS:X  a  UR                  S5        O3UR                  SU-   5        OUS:X  a  US:X  a    XE4$ [        S
U -   5      eUS-  nGM     XE4$ )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    r7   )r(   r1   r)   r   r   )r   staterL   rO   labels
labels_lenr,   lns           r    _parse_labels_with_state_machinerY   t   s   EIJFJ&&s{%#  &k!s{)  &''s{$ !1D!899l"t|)WWY'+11"55$%E%LMM<$%Kd%RSSWWZ0
	
)!!$'''s{#% !1D!899'' Et|!!$'!!$'!!#&!!$+.m#s{  !!1D!899a
m n r   c                    0 nU (       a  SU ;  a  [         eU n U(       GaP  UR                  S5      nUS U nX#S-   S  nU(       a	  US   S:w  a  [         eUSS  nU(       a	  US   S:X  a  [         eU(       a	  US   S:X  a  [         eSnU[        U5      :  a=  UR                  SU5      n[        US U U5      (       d  OUS-  nU[        U5      :  a  M=  US-   nUSU nSU;   a  [	        U5      n[
        R                  " U5      (       d  [        SU -   5      eXA;   a  [        S	U -   5      eXU'   X'S-   S  nUR                  S5      (       a  Sn	OSn	X)S  nU(       a  U	S:X  a  [         eU(       a  GMP  U$ ! [          a    [        S
U -   5      ef = f)NrM   r7   r   r   rS   r   zinvalid line, bad label name: z$invalid line, duplicate label name: zInvalid labels: )r1   indexlenrG   r$   r   r   
startswith)
r   rV   
sub_labelsvalue_start
label_namevalue_substri	quote_endlabel_value
next_commas
             r   _parse_labelsrg      s   F 4 J84$**3/K#L[1J#!O$45J A#!5   &ab>L A#!5  <#3s#:   Ac,'' &&sA.,\"1-=qAAQ	 c,'' AI$Qy1K{"/<'--j99 !AD!HII# !G$!NOO!,: $MN3J$$S))

#K0J jAo  c jf  4+d2334s   B8E3 BE3 1E3 3Fc                    SnU R                  S5      nUS:X  d  XS U ;   a9  U R                  S5      nU S U nXS-   S  n[        U5      u  pgn[        U0 XgU5      $ U S U nX;  a$  U R	                  S5      n	XS-   U	 n
[        U
5      nO [        XS-   S  5      u  pU[        U5      -   n	X	S-   S  n[        U5      u  pgn[        XKXgU5      $ )Nz # {r[   rT   r7   rJ   r   )findr\   _parse_remaining_textr   rindexrg   rY   r]   )r   	separatorlabel_startname_endnameremaining_textr3   r?   exemplar	label_endlabelrV   rW   s                r   _parse_sampleru      s    I))C.KbIl{);;::c?IXlm,%:>%J"(dB(;;D KK$	1_Y/u% >dQR?CS>TUT*	a-.)N!6~!FEh$(;;r   c                    U R                  SS5      n[        US   5      n[        U5      S:X  a  US S 4$ / n/ n/ nS nSnUS   n [        U 5      nU GHM  n	US:X  a.  U	S:X  a  U(       d  SnM  U	S:X  a  SnM%  UR	                  U	5        M8  US:X  a  U	S:X  a  SnMH  [        SU -   5      eUS:X  a  U	S:X  a  S	nMf  [        SU -   5      eUS	:X  aI  U	S
:X  a5  U R                  S
5      U R                  S5      p[        X
S-   U 5      nSnM  [        SU -   5      eUS:X  a  U	S:X  a  SnM  M  US:X  a  U	S:X  a  SnM  [        SU -   5      eUS:X  a:  U	S:X  a  U(       d  [        SU -   5      eU	S:X  a  SnGM  UR	                  U	5        GM3  US:X  d  GM<  UR	                  U	5        GMP     US:X  a  U(       d  [        SU -   5      eUS:X  a  U(       d  [        SU -   5      eUS;   a  [        SU -   5      e[        U5      nS nUbS  [        S UR                  5        5       5      nUS:  a  [        SU -   5      e[        U[        U5      [        U5      5      nX,U4$ )NrT   r7   r   r?   #exemplarspaceexemplarhashrP   exemplarstartoflabelsri   rJ   exemplarparsedlabelsexemplarvaluespaceexemplarvalueexemplartimestamp)ry   rx   rz   r{   c              3   T   #    U  H  u  p[        U5      [        U5      -   v   M      g 7fr!   )r]   ).0kvs      r   	<genexpr>(_parse_remaining_text.<locals>.<genexpr>c  s      R:Q$!c!fs1vo:Qs   &(   zExemplar labels are too long: )r:   r4   r]   iterr(   r1   r\   rl   rg   rB   sumitemsr   )r   
split_textvalr?   exemplar_valueexemplar_timestampexemplar_labelsrU   itr,   rn   rs   rA   rr   exemplar_lengths                  r   rk   rk     s   C#J
z!}
%C
:!D$INOEa=D	dBKs{9'&  &n$s{' !1D!899o%s{/ !1D!899--s{)-C$++c:JY"/1_Y0O"P. !1D!899,,s{, **s{' !1D!899o%s{> !1D!899+%%d+))%%d+S X 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                 L   US:X  a  0 $ US:X  a/  U R                   U:X  a  U R                  R                  5       nUS	 U$ US:X  a  U R                  R                  5       nX1	 U$ US;   a2  U R                   US-   :X  a  U R                  R                  5       nUS	 U$ U R                  $ )Ninfosummaryquantilestateset	histogramgaugehistogram_bucketle)rp   rV   copy)samplerp   typds       r   _group_for_sampler   o  s    
f}	
iFKK4/MM jM
jMM G
--&++	AQ2QMM dG==r   c                 r  ^^	^
^^^^^ S nS nU	U
UUUUUU4S jnU  GH  nUR                   [        T5      S  n[        UTS5      nXr:w  d  UR                  U:w  a  Ub  U" 5         S m
S m	SmSmSmSmSmUnUR                  nUS:X  ae  [	        UR
                  S   5      nUS:  a  SmT	b  UT	::  a  [        ST-   5      eUR                  T:  a  [        S	T-   5      eUm	UR                  mM  US
;   a  UR                  m
M  US;   a  SmM  US;   d  M  SmUR                  S:  d  GM
  SmGM     Ub  U" 5         g g )Nc                  ~  > T [        S5      :w  a  [        ST-   5      eTb  TT:w  a  [        ST-   5      eT(       a  Tc  [        ST-   5      eT(       a  Tc  [        ST-   5      eT(       d  T(       d  Tb  [        ST-   5      eT(       a  T(       a  [        ST-   5      eT(       d  T(       a  [        ST-   5      eg g )	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   r1   )bucketcounthas_gsumhas_negative_bucketshas_negative_gsumhas_sumrp   r3   s   r   	do_checks#_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   Fr   r   r   TzBuckets out of order: zBucket values out of order: )_count_gcount)_sum)_gsum)rp   r]   r   r?   r   rV   r1   r3   )samplesrp   r   r?   r   r   suffixgbr   r   r   r   r   r   r3   s    `       @@@@@@@r   _check_histogramr     sT   EI^ ^  D	
#a{3:	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{$(!C F  r   c           
   #     ^^#    Sn/ nSn[        5       mSS// SQ/ SQ/ SQS/S	.mUU4S
 jnU  GHy  nUS   S:X  a  USS nU(       a  [        SU-   5      eU(       d  [        S5      eUS:X  a  SnMC  UR                  S5      (       GaH  UR                  SS5      n[	        U5      S:  a  [        SU-   5      eUS   U:X  a  W(       a  [        SU-   5      eUS   U:w  a<  Ub  U" UWW	W
W5      v   US   nSn
Sn	SnSn[        5       nSn[        5       n/ nUS   /nUS   S:X  a"  Wb  [        SU-   5      e[        US   5      nGM  US   S:X  aR  W	b  [        SU-   5      eUS   n	U	S:X  a  [        SU-   5      eTR                  U	S/5       Vs/ s H  oU-   PM	     nnGMr  US   S :X  a  W
b  [        S!U-   5      eUS   n
GM  [        SU-   5      e[        U5      nUR                  U;  aJ  Ub  U" UWW	W
W5      v   UR                  nSnSn
S"n	/ nSnSn[        5       n[        5       nUR                  /nW	S#:X  a  UUR                  ;  a  [        S$U-   5      eUS%-   UR                  :X  aK  UR                  R                  S&S'5      S':X  d  [        UR                  S&   5      (       a  [        S(U-   5      eUS%-   UR                  :X  aL  [        UR                  [        5      (       d-  UR                  R                  5       (       d  [        S)U-   5      eUS*-   UR                  :X  d  US+-   UR                  :X  aL  [        UR                  [        5      (       d-  UR                  R                  5       (       d  [        S,U-   5      eU	S-:X  an  UUR                  :X  a^  S.[        UR                  R                  S/S5      5      s=::  a  S::  a   O  O[        UR                  S/   5      (       a  [        S0U-   5      e[!        [#        [%        UX5      R'                  5       5      5      nWb  UU:w  a  UW;   a  [        S1U-   5      eUbP  UU:X  aJ  UR(                  SL WSL :w  a  [        S2U-   5      eUb$  UUR(                  :  a  U	S3:w  a  [        S4U-   5      eO
[        5       nUR                  [!        [#        UR                  R'                  5       5      5      4nUR(                  W:w  d  UW;  a  WR+                  U5        WR-                  U5        UnUR(                  nWR-                  U5        U	S#:X  a  UR                  S5;  a  [        S6U-   5      eU	S3:X  a  UR                  S:w  a  [        S7U-   5      eU	S-:X  a.  UUR                  :X  a  UR                  S.:  a  [        S8U-   5      eUR                  [	        U5      S S9;   a3  [.        R0                  " UR                  5      (       a  [        S:U-   5      eUR                  [	        U5      S S;;   a  UR                  S.:  a  [        S<U-   5      eUR2                  (       d  GM  U	S=;   a#  UR                  R5                  S%5      (       a  GME  U	S>;   a#  UR                  R5                  S5      (       a  GMn  [        S?U-   5      e   Ub  U" UWW	W
W5      v   U(       d  [        S@5      egs  snf 7f)AzParse 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                   > Uc  Sn[        TR                  U/ 5      S/-   5       H/  nX-   T;   a  [        SU -   U-   5      eTR                  X-   5        M1     Uc  SnUc  SnU(       a'  U R	                  SU-   5      (       d  [        SU -   5      eU(       a  US;   a  [        SU -   5      eUS;   a  [        X@5        [        XX#5      nXFl        U$ )	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getr1   addendswithr   r   r   )	rp   documentationr   unitr   r   metric
seen_namestype_suffixess	          r   build_metric0text_fd_to_metric_families.<locals>.build_metric  s    ;C-++C4t;<F}
* !2T!9F!BCCNN4=) =  M<DcDj11@4GHHC//G$NOO11W+S7 r   r[   r   zReceived line after # EOF: zReceived blank linez# EOFTrw   rT         rP   r   z!Received metadata after samples: r7   HELPzMore than one HELP for metric: TYPEzMore than one TYPE for metric: untypedzInvalid TYPE for metric: 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   r7   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   r1   r^   r:   r]   r-   r   ru   rp   rV   r   
isinstancer3   r2   
is_integerr   tuplesortedr   r   r?   r(   r   r<   r=   rr   r   )fdrp   allowed_nameseofr   liner@   r   r   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, 8t9D:TABB2337?C__S!!JJsA&E5zA~ !1D!899Qx4G !Dt!KLLQx4#&t]CwOOQx $!e"&*-%'!&q
Qx6! ,$%F%MNN .uQx 8qV#?$%F%MNNAh)#$%@4%GHH3@3D3DS2$3O P3Oa3O PqV##$%F%MNNQx !1D!899"4(F{{-/#&t]CwOO{{ $"&*-%'!e!'j T%> !;d!BCCy FKK/**475@0t1DEE !5!<==y FKK/'c::6<<CZCZC\C\ !Dt!KLLFKK/4)3Cv{{3R'c::6<<CZCZC\C\ !Cd!JKKy TV[[%85):)::r)J#KPqP0z1JKK !;d!BCCf.vtAGGIJKA Q%ZA4D !<t!CDD Q%Z$$,/T2IJ$%QTX%XYY".?VEUEU3UZ]agZg$%QTX%XYY*-%'eF6==3F3F3H,I&JKI?2iG^6^v&#''	2E$..OOOAj V\\%? !WZ^!^__f}!2 !ID!PQQiDFKK$7FLL1<L !G$!NOO{{3t9:&*eejnjtjtLLk" k" !G$!NOO{{3t9:&*\\agamampqaq !Lt!STT;;@T@TU^@_@_{*v{{/C/CH/M/M !wz~!~o r 4T7CC/00 c !Qs%   F
[[R*[$[4$[9[)!ior   r<   remetrics_corer   r   r   r   r   r   utilsr	   r   r   r   r   r   r   compiler"   r$   r-   r4   rB   rG   rY   rg   ru   rk   r   r   r   rD   r   r   <module>r      s      	 7 1 1 #C El^ #  , jj%86,!?DA4H<>Sl&8vi1r   