
    iogqc                         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)Metric6   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    zz~~r'   c                 J    U R                   R                  R                  5       $ r3   )r4   r   decoderD   s    r$   _R_nameMetric._R_nameQ   s    zz%%''r'   c                 .    U R                   R                  $ r3   )r4   r   rD   s    r$   _R_pmidMetric._R_pmidS       zz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}}**GG,<=!!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                  XSU R                  5      n	U	R%                  U R                  5      nUR'                  XxU45        GM     U$ ! [         a    Sn Nf = 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"    hhtyy11778t{{#AnnT-G\\* hh--dkk7.2iinndnnNG!+.))Q((..t~~w/0$//CLL0EKK./ $   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^    LL ~~e3H}}$%B~~e0H}}$ & 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                  XR                  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+                  ["        XSU R$                  5      nU R                  R+                  ["        XSU R$                  5      nUR-                  ["        5      nUR-                  ["        5      nUU:  d  GM  UR/                  XUU-
  U-  45        GM     U$ ! [         a    Sn GNqf = f)zExtract 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   
 99==N*%%f--hhtyy11778t{{#AnnT-G221llEJH\\* hh--dkk7.2iinnnNGxx..u||X/3yy~~~OH!+.))Q((..~w/0$//C88//014??DLL0E]]>2FWUV^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,    zz,,TZZ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    88&&tyy7eXx(HH		0 NNLAS%# +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 !##  64t
,CGT4.DGT4.DGT4.DGT4.DGT4.D iD$7F-tT:J[$=H|T4@I>4t<KtT48I-tT4@M-tT4@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$))#DLE5#'??499#=LE$):"3u#45G GNN!!5"2399!!^3OOq O1		 0 0 2D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  pU HB  u  piU	[        :X  a  U(       d  / nUR                  U5        M+  U R                  Xi5      n
XX6   '   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+KE$&&{{}??&&t,DEd]+LL , ))%**,7IC!
:%!KK% #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2GL 	G  	 -2^^-=u}}ODJJ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+KEdE**{{7+#D>EL ,		 ))%0I9~E
*1S^SZ4PP

  !4w!>? m# + 5$d**  	 -2^^-=u}}ODJJ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 %20!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    yyr'   c                 \    U R                   R                  U R                   R                  :g  $ r3   )r  r   r   rD   s    r$   _R_nonCountersMetricGroup._R_nonCounters  s!    yy##tyy';';;;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    zz"",,,r'   c                     U R                   $ r3   )r   rD   s    r$   _R_prevMetricGroup._R_prev  s    zz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    99--e4DD\FKKf-.JJv{{F34  I!A:.		,FA!'	!7DOOA -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   
	 ))++DOO<DK[[))F4;;//778{{++44Q7{{++44Q7-1ZZ-=-C-C

4 *)-

4 &	 9   	 zz!}
* m#(-(8%--/JDJJ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5M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    </-  OT4>L>4t<KtT48IiD$7FtT48IGT4.D-tT4@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$zz|"..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MMOE$zz|"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,    :RYY%

"3c"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    == YY[E{&&& ! --224?D((==002:002002113=''E&..(4>>&+AAVK6C< 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     *&&&99**")!Q-D """ ]]&MM557E &+#
 """ '+&9&9# """ #'"5"5D"""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$DAa''HHW%{EH %		-""4/   	-!%(-**45 -NN58,- )	-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]    	YY[EK'')E DNN5$9D$@!	~~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&&(	jjlG==G/a/  %$..*AT^^TZE[*[  $$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:tT:G-/?tLM-/?tLMtZt4Gz4t4G
 -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5b8 80|{ |r'   