ó
    ioøgqc  ã                   óö   • S r SSKrSSKJrJrJrJrJr  SSKJ	r	J
r
JrJrJr  SSKJrJrJrJrJrJrJrJr   " S S\5      r " S S	\5      r " S
 S\	5      r " S S\5      r " S S\5      r " S S\\5      rg)z@Convenience Classes building on the base PMAPI extension module é    N)Úc_intÚc_uintÚc_char_pÚcastÚPOINTER)Ú	pmContextÚpmValueÚpmDescÚpmErrÚtimeval)ÚPM_CONTEXT_HOSTÚPM_CONTEXT_ARCHIVEÚPM_INDOM_NULLÚ
PM_IN_NULLÚ
PM_ID_NULLÚPM_SEM_COUNTERÚ
PM_ERR_EOLÚPM_TYPE_DOUBLEc                   ó   • \ rS rSrSrS rSrg)Ú
MetricCoreé    aï  
Core metric information that can be queried from the PMAPI
PMAPI metrics are unique by name, and MetricCores should be also
rarely, some PMAPI metrics with different names might have identical PMIDs
PMAPI metrics are unique by (name) and by (name,pmid) - _usually_ by (pmid)
too.  Note that names here (and only here) are stored as byte strings for
direct PMAPI access.  All dictionaries/caching strategies built using the
core structure use native strings (i.e., not byte strings in python3).
c                 óž   • Xl         [        U[        5      (       d  UR                  S5      nX l        X0l        S U l        S U l        S U l        g )Núutf-8)	ÚctxÚ
isinstanceÚbytesÚencodeÚnameÚpmidÚdescÚtextÚhelp)Úselfr   r   r   s       Ú*/usr/lib/python3/dist-packages/pcp/pmcc.pyÚ__init__ÚMetricCore.__init__+   sA   € ØŒÜ˜$¤×&Ñ&Ø—;‘;˜wÓ'ˆDØŒ	ØŒ	ØˆŒ	ØˆŒ	Øˆ�	ó    )r   r    r"   r   r   r!   N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r%   Ú__static_attributes__© r'   r$   r   r       s   † ñõr'   r   c                   óâ  • \ 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S 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S r\" \SSS5      r\" \SSS5      r\" \SSS5      r\" \	SSS5      r \" \
SSS5      r!\" \SSS5      r"\" \\SS5      r#\" \SSS5      r$\" \\SS5      r%\" \\SS5      r&\" \SSS5      r'\" \SSS5      r(\" \SSS5      r)\" \SSS5      r*S r+S r,Sr-g)ÚMetricé6   z‚
Additional metric information, such as conversion factors and values
several instances of Metric may share a MetricCore instance
c                 óØ   • Xl         S U l        S U l        S U l        S U l        UR
                  R                  R                  U l        S U l	        S U l
        S U l        S U l        S U l        g ©N)Ú_coreÚ_vsetÚ_valuesÚ	_prevvsetÚ_prevValuesr    ÚcontentsÚtypeÚ	_convTypeÚ
_convUnitsÚ_errorStatusÚ
_netValuesÚ_netPrevValuesÚ_netConvertedValues)r#   Úcores     r$   r%   ÚMetric.__init__?   sa   € ØŒ
ØˆŒ
ØˆŒØˆŒØˆÔØŸ™×+Ñ+×0Ñ0ˆŒØˆŒØ ˆÔØˆŒØ"ˆÔØ#'ˆÕ r'   c                 ó.   • U R                   R                  $ r3   )r4   r   ©r#   s    r$   Ú_R_ctxÚMetric._R_ctxO   s   € Ø�z‰z�~‰~Ðr'   c                 óJ   • U R                   R                  R                  5       $ r3   )r4   r   ÚdecoderD   s    r$   Ú_R_nameÚMetric._R_nameQ   s   € Ø�z‰z�‰×%Ñ%Ó'Ð'r'   c                 ó.   • U R                   R                  $ r3   )r4   r   rD   s    r$   Ú_R_pmidÚMetric._R_pmidS   ó   € Ø�z‰z�‰Ðr'   c                 ó.   • U R                   R                  $ r3   )r4   r    rD   s    r$   Ú_R_descÚMetric._R_descU   rN   r'   c                 ó.   • U R                   R                  $ r3   )r4   r!   rD   s    r$   Ú_R_textÚMetric._R_textW   rN   r'   c                 ó.   • U R                   R                  $ r3   )r4   r"   rD   s    r$   Ú_R_helpÚMetric._R_helpY   rN   r'   c                 ód   • [        UR                  R                  [        [        5      5      nX2   $ )z$Return the vlist[vlist_idx] of vset )r   r9   Úvlistr   r	   )r#   ÚvsetÚ	vlist_idxÚlistptrs       r$   Ú	get_vlistÚMetric.get_vlist\   s&   € ä�t—}‘}×*Ñ*¬G´GÓ,<Ó=ˆØÑ!Ð!r'   c                 ó8   • U R                  X5      R                  $ )z-Return the inst for vlist[vlist_idx] of vset )r]   Úinst)r#   rZ   r[   s      r$   Úget_instÚMetric.get_insta   s   € à�~‰~˜dÓ.×3Ñ3Ð3r'   c                 óÞ  • UnU R                   nUR                  U R                  R                  R                  5      n/ n[        UR                  5       GH  nU R                  X&5      n XGR                     nU R                   R                  UR                  UU R                  R                  U R                  5      n	U R                  (       aX  [        [         5      S-  " 5       n
U R                  U
S'   U R                   R#                  U R                  XšSU R                  5      n	U	R%                  U R                  5      nUR'                  XxU45        GM     U$ ! [         a    Sn Nòf = f)zUExtract the value for a singleton or list of instances
as a triple (inst, name, val)
Ú é   r   )r   Ú
mcGetInstDr    r9   ÚindomÚrangeÚnumvalr]   r`   ÚKeyErrorÚpmExtractValueÚvalfmtr:   r;   r<   r   r
   ÚpmConvScaleÚdrefÚappend)r#   ÚinValuesrZ   r   ÚinstDÚvalLÚiÚinstvalr   ÚoutAtomr    Úvalues               r$   ÚcomputeValuesÚMetric.computeValuese   s"  € ð ˆØ�h‰hˆØ—‘˜tŸy™y×1Ñ1×7Ñ7Ó8ˆØˆÜ�t—{‘{×#ˆAØ—n‘n TÓ-ˆGðØŸ\™\Ñ*�ð —h‘h×-Ñ-¨d¯k©k¸7Ø.2¯i©i¯n©n¸d¿n¹nóNˆGà��Ü¤›¨!Ò+Ó.�ØŸ)™)��Q‘ØŸ(™(×.Ñ.¨t¯~©~¸wØ/0°$·/±/óC�à—L‘L §¡Ó0ˆEØ�K‰K˜¨Ð.×/ñ $ð ˆøô ó Ø’ðús   Á+EÅE,Å+E,c                 óæ   • XR                   ::  a"  U R                  X15      nX$R                  :X  a  U$ [        UR                   5       H'  nU R                  X55      nX$R                  :X  d  M%  Us  $    g)z1Find a metric instance in the previous resultset N)ri   r]   r`   rh   )r#   Úindexr`   ÚpvsetÚpinstvalÚpis         r$   Ú_find_previous_instvalÚMetric._find_previous_instval~   s^   € à—L‘LÓ Ø—~‘~ eÓ3ˆHØ—}‘}Ó$Ø�Ü˜Ÿ™Ö%ˆBØ—~‘~ eÓ0ˆHØ—}‘}Õ$Ø’ñ &ð r'   c                 óˆ  • U R                   R                  [        :w  a  U R                  U5      $ Uc  gUnUnU R                  nUR                  U R                   R                  R                  5      n/ n[        UR                  5       GH   n	U R                  XY5      n
U R                  XšR                  U5      nUc  M6   XzR                     nU R                  R                  UR                  U
U R                   R                   ["        5      nU R                  R                  UR                  UU R                   R                   ["        5      nU R$                  (       a~  ['        [(        5      S-  " 5       nU R                   US'   U R                  R+                  ["        XßSU R$                  5      nU R                  R+                  ["        XïSU R$                  5      nUR-                  ["        5      nUR-                  ["        5      nUU:¼  d  GM‡  UR/                  X¬UU-
  U-  45        GM£     U$ ! [         a    Sn GNqf = f)z©Extract the value for a singleton or list of instances as a
triple (inst, name, val) for COUNTER metrics with the value
delta calculation applied (for rate conversion).
Nrd   re   r   )r    Úsemr   rw   r   rf   r9   rg   rh   ri   r]   r~   r`   rj   rk   rl   r:   r   r<   r   r
   rm   rn   ro   )r#   ÚvaluesÚ
prevValuesÚdeltar{   rZ   r   rq   rr   rs   rt   r|   r   ru   ÚpoutAtomr    rv   Úpvalues                     r$   ÚconvertValuesÚMetric.convertValuesŠ   sÎ  € ð
 �9‰9�=‰=œNÓ*Ø×%Ñ% fÓ-Ð-ØÑØØˆØˆØ�h‰hˆØ—‘˜tŸy™y×1Ñ1×7Ñ7Ó8ˆØˆÜ�t—{‘{×#ˆAØ—n‘n TÓ-ˆGØ×2Ñ2°1·l±lÀEÓJˆHØÑÙðØŸ\™\Ñ*�ð —h‘h×-Ñ-¨d¯k©k¸7Ø.2¯i©i¯n©n¼nóNˆGà—x‘x×.Ñ.¨u¯|©|¸XØ/3¯y©y¯~©~¼~óOˆHà��Ü¤›¨!Ò+Ó.�ØŸ)™)��Q‘ØŸ(™(×.Ñ.¬~¸wØ/0°$·/±/óC�àŸ8™8×/Ñ/´ÀØ01°4·?±?óD�à—L‘L¤Ó0ˆEØ—]‘]¤>Ó2ˆFØ˜ŽØ—‘˜W¨U°V©^¸uÑ,DÐE×Fñ/ $ð0 ˆøô# ó Ø“ðús   ÃH1È1IÉ Ic                 ó   • U R                   $ r3   )r6   rD   s    r$   Ú	_R_valuesÚMetric._R_values²   ó   € Ø�|‰|Ðr'   c                 ó   • U R                   $ r3   )r8   rD   s    r$   Ú_R_prevValuesÚMetric._R_prevValues´   s   € Ø×ÑÐr'   c                 ó   • U R                   $ r3   ©r;   rD   s    r$   Ú_R_convTypeÚMetric._R_convType¶   s   € Ø�~‰~Ðr'   c                 ó   • U R                   $ r3   ©r<   rD   s    r$   Ú_R_convUnitsÚMetric._R_convUnits¸   ó   € Ø�‰Ðr'   c                 ó   • U R                   $ r3   )r=   rD   s    r$   Ú_R_errorStatusÚMetric._R_errorStatus»   s   € Ø× Ñ Ð r'   c                 ó   • U R                   $ r3   )Ú_netConvValuesrD   s    r$   Ú_R_netConvValuesÚMetric._R_netConvValues¾   ó   € Ø×"Ñ"Ð"r'   c                 ó~   • U R                   (       d  g U R                  U R                   5      U l        U R                  $ r3   )r7   rw   r?   rD   s    r$   Ú_R_netPrevValuesÚMetric._R_netPrevValuesÁ   s/   € Ø�~�~ØØ"×0Ñ0°·±Ó@ˆÔØ×"Ñ"Ð"r'   c                 ó~   • U R                   (       d  g U R                  U R                   5      U l        U R                  $ r3   )r5   rw   r>   rD   s    r$   Ú_R_netValuesÚMetric._R_netValuesÇ   s,   € Ø�z�zØØ×,Ñ,¨T¯Z©ZÓ8ˆŒØ�‰Ðr'   c                 ób   • U R                   U l        Xl         U R                  U l        S U l        g r3   )r6   Ú_prevÚ	_netValueÚ_netPrev)r#   r‚   s     r$   Ú	_W_valuesÚMetric._W_valuesÍ   s$   € Ø—\‘\ˆŒ
ØŒØŸ™ˆŒØˆ�r'   c                 ó   • Xl         g r3   r‘   ©r#   rv   s     r$   Ú_W_convTypeÚMetric._W_convTypeÓ   s   € Ø�r'   c                 ó   • Xl         g r3   r•   r®   s     r$   Ú_W_convUnitsÚMetric._W_convUnitsÕ   s   € Ø�r'   Nc                 ó  • U R                   R                  U R                  R                  5      n[	        SSU5        U R                   R                  U R                  R                  5      nU R                   H  u  p#n[	        SX45        M     g )Nz   zindom:)r   Ú
pmInDomStrr    rg   Úprintrf   Ú	netValues)r#   ÚindomstrÚ_r   Úvals        r$   ÚmetricPrintÚMetric.metricPrintê   sb   € Ø—8‘8×&Ñ& t§y¡y§¡Ó7ˆÜˆe�X˜xÔ(Ø�H‰H×Ñ §	¡	§¡Ó0ˆØ ŸNœN‰LˆA�SÜ�%˜Ö#ò +r'   c                 ót   • U R                  U R                  U R                  U5      nX l        U R                  $ r3   )r‡   r5   r7   r�   )r#   r„   ÚconvertedLists      r$   ÚmetricConvertÚMetric.metricConvertñ   s0   € Ø×*Ñ*¨4¯:©:°t·~±~ÀuÓMˆØ+ÔØ×"Ñ"Ð"r'   )r;   r<   r4   r=   r�   r@   rª   r?   r©   r>   r¨   r8   r7   r6   r5   ).r(   r)   r*   r+   r,   r%   rE   rI   rL   rP   rS   rV   r]   ra   rw   r~   r‡   rŠ   rŽ   r’   r–   rš   rž   r¢   r¥   r«   r¯   r²   Úpropertyr   r   r   r    r!   r"   r‚   rƒ   ÚconvTypeÚ	convUnitsÚerrorStatusr·   ÚnetPrevValuesÚnetConvValuesr»   r¿   r-   r.   r'   r$   r0   r0   6   sk  † ñò(ò ò(òòòòò"ò
4òò2
ò&òPò òòò!ò#ò#òòòò ñ �6˜4  tÓ
,€CÙ�G˜T 4¨Ó.€DÙ�G˜T 4¨Ó.€DÙ�G˜T 4¨Ó.€DÙ�G˜T 4¨Ó.€DÙ�G˜T 4¨Ó.€Dñ �i ¨D°$Ó7€FÙ˜-¨¨t°TÓ:€JÙ˜ [°$¸Ó=€HÙ˜ |°T¸4Ó@€IÙ˜>¨4°°tÓ<€KÙ˜ t¨T°4Ó8€IÙÐ-¨t°T¸4Ó@€MÙÐ-¨t°T¸4Ó@€Mò$õ#r'   r0   c                   óD   • \ rS rSrSr\S4S jrS rS rS r	S r
S	 rS
rg)ÚMetricCacheé÷   aa  
A cache of MetricCores is kept to reduce calls into the PMAPI library
this also slightly reduces the memory footprint of Metric instances
that share a common MetricCore
a cache of instance domain information is also kept, which further
reduces calls into the PMAPI and reduces the memory footprint of
Metric objects that share a common instance domain
úlocal:c                 óx   • [         R                  " XU5        0 U l        0 U l        0 U l        SU l        SU l        g )Nr   )r   r%   Ú	_mcIndomDÚ
_mcByNameDÚ
_mcByPmidDÚ
_mcCounterÚ
_mcMetrics©r#   ÚtypedÚtargets      r$   r%   ÚMetricCache.__init__  s5   € Ü×Ò˜4¨Ô/ØˆŒØˆŒØˆŒØˆŒØˆ�r'   c                 ó    • U R                   U   $ )z.Query the instance : instance_list dictionary )rÌ   )r#   rg   s     r$   rf   ÚMetricCache.mcGetInstD  s   € à�~‰~˜eÑ$Ð$r'   c                 ó@  • UR                   R                  R                  nX R                  ;  aÁ  [	        U5      R
                  [	        [        5      R
                  :X  a	  [        S0nOlU R                  [        :X  a  U R                  UR                   5      u  pEOU R                  UR                   5      u  pEUb  Ub  [        [        XE5      5      nO0 nU R                  R                  X#05        UR                   R                  R                  [         :X  a  U =R"                  S-  sl        U =R$                  S-  sl        U R&                  R                  UR(                  R+                  5       U05        U R,                  R                  UR.                  U05        g)zUpdate the dictionary s
   PM_IN_NULLNre   )r    r9   rg   rÌ   r   rv   r   r   Ú_typer   ÚpmGetInDomArchiveÚ
pmGetInDomÚdictÚzipÚupdater�   r   rÏ   rÐ   rÍ   r   rH   rÎ   r   )r#   rA   rg   ÚinstmapÚinstLÚnameLs         r$   Ú_mcAddÚMetricCache._mcAdd  s(  € à—	‘	×"Ñ"×(Ñ(ˆØŸ™Ó&Ü�U‹|×!Ñ!¤U¬=Ó%9×%?Ñ%?Ó?Ü% }Ð5‘à—:‘:Ô!3Ó3Ø#'×#9Ñ#9¸$¿)¹)Ó#D‘L�E˜5à#'§?¡?°4·9±9Ó#=‘L�EØÑ$¨Ñ):Ü"¤3 uÓ#4Ó5‘Gà �GØ�N‰N×!Ñ! 5Ð"2Ô3à�9‰9×Ñ×!Ñ!¤^Ó3Ø�OŠO˜qÑ �OØ�Š˜1Ñ�à�‰×Ñ §	¡	× 0Ñ 0Ó 2°DÐ9Ô:Ø�‰×Ñ §	¡	¨4Ð0Õ1r'   c                 ó  • / nSnSn[        U5       Hx  u  pV[        U[        5      (       a  UR                  5       nU R                  R                  U5      nU(       d  U(       d  0 nUR                  Xe05        UR                  U5        Mz     U(       ai  U R                  UR                  5       5      u  p„U HB  u  piU	[        :X  a  U(       d  / nUR                  U5        M+  U R                  Xi5      n
X¢X6   '   MD     X$4$ )z2Update the core (metric id, description,...) list N)Ú	enumerater   r   rH   rÍ   ÚgetrÝ   ro   ÚmcFetchPmidsÚkeysr   Ú_mcCreateCore)r#   rà   ÚcoreLÚmissDÚerrLrz   r   rA   ÚidLr   Únewcores              r$   ÚmcGetCoresByNameÚMetricCache.mcGetCoresByName+  sÞ   € àˆØˆØˆä$ UÖ+‰KˆEÜ˜$¤×&Ñ&Ø—{‘{“}�à—?‘?×&Ñ& tÓ,ˆDÞæØ�EØ—‘˜d˜]Ô+Ø�L‰L˜Öñ ,ö Ø×)Ñ)¨%¯*©*«,Ó7‰IˆCÛ!‘
�Øœ:Ó%æØ!˜Ø—K‘K Ö%ð #×0Ñ0°Ó<�Gà)0˜%™+Ó&ñ "ð ˆ{Ðr'   c                 ó0  • [        XU5      n U R                  U5      Ul        U R                  U5        U$ ! [         aT  nUR	                  5       < SUR                  5       < 3n[        R                  R                  U5        [        S5      eSnAff = f)zUpdate the core description z: pmLookupDesc: re   N)r   ÚpmLookupDescr    r   ÚprognameÚmessageÚsysÚstderrÚwriteÚ
SystemExitrá   )r#   r   r   rí   ÚerrorÚfails         r$   rè   ÚMetricCache._mcCreateCoreN  s}   € ä˜T¨Ó.ˆð	 Ø×,Ñ,¨TÓ2ˆGŒLð 	�‰�GÔØˆøô ó 	 Ø-2¯^©^Ö-=¸u¿}¹}½ÐOˆDÜ�J‰J×Ñ˜TÔ"Ü˜Q“-Ðûð	 ús   Ž7 ·
BÁABÂBc                 ó€  • Sn[         [        U5      -  " 5       n[        U5       H8  u  pE[        U[        5      (       d  UR                  S5      n[        U5      X4'   M:      U R                  U5      n[        U5      [        U5      :  aF  S[        U5      [        U5      4-  n[        R                  R                  SU-  5        [        S5      e [        X5      U4$ ! [         aT  nUR                  5       < SUR                  5       < 3n	[        R                  R                  U	5        [        S5      eSnAff = f)zCUpdate the core metric ids.  note: some names have identical pmids Nr   z%d of %d metric nameszCannot resolve %sre   z: pmLookupName: )r   Úlenrä   r   r   r   ÚpmLookupNamerô   rõ   rö   r÷   r   rò   ró   rÜ   )
r#   rà   rë   ÚnameArz   r   Ú	pmidArrayÚmissingrø   rù   s
             r$   ræ   ÚMetricCache.mcFetchPmids\  s	  € àˆÜœC ›JÒ&Ó)ˆÜ$ UÖ+‰KˆEÜ˜d¤E×*Ñ*Ø—{‘{ 7Ó+�Ü# D›>ˆE‹Lñ ,ð		 Ø×)Ñ)¨%Ó0ˆIÜ�9‹~¤ E£
Ó*Ø1´S¸³^ÄSÈÃZÐ4PÑP�Ü—
‘
× Ñ Ð!4°wÑ!>Ô?Ü  “mÐ#ð +ô �5Ó$ dÐ*Ð*øô ó 	 Ø-2¯^©^Ö-=¸u¿}¹}½ÐOˆDÜ�J‰J×Ñ˜TÔ"Ü˜Q“-Ðûð	 ús   Á"A/C Ã
D=Ã)AD8Ä8D=)rÍ   rÎ   rÏ   rÌ   rÐ   N)r(   r)   r*   r+   r,   r   r%   rf   rá   rî   rè   ræ   r-   r.   r'   r$   rÈ   rÈ   ÷   s-   † ñð -°Xô ò%ò2ò0!òFõ+r'   rÈ   c                   ó  • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 r\" \SSS5      r\" \SSS5      r\" \SSS5      r\" \	\SS5      r\" \SSS5      r\" \SSS5      r\" \
SSS5      r/ 4S jrS rS rS rS rSrg)ÚMetricGroupir  al  
Manages a group of metrics for fetching the values of
a MetricGroup is a dictionary of Metric objects, for which data can
be fetched from a target system using a single call to pmFetch
the Metric objects are indexed by the metric name
pmFetch fetches data for a list of pmIDs, so there is also a shadow
dictionary keyed by pmID, along with a shadow list of pmIDs
c                 ó   • U R                   $ r3   )Ú_ctxrD   s    r$   Ú_R_contextCacheÚMetricGroup._R_contextCache  s   € Ø�y‰yÐr'   c                 ó\   • U R                   R                  U R                   R                  :g  $ r3   )r  rÏ   rÐ   rD   s    r$   Ú_R_nonCountersÚMetricGroup._R_nonCounters�  s!   € Ø�y‰y×#Ñ# t§y¡y×';Ñ';Ñ;Ð;r'   c                 ó   • U R                   $ r3   )Ú
_pmidArrayrD   s    r$   Ú_R_pmidArrayÚMetricGroup._R_pmidArrayƒ  r˜   r'   c                 óB   • U R                   R                  R                  $ r3   )Ú_resultr9   Ú	timestamprD   s    r$   Ú_R_timestampÚMetricGroup._R_timestamp…  s   € Ø�|‰|×$Ñ$×.Ñ.Ð.r'   c                 ó   • U R                   $ r3   )r  rD   s    r$   Ú	_R_resultÚMetricGroup._R_result‡  rŒ   r'   c                 óB   • U R                   R                  R                  $ r3   )r¨   r9   r  rD   s    r$   Ú_R_prevTimestampÚMetricGroup._R_prevTimestamp‰  s   € Ø�z‰z×"Ñ"×,Ñ,Ð,r'   c                 ó   • U R                   $ r3   )r¨   rD   s    r$   Ú_R_prevÚMetricGroup._R_prev‹  s   € Ø�z‰zÐr'   c                 ó2   • U R                   U l        Xl         g r3   )r  r¨   )r#   Úpmresults     r$   Ú	_W_resultÚMetricGroup._W_result‘  s   € Ø—\‘\ˆŒ
Ø�r'   Nc                 ó”   • [         R                  U 5        Xl        S U l        S U l        S U l        0 U l        U R                  U5        g r3   )rÛ   r%   r  r  r  r¨   Ú_altDÚmgAdd)r#   ÚcontextCacheÚinLs      r$   r%   ÚMetricGroup.__init__£  s:   € Ü�‰�dÔØ Œ	ØˆŒØˆŒØˆŒ
ØˆŒ
Ø�
‰
�3�r'   c           	      ó^   • X;   a  [        S5      e[        R                  X[        XS95        g ©Nz)metric group with that key already exists)r%  ©rj   rÛ   Ú__setitem__r  ©r#   Úattrrv   s      r$   r*  ÚMetricGroup.__setitem__¬  ó(   € Ø‹<ÜÐFÓGÐGÜ×Ñ˜¤[°Ñ%AÕBr'   c                 ó¶  • U R                   R                  U5      u  p#U HR  n[        U5      nU R                  UR                  U05        U R
                  R                  UR                  U05        MT     [        U 5      n[        U-  " 5       U l	        [        U R                  5       5       H)  u  px[        X   R                  5      U R                  U'   M+     g)zCreate the list of Metric(s) N)r  rî   r0   rÝ   r   r"  r   rü   r   r  rä   rç   )	r#   rà   ré   r¹   rA   ÚmetricÚnÚxÚkeys	            r$   r#  ÚMetricGroup.mgAdd´  s£   € à—9‘9×-Ñ-¨eÓ4‰ˆÛˆDÜ˜D“\ˆFØ�K‰K˜Ÿ™ fÐ-Ô.Ø�J‰J×Ñ˜vŸ{™{¨FÐ3Ö4ñ ô �‹IˆÜ! Aš:›.ˆŒÜ §	¡	£Ö,‰FˆAÜ!'¨©	¯©Ó!7ˆD�O‰O˜AÓò -r'   c                 ó  •  U R                   R                  U R                  5      U l        U R                  R                  n[        U R                  R                  R                  5       H‹  nU R                  R                  R                  U5      nU R                  R                  R                  U5      nU R                  U   R                  U R                  U   l        X@R                  U   l
        M�     UR*                  $ ! [         av  nUR                  S   [        :X  a  [        S5      eUR!                  5       < SUR#                  5       < 3n[$        R&                  R)                  U5        [        S5      eSnAff = f)zT
Fetch the list of Metric values.  Save the old value.
Return the result timestamp.
r   z: pmFetch: re   N)r  ÚpmFetchr  Úresultr9   rh   ÚnumpmidÚget_pmidÚget_vsetr"  r5   r7   r   Úargsr   r÷   rò   ró   rô   rõ   rö   r  )r#   r7  rs   r   rZ   rø   rù   s          r$   ÚmgFetchÚMetricGroup.mgFetchÀ  s  € ð
	 ØŸ)™)×+Ñ+¨D¯O©OÓ<ˆDŒKà—[‘[×)Ñ)ˆFÜ˜4Ÿ;™;×/Ñ/×7Ñ7Ö8�Ø—{‘{×+Ñ+×4Ñ4°QÓ7�Ø—{‘{×+Ñ+×4Ñ4°QÓ7�Ø-1¯Z©Z¸Ñ-=×-CÑ-C�—
‘
˜4Ñ Ô*Ø)-—
‘
˜4Ñ Ö&ñ	 9ð ×ÑÐøô ó 	 Ø�z‰z˜!‰}¤
Ó*Ü  “mÐ#Ø(-¯©Ö(8¸%¿-¹-½/ÐJˆDÜ�J‰J×Ñ˜TÔ"Ü˜Q“-Ðûð	 ús   ‚C8D Ä
FÄA1FÆFc                 ó|   • U R                   b  [        U R                  5      nOSn[        U R                  5      U-
  $ )zj
Sample delta - used for rate conversion calculations, which
requires timestamps from successive samples.
ç        )r¨   ÚfloatÚprevTimestampr  )r#   rA  s     r$   ÚmgDeltaÚMetricGroup.mgDelta×  s7   € ð
 �:‰:Ñ!Ü! $×"4Ñ"4Ó5‰MàˆMÜ�T—^‘^Ó$ }Ñ4Ð4r'   )r"  r  r  r¨   r  r7  )r(   r)   r*   r+   r,   r  r	  r  r  r  r  r  r  rÁ   r$  ÚnonCountersrÿ   r7  r  ÚprevrA  r%   r*  r#  r<  rB  r-   r.   r'   r$   r  r  r  sÁ   † ñòò<òò/òò-òò ñ ˜O¨T°4¸Ó>€LÙ˜>¨4°°tÓ<€KÙ˜ t¨T°4Ó8€IÙ�i ¨D°$Ó7€FÙ˜ t¨T°4Ó8€IÙ�G˜T 4¨Ó.€DÙÐ-¨t°T¸4Ó@€Mð
 *,ô òCò
8ò õ.	5r'   r  c                   ó$   • \ rS rSrSrS rS rSrg)ÚMetricGroupPrinteriã  a  
Handles reporting of MetricGroups within a GroupManager.
This object is called upon at the end of each fetch when
new values are available.  It is also responsible for
producing any initial (or on-going) header information
that the tool may wish to report.
c                 óŒ   • UR                  5        H0  nX   nUR                  5        H  nX4   R                  5         M     M2     g)z/Base implementation, all tools should override N)rç   r»   )r#   ÚmanagerÚ
group_nameÚgroupÚmetric_names        r$   ÚreportÚMetricGroupPrinter.reportë  s9   € à!Ÿ,™,ž.ˆJØÑ'ˆEØ$Ÿz™zž|�ØÑ"×.Ñ.Ö0ó  ,ò )r'   c                 ó®   • UR                  5        HA  nX   nUR                  5       nUR                  5        H  nX5   R                  U5        M     MC     g)z0Do conversion for all metrics across all groups N)rç   rB  r¿   )r#   rI  rJ  rK  r„   rL  s         r$   ÚconvertÚMetricGroupPrinter.convertò  sF   € à!Ÿ,™,ž.ˆJØÑ'ˆEØ—M‘M“OˆEØ$Ÿz™zž|�ØÑ"×0Ñ0°Ö7ó  ,ò )r'   r.   N)r(   r)   r*   r+   r,   rM  rP  r-   r.   r'   r$   rG  rG  ã  s   † ñò1õ8r'   rG  c                   óþ   • \ rS rSrSrS rS rS rS rS r	S r
S	 rS
 r\" \\SS5      r\" \\SS5      r\" \	\
SS5      r\" S\SS5      r\" \SSS5      r\S4S jrS r\S 5       rS rS rS rS rS rS rSrg)ÚMetricGroupManageriû  zw
Manages a dictionary of MetricGroups which can be pmFetch'ed
inherits from MetricCache, which inherits from pmContext
c                 ó   • U R                   $ r3   ©Ú_optionsrD   s    r$   Ú
_R_optionsÚMetricGroupManager._R_options  ó   € Ø�}‰}Ðr'   c                 ó   • Xl         g r3   rU  )r#   Úoptionss     r$   Ú
_W_optionsÚMetricGroupManager._W_options  ó   € Ø�r'   c                 ó   • U R                   $ r3   ©Ú_default_deltarD   s    r$   Ú_R_default_deltaÚ#MetricGroupManager._R_default_delta
  r    r'   c                 ó   • Xl         g r3   r`  )r#   r„   s     r$   Ú_W_default_deltaÚ#MetricGroupManager._W_default_delta  ó   € Ø#Õr'   c                 ó   • U R                   $ r3   ©Ú_default_pauserD   s    r$   Ú_R_default_pauseÚ#MetricGroupManager._R_default_pause  r    r'   c                 ó   • Xl         g r3   ri  ©r#   Úpauses     r$   Ú_W_default_pauseÚ#MetricGroupManager._W_default_pause  rg  r'   c                 ó   • Xl         g r3   )Ú_printer)r#   Úprinters     r$   Ú
_W_printerÚMetricGroupManager._W_printer  r^  r'   c                 ó   • U R                   $ r3   )Ú_counterrD   s    r$   Ú
_R_counterÚMetricGroupManager._R_counter  rY  r'   NrÊ   c                 ó´   • [         R                  U 5        [        R                  XU5        S U l        [	        SS5      U l        S U l        S U l        SU l        g )Nre   r   )	rÛ   r%   rÈ   rV  r   ra  rj  rs  rx  rÑ   s      r$   r%   ÚMetricGroupManager.__init__%  sI   € Ü�‰�dÔÜ×Ñ˜T¨&Ô1ØˆŒÜ% a¨›mˆÔØ"ˆÔØˆŒØˆ�r'   c           	      ó^   • X;   a  [        S5      e[        R                  X[        XS95        g r(  r)  r+  s      r$   r*  ÚMetricGroupManager.__setitem__.  r.  r'   c                 ój   • U R                  X5      n[        UR                  S5      Ul        Xl        U$ )z7Helper interface, simple PCP monitor argument parsing. r   )ÚfromOptionsr   r„   ra  rV  )Úclsr[  ÚargvrI  s       r$   ÚbuilderÚMetricGroupManager.builder3  s0   € ð —/‘/ 'Ó0ˆÜ!(¨¯©¸Ó!:ˆÔØ"ÔØˆr'   c                 óf   • Uc  g[        UR                  5      [        UR                  5      S-  -   $ )z,convert timeval to epoch seconds as a float r?  g    €„.A)r@  Útv_secÚtv_usec)r#   Útvs     r$   Ú	_tv2floatÚMetricGroupManager._tv2float>  s,   € à‰:ØÜ�R—Y‘YÓ¤%¨¯
©
Ó"3°cÑ"9Ñ9Ð9r'   c                 óJ  • U R                   c  gSnU R                  5        H  nX   R                  (       d  M  SnM     U R                   R                  5       nUb  X1-   S4$ U R                   R	                  5       c  gU R                   R                  5       nU R                   R                  5       nU R                   R                  5       nUc  U R                  nU R                  U5      nU R                  U5      U R                  U5      -
  U-  n[        US-   5      U-   U4$ )a¦  Return the number of samples we are to take and the
finish time, or 0,0 if --finish is not specified.
This is based on command line options --samples but also
must consider --start, --finish and --interval.  If none
of these were presented, a zero return means "infinite".
Also consider whether the utility needs rate-conversion,
automatically increasing the sample count to accommodate
when counters metrics are present.
N)r   Nre   r   g      à?)rV  rç   rD  ÚpmGetOptionSamplesÚpmGetOptionFinishOptargÚpmGetOptionOriginÚpmGetOptionFinishÚpmGetOptionIntervalra  r‰  Úint)	r#   ÚextrarK  ÚsamplesÚoriginÚfinishr„   ÚperiodÚwindows	            r$   Ú_computeSamplesÚ"MetricGroupManager._computeSamplesD  s  € ð �=‰=Ñ ØØˆØ—Y‘Y–[ˆEØ‰{×&×&Ñ&Ø’ñ !ð —-‘-×2Ñ2Ó4ˆØÑØ‘? DÐ(Ð(Ø�=‰=×0Ñ0Ó2Ñ:ØØ—‘×0Ñ0Ó2ˆØ—‘×0Ñ0Ó2ˆØ—‘×1Ñ1Ó3ˆØ‰=Ø×'Ñ'ˆEØ—‘ Ó&ˆØ—.‘. Ó(¨4¯>©>¸&Ó+AÑAÀVÑKˆä�6˜C‘<Ó  5Ñ(¨&Ð0Ð0r'   c                 ó„  • U R                   b  U R                   $ U R                  [        :X  a  [        SS5      U l         U R                   $ U R                  bM  U R                  R                  5       nUb  Xl         U R                   $ U R                  U l          U R                   $ U R                  U l         U R                   $ )a  Figure out how long to sleep between samples.
This needs to take into account whether we were explicitly
asked for a delay (independent of context type, --pause),
whether this is an archive or live context, and the sampling
--interval (including the default value, if none requested).
r   )rj  r:   r   r   rV  r�  ra  rn  s     r$   Ú_computePauseTimeÚ$MetricGroupManager._computePauseTimec  s·   € ð ×ÑÑ*Ø×&Ñ&Ð&Ø�9‰9Ô*Ó*Ü")¨!¨Q£-ˆDÔð ×"Ñ"Ð"ð �]‰]Ñ&Ø—M‘M×5Ñ5Ó7ˆEØÑ Ø&+Ô#ð
 ×"Ñ"Ð"ð '+×&9Ñ&9�Õ#ð ×"Ñ"Ð"ð #'×"5Ñ"5ˆDÔØ×"Ñ"Ð"r'   c                 óÂ  • / n[         [        U5      -  " 5       n[        U5       H8  u  pE[        U[        5      (       d  UR                  S5      n[        U5      X4'   M:      [        R                  " X5        U(       d  gU$ ! [         aR    [        U5       H@  u  pE [        R                  " X5        M  ! [         a    UR                  X   5         M>  f = f    Nef = f)z½
Return a list of metrics that are missing from the default context.
This is usually only applicable when replaying archives.
Return None if all found, else a list of missing metric names.
r   N)
r   rü   rä   r   r   r   r   rý   r   ro   )r#   rà   r   rþ   rs   r1  s         r$   ÚcheckMissingMetricsÚ&MetricGroupManager.checkMissingMetricsx  sÃ   € ð ˆÜœC ›JÒ&Ó)ˆÜ˜eÖ$‰DˆAÜ˜a¤×'Ñ'Ø—H‘H˜WÓ%�Ü “{ˆE‹Hñ %ð		-ä×"Ò" 4Ô/ö ØØˆøô ó 	-ä! %Ö(‘�ð-Ü×*Ò*¨4Ö5øÜó -Ø—N‘N 5¡8×,ð-úó )ð	-ús6   Á"B ÂCÂB5Â3CÂ5CÃCÃCÃCÃCc                 óº   • SnSnU R                  5        HB  nX   R                  5       nUb  U R                  U5      U:”  d  M/  UnU R                  U5      nMD     U$ )z.Perform fetch operation on all of the groups. Nr?  )rç   r<  r‰  )r#   Ú	fetchtimeÚrmaxrK  Ústamps        r$   ÚfetchÚMetricGroupManager.fetch’  s]   € àˆ	ØˆØ—Y‘Y–[ˆEØ‘K×'Ñ'Ó)ˆEØÑ  D§N¡N°5Ó$9¸DÕ$@Ø!�	Ø—~‘~ eÓ,’ñ	 !ð
 Ðr'   c                 óà  • U R                  5       u  pU R                  5       n U R                  5       n U R                  Us=:¼  a  S:”  a  O  O gUb&  U R	                  U5      U R	                  U5      :¼  a   gU R
                  R                  U 5        UR                  5         U R                  5       nU =R                  S-  sl        M—  ! [         a  nUs SnA$ SnAf[         a     gf = f)a1  Using options specification, loop fetching and reporting,
pausing for the requested time interval between updates.
Transparently handles archive/live mode differences.
Note that this can be different to the sampling interval
in archive mode, but is usually the same as the sampling
interval in live mode.
r   Nre   )
r˜  r›  r¤  rx  r‰  rs  rM  Úsleepr÷   ÚKeyboardInterrupt)r#   r“  r•  ÚtimerÚcurtimeÚcodes         r$   ÚrunÚMetricGroupManager.run�  sØ   € ð ×.Ñ.Ó0‰ˆà×&Ñ&Ó(ˆð	Ø—j‘j“lˆGØØ—=‘= GÕ/¨aÖ/Øð ð Ñ%¨$¯.©.¸Ó*AÀTÇ^Á^ÐTZÓE[Ó*[Øð ð —‘×$Ñ$ TÔ*Ø—‘”ØŸ*™*›,�Ø—’ Ñ"•ñ øô ó 	Ø�KûÜ ó 	ØØð	ús0   ¤+C Á'C Á:AC Ã
C-ÃCÃC-ÃC-Ã,C-)rx  ra  rj  rV  rs  )r(   r)   r*   r+   r,   rW  r\  rb  re  rk  rp  ru  ry  rÁ   r[  Údefault_deltaÚdefault_pausert  Úcounterr   r%   r*  Úclassmethodrƒ  r‰  r˜  r›  rž  r¤  r¬  r-   r.   r'   r$   rS  rS  û  sÉ   † ñòò ò#ò$ò#ò$ò òñ �z :¨t°TÓ:€GÙÐ-Ð/?ÀÀtÓL€MÙÐ-Ð/?ÀÀtÓL€Má�t˜Z¨¨tÓ4€GÙ�z 4¨¨tÓ4€Gð
 -°Xô òCð
 ñó ðò:ò1ò>#ò*ò4	õr'   rS  )r,   rô   Úctypesr   r   r   r   r   Ú	pcp.pmapir   r	   r
   r   r   Úcpmapir   r   r   r   r   r   r   r   Úobjectr   r0   rÈ   rÛ   r  rG  rS  r.   r'   r$   Ú<module>r¶     s}   ðÙ Gó. ß 9Õ 9ß @Õ @÷$÷ $ó $ô
�ô ô,~#ˆVô ~#ôBx+�)ô x+ôvn5�$ô n5ôb8˜ô 8ô0|˜˜{õ |r'   