
    hk                     |   S SK r S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SKJ	r	J
r
JrJrJrJrJrJrJr  S SKJr  SSKJrJr  SSKJrJrJrJrJrJr  \	(       a  S SKqS SK J!q!  OSq!Sq\RD                  " \#5      r$ " S S	\5      r% " S
 S\\&\4   5      r' " S S\5      r(SS jr) " S S5      r* " S S\5      r+g)    N)	TYPE_CHECKINGAnyDictIterableList
NamedTupleOptionalSequenceUnion)CockpitProblem   )AsyncChannelChannelError)
JsonObject	JsonValueget_intget_objvget_strget_strvpmapic                       \ rS rSrSrg)MetricNotFoundErrorZ    N)__name__
__module____qualname____firstlineno____static_attributes__r       6/usr/lib/python3/dist-packages/cockpit/channels/pcp.pyr   r   Z   s    r!   r   c                   4   ^  \ rS rSrS\SS4U 4S jjrSrU =r$ )PcpMetricInfo^   valuereturnNc                    > [        US5      U l        [        USS5      U l        [        USS5      U l        [        TU ]  U R                  U R                  U R                  S9  g )Nnamederive units)r)   r*   r,   )r   r)   r*   r,   super__init__)selfr&   	__class__s     r"   r.   PcpMetricInfo.__init___   sQ    E6*	eXr2UGR0
dii4::Nr!   )r*   r)   r,   )r   r   r   r   r   r.   r    __classcell__)r0   s   @r"   r$   r$   ^   s    Oj OT O Or!   r$   c                   \    \ rS rSr% \\S'   \\S'   \\S'   \\S'   \\S'   \\S'   \	\S'   S	r
g
)
MetricInfof   pmidr*   descr)   factorr,   	instancedr   N)r   r   r   r   int__annotations__strr   floatboolr    r   r!   r"   r4   r4   f   s%    
IK
I
IMJOr!   r4   c                  r    [         b  [        c   SS Kq SSKJq  g g ! [         a  n [        SSS9U eS n A ff = f)Nr   r   not-supportedzpython3-pcp not installedmessage)c_apir   cpmapipcpImportErrorr   )excs    r"   try_import_pcprH   p   sA    }	^"! &  	^8STZ]]	^s   
 
616c                   N    \ rS rSr% \\   \S'   SSS\S\SS4S	 jr	S\4S
 jr
Srg)ArchiveInfoz   metric_descriptionscontextpmapi.pmContextstartpathr'   Nc                 6    Xl         X l        X0l        / U l        g N)rM   rO   rP   rL   )r/   rM   rO   rP   s       r"   r.   ArchiveInfo.__init__}   s    
	#% r!   c                     U R                   $ rR   )rO   )r/   s    r"   sort_keyArchiveInfo.sort_key   s    zzr!   )rM   rL   rP   rO   )r   r   r   r   r   r4   r;   r=   r<   r.   rU   r    r   r!   r"   rJ   rJ   z   s;    j))& 1 &% &s &t &% r!   rJ   c            
       8   \ rS rSr% Sr\\S'   \\S'   S\S'   \\S'   \\S'   \\S	'   \\S
'   \\S'   \\S'   Sr	\
\S'   SrS\S'   \\   \S'   S\4S jr\S\SS4S j5       r\S\SS4S j5       rS\S\\   4S jrSSS\S\4S jr\S7S j5       r\S\S\\   4S  j5       r\S!\S\4S" j5       rS8S% jrS#S$S\4S& jrSSS\S\S'\S\4
S( jrSSS#\
S\
4S) jrS*\S\S+\S\\   4S, jr S-\S.\\   S\
4S/ jr!S0\"\
   SS4S1 jr#S2 r$S\S3\SS4S4 jr%S\SS4S5 jr&S6r'g)9PcpMetricsChannel   metrics1pcp_dirarchive_batchrN   rM   sourceintervalstart_timestamplast_timestampnext_timestamplimitNlast_sampleszpmapi.pmResult | Nonelast_resultsrL   optionsc                    SU l         SU l        SU l        [        R                  n[        R                  * S-
  n[        USS5      U l        U R                  S::  d  U R                  U:  a  [        SSU R                   3S9e[        US	S5      U l        U R                  S-  U:  d  U R                  S-  U:  a  [        SS
U R                   3S9eU R                  S:  a3  [        [        R                  " 5       S-  U R                  -   5      U l        [        US[        5      U l        [        USU5      U l        U R                  S::  d  U R                  U:  a  [        SSU R                   3S9e[        USS5      U l        [        US/ 5      U l        [%        USS5      U l        U R&                  S:X  a
  [        SSS9eg )N<   r      r^     protocol-errorzinvalid "interval" value: rA   	timestampzinvalid "timestamp" value: metricsrb   zinvalid "limit" value: 	instancesr+   zomit-instancesr]   0no "source" option specified for metrics channel)r\   r`   ra   sysmaxsizer   r^   r   r_   r:   timer   r$   rl   rb   r   rm   omit_instancesr   r]   )r/   re   max_sizemin_sizes       r"   parse_optionsPcpMetricsChannel.parse_options   s   ;;KK<!#T:==A!9/;UVZVcVcUd9eff&wQ?$&1T5I5ID5PS[5[/;VW[WkWkVl9mnn!##&		d(:d>R>R'R#SD MBWgx8
::?djj83/;RSWS]S]R^9_``!';;&w0@"Egx4;;"/9kll r!   rk   r'   zpmapi.timevalc                 l    [        U S-  5      n[        U S-  S-  5      n[        R                  " X5      $ )Nri   )r:   r   timeval)rk   secusecs      r"   float_to_timeval"PcpMetricsChannel.float_to_timeval   s4    )d"#I$,-}}S''r!   ztuple[str, str]c                    U S:X  a
  [        SSS9eU R                  S5      (       a  U n[        R                  nX4$ U S:X  aN  [        R
                  " 5       n[        R                  R                  S5      nU SU 3n[        R                  nX4$ U S	:X  a  U n[        R                  nX4$ U S
:X  a  Sn[        R                  nX4$ [        SSU  3S9e)Nr+   rj   rn   rA   /zpcp-archivePCP_LOG_DIRz
/pmlogger/directpmcdzlocal:r@   z3unsupported "source" option specified for metrics: )r   
startswithrC   PM_CONTEXT_ARCHIVEplatformnoder   	pmContextpmGetConfigPM_CONTEXT_LOCALPM_CONTEXT_HOST)r]   r)   context_typehostnamearchive_dirs        r"   get_context_and_name&PcpMetricsChannel.get_context_and_name   s    R</9klls##D 33L  ## }$}}H//55mDK!]*XJ7D 33L ## xD 11L ## vD 00L
 ## )\]c\d'eg gr!   r)   c                 r   [        U R                  U5      [        R                  S9n[	        U5      S:X  a  [        S5      eU HU  nU R                   HB  nS n U R                  UR                  U5      nUc   eUR                  R                  U5        MD     MW     U$ ! [         a    [        S5      S ef = f)N)keyr   	not-foundr+   )sortedprepare_archivesrJ   rU   lenr   rl   convert_metric_descriptionrM   r   rL   append)r/   r)   archivesarchivemetricmetric_descs         r"   get_archivesPcpMetricsChannel.get_archives   s    $//5;;O;OPx=A{++  G,,"5"&"A"A'//SY"ZK #...++22;? '    + 5&r*45s   BB6r   c           
         [        USS5      nUS:X  a
  [        SSS9e[        USS5      n[        USS5      n UR                  U5      n UR                  US   5      nUR                  [        R                  :g  n	U	(       a  [        U R                   5      S:  aH  UR#                  US 5        U R                    H&  n
 UR%                  X5      nUR'                  X5        M(     [        U R*                  5      S:  aI  UR'                  US 5        U R*                   H'  n UR%                  X5      nUR#                  X/5        M)     SnUR,                  nU(       a3   UR/                  U5      u  pU R1                  XU5        XO:w  d  US:w  a  Un[3        US   UUUUUU	S9$ ! [        R                   a_  nUR                  5       [        R                  :X  a$  [        R                  SU5        [        S	S
U 3S9S e[        S[        U5      S9S eS nAff = f! [        R                   aI  nUR                  5       [        R                  :X  a  [        SS
U 3S9S e[        S[        U5      S9S eS nAff = f! [        R                   a"  n[        R)                  SX5         S nAGM  S nAff = f! [        R                   a"  n[        R)                  SX5         S nAGM  S nAff = f! [        R                   aI  nUR                  5       [        R                  :X  a  [        SS
U 3S9S e[        S[        U5      S9S eS nAff = f)Nr)   r+   rj   z;invalid "metrics" option was specified (no name for metric)rA   r,   r*   zno such metric: %serrorzno such metric: internal-errorr   r   z)Unable to add profile: instance=%s err=%sz,Unable to remove profile: instance=%s err=%s      ?)r6   r)   r*   r7   r8   r,   r9   )r   r   pmLookupNamer   pmErrerrnorC   PM_ERR_NAMEloggerr   r   r<   pmLookupDescindomPM_INDOM_NULLr   rm   pmDelProfilepmLookupInDompmAddProfiledebugrr   r,   pmParseUnitsStrtry_convert_unitr4   )r/   rM   r   r)   r,   r*   pm_idsrG   pm_descr9   instanceinstidomit_instancer8   pm_unitsparsed_unitss                   r"   r   ,PcpMetricsChannel.convert_metric_description   s   vvr*2:/'df f,2.	Q))$/F	Q**6!95G MMU%8%88	4>>"Q&$$Wd3 $Ha!(!6!6w!I,,W= !/ 4&&'!+$$Wd3%)%8%8Mi!(!6!6w!N,,Wh? &9 ==U)0)@)@)G& !!'H=$#'vay#!'&!' ($-/ 	/k {{ 	Qyy{e///148)'=MdV;TU[__"#3SXFDP	Q {{ 	Qyy{e///";:J4&8QRX\\"#3SXFDP		Q  !;; a%PRZ``a !;; i%SUbhhi ;; U99;%"3"33&{>Ntf<UV\``&'7SJPTT	Usz   F  H >"I6#J/K(  H4AHHI3*AI..I36J,
J''J,/K%K  K%(M<AM  Mc                     [         R                  " 5       nSUl         U R                  [        R
                  X1/SU5        g! [         R                   a  n[        S[        U5      S9SeSnAff = f)zGTry to convert a dummy value to validate that the metric is convertibleg        r   r   rA   N)	r   pmAtomValuedpmConvScalerC   PM_TYPE_DOUBLEr   r   r<   )rM   r   r   dummyrG   s        r"   r   "PcpMetricsChannel.try_convert_unit2  se     !!#	M 4 4eY8T{{ 	M/SBL	Ms   #A A/A**A/r   c              #      #    [         R                   " [         R                  " U 5      S-   5      nU Hu  n[        R                  SU5         [        R
                  " [        R                  U5      nUR                  5       n[        UR                  5      S-  n[        X5U5      v   Mw     g ! [        R                   a;  nUR                  5       [        R                  :w  a  [        SSU 3S9S e S nAM  S nAff = f7f)Nz/*.indexzopening archive: %rri   r   zcould not read archive rA   )globescaper   r   r   r   rC   r   pmGetArchiveLabelr=   rO   rJ   r   r   PM_ERR_LOGFILEr   )r   indexesarchive_pathrM   	log_labelarchive_startrG   s          r"   r   "PcpMetricsChannel.prepare_archives<  s     ))DKK4zAB#LLL.=p//%*B*BLQ#557	 %ioo 6 =!',GG $ ;; p99;%"6"66&{>UVbUc<dekoo 7ps1   A	C>AB,'C>,C; 0C60C>6C;;C>sem_idc                     U [         R                  :X  a  gU [         R                  :X  a  gU [         R                  :X  a  gg)Ncounterinstantdiscreter+   )rC   PM_SEM_COUNTERPM_SEM_INSTANTPM_SEM_DISCRETE)r   s    r"   semantic_valPcpMetricsChannel.semantic_valJ  s8    U)))u+++u,,,r!   resultspmapi.pmResultc                    / nU R                    GH  nSUR                  0nUR                  (       a  UR                  US'   UR                  S:X  a  [	        UR
                  5      US'   O0UR                  UR
                  5       SSUR                  -   3US'   U R                  UR                  R                  5      nUS:w  a(  U R                  UR                  R                  5      US'   UR                  (       a  / n[        UR                  R                  5       H  nUR                  R                  U5      n	UR                  U	:w  a  M0  [        UR                  R!                  U5      5       HU  n
UR                  R#                  X5      nUR%                  UR                  UR&                  5      nUR)                  U5        MW     M     XuS'   UR)                  U5        GM     [+        [,        R,                  " 5       5      S	-  n[+        UR                  R.                  R0                  S	-  UR                  R.                  R2                  S	-  -   5      nU R5                  U R6                  U R8                  UUUS
9  g )Nr)   r*   r   r,   *r+   	semanticsrm   ri   )r]   r^   rk   rl   now)rL   r)   r*   r8   r<   r,   
pmUnitsStrr   r7   semr9   rangecontentsnumpmidget_pmidr6   
get_numval	get_vlistpmNameInDominstr   r:   rq   rk   tv_sectv_usec	send_jsonr]   r^   )r/   r   rM   rl   r   r7   r   instsir6   jr&   instance_descr   rk   s                  r"   	send_metaPcpMetricsChannel.send_metaU  s#   33K6<k>N>N5OD!!!,!3!3X!!S( #K$5$5 6W#*#5#5k6G6G#H"I3Q\QcQcKcJd eW))+*:*:*>*>?IB$($5$5k6F6F6J6J$K[! $$#%w//778A"++44Q7D"''4/ "7#3#3#>#>q#AB ' 0 0 : :1 @(/(;(;K<L<Lejj(Y]3 C 9 %*[!NN4 C 4F $))+%((2299D@!**44<<tCD E	dkk $!*&	 	 	 r!   c                    U R                   nUc  g[        UR                  R                  5       H  nU R                  U   R
                  (       d  M#  UR                  R                  U5      nUR                  R                  U5      nXE:w  a    g[        U5       H>  nUR                  R                  X65      UR                  R                  X65      :w  d  M=      g   M     g)z
If a multi-instance metric changes its instances we need to send a new
meta message when these change. For example when an drive or ethernet
card is removed out.
TF)rd   r   r   r   rL   r9   r   get_inst)r/   r   rd   r   numval1numval2r   s          r"   needs_meta_update#PcpMetricsChannel.needs_meta_update  s     (( w''//0A++A.88&&11!4G"++66q9G!7^##,,Q2l6K6K6T6TUV6ZZ $ 1 r!   total_fetchedc                    [         R                  [        U R                  5      -  " 5       n[	        U R                  5       H  u  pgUR
                  XV'   M      / n [        U5       H  n	XC:X  aW  UR                  [        R                  :w  a  Us  $ U R                  U5        [        R                  SU R                  5        Us  $ UR                  U5      n
U R                  U
5      (       a9  U(       a!  U R                  U5        UR!                  5         U R#                  X5        UR%                  U R'                  X5      5        Xl        US-  nM     U R                  U5        UR!                  5         GM   ! [*        R,                   aw  n[        R                  SX5        UR/                  5       [        R0                  :w  a  [3        S[5        U5      S9S e[        U5      S:  a  U R                  U5         S nAU$ S nAff = f)NzReached limit "%s", stoppingrh   zFetching error: %r, fetched %rr   rA   r   )ctypesc_uintr   rL   	enumerater6   r   typerC   r   send_updatesr   r   rb   pmFetchr   clearr   r   parse_fetched_resultsrd   r   r   r   
PM_ERR_EOLr   r<   )r/   rM   r\   rb   r   pmidsr   r   fetched_r   rG   s               r"   samplePcpMetricsChannel.sample  s   T%=%=!>>A"4#;#;<IA{{EH = !#G#}-A$-"<<5+C+CC#00))'2%CTZZP,,%ooe4G --g66" --g6#MMOw8NN4#=#=g#OP(/%!Q&M- .0 !!'*9 : ;; =sL99;%"2"22&'7SJPTTw<!#%%g.s&   4E9 4E9 B0E9 9HA,G??Hc                    [        U R                  5      n0 n[        UR                  R                  5      US'   [        UR                  R                  5       GH  nS nUR                  R                  U5      nU R                  U   nUR                  R                  n	US:  a  S XCU   R                  '   M_  U	[        R                  :X  d(  U	[        R                  :X  d  U	[        R                  :X  a  S XCU   R                  '   M  UR                   (       d  U R#                  XXS5      nO8/ n
[        U5       H%  nU
R%                  U R#                  XXU5      5        M'     U
nXdX5   R                  '   GM     U$ )Nrk   r   )listrl   r=   r   rk   r   r   r   rL   r7   r   r)   rC   PM_TYPE_AGGREGATEPM_TYPE_EVENTPM_TYPE_STRINGr9   build_sampler   )r/   rM   r   rl   samplesr   valuesnumvalr   content_typevalsr   s               r"   r   'PcpMetricsChannel.parse_fetched_results  sH   t||$FH$W%5%5%?%?@w''//0AHLF!**55a8F2215K&++00L z+/
( u666 3 33 4 44+/
(((**7[QO.0vAKK 1 1'KTU VW ''-GJOO$5 18 r!   r   r   c                    UR                   R                  U5      n[        R                  SXdU5        UR                   R	                  U5      nUR
                  U::  a  g UR                   R                  U5      nUR                   R                  XE5      n	UR                  R                  n
S nS nU
[        R                  :X  aA   UR                  UU	[        R                  [        R                  5      nUR                  S-  nOU
[        R                   :X  aD   UR                  UU	[        R                   [        R                   5      nUR"                  S-  S-	  nO/ UR                  UU	U
[        R$                  5      nUR&                  nUR                  R(                  UR(                  :w  ao   [*        R,                  " 5       nXl        UR/                  [        R$                  UUR                  /SUR(                  5      nUR&                  UR0                  -  nU$ U$ ! [         a   n[        R                  SU5         S nANS nAff = f! [         a   n[        R                  SU5         S nANS nAff = f! [         a!  n[        R                  SU5         S nAGNS nAff = f! [*        R2                   a  n[5        S[7        U5      S	9S eS nAff = f)
Nz,build_sample pmid=%d, metric=%d, instance=%dl    z&Unable to extract PCP TYPE_64 value %s   z'Unable to extract PCP TYPE_U64 value %szUnable to extract PCP value %sr   r   rA   )r   r   r   r   get_vsetr	  
get_valfmtr   r7   r   rC   
PM_TYPE_64pmExtractValuell	Exception	exceptionPM_TYPE_U64ullr   r   r,   r   r   r   r8   r   r   r<   )r/   rM   r   r   r   r   r6   valuesetvalfmtr&   r
  sample_valueatomrG   r   converted_atoms                   r"   r  PcpMetricsChannel.build_sample  s   ((0CTS[\ ##,,V4??h&!!,,V4  **6<"'',,
 5+++P--f.3.3.>.>.3.>.>@  $ww-8 U...Q--f.3.3.?.?.3.?.?A !%B25H--f.3.:.3.B.BD  $vv
 !![%6%66
Q))+&!(!4!4U5I5I5:6A6F6F5G565@5F5F	"H
  .//+2D2DD |G  P  !I3OOP  Q  !JCPPQ  H  !A3GGH ;; Q"#3SXFDPQsb   ?H  AI .I: 0A,J(  
I
*II

I7I22I7:
J%J  J%(K<KKr&   	old_valuec                 F    Ub  X-
  U R                   U R                  -
  -  $ g)NF)ra   r`   )r/   r&   r  s      r"   calculate_sample_rate'PcpMetricsChannel.calculate_sample_rate2  s*     %$*=*=@S@S*STTr!   r  c           	         / nU R                   =(       d    0 nU GHu  n[        US   [        5      (       d   eUS   U l        / nU R                   GH  nXFR
                     nUR                  UR
                  S 5      n[        U[        5      (       av  UR                  S:X  aS  / n	[        U5       H/  u  pS nUb   X   nU	R                  U R                  X5      5        M1     UR                  U	5        M  UR                  U5        M  UR                  S:X  a%  Ub"  UR                  U R                  Xx5      5        M  Uc  UR                  S5        GM  UR                  U5        GM     UR                  U5        U R                  U l        UnGMx     X0l         U R                  [        R                   " U5      R#                  5       5        g ! [         a     GNf = f)Nrk   rateF)rc   
isinstancer=   ra   rl   r)   getr  r*   r   
IndexErrorr   r   r`   	send_datajsondumpsencode)r/   r  datarc   r   sampled_values
metricinfor&   r  tmpindexvalold_vals                r"   r   PcpMetricsChannel.send_updates8  s   02((.BFf[159999"("5D8:N"ll
/(,,Z__dC	eT**!((F2 *3E*:JE&*G(4!).7.>G  JJt'A'A#'OP +; '--c2&--e4!((F2u7H&--d.H.H.Z[ =*11%8*11%83 +6 KK'"&"5"5D!LE H )tzz$'..01+ (2 !)$(!)s   ;G
G	G	c                    Sn[        U5       GH  u  p4UR                  U l        S U l        S U l        U R                  nU[        U5      S-
  :w  a  XS-      R                  U:  a  MZ  XTR                  :  a  [        UR                  5      nUR                  n UR                  [        R                  [        R                  " [        R                  5      -  U R                  U5      U R                  5        U R)                  UR                  U R*                  U R,                  U5      nGM     g ! [         R"                   a  n[%        S['        U5      S9S eS nAff = f)Nr   rh   r   rA   )r   rL   rd   rc   r_   r   rO   r:   rM   	pmSetModerC   PM_MODE_INTERP
PM_XTB_SETPM_TIME_MSECr{   r^   r   r   r   r<   r   r\   rb   )r/   r   r   r   r   rk   rM   rG   s           r"   sample_archives!PcpMetricsChannel.sample_archivesd  s%   #H-JA'.'B'BD$ !%D $D,,I CMA%%(q5/*?*?)*K==(.	ooGQ!!%"6"69I9I%J\J\9]"]"&"7"7	"BDMMS
 !KK9K9KTZZYfgM1 .* ;; Q"#3SXFDPQs   AD00EEEr   c                 V    [         R                  " X!5      nU R
                   H7  nS n U R                  X55      nUc   eU R                  R                  U5        M9     U$ ! [         R                   a  n[        S[	        U5      S9S eS nAff = f! [         a    [        S5      S ef = f)Nr   rA   r+   )
r   r   r   r   r<   rl   r   r   rL   r   )r/   r)   r   direct_contextrG   r   r   s          r"   prepare_direct_context(PcpMetricsChannel.prepare_direct_context  s    	M"__\@N llFK1"==nU ***$$++K8 #  {{ 	M/SBL	M ' 1"2&D01s"   A! B!B5B		BB(c                 H  #    / U l         [        R                  SXR                  5        U R	                  U5        [        5         [        SL a  [        S5      eU R                  U R                  5      u  p#U[        R                  :X  a3  U R                  U5      nU R                  5         U R                  U5        g U R                  X#5      nU R                  5          U R!                  USSS5        ["        R$                  " U R&                  S-  5      I S h  vN   MA   N7f)Nz)metrics pcp-archive open: %r, channel: %rTr@   rh   r   ri   )rL   r   r   channelru   rH   r   r   r   r]   rC   r   r   readyr8  r<  r   asynciosleepr^   )r/   re   r)   r   r   r;  s         r"   runPcpMetricsChannel.run  s     #% @'<<X7#D=//!66t{{C5333((.HJJL  *!88LNJJLNAq!4mmDMMD$8999 9s   DD"D D")r\   rm   r^   rd   rc   r`   rb   rL   rl   ra   rr   r]   r_   r'   N)r   r   rM   rN   r'   N)(r   r   r   r   payloadr<   r;   r:   r=   rc   r   rd   r   r4   r   ru   staticmethodr{   r   r   rJ   r   r   r   r   r   r   r>   r   r   r   r	   r  r   r
   r   r8  r<  rC  r    r   r!   r"   rX   rX      s@   GLKMJL#,0L)0j))mZ m< (E (o ( (
 $S $-> $ $. +)> .E/2C E/Z E/\f E/N M M pc ph{.C p p S S  - ^)9 d 8-/ - -C -`c -hk -^!-> ! !QT !F=* =c =]` =emnset =@5 Xe_ QT *2HSM *2d *2Xh83 c FW ": : :r!   rX   rE  ),rA  r   r   r(  loggingr   ro   rq   typingr   r   r   r   r   r   r	   r
   r   cockpit.protocolr   r?  r   r   jsonutilr   r   r   r   r   r   rD   rC   rE   r   	getLoggerr   r   r   r<   r$   r4   rH   rJ   rX   r   r!   r"   <module>rM     s   B       
  b b b + 0 R REE			8	$	. 	ODi( O ^
 
`: `:r!   