qw&ddlZddlZddlZddlZddlmZddlmZddlm Z m Z ddl m Z m Z ddlmZmZmZddlmZddlmZdd lmZdd lmZdd lmZdd lmZd ZdZedzZ dZ!dZ"GddeZ#dS)N)clpwd)jwt_token_check)is_cmt_disabledis_client_enabled)ProcLve LIMIT_LVP_ID) MySQLGovernorMySQLGovExceptionMySQLGovernorAbsent)LVEStat)LveStatsPlugin)mempages_to_bytes) get_domains)LVEUsage)write_file_via_tempfilezbThere was detected MySQL Governor and information about limits will be collected starting from nowz/Error while getting Mysql Governor limits: %s. zSince the governor doesn't seem to be well configured, the limits statistics won't be collected. This warning won't be repeated to prevent annoying spam in logs.zxCentralized Monitoring isn't enabled. CMCollector plugin won't collect data. It's expected behaviour for non CL+ clientsz}Centralized Monitoring has been detected! From now, CMCollector will gather limits statistics for it gently and affectionate.cteZdZdZGddZdZdZddZdZe dd e d e fd Z d Z dZdS) CMCollectorzA Collector plugin for Cloudlinux+ Centralized Monitoring c0eZdZdZdZdZdZdZdZdS)CMCollector.DomainsCachez= Sub-class for keeping username:domain pairs c>||_i|_d|_d|_dS)NriQ)logcachecache_creation_timecache_expiration_interval)selfloggers /builddir/build/BUILDROOT/lve-stats-4.3.2-1.el9.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/lvestats/plugins/generic/cm_collector.py__init__z!CMCollector.DomainsCache.__init__:s&DHDJ'(D $-9D * * *c|r!|jdi|_||jvr |j|S||}|r||||S)Nz@Domains cache is expired, going to regenerate user-domains cache) _is_expiredrinfor_get_real_valuesetrusernamedomains rgetzCMCollector.DomainsCache.get@s!!  `aaa 4:%%z(++))(33F +6***Mrc|jsRttj|_|jdt |j||j|<dS)NzCache creation timestamp: %s)rinttimerrr"strr%s rr$zCMCollector.DomainsCache.setKsW: ]+.ty{{+;+;( [>[\\\#)DJx rcdttj|jz |jkS)N)r*r+rrrs rr!z$CMCollector.DomainsCache._is_expiredQs&ty{{##d&>>A__ _rcT t|ddS#t$rYdSwxYw)NF)raise_exceptionr)r Exception)rr&s rr#z(CMCollector.DomainsCache._get_real_valueTsC "8UCCCAFF   tt s  ''N) __name__ __module__ __qualname____doc__rr(r$r!r#rr DomainsCacher5sl   : : :    * * *  ` ` `     rr7ctjd|_d|_d|_d|_d|_d|_d|_d|_ |j dt|_ t|_tj|_||j|_dS)NzCL+CM_Collectorr<z/var/lve/cm_lve.jsonFzCM Collector plugin init)logging getLoggerrnowperiod_filename_to_write_is_write_error_is_jwt_token_error_is_governor_absent_error_is_cm_enabled_errorr"rproc_lver governorrClPwdget_sys_min_uidmin_uidr7 domains_cacher.s rrzCMCollector.__init__\s$%677 "8$#( ).&$)!  0111  % {}}4466 !..tx88rc |j|\}}|jr&|jt d|_n#t $rF}|js4|jtt|d|_Yd}~dSd}~wt$r8}|jtt|Yd}~dSd}~wwxYwd|id|dzidS)zn Gets Mysql Governor limits and returns ready-to-send dict with limits and zero-usage FTNli) mysql_cpumysql_io) rDget_limits_by_userrArr"GOVERNOR_ENABLED_MSGr warningGOVERNOR_ABSENT_ERROR_MSGr,r GOVERNOR_BASIC_ERROR_MSG)rr&cpuioes r_prepare_dbgov_limitsz!CMCollector._prepare_dbgov_limitsks m66x@@GC- 7 233316."   1 6  !:CFFCCC15.44444     H  5s1vv > > >44444 sR$Y   s$A A C;B C%-CCrcRi}|j|dD]}|j}t||}|jdks|jt krG|t|||d||j<|S)zF Parse lve limits from /proc/lve via ProcLve instance F)without_limitsrT) only_limits) rClinesversionr idr_lveusage_to_dictrinit_limits_from_lvestat)rprocslvp_idlimitslinerZstats r _parse_limitszCMCollector._parse_limitssM''u'EE  Dm++--G4))Dw!||tw,66"44!!::4GGUY5F47OO rci}|jrF|jD],}||||-||||S)zI Returns dict with lve_id and it`s limits from /proc/lve )r_)rCresellers_supported lvp_id_listupdaterc)rr^usersr_s r_get_lve_userszCMCollector._get_lve_userss = , , . . G-3355 G G T//f/EEFFFF T''../// rFusagerXc |rCd|jdz id|jidt|jid|jid|jid|jidStt|j dz |jdz |j d|j |j|j dttt|j t|j|jdtt|j|j|jdtt|j|j|jdtt|j|j|jddS)zL Return ready-to-send dict with metrics by passed lve usage rJd)rReppmemnprocrSiops)arJf)lcpuleprlmemphylnprocrSliopsr*round cpu_usage cpu_faultmep mep_faultmemphy memphy_faultro nproc_faultio_usageio_faultrp iops_fault)rjrXs rr\zCMCollector._lveusage_to_dictsz  UZ#-.EI&/ >>?u|,EHoek*  u//0036Z#%_   HH&s5+>+>'?'?@@&u}55' u{++,,\& u~..//X^ uz**++[%-   rc(g}|di}||dd}|di}|D]$\}} t j|j}n#t$rY-wxYw|j|} | sN||| d} ||vr1||} | | | n| |||vrA||d||dd| d <||d ||d d| d <n,| |} | | | | | &|S) z Returns list with metrics (lve&mysql) by each lve_id In case there is some usage for lve_id -> it will be used otherwise -> zero-usage values with actual lve/mysql limits are used dbgov_data_for_cmr^ lve_usage)lve_idr&r'ry cpu_limit)rqrJrKrio_limitrL) poprir(itemspwdgetpwuidpw_namer1rHrgr\rUappend) rlve_data lve_data_listrrhrr limits_datar&r' lve_data_dictv mysql_limitss r_prepare_metrics_to_sendz$CMCollector._prepare_metrics_to_sends  $LL)%>????$$[111****62;?*62;?.. k* +62:>*62:>-- j)) $99(CC +!((666   / / / /s3B  BBct\}}}|s+|js"|jd|d|_dSt st s/|js&|jtd|_dSd|_|jr&|jtd|_tj d| |i} t||j dd|_dS#tt f$rF}|js4|jt%|d|_Yd}~dSYd}~dSd}~wwxYw)z( Main plugin entrypoint zfJWT token error: '%s'. CM Collector plugin will not work, it is expected behaviour for non CL+ clientsTNF lve_statsi)rr@rr"rrrBCM_DISABLED_MSGCM_ENABLED_MSGjsondumpsrrr>r?IOErrorOSErrorerrorr,)rrtoken_is_validtoken_error_msg_ json_resultrTs rexecutezCMCollector.executes .=->->* + 0 C# ,0( F    $5$7$7 , 1 o...,0) F#(  $ . HMM. ) ) )(-D %j+t/L/LX/V/V!WXX  , #K1H% P P P#(D ! , , ,' ,s1vv&&&'+$$$$$$$ , , , , , , ,s)DE5EEN)r)F)r2r3r4r5r7rrUrcri staticmethodrboolr\rrr6rrrr0s%%%%%%%%N 9 9 9   4       ( ( ( ( ( ( \( T+++Z#,#,#,#,#,rr)$r:rrr+clcommonrclcommon.lib.jwt_tokenrclcommon.lib.cmt_utilsrrclcommon.clprocrr clcommon.libr r r lvestatr lvestats.core.pluginr lvestats.lib.commons.sizeutilrlvestats.lib.commons.funcr"lvestats.plugins.generic.analyzersrsecureiorrNrQrPrrrr6rrrs 222222EEEEEEEE11111111NNNNNNNNNN//////;;;;;;111111777777,,,,,,iM %%$ j,j,j,j,j,.j,j,j,j,j,r