a h l@s<ddlZddlZddlZddlZddlZddlZddlZddlZddlm Z m Z m Z m Z m Z mZmZmZmZddlmZddlmZmZddlmZmZmZmZmZmZe rddladdl m!a!nda!dae"e#Z$Gdd d eZ%Gd d d e e&efZ'Gd d d eZ(ddddZ)GdddZ*GdddeZ+dS)N) TYPE_CHECKINGAnyDictIterableList NamedTupleOptionalSequenceUnion)CockpitProblem) AsyncChannel ChannelError) JsonObject JsonValueget_intget_objvget_strget_strvpmapic@s eZdZdS)MetricNotFoundErrorN)__name__ __module__ __qualname__rr8/usr/lib/python3.9/site-packages/cockpit/channels/pcp.pyrZsrcs$eZdZeddfdd ZZS) PcpMetricInfoN)valuereturncsDt|d|_t|dd|_t|dd|_tj|j|j|jddS)Nnamederiveunits)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) MetricInfopmidr!descr factorr# instancedN) rrrint__annotations__strrfloatboolrrrrr*fs r*rc Cs`tdustdur\zddladdlmaWn2tyZ}ztddd|WYd}~n d}~00dS)Nrr not-supportedzpython3-pcp not installedmessage)c_apircpmapipcp ImportErrorr)excrrrtry_import_pcpps r=c@s<eZdZUeeed<deeddddZeddd Z dS) ArchiveInfometric_descriptionspmapi.pmContextN)contextstartpathrcCs||_||_||_g|_dSN)rArBrCr?)r&rArBrCrrrr%}szArchiveInfo.__init__r4cCs|jSrD)rB)r&rrrsort_keyszArchiveInfo.sort_key) rrrrr*r0r2r1r%rErrrrr>zs  r>c@seZdZUdZeed<eed<ded<eed<eed<eed<eed <eed <eed <d Ze ed <d Z ded<e e ed<e d dddZeeddddZeeddddZeeedddZde e dd d!Zedd"d#d d$d%d&Zeeeed'd(d)Zeeed*d+d,Zd-dd d.d/d0Zd-ed1d2d3Zdeeeed4d5d6Zde e d7d8d9Zde e eed:d;dd?d@Z!ee d dAdBdCZ"dDd dEdFdGZ#eeddHdIdJZ$e d ddKdLZ%d S)MPcpMetricsChannelZmetrics1Zpcp_dir archive_batchr@rAsourceintervalstart_timestamplast_timestampnext_timestamplimitN last_sampleszpmapi.pmResult | None last_resultsr?)optionsrcCsDd|_d|_d|_tj}tj d}t|dd|_|jdksF|j|krZtdd|jdt|d d|_|jd|ks|jd|krtdd |jd|jdkrt t d|j|_t |d t |_ t|d ||_|jdks|j|krtdd |jdt|dd|_t|dg|_t|dd|_|jdkr@tddddS)N<rrIprotocol-errorzinvalid "interval" value: r6 timestampzinvalid "timestamp" value: metricsrMzinvalid "limit" value: instancesr"zomit-instancesrH0no "source" option specified for metrics channel)rGrKrLsysmaxsizerrIrrJr/timerrrVrMrrWomit_instancesrrH)r&rPZmax_sizeZmin_sizerrr parse_optionss,   zPcpMetricsChannel.parse_optionsz pmapi.timeval)rUrcCs(t|d}t|dd}t||S)NrS)r/rZtimeval)rUZsecZusecrrrfloat_to_timevals z"PcpMetricsChannel.float_to_timevalztuple[str, str])rHrcCs|dkrtdddn|dr,|}tj}nl|dkr^t}tjd}|d|}tj}n:|d krr|}tj }n&|d krd }tj }ntd d |d||fS)Nr"rTrXr6/z pcp-archiveZ PCP_LOG_DIRz /pmlogger/ZdirectZpmcdzlocal:r5z3unsupported "source" option specified for metrics: ) r startswithr8PM_CONTEXT_ARCHIVEplatformZnoder pmContextZ pmGetConfigZPM_CONTEXT_LOCALZPM_CONTEXT_HOST)rHr context_typehostname archive_dirrrrget_context_and_names(  z&PcpMetricsChannel.get_context_and_name)r rc Cst||tjd}t|dkr(td|D]P}|jD]D}d}z||j|}Wnt yltddYn0|j |q6q,|S)N)keyr not-foundr") sortedprepare_archivesr>rElenrrVconvert_metric_descriptionrArr?append)r&r archivesarchivemetric metric_descrrr get_archivess   zPcpMetricsChannel.get_archives)rArqrc Cst|dd}|dkr tdddt|dd}t|dd}z||}Wnhtjy}zN|tjkrt d|t d d |ddntd t |ddWYd}~n d}~00z| |d }Wn^tjy }zB|tjkrtd d |ddntd t |ddWYd}~n d}~00|j tjk} | r2t|jd kr||d|jD]Z} z||| } ||| Wn6tjy}ztd| |WYd}~n d}~00qVt|jd kr2||d|jD]\} z||| } ||| gWn6tjy,}ztd| |WYd}~n d}~00qd} |j}|rz||\}} Wn`tjy}zD|tjkrtd d |ddntd t |ddWYd}~n d}~00||||||ks| dkr|}t|d |||| || dS)Nr r"rTz;invalid "metrics" option was specified (no name for metric)r6r#r!zno such metric: %serrorzno 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 pmLookupNamerpmErrerrnor8Z PM_ERR_NAMEloggerrtrr1Z pmLookupDescZindomZ PM_INDOM_NULLrlrWZ pmDelProfileZ pmLookupInDomZ pmAddProfiledebugr\r#ZpmParseUnitsStrtry_convert_unitr*)r&rArqr r#r!Zpm_idsr<pm_descr.instanceZinstidZ omit_instancer-pm_unitsZ parsed_unitsrrrrmst    ((    (   ((z,PcpMetricsChannel.convert_metric_descriptionz pmapi.pmDescz pmapi.pmUnits)rAr|r~rc Csft}d|_z|tj||gd|Wn8tjy`}ztdt|ddWYd}~n d}~00dS)zGTry to convert a dummy value to validate that the metric is convertiblegrrur6N) r pmAtomValued pmConvScaler8PM_TYPE_DOUBLErwrr1)rAr|r~dummyr<rrrr{2s z"PcpMetricsChannel.try_convert_unit)rfrc cstt|d}|D]}td|z6ttj|}|}t |j d}t |||VWqtj y}z.| tjkrtdd|ddWYd}~qd}~00qdS)Nz/*.indexzopening archive: %rrSrizcould not read archive r6)globescaperyrzrrcr8raZpmGetArchiveLabelr2rBr>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)rrrr semantic_valJs   zPcpMetricsChannel.semantic_valzpmapi.pmResult)resultsrArcCs`g}|jD]}d|ji}|jr*|j|d<|jdkrDt|j|d<n ||jdd|j|d<||jj }|dkr||jj |d<|j rg}t |j j D]Z}|j |} |j| krqt |j |D],} |j || } ||j| j} || qq||d<||q ttd } t|j jjd |j jjd }|j|j|j||| d dS) Nr r!rvr#*r" semanticsrWrS)rHrIrUrVnow)r?r r!r-r1r#Z pmUnitsStrrr,Zsemr.rangecontentsnumpmidget_pmidr+ get_numval get_vlistZ pmNameInDominstrnr/r[rUZtv_secZtv_usecZ send_jsonrHrI)r&rrArVrrr,rZinstsir+jrZ instance_descrrUrrr send_metaUsB         zPcpMetricsChannel.send_meta)rrcCs|j}|durdSt|jjD]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)rOrrrr?r.rZget_inst)r&rrOrZnumval1Znumval2rrrrneeds_meta_updates     z#PcpMetricsChannel.needs_meta_update)rArGrM total_fetchedrc Csttjt|j}t|jD]\}}|j||<qg}zt|D]} ||kr|jtj kr`|WS| |t d|j |WS||} || r|r| |||| ||||| | |_|d7}q>| ||Wq0tjyl} zbt d| || tjkr2tdt| ddt|dkrJ| |WYd} ~ qpWYd} ~ q0d} ~ 00q0|S)NzReached limit "%s", stoppingrRzFetching error: %r, fetched %rrur6r)ctypesZc_uintrlr? enumerater+rtyper8ra send_updatesryrzrMZpmFetchrclearrrnparse_fetched_resultsrOrrwrxZ PM_ERR_EOLrr1) r&rArGrMrZpmidsrrqZfetched_rr<rrrsamples>              &zPcpMetricsChannel.sample)rArrc Cst|j}i}t|jj|d<t|jjD]}d}|j|}|j|}|j j } |dkrhd|||j <q*| t j ks| t jks| t jkrd|||j <q*|js|||||d}n.g} t|D]} | |||||| q| }||||j <q*|S)NrUr)listrVr2rrUrrrr?r,rr r8ZPM_TYPE_AGGREGATEZ PM_TYPE_EVENTZPM_TYPE_STRINGr. build_samplern) r&rArrVsamplesrvaluesnumvalrr content_typeZvalsrrrrrs4     z'PcpMetricsChannel.parse_fetched_resultsz float | None)rArrrrqr}rc Cs|j|}td||||j|}|j|kr6dS|j|}|j||} |jj } d} d} | t j krz"| || t j t j } | j d@} Wn0ty} ztd| WYd} ~ n d} ~ 00n| t jkr(z&| || t jt j} | jd>d?} Wn2ty$} ztd| WYd} ~ n d} ~ 00nPz| || | t j} | j} Wn2tyv} ztd| WYd} ~ n d} ~ 00|jj|jkrz8t}| |_|t j||jgd|j}|j|j} Wn:tjy} ztdt| d dWYd} ~ n d} ~ 00| S) Nz,build_sample pmid=%d, metric=%d, instance=%dlz&Unable to extract PCP TYPE_64 value %sz'Unable to extract PCP TYPE_U64 value %szUnable to extract PCP value %srrur6)rrryrzZget_vsetrZ get_valfmtrr,rr8Z PM_TYPE_64ZpmExtractValueZll Exception exceptionZ PM_TYPE_U64Zullrrr#rrrr-rwrr1)r&rArrrrqr}r+ZvaluesetZvalfmtrrZ sample_valueZatomr<rZconverted_atomrrrrsj     $ $ "(zPcpMetricsChannel.build_sample)r old_valuercCs$|dur|||j|jSdSdS)NF)rLrK)r&rrrrrcalculate_sample_rate3sz'PcpMetricsChannel.calculate_sample_rate)rrc CsFg}|jp i}|D]}|d|_g}|jD]}||j}||jd}t|tr|jdkrg} t|D]F\} } d} |durz || } Wnt yYn0| | | | qh| | n | |q,|jdkr|dur| | ||q,|dur| dq,| |q,| ||j|_ |}q||_| t|dS)NrUZrateF)rNrLrVr get isinstancerr!r IndexErrorrnrrKZ send_datajsondumpsencode) r&rdatarNrZsampled_valuesZ metricinforrtmpindexvalZold_valrrrr9s>               zPcpMetricsChannel.send_updateszSequence[ArchiveInfo])rorc Csd}t|D]\}}|j|_d|_d|_|j}|t|dkrR||dj|krRq ||jkrft|j}|j}z(| t j t t j B|||jWn8tjy}ztdt|ddWYd}~n d}~00||j|j|j|}q dS)NrrRrur6)rr?rOrNrJrlrBr/rAZ pmSetModer8ZPM_MODE_INTERPZ PM_XTB_SETZ PM_TIME_MSECr^rIrrwrr1rrGrM)r&rorrrprUrAr<rrrsample_archiveses$"   (z!PcpMetricsChannel.sample_archives)r rdrc Cszt||}Wn8tjyH}ztdt|ddWYd}~n d}~00|jD]B}d}z|||}WntytddYn0|j |qP|S)Nrur6r") rrcrwrr1rVrmrr?rn)r&r rddirect_contextr<rqrrrrrprepare_direct_contexts(  z(PcpMetricsChannel.prepare_direct_contextcsg|_td||j||ttdur6td||j \}}|t j krn| |}| ||n<|||}| ||dddt|jdIdHqdS)Nz)metrics pcp-archive open: %r, channel: %rTr5rRrrS)r?ryrzchannelr]r=rrrgrHr8rarsZreadyrrrasynciosleeprI)r&rPr rdrorrrrruns     zPcpMetricsChannel.run)&rrrZpayloadr1r0r/r2rNrrOrr*rr] staticmethodr^rgr r>rsrmr{rrkrrr3rrrrrrrrrrrrrrrFsL    G   //# A,rF),rrrrZloggingrbrYr[typingrrrrrrrr r Zcockpit.protocolr rr rZjsonutilrrrrrrr9r8r:rZ getLoggerrryrr1rr*r=r>rFrrrrAs.,