HEX
Server: Apache
System: Linux 185.122.168.184.host.secureserver.net 5.14.0-570.60.1.el9_6.x86_64 #1 SMP PREEMPT_DYNAMIC Wed Nov 5 05:00:59 EST 2025 x86_64
User: barbeatleanalyti (1024)
PHP: 8.1.33
Disabled: NONE
Upload Files
File: //proc/self/root/lib/python3.9/site-packages/cockpit/channels/__pycache__/pcp.cpython-39.opt-1.pyc
a

�/�h�k�@s<ddlZddlZddlZddlZddlZddlZddlZddlZddlm	Z	m
Z
mZmZm
Z
mZmZmZmZddlmZddlmZmZddlmZmZmZmZmZmZe	r�ddladdl m!a!nda!dae�"e#�Z$Gdd	�d	e�Z%Gd
d�dee&ef�Z'Gdd
�d
e�Z(dd�dd�Z)Gdd�d�Z*Gdd�de�Z+dS)�N)	�
TYPE_CHECKING�Any�Dict�Iterable�List�
NamedTuple�Optional�Sequence�Union)�CockpitProblem�)�AsyncChannel�ChannelError)�
JsonObject�	JsonValue�get_int�get_objv�get_str�get_strv��pmapic@seZdZdS)�MetricNotFoundErrorN)�__name__�
__module__�__qualname__�rr�8/usr/lib/python3.9/site-packages/cockpit/channels/pcp.pyrZsrcs$eZdZedd��fdd�Z�ZS)�
PcpMetricInfoN)�value�returncsDt|d�|_t|dd�|_t|dd�|_t�j|j|j|jd�dS)N�name�derive��units)r r!r#)rr r!r#�super�__init__)�selfr��	__class__rrr%_szPcpMetricInfo.__init__)rrrrr%�
__classcell__rrr'rr^src@sFeZdZUeed<eed<eed<eed<eed<eed<eed<dS)	�
MetricInfo�pmidr!�descr �factorr#�	instancedN)	rrr�int�__annotations__�strr�float�boolrrrrr*fs
r*�rc
Cs`tdustdur\zddladdlmaWn2tyZ}ztddd�|�WYd}~n
d}~00dS)Nrr�
not-supportedzpython3-pcp not installed��message)�c_apir�cpmapi�pcp�ImportErrorr)�excrrr�try_import_pcppsr=c@s<eZdZUeeed<deedd�dd�Zed�dd	�Z	dS)
�ArchiveInfo�metric_descriptions�pmapi.pmContextN)�context�start�pathrcCs||_||_||_g|_dS�N)rArBrCr?)r&rArBrCrrrr%}szArchiveInfo.__init__r4cCs|jSrD)rB)r&rrr�sort_key�szArchiveInfo.sort_key)
rrrrr*r0r2r1r%rErrrrr>zs
r>c@s�eZdZUdZeed<eed<ded<eed<eed<eed<eed	<eed
<eed<dZe	ed
<dZ
ded<eeed<e
d�dd�Zeedd�dd��Zeedd�dd��Zeeed�dd�Zde
ed�d d!�Zedd"�d#d$��Zeeeed%�d&d'��Zeeed(�d)d*��Zd+ddd,�d-d.�Zd+ed/�d0d1�Zdeeeed2�d3d4�Zde	e	d5�d6d7�Zeeeeed8�d9d:�Zeeee	d;�d<d=�Z e!e	dd>�d?d@�Z"dAdB�Z#eeddC�dDdE�Z$e
ddF�dGdH�Z%dS)I�PcpMetricsChannelZmetrics1Zpcp_dir�
archive_batchr@rA�source�interval�start_timestamp�last_timestamp�next_timestamp�limitN�last_sampleszpmapi.pmResult | None�last_resultsr?)�optionscCsDd|_d|_d|_tj}tjd}t|dd�|_|jdksF|j|krZtdd|j��d��t|d	d�|_|jd|ks�|jd|kr�tdd
|j��d��|jdkr�t	t
�
�d|j�|_t|dt�|_
t|d|�|_|jdks�|j|kr�tdd
|j��d��t|dd�|_t|dg�|_t|dd�|_|jdk�r@tddd��dS)N�<r�rI���protocol-errorzinvalid "interval" value: r6�	timestampzinvalid "timestamp" value: �metricsrMzinvalid "limit" value: �	instancesr"zomit-instancesrH�0no "source" option specified for metrics channel)rGrKrL�sys�maxsizerrIrrJr/�timerrrVrMrrW�omit_instancesrrH)r&rPZmax_sizeZmin_sizerrr�
parse_options�s,
zPcpMetricsChannel.parse_optionsz
pmapi.timeval)rUrcCs(t|d�}t|dd�}t�||�S)NrS)r/rZtimeval)rUZsecZusecrrr�float_to_timeval�sz"PcpMetricsChannel.float_to_timevalztuple[str, str])rHrcCs�|dkrtddd��n�|�d�r,|}tj}nl|dkr^t��}tj�d�}|�d|��}tj}n:|d	krr|}tj	}n&|d
kr�d}tj
}ntdd
|��d��||fS)Nr"rTrXr6�/zpcp-archiveZPCP_LOG_DIRz
/pmlogger/ZdirectZpmcdzlocal:r5z3unsupported "source" option specified for metrics: )r�
startswithr8�PM_CONTEXT_ARCHIVE�platformZnoder�	pmContextZpmGetConfigZPM_CONTEXT_LOCALZPM_CONTEXT_HOST)rHr �context_type�hostname�archive_dirrrr�get_context_and_name�s(
�z&PcpMetricsChannel.get_context_and_name)r rc
Cs�t|�|�tjd�}t|�dkr(td��|D]P}|jD]D}d}z|�|j|�}Wnt	yltd�d�Yn0|j
�|�q6q,|S)N)�keyr�	not-foundr")�sorted�prepare_archivesr>rE�lenrrV�convert_metric_descriptionrArr?�append)r&r �archives�archive�metric�metric_descrrr�get_archives�s
zPcpMetricsChannel.get_archives)rArqrcCs�t|dd�}|dkr tddd��t|dd�}t|dd�}z|�|�}Wnhtjy�}zN|��tjkr�t�	d|�t
d	d
|��d�d�ntdt|�d�d�WYd}~n
d}~00z|�|d�}Wn^tj�y }zB|��tjkr�td
d
|��d�d�ntdt|�d�d�WYd}~n
d}~00|j
tjk}	|	�r2t|j�dk�r�|�|d�|jD]Z}
z|�||
�}|�||�Wn6tj�y�}zt�d|
|�WYd}~n
d}~00�qVt|j�dk�r2|�|d�|jD]\}z|�||�}|�||g�Wn6tj�y,}zt�d||�WYd}~n
d}~00�q�d}
|j}|�r�z|�|�\}}
Wn`tj�y�}zD|��tjk�r�td
d
|��d�d�ntdt|�d�d�WYd}~n
d}~00|�|||�||k�s�|
dk�r�|}t|d||||
||	d�S)Nr r"rTz;invalid "metrics" option was specified (no name for metric)r6r#r!zno such metric: %s�errorzno such metric: �internal-errorrriz)Unable to add profile: instance=%s err=%sz,Unable to remove profile: instance=%s err=%s��?)r+r r!r,r-r#r.)rrZpmLookupNamer�pmErr�errnor8ZPM_ERR_NAME�loggerrtrr1ZpmLookupDescZindomZ
PM_INDOM_NULLrlrWZpmDelProfileZ
pmLookupInDomZpmAddProfile�debugr\r#ZpmParseUnitsStr�try_convert_unitr*)r&rArqr r#r!Zpm_idsr<�pm_descr.�instanceZinstidZ
omit_instancer-�pm_unitsZparsed_unitsrrrrm�st�((
(
((�z,PcpMetricsChannel.convert_metric_descriptionr4c
Csft��}d|_z|�tj||gd|�Wn8tjy`}ztdt|�d�d�WYd}~n
d}~00dS)zGTry to convert a dummy value to validate that the metric is convertiblegrrur6N)	r�pmAtomValue�d�pmConvScaler8�PM_TYPE_DOUBLErwrr1)rAr|r~�dummyr<rrrr{2sz"PcpMetricsChannel.try_convert_unit)rfrccs�t�t�|�d�}|D]�}t�d|�z6t�tj|�}|��}t	|j
�d}t|||�VWqtjy�}z.|�
�tjkr�tdd|��d�d�WYd}~qd}~00qdS)Nz/*.indexzopening archive: %rrSrizcould not read archive r6)�glob�escaperyrzrrcr8raZpmGetArchiveLabelr2rBr>rwrxZPM_ERR_LOGFILEr)rfZindexesZarchive_pathrAZ	log_labelZ
archive_startr<rrrrk<sz"PcpMetricsChannel.prepare_archives)�sem_idrcCs.|tjkrdS|tjkrdS|tjkr*dSdS)NZcounterZinstantZdiscreter")r8ZPM_SEM_COUNTERZPM_SEM_INSTANTZPM_SEM_DISCRETE)r�rrr�semantic_valJs


zPcpMetricsChannel.semantic_valzpmapi.pmResult)�resultsrArcCs`g}|jD�]}d|ji}|jr*|j|d<|jdkrDt|j�|d<n |�|j��dd|j��|d<|�|jj	�}|dkr�|�|jj	�|d<|j
�rg}t|jj
�D]Z}|j�|�}	|j|	kr�q�t|j�|��D],}
|j�||
�}|�|j|j�}|�|�q�q�||d<|�|�q
tt���d	}
t|jjjd	|jjjd	�}|j|j|j|||
d
�dS)Nr r!rvr#�*r"�	semanticsrWrS)rHrIrUrV�now)r?r r!r-r1r#Z
pmUnitsStrr�r,Zsemr.�range�contents�numpmid�get_pmidr+�
get_numval�	get_vlistZpmNameInDom�instrnr/r[rUZtv_secZtv_usecZ	send_jsonrHrI)r&r�rArVrrr,r�Zinsts�ir+�jrZ
instance_descr�rUrrr�	send_metaUsB


 
��zPcpMetricsChannel.send_meta)r�rcCs�|j}|durdSt|jj�D]j}|j|js0q|j�|�}|j�|�}||krVdSt|�D](}|j�||�|j�||�kr^dSq^qdS)z�
        If a multi-instance metric changes its instances we need to send a new
        meta message when these change. For example when an drive or ethernet
        card is removed out.
        NTF)rOr�r�r�r?r.r�Zget_inst)r&r�rOr�Znumval1Znumval2r�rrr�needs_meta_update�sz#PcpMetricsChannel.needs_meta_update)rArGrM�
total_fetchedrc
Csttjt|j��}t|j�D]\}}|j||<qg}z�t|�D]�}	||kr�|jtj	kr`|WS|�
|�t�d|j
�|WS|�|�}
|�|
�r�|r�|�
|�|��|�|
|�|�|�||
��|
|_|d7}q>|�
|�|��Wq0tj�yl}zbt�d||�|��tjk�r2tdt|�d�d�t|�dk�rJ|�
|�WYd}~�qpWYd}~q0d}~00q0|S)NzReached limit "%s", stoppingrRzFetching error: %r, fetched %rrur6r)�ctypesZc_uintrlr?�	enumerater+r��typer8ra�send_updatesryrzrMZpmFetchr��clearr�rn�parse_fetched_resultsrOrrwrxZ
PM_ERR_EOLrr1)r&rArGrMr�Zpmidsr�rqZfetched�_r�r<rrr�sample�s>








&zPcpMetricsChannel.sample)rAr�rcCs�t|j�}i}t|jj�|d<t|jj�D]�}d}|j�|�}|j|}|j	j
}	|dkrhd|||j<q*|	tj
ks�|	tjks�|	tjkr�d|||j<q*|js�|�||||d�}n.g}
t|�D]}|
�|�|||||��q�|
}||||j<q*|S)NrUr)�listrVr2r�rUr�r�r�r?r,r�r r8ZPM_TYPE_AGGREGATEZ
PM_TYPE_EVENTZPM_TYPE_STRINGr.�build_samplern)r&rAr�rV�samplesr��values�numvalrr�content_typeZvalsr�rrrr��s4


��z'PcpMetricsChannel.parse_fetched_results)rrrqr}rc
Cs|j�|�}t�d|||�|j�|�}|j|kr6dS|j�|�}|j�||�}	|jj	}
d}d}|
t
jkr�z"|�||	t
jt
j�}|j
d@}Wn0ty�}
zt�d|
�WYd}
~
n
d}
~
00n�|
t
jk�r(z&|�||	t
jt
j�}|jd>d?}Wn2t�y$}
zt�d|
�WYd}
~
n
d}
~
00nPz|�||	|
t
j�}|j}Wn2t�yv}
zt�d|
�WYd}
~
n
d}
~
00|jj|jk�r�z8t��}||_|�t
j||jgd|j�}|j|j}Wn:tj�y�}
ztdt|
�d	�d�WYd}
~
n
d}
~
00|S)
Nz,build_sample pmid=%d, metric=%d, instance=%dl���z&Unable to extract PCP TYPE_64 value %s�z'Unable to extract PCP TYPE_U64 value %szUnable to extract PCP value %srrur6)r�r�ryrzZget_vsetr�Z
get_valfmtr�r,r�r8Z
PM_TYPE_64ZpmExtractValueZll�	Exception�	exceptionZPM_TYPE_U64Zullr�r�r#rrr�r-rwrr1)r&rAr�rrrqr}r+ZvaluesetZvalfmtrr�Zsample_valueZatomr<r�Zconverted_atomrrrr��sj

�$�$�
"�(zPcpMetricsChannel.build_sample)r�	old_valuercCs$|dur|||j|jSdSdS)NF)rLrK)r&rr�rrr�calculate_sample_rate2sz'PcpMetricsChannel.calculate_sample_rate)r�rc
CsFg}|jpi}|D�]}|d|_g}|jD]�}||j}|�|jd�}t|t�r�|jdkr�g}	t|�D]F\}
}d}|dur�z||
}Wnt	y�Yn0|	�
|�||��qh|�
|	�n
|�
|�q,|jdkr�|dur�|�
|�||��q,|du�r|�
d�q,|�
|�q,|�
|�|j|_|}q||_|�
t�|����dS)NrUZrateF)rNrLrVr �get�
isinstancer�r!r��
IndexErrorrnr�rKZ	send_data�json�dumps�encode)
r&r��datarNr�Zsampled_valuesZ
metricinforr��tmp�index�valZold_valrrrr�8s>








zPcpMetricsChannel.send_updatescCs�d}t|�D]�\}}|j|_d|_d|_|j}|t|�dkrR||dj|krRq||jkrft|j�}|j}z(|�	t
jt
�t
j
�B|�|�|j�Wn8tjy�}ztdt|�d�d�WYd}~n
d}~00|�|j|j|j|�}qdS)NrrRrur6)r�r?rOrNrJrlrBr/rAZ	pmSetModer8ZPM_MODE_INTERPZ
PM_XTB_SETZPM_TIME_MSECr^rIrrwrr1r�rGrM)r&ror�r�rprUrAr<rrr�sample_archivesds$"

�(z!PcpMetricsChannel.sample_archives)r rdrc
Cs�zt�||�}Wn8tjyH}ztdt|�d�d�WYd}~n
d}~00|jD]B}d}z|�||�}Wnty�td�d�Yn0|j�	|�qP|S)Nrur6r")
rrcrwrr1rVrmrr?rn)r&r rd�direct_contextr<rqrrrrr�prepare_direct_context�s(
z(PcpMetricsChannel.prepare_direct_context)rPrc�s�g|_t�d||j�|�|�t�tdur6td��|�|j	�\}}|t
jkrn|�|�}|�
�|�|�n<|�||�}|�
�|�|ddd�t�|jd�IdHq�dS)Nz)metrics pcp-archive open: %r, channel: %rTr5rRrrS)r?ryrz�channelr]r=rrrgrHr8rarsZreadyr�r�r��asyncio�sleeprI)r&rPr rdror�rrr�run�s


zPcpMetricsChannel.run)&rrrZpayloadr1r0r/r2rNrrOrr*rr]�staticmethodr^rgrr>rsrmr{rkr�r�r3r�r�r�rr�r�r	r�r�r�r�rrrrrF�sH
G	

//#@,rF),r�r�r�r�ZloggingrbrYr[�typingrrrrrrrr	r
Zcockpit.protocolrr�r
rZjsonutilrrrrrrr9r8r:rZ	getLoggerrryrr1rr*r=r>rFrrrr�<module>As.,