o
     b6                     @   s   d Z ddlmZ ddlmZ zddlZW n ey!   ddlZY nw ddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlmZ dZdZdZG d	d
 d
eZdS )z" PCP Python Utils Config Routines     )deepcopy)OrderedDictN)pmapixxx   Fc                   @   s  e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd\d*d+Zd,d- Zd.d/ Zd0d1 Zd)g fd2d3Zd4d5 Zd6d7 Zd8d9 Zd:d; ZG d<d= d=e Z!d>d? Z"d@dA Z#e$dBfdCdDZ%dEdF Z&dGdH Z'e$dBfdIdJZ(dKdL Z)dMdN Z*dOdP Z+dQdR Z,dSdT Z-dUdV Z.d]dXdYZ/d]dZd[Z0d(S )^pmConfigz Config reader and validator c                 C   sh   d| _ d| _|| _g | _g | _g | _g | _g | _t | _	d| _
d | _g | _i | _g | _t | _g | _d S )N)z-?z--helpz-Vz	--version)label	instancesunittypewidth	precisionlimitformular   )arghelp
metricspecutilpmidsdescsinststextslabelsr   
res_labels_round_init_ts_pred_indom	_re_cache_tmp_conf_metrics_prev_insts)selfr    r!   ./usr/lib/python3/dist-packages/pcp/pmconfig.py__init__.   s    
zpmConfig.__init__c              	      sF    fdd}dD ]}zt t|}t|| W q ty    Y qw dS )z Set default signal handler c                    s    j   td dS )z Default signal handler r   N)r   finalizesysexit)_signum_framer    r!   r"   handlerV   s   
z,pmConfig.set_signal_handler.<locals>.handler)SIGHUPSIGTERMN)getattrsignal	Exception)r    r*   sigsignumr!   r)   r"   set_signal_handlerT   s   
zpmConfig.set_signal_handlerc                 C   
   |  |S )z Set default config file )set_config_path)r    default_configr!   r!   r"   set_config_fileb      
zpmConfig.set_config_filec           	   	   C   sJ  d}t jd}tjd}|D ]%}|d|}|d|}t |t jr5t j	|s1t j
|r5|} nqttjdd }|D ]a}|| jv rK dS |dv sT|drzB|dv r^t|}n|dd	d}t |t jrxt j	|st j
|st j|sd
}nt |t jsd}nd}td||f W qA ty   Y  |S w qA|S )z Set default config path N~PCP_SYSCONF_DIRz$HOMEz$PCP_SYSCONF_DIRr   )-cz--configr:    zNo such file or directoryzPermission deniedzNot a regular filez+Failed to read configuration from '%s':
%s.)ospath
expanduserr   	pmContextpmGetConfigreplaceaccessR_OKisfileisdiriterr%   argvr   
startswithnextexistsIOErrorStopIteration)	r    r5   configusrdirsysdirconfargsargerrr!   r!   r"   r4   f   sR   





zpmConfig.set_config_pathc                 C   s   g }| j jrCtj| j jr|| j j |S tt| j jD ]"}tj| j j|}|	drBt
|tjrBtj|rB|| q |S )z' Helper to get individual config files z.conf)r   rM   r<   r=   rD   appendsortedlistdirjoinendswithrB   rC   )r    
conf_filesffnr!   r!   r"   _get_conf_files   s   $
zpmConfig._get_conf_filesc                 C   s  t |}|dkr|dr|dr|dd }|| j_dS |dv r$d}|dv r*d}|d	kr4|| j_dS |d
krO|ddkrE|| j_dS |dd| j_dS |dkrd| jj	
| | jj	 | j_dS |dkry| jj	| | jj	 | j_dS |dkr|dkrd| j_dS d| j_dS |dkr|dkrd| j_dS d| j_dS |dkr|d| j_dS zt| j|t| W dS  ty   |dr|dr|dd }t| j|| Y dS w )z Set options read from file colxrow"r   N)trueTrueyyesYes)falseFalsennoNor   	speclocalderived;,samplesintervalr   rawtype_preferr	   )strrH   rX   r   r]   rj   findrk   rA   optspmSetOptionSamplespmGetOptionSamplesrn   pmSetOptionIntervalpmGetOptionIntervalro   r   rq   splitr	   setattrint
ValueError)r    namevaluer!   r!   r"   set_attr   sN   zpmConfig.set_attrc                 C   s   | |sdS ||D ]3}|| jjv r"|||s"td||f || jjv r3| |||| q|dkr?td||f qdS )z0 Read options from a configuration file section Nz"No value set for option %s in [%s]optionszUnknown option %s in [%s])has_sectionr   r   keysgetr|   r   )r    rM   sectionoptr!   r!   r"   read_section_options   s   
zpmConfig.read_section_optionsc                 C   s`  t jd dkrt jd dkrt }nt }t|_|  D ]}z6|| d}| || t	t j
dd D ]}|drT|dd | v rT|dd }| || q7W q tjy } z*t|drit|jn|jd d }t jd	||t|jf  t d W Y d}~qd}~w ty } zt jd
||f  t d W Y d}~qd}~ww dS )z& Read options from configuration file r      r      r   N:lineno4Failed to read configuration file '%s', line %s:
%s
z,Failed to read configuration file '%s':
%s.
)r%   version_infoConfigParserSafeConfigParserrr   optionxformr\   readr   rF   rG   rH   sectionsErrorhasattrr   errorsstderrwritemessager&   r|   )r    rM   rP   r   rR   errorr   r!   r!   r"   read_options   s8   

"zpmConfig.read_optionsc                 C   s0   t jt jj t jtjrt  t j S )z Read command line options )	r   c_apipmSetOptionFlagsPM_OPTFLAG_DONEpmGetOptionsFromListr%   rG   
pmUsageErrpmGetOperandsr)   r!   r!   r"   read_cmd_line   s   
zpmConfig.read_cmd_linec                 C   sp   g }t |g}t|d D ]'}|ds|dr |dd }|ds*|dr0|dd }|| q|S )z& Parse user-supplied instances string r   r^   'r   Nr_   )csvreaderlistrH   rX   rT   )r    r	   r   r   instr!   r!   r"   parse_instances   s   zpmConfig.parse_instancesc                 C   s   g }| ddk r|d |fS d}|dd }|r.t|dkr.|d dks,|d dkr.d}| ds8| drk|dd dd }|d }|d||d  }|r_| |dd	 }n| |}||d
}n|rp|g}| ddk r{|d7 }||fS )z" Parse instances from metric spec rm   r   z,,r   r   r^   r   Nr_   r;   )country   len	partitionrfindr   rA   )r    specr   quotedsinststrqr!   r!   r"   parse_metric_spec_instances  s(   (
z$pmConfig.parse_metric_spec_instancesc                 C   sZ   |g||< t dt| jD ]}t|| |kr*|dkr#|| g  q|| d qdS )z Parse new verbose metric r   r   N)ranger   r   rT   )r    metricskeyr~   indexr!   r!   r"   parse_new_verbose_metric  s   
z!pmConfig.parse_new_verbose_metricc                 C   s   | dr|dr|dd }|dkr>| jjdu r*d|| d  d | | j_dS | j jd|| d  d | 7  _dS | j|dkrU|g|| | j|d < dS ||| | j|d < dS )	z& Parse additional verbose metric info r^   r   r_   r   Nrl   r   =)rH   rX   r   rk   r   r   )r    r   r   r   r~   r!   r!   r"   parse_verbose_metric_info(  s    (z"pmConfig.parse_verbose_metric_infoc                 C   s   d}d|v sd|v r| dd | jvrd}d|v r)d|v r)| dd dkr)d}|rE| |d | \}}|d||< ||| d< d	S d|vsS| dd | jvr\| ||| d	S | d\}}||vrmtd| | |||| d	S )
z Parse metric information Frm   .r   Tr   r   zUndeclared metric key %sN)rsplitr   r   ry   r   r|   r   )r    r   r   r~   compactr   r   r!   r!   r"   parse_metric_info7  s   $"zpmConfig.parse_metric_infoc                    s  j j   stjd t  fdd}t }t }| }t }tj	d dkr<tj	d dkr<t

 }t

 }nt
 }t
 }t|_t|_ D ]}z|| W n7 t
jy }	 z*t|	drkt|	jn|	jd d }
tjd	||
t|	jf  td W Y d
}	~	nd
}	~	ww j jdkr/|dr/t }|dD ]o}|j jv rtjd tjd|  td |d|stjd tjd||f  td z|||d| W q ty }	 ztjd tjdt|	|  d  td W Y d
}	~	qd
}	~	ww |D ]}|| d
d d }|| dd
 ||< q| D ]7}||r@|| || |||< | |D ]\}}|!|||"dd qN|dvri|| q3qN|D ]}|| d
u r||rt }||D ]k}|||s|| }tjd tjd|||f  td |j jvrz||||| W q ty }	 z$|| }tjd tjd| t|	 d  td W Y d
}	~	qd
}	~	ww q|D ]}|| d
d d }|| dd
 ||< q|||< qn|D ]}|| d
u r)tjd|  td qj jdkr@|D ]}|| j j#|< q4|D ]*}t$|| t%rV|| j j#|< qB|| rk|| D ]}|| j j#|< q_qBj j#s}tjd td t&j j#_'d
S )z! Construct and prepare metricset zNo metrics specified.
c                     sd   t  }  D ]*}|drd| |dd < q|\}}|d}||d< |dd | |d < q| S )z# Helper to read command line items r   Nr   rm   r   r   )r   rH   r   ry   )tempmetmetricr   r   mr   r    r!   r"   read_cmd_line_itemsX  s   

z5pmConfig.prepare_metrics.<locals>.read_cmd_line_itemsr   r   r   r   r   r   Nglobalz"Failed to read configuration file z)'%s':
Section [global] contains options.
z''%s':
No value set for %s in [global].
z'%s':
z.
%z%%)r   r   z#'%s':
No value set for %s in [%s].
z&Metricset definition ':%s' not found.
)(r   rt   r   r%   r   r   r   r   r   r   r   r   rr   r   r\   r   r   r   r   r   r   r&   globalsr   r   r   r   r   r|   r   remove_sectionadd_sectionitemssetrA   r   
isinstancer   r   r   )r    r   globmetconfmetcmdlmetsourcesrM   all_setsrP   r   r   parsemetr   r   r}   r   r~   r   r   r!   r   r"   prepare_metricsQ  s   
"










zpmConfig.prepare_metricsc                 C      t | jdr| jjrdS dS )z Check if help texts requested include_textsTF)r   r   r   r)   r!   r!   r"   provide_texts     zpmConfig.provide_textsc                 C   r   )z Check if labels needed include_labelsTF)r   r   r   r)   r!   r!   r"   provide_labels  r   zpmConfig.provide_labelsc                 C   sD   g }|  D ]\}}t|tr|| | q|||f q|S )z  Helper to flatten dict to list )r   r   dictextend_dict_to_flat_listrT   )r    dr   kvr!   r!   r"   r     s   
zpmConfig._dict_to_flat_listc                 C   s   |  }|| |S )z Helper to merge label dicts )copyupdate)r    d1d2d3r!   r!   r"   merge_labels  s   
zpmConfig.merge_labelsNTc           	      C   s   |r| j | }n| jt| jj | }|dtjj	fv r#|d }n0|r4||d vr-i n|d | }n|d s:i n|d | }|sI|}|sHdS n
|d }| 
||}dddd | |D  d	 S )
z Return labels as string Nr   r   z{}{rm   c                 s   s     | ]\}}d ||f V  qdS )z	'%s':'%s'Nr!   ).0r   r   r!   r!   r"   	<genexpr>   s    z*pmConfig.get_labels_str.<locals>.<genexpr>})r   r   r   r   r   r   r   r   r   
PM_IN_NULLr   rW   r   )	r    r   r   currcombinerefr   inst_labelsmetric_labelsr!   r!   r"   get_labels_str  s    
"zpmConfig.get_labels_strc                 C   r   )z Check if doing live filtering live_filterTF)r   r   r   r)   r!   r!   r"   do_live_filtering  r   zpmConfig.do_live_filteringc                 C   r   )z! Check if doing invert filtering invert_filterTF)r   r   r   r)   r!   r!   r"   do_invert_filtering  r   zpmConfig.do_invert_filteringc                 C   s.   | j jjtjjkr| j j|S | j j|S )z  Get instance domain for metric )r   contextr   r   r   PM_CONTEXT_ARCHIVEpmGetInDomArchive
pmGetInDom)r    descr!   r!   r"   get_metric_indom  s   zpmConfig.get_metric_indomc                 C   sd   |t jjkr|r
i S g S |r| jj|S g }| jj|}|D ]}|||v r,|| ni  q |S )z Get instance labels )r   r   PM_INDOM_NULLr   r   pmGetInstancesLabelsrT   )r    indomr   r   r   indom_labelsir!   r!   r"   get_inst_labels  s   zpmConfig.get_inst_labelsc                 C   sV   | dr|dd }|S | dr|dd }|dr#|dd }tj|}|S )z Get process basename (r   r_   -Nr   )rH   rX   r<   r=   basename)r    procr!   r!   r"   get_proc_basename   s   


zpmConfig.get_proc_basenamec                 C   sl  z{| j j|d }|| jv rW dS | j j|d }|jjtjj	kr-tjj
gdgf}n| |}|d s>tjj
gdgf}|jjtjjks}|jjtjjks}|jjtjjks}|jjtjjks}|jjtjjks}|jjtjjks}|jjtjjks}ttjj| js| j jn| j}t| j dr| j jr|d d sW dS |r|d d r|  sg g g}|D ]}d}z| rd}	|d d  d  rt|d D ]0\}
}| d }| rt|t|kr|d |d |
  |d |d |
  d} nq| dd	 d
d	 dd	! rWd}	d|d d v rW|d d  d  rWt|d D ])\}
}|| "| d krU|d |d |
  |d |d |
  d}q-|sd}	t#$d| d }t|d D ]"\}
}t#%||r|d |d |
  |d |d |
  qk~W q t&y } zt'j()d|	||f  t'*d W Y d}~qd}~ww |d sW dS t+|}| j| | j,| | j-| | . r:d\}}}}z3| j j/|tjj0}| j j/|tjj1}|jjtjj	kr| j j2|tjj0}| j j2|tjj1}W n tjy/ } z|j3d tjj4kr% W Y d}~nd}~ww | j5||||g i }g }i }| 6 rkz| j j7|}| 8|jjd|d }| 8|jj}W n
 t&yj   Y nw | j9||g ||g| j:|< W dS  tjy } z+t| j dr| j j;rW Y d}~dS t'j()d|t<|f  t'*d W Y d}~dS d}~ww )z0 Validate individual metric and get its details r   N	omit_flatr   FzInvalid instanceTr   r;   _r   zInvalid process zInvalid regex\A\Zz%s '%s': %s.
)NNNNignore_incompatInvalid metric %s (%s).
)=r   r   pmLookupNamer   pmLookupDescscontentsr   r   r   r   r   r   r   
PM_TYPE_32PM_TYPE_U32
PM_TYPE_64PM_TYPE_U64PM_TYPE_FLOATPM_TYPE_DOUBLEPM_TYPE_STRINGpmErrPM_ERR_TYPEr   r	   r   r  r   isdigitry   	enumerater{   rT   rA   isalnumr  recompilematchr/   r%   r   r   r&   tupler   r   r   pmLookupTextPM_TEXT_ONELINEPM_TEXT_HELPpmLookupInDomTextrQ   PM_ERR_TEXTr   r   pmLookupLabelsr   r   r   r  rr   )r    r   pmidr   r   r	   foundrhitmsgr   r   spcrr   linefulldomldomhr   r   	ri_labelsr!   r!   r"   check_metric.  s   

 
",


zpmConfig.check_metricc                 C   r   )z& Check if unknown metrics are ignored ignore_unknownTF)r   r   r/  r)   r!   r!   r"   ignore_unknown_metrics  r   zpmConfig.ignore_unknown_metricsc                 C   sT   d|v r(| dd dd}| dd dd	}| d
d
 dd}| dd}|S )z Format a metric text label z / nanosecnsmicrosecusmillisecmssecr   minhourh/)rA   )r    r   r!   r!   r"   format_metric_label  s   zpmConfig.format_metric_labelc                   @   s    e Zd ZdZdd Zdd ZdS )zpmConfig.pmfg_items_to_indomzC Helper to provide consistent interface with pmfg items and indoms c                 C   s
   || _ dS )z# Initialize an instance with items N_items)r    r   r!   r!   r"   r#     r7   z%pmConfig.pmfg_items_to_indom.__init__c                 C   s   | j S )z Retrieve the items r=  r)   r!   r!   r"   __call__  s   z%pmConfig.pmfg_items_to_indom.__call__N)__name__
__module____qualname____doc__r#   r?  r!   r!   r!   r"   pmfg_items_to_indom  s    rD  c                 C   s   t t|t| | S )z8 Round an integer value up to the nearest upper integer )r{   mathceilfloat)r    r~   upperr!   r!   r"   integer_roundup  s   zpmConfig.integer_roundupc                 C   s
  zd}d}t | jdr| jjrd}t| jj| j_t | jdr-| jjr-d}t| jj| j_t | jdrA| jjrAd}t| jj| j_d}t | jdra| jjrad}t| jj| j_| jjdk rat|t | jd	r| jjrd	}t| jj| j_| jjdk rt|t | jd
r| jj	rd
}t| jj	| j_	| jj	dk rt|t | jdr| jj
rd}t| jj
| j_
| jj
dk rt|t | jdr| jjrd}| jjdkrt| jj| j_| jjdk rt|W dS W dS W dS W dS  ty   tjd||f  td Y dS w )z! Validate common utility options zInteger expectedunknownranklimit_filterlimit_filter_forcezNon-negative integer expectedr   r   width_forcer   precision_forcerepeat_headerautoz#Error while reading option %s: %s.
r   N)r   r   rK  r{   rL  rM  r   r|   rN  r   rO  rP  r%   r   r   r&   )r    rS   attrr!   r!   r"   validate_common_options  s\   z pmConfig.validate_common_optionsr   c           "         s   t jdstjj_t jdr/jjr/jjdD ]}|jjvr.dg gjj|< qjjr=tdjjdD ]}|	dsJ|	dr~z	jj
| W q> tjy} } ztjd	 tjd
|t|f  td W Y d}~q>d}~ww d}zz|dd\}}jj
|  W n tjy } zO|jd tjjkr| }n;z#jj
| |  W W Y d}~W |rtjd|  td q> tjy } z
| }W Y d}~nd}~ww W Y d}~n-d}~w ty } zd}W Y d}~nd}~w ty } zd}W Y d}~nd}~ww W |r*tjd|  td q>|r<tjd|  td w w t jdrIjjsӈjj t j_ fdd}	t D ]u}
|
_zjj
 |
|	 W q] tjy } zW|jd tjjkr d}z	jj
|
 W n, tjy } z|jd tjjkr ! r|
jv rd}W Y d}~nd}~ww |st |
 jj|
< W Y d}~q]d}~ww jj t j_ D ]S}
z+t"j#} |
 d _jj
 |
j$ t"j#|krW qވ |
 jj|
< W q tjy1 } ztjd|
t|f  td W Y d}~qd}~ww j%sU! sUtjd jj&rPt'd t'jj& td | }t }t(jjD ]\}}
t)ddD ]'}t"jj|
 |kr|dkrjj|
 *g  qkjj|
 *d qkjj|
 d sd}|
dD ]}||d d 7 }q|dd |
dd  jj|
 d< jj|
 d sjj&rj%| d d tjj+krjj&jj|
 d< j%| d d tjj+krg jj|
 d< |r,t"j%| d d}t jdr)jj|
 d s)jj-jj|
 d< njj|
 d dkr=djj|
 d< ndjj|
 d< t jdrSjj.dksljj|
 d dkslt jd rtjj/d!krtdjj|
 d< d"d# }d$d% }d&d' }j0| j1j2}||rt jd(rjj3rjj3jj|
 d)< n3t jd*rÈjj4rÈjj|
 d) sÈjj4jj|
 d)< njj|
 d) st|jj|
 d)< ||r%t jd+rjj5rjj5jj|
 d)< n3t jd,rjj6rjj|
 d) sjj6jj|
 d)< njj|
 d) s%t|jj|
 d)< ||rtt jd-rAjj7rAjj7jj|
 d)< n3t jd.rajj8rajj|
 d) sajj8jj|
 d)< njj|
 d) stt|jj|
 d)< jj|
 d) st|jj|
 d)< t jd rjj/d!krt|jj|
 d)< zTjj|
 d) }jj
9jj|
 d) \}}jj|
 d dkrj0| j1j.tjj:krj0| j;tjj<krd|vr|d/7 }=|}|||fjj|
 d)< W n+ tjy } ztjd0t|jj|
 d) f  td W Y d}~nd}~ww tjj>}t|tj0| j1j2kr8j0| j1j.}jj|
 d dkrSj0| j1j;tjj<krStjj>}j0| j1j.tjj:krfj0| j1j.}jj|
 d1 rzt?jj|
 d1 jj|
 d1< jj|
 d1 dk rtW n1 ty   tjd2|
  td Y nw t jd3rjj@jj|
 d1< ndjj|
 d1< t jd4r؈jjAdur؈jjAjj|
 d1< jj|
 d1 st"jj|
 d jj|
 d1< jj|
 d1 t"tBk rt"tBjj|
 d1< jj|
 d5 r;zt?jj|
 d5 jj|
 d6< W n1 ty:   tjd2|
  td Y nw t jd7rMjjCjj|
 d6< ndjj|
 d6< t jd8rmjjDdurmjjDjj|
 d6< djj|
 d5< jj|
 d9 rzt?jj|
 d9 jj|
 d9< W n( ty   tjd:|
  td Y nw t jd;rjjEjj|
 d9< t jd<rψjjFrψjjFjj|
 d9< j0| j1j.tjj:krdjj|
 d9< zg }tGd|}jj|
 d) d }|rjj|
 d rd}g }t)dt"j%| d D ]U}z.jjHI|
||j%| d | }|*j%| d | j%| d | |f |d7 }W q tjyg } z|jd tjjJkrW |*| W Y d}~qd}~ww |dkrtK|D ] } j%| d | = j%| d | = L rjM| d | = qqN|jj|
 d5< njjHO|
|||jj|
 d5< P rz"g jQ|
< jj|
 d D ]}!jQ|
 *tRSd=|! d>  qW n" ty } ztjd?|!|f  td W Y d}~nd}~ww W qa ty   t jd@rjjTr|||
< n Y qaw tK|D ]0}
j#||
 = j0||
 = j%||
 = U r;jV||
 = L rFjM||
 = jj|
= q~jjsj! s_tjdA ntjdB td t jdr|jjr~W  dS dS dS )Cz Validate the metricset 	leaf_only	predicaterm   r;   Nrl   r;  r   z*Failed to load derived metric definitions zfrom file '%s':
%s.
r   r   r   z'Failed to register derived metric:
%s.
z+Invalid syntax (expected metric=expression)zUnidentified errorc                    sL   | j kr| jjvrt j  jj| < dS dS t |  jj| < dS )z( Helper to support non-leaf metricspecs N)r   r   r   r   )r   r   r!   r"   metric_base_check
  s
   
z4pmConfig.validate_metrics.<locals>.metric_base_checkFTr  zNo matching instances found.
z
Requested global instances:   r_   i  rq   r   rp   r   outputarchivec                 S   &   | j dkr| jdkr| jdkrdS dS )z Test count dimension r   r   TF)dimCountdimSpacedimTimer
   r!   r!   r"   is_countp  
   


z+pmConfig.validate_metrics.<locals>.is_countc                 S   r[  )z Test space dimension r   r   TF)r]  r\  r^  r_  r!   r!   r"   is_spacex  ra  z+pmConfig.validate_metrics.<locals>.is_spacec                 S   r[  )z Test time dimension r   r   TF)r^  r\  r]  r_  r!   r!   r"   is_time  ra  z*pmConfig.validate_metrics.<locals>.is_timecount_scale_forcer   count_scalespace_scale_forcespace_scaletime_scale_force
time_scalez / sz%s: %s.
   z"Non-negative integer expected: %s
r   rN        r   rO     zInteger expected: %s
rL  rM  r  r  zInvalid regex '%s': %s.
r  zNo compatible metrics found.
zNot one known metric found.
)Xr   r   r   r   r   rU  ry   rk   filterrH   r   pmLoadDerivedConfigr   r  r%   r   r   rr   r&   r	  striprQ   r   PM_ERR_NAMEr   pmRegisterDerivedr|   r/   rT  r   r   r   pmTraversePMNSr0  r   r   r.  r   r	   printr  r   rT   r   rI  rq   r   rY  r   r  unitsrd  re  rf  rg  rh  ri  pmParseUnitsStrr  semPM_SEM_COUNTERr<  r  r{   r   rN  TRUNCr   rO  rL  rM  maxpmfgextend_itemPM_ERR_CONVreversedr   r   rD  extend_indomr   r   r  r  r  r   r   validate_predicate)"r    
curr_insts	max_instsrU  rk   r   rS   r}   exprrV  r   ignoreldynamic_instsincompat_metricsr   r   r   r`  rb  rc  r
   r   unitstrmultmtyper   scalemitemsvanishedjitemr   r$  r!   r   r"   validate_metrics  sT  




	




& 
	




$  $$
",



"





zpmConfig.validate_metricsc                 C   sh  | j j r| j j du rd}nt| j j }t| j j | | j _| j j r^| j j | j _t	d| j j| j _t| j j| j jd  | j _
| j jt| j j
 | j j | j _
n?| j j | j _
| j j
sqtd| j _
zt| j jt| j j
 d | j _W n ty   Y nw | j j | j _| j j | j _
t| j j
dkrtjd td dS dS )z Finalize util options Nr   r   r   z$Interval must be greater than zero.
)r   rt   pmGetOptionFinishOptargpmGetOptionOriginrG  pmGetOptionFinishruntimerv   rn   rz  ro   rw   rr   rx   r   timevalr{   r/   r%   r   r   r&   )r    originr!   r!   r"   finalize_options;  s2   $zpmConfig.finalize_optionsc                 C   sH   t  | j_g | _g | _g | _g | _g | _t  | _| jj	
  d| j_dS )z Clear metricset N)r   r   r   r   r   r   r   r   r   r{  clearpmfg_tsr)   r!   r!   r"   clear_metricsZ  s   
zpmConfig.clear_metricsc                 C   s(   |    | jj | j_| || dS )z Update metricset N)r  r   r{  extend_timestampr  r  )r    r  r  r!   r!   r"   update_metricsf  s   zpmConfig.update_metricsc                 C   s   t | jdr
| jjS dS )zV Action to take when namespace change occurs:
            ignore=0, abort=1, update=2 names_changer   )r   r   r  r)   r!   r!   r"   names_change_actionl  s   zpmConfig.names_change_actionc              
   C   s   z| j j }W n0 tjy8 } z#|jd tjjkr!W Y d}~dS |jd tjjkr2ttjjd|d}~ww | j j	sU| j 
 d}| j j }t|t|krUdS |tjj@ rk|  }|dkredS |d	krkdS dS )
z2 Sample using fetchgroup and handle special cases r   Nr_   z+
No metrics or instances to report present.z%srX  r   r   )r   r{  fetchr   r  rQ   r   
PM_ERR_EOLPM_ERR_TOOSMALLinterpolr  strftimert   r  rG  PMCD_NAMES_CHANGEr  )r    stater   samplefinishactionr!   r!   r"   r  s  s0   
	zpmConfig.fetchc                 C   sh   |  j d7  _ | jst| j d| _| jt| jj| j   }|t  }|dkr2t| dS dS )z Pause before next sampling r   z%s.%fr   N)	r   r   rG  r   r  r  ro   timesleep)r    wakeupr  r!   r!   r"   pause  s   zpmConfig.pausec                 C   s   | j | sdS | jj| d D ],}|dddddd r;d|v r;| d  r;|| | d kr; dS q| j | D ]}t	||rL dS qAd	S )
z/ Filter instance name against metric instances Tr   r   r;   r  r   r  r   F)
r   r   r   rA   r  ry   r  r  r  r  )r    r   r}   r$  r(  r!   r!   r"   filter_instance  s   
 zpmConfig.filter_instancec                 C   sB   | j js|S t| j j}t| j jdk}t|dd |dd| S )z Rank instances r   c                 S   s   | d S )Nr   r!   )r~   r!   r!   r"   <lambda>  s    zpmConfig.rank.<locals>.<lambda>)r   reverseN)r   rK  absboolrU   )r    r	   rK  revsr!   r!   r"   rK    s
   zpmConfig.rankc                 C   s   | j jdD ]Y}|| j jvrtjd|  td t| j j	 
|}| j| j| jj | j| d d tjjkrJtjd td | j| jjtjjkr`tjd td qdS )z- Validate predicate filter reference metrics rm   z"Predicate metric %s filtered out.
r   r   z&Predicate metric must have instances.
z)Predicate metric values must be numeric.
N)r   rU  ry   r   r%   r   r   r&   r   r   r   r   rT   r   r  r   r   r   r   r   r   r  )r    rU  r   r!   r!   r"   r    s   


zpmConfig.validate_predicateFc                 C   r3   )z. Deprecated, use get_ranked_results() instead )get_ranked_results)r    
valid_onlyr!   r!   r"   get_sorted_results  r7   zpmConfig.get_sorted_resultsc              
      sL  t  tjdrjjrjjd}nd} o  }tjjD ]\}g < zmjj d  D ]a\}}}zS|t	j
jkrH|sHW q8|rX|t	j
jkrX|sXW q8| }jj d r|vrjj d dkry|k ryW q8dk r|tkrW q8 |||f W q8 ty   Y q8w W n	 ty   Y nw |r s= q& r5fddD }	j|	kr5j}
t  _|	_D ]ed	}|
v r	|
 d }|
 d
   rtt  d ni }tfdd|D r|
 d
 }ntjj }jjj| }|d	u r-j| jj}||gj< qψs:S |ri t|D ]-\}}| |< j | vr^g <  !fdd| D  qCD ]v|v rjj d rjj d dkrfdd D < ndk rfdd D < qstjj }j| jjj vrӈ < qsj| jj  fdd D < qsntjdrjjrD ] < q r$ r$D ]fdd D < qS )z! Get filtered and ranked results rU  rm   r!   rk  rm  r   c                    s,   g | ]} | r|t t |  d  fqS r   )r   zip)r   r   )resultsr!   r"   
<listcomp>  s   , z/pmConfig.get_ranked_results.<locals>.<listcomp>Nr   c                 3   s    | ]}| v V  qd S )Nr!   )r   r   )
prev_instsr!   r"   r     s    z.pmConfig.get_ranked_results.<locals>.<genexpr>c                 3   s(    | ]}|d    vr|d  V  qdS )r   Nr!   r   x)p
pred_instsr!   r"   r     s   & c                    s   g | ]
}|d   kr|qS r   r!   r  r   r!   r"   r    s    c                    s    g | ]}|d  t  kr|qS r  )r  r  r  r!   r"   r         c                    s    g | ]}|d    v r|qS r  r!   r  )
inst_indexr  r!   r"   r  $  r  rK  c                    s    g | ]}  |d  r|qS )r   )r  r  )r   r    r!   r"   r  ,  r  )"r   r   r   rU  ry   r   r   r  r   r   r   r   r  r  rT   r/   r   r   r   r   r   r  allr   r   r!  r   r   r   r  r   rK  r   r   )r    r  
predicatesearly_live_filterr   r   r}   valr~   r   prev_labelsr-  r   r  rU  r!   )r  r   r   r  r  r  r  r    r"   r    s   


 


&


  zpmConfig.get_ranked_results)NTT)F)1r@  rA  rB  rC  r#   r2   r6   r4   r\   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r.  r0  r<  objectrD  rI  rS  
CURR_INSTSr  r  r  r  r  r  r  r  rK  r  r  r  r!   r!   r!   r"   r   ,   s^    &'/


`

-  d
r   )rC  r   r   collectionsr   configparserr   ImportErrorr.   r  rE  r   r%   r<   r  pcpr   ry  VERSIONr  r  r   r!   r!   r!   r"   <module>   s(   