§ Ù@ªjA6ãóÒ—ddlmZddlmZmZddlmZmZmZmZm Z ddlm Z ddl m Z ddl mZmZmZmZmZddlmZddlmZmZmZdd lmZdd lmZd „Zd „ZGd „de¦«ZdS)é)Úceil)ÚIntegerÚdesc)Úand_ÚselectÚfuncÚcaseÚcast)Úor_)Ú uidconverter)Úgm_datetime_to_unixtimestampÚ gm_to_localÚunixtimestamp_to_gm_datetimeÚ local_to_gmÚround_1m)ÚOutputFormatter)Úconvert_to_listÚenumerate_duplicate_columnsÚadd_labes_to_column)Údyn_time_unit_groups)Ú history_govcó&—tj| d¦«d¦«¦«tj| d¦«d¦«¦«ztj| d¦«d¦«¦«zS)z‰ :param sqlalchemy.orm.attributes.InstrumentedAttribute cause_of_restrict: :return sqlalchemy.sql.elements.BinaryExpression: ú&ééé)rÚmaxÚop©Úcause_of_restricts ú†/builddir/build/BUILDROOT/lve-stats-5.0.5-1.el8.x86_64/opt/cloudlinux/venv/lib/python3.11/site-packages/lvestats/lib/lveinfolib_gov.pyÚget_bitwise_restrictr"sˆ€õ ŒÐ*Ð"×%Ò% cÑ*Ô*¨1Ñ-Ô-Ñ.Ô.Ý Œ(Ð,Ð$×'Ò'¨Ñ,Ô,¨QÑ/Ô/Ñ 0Ô 0ñ 1å Œ(Ð,Ð$×'Ò'¨Ñ,Ô,¨QÑ/Ô/Ñ 0Ô 0ñ 1ðóc ó†—t|dkdf|dkdf|dkdf|dkdf|d kd f|d kd f|d kdfgd¬¦«S)zv :param sqlalchemy.sql.elements.BinaryExpression cause_of_restrict: :return sqlalchemy.sql.elements.Case: rÚCrÚRéÚCRrÚWéÚCWéÚRWéÚCRWÚ)Úelse_)r rs r!Úget_cause_of_restrictr2(s€€õ à  !Ò # SÐ )Ø  !Ò # SÐ )Ø  !Ò # TÐ *Ø  !Ò # SÐ )Ø  !Ò # TÐ *Ø  !Ò # TÐ *Ø  !Ò # UÐ +ð ðð ñ ô ð r#cóh—eZdZdZ dd„Zd„Zd„Zd „Zd „Zd „Z d „Z d „Z dd„Z dd„Z dS)ÚHistoryShowDBGovÚtsNÚ localhostFçÍÌÌÌÌÌì?cóà—| |_| |_||_||_||_||_||_||_||_||_ | pddi|_ | dkrd|_ n| |_ | |_ dS)a? :param bool reverse: :param sqlalchemy.engine.base.Engine dbengine: :param datetime.datetime period_from: :param datetime.datetime period_to: :param int|None uid: :param str server_id: :param str|list|tuple|None show_columns: :param str order_by: :param int|None limit: :param dict|None cfg: :param int|None time_unit: :param bool reverse: :param list[str]|str|None by_usage: :param float by_usage_percentage: value in range [0..1] :return list: Ú server_idr6éÿÿÿÿN) Úby_usage_percentageÚby_usageÚdbengineÚ period_fromÚ period_toÚuidr9Úrequested_columnsÚorder_byÚlimitÚcfgÚ time_unitÚreverse)Úselfr=r>r?r@r9Ú show_columnsrBrCrDrErFr<r;s r!Ú__init__zHistoryShowDBGov.__init__>sƒ€ðB$7ˆÔ Ø ˆŒ Ø ˆŒ Ø&ˆÔØ"ˆŒØˆŒØ"ˆŒØ!-ˆÔØ ˆŒ ؈Œ ØÐ4˜;¨ Ð4ˆŒØ ˜Š?ˆ?Ø!ˆDŒNˆNà&ˆDŒN؈Œ ˆ ˆ r#cóV—|j€gS| |j¦«\}}ttt |¦«¦«t|j¦«¦«}t tt |¦«¦«t|j¦«¦«}t|¦«}t|¦«}g}tt||¦«¦«D]L\}}}t|¦«|_t|¦«|_||_ ||  ¦«z }ŒM|S)zT Show dbgov statistics with dynamic time-unit. :rtype: list )r@Ú_get_min_max_tsrrrr>Úminr?rÚreversedrrrEÚhistory_dbgov_show) rGÚmax_tsÚmin_tsr>r?ÚrowsÚt_fromÚt_torEs r!Úhistory_dbgov_show_dynamicz+HistoryShowDBGov.history_dbgov_show_dynamicps€ð Œ8Р؈Ið×-Ò-¨d¬hÑ7Ô7‰ˆ�Ý�+Õ&BÀ6Ñ&JÔ&JÑKÔKÍ[ÐY]ÔYiÑMjÔMjÑkÔkˆ Ý� Õ$@ÀÑ$HÔ$HÑIÔIÍ;ÐW[ÔWeÑKfÔKfÑgÔgˆ õ˜{Ñ+Ô+ˆ ݘYÑ'Ô'ˆ àˆÝ'/Õ0DÀ[ÐR[Ñ0\Ô0\Ñ']Ô']ð .ð .Ñ #ˆF�D˜)Ý*¨6Ñ2Ô2ˆDÔ Ý(¨Ñ.Ô.ˆDŒNØ&ˆDŒNØ �D×+Ò+Ñ-Ô-Ñ -ˆDˆD؈ r#cóV‡—‰jt¦«ks ‰jgkrgS‰j�.t‰jttf¦«s ‰jdkrgSt ‰j¦«}t ‰j¦«}‰jpd}‰ ||¦«}‰  |¦«}‰  |¦«}ttj  ||¦«tj‰jk¦«}‰ |¦«}t‰jt"¦«rÞt%t'|¦«¦« t|tj‰jk¦«¦« |¦«} ‰j�5|  |tj¦« |¦«} �n#|  |tjtj¦« |¦«} nät%t'|¦«¦« |¦« |¦«} t‰jttf¦«rD|  tj t‰j¦«¦«¦«} |  tjtj¦« |¦«} ‰jr(|  ‰ |¦«¦«} ‰j | ¦«} t?‰j |  !¦«dgˆfd„fgd¢d„fgd¢d„fg¬ ¦«} |  "¦«|  #¦«S) zM Show statistics from history_gov table :rtype: list NrÚUSERcóv•—tjt|¦«‰jd‰j‰j¦«S)Nr9)r Úuid_to_usernameÚintrDr9r=)Úuid_rGs €r!úz5HistoryShowDBGov.history_dbgov_show..És.ø€¥Ô!=ݘD™ œ  4¤8¨KÔ#8¸$¼.È$Ì-ñ"ô"€r#)ÚCPUÚREADÚWRITEcóD—|€|ntt|¦«d¦«S)Nr.)ÚroundÚfloat©Úxs r!r[z5HistoryShowDBGov.history_dbgov_show..Ís €¸!¸)°Q°QÍÍuÐUVÉxÌxÐYZÑI[ÔI[€r#)ÚTSÚFROMÚTOÚlCPUÚlREADÚlWRITEÚCONcó(—|€|nt|¦«S©N)rYrbs r!r[z5HistoryShowDBGov.history_dbgov_show..Îs€ÐXYÐXaÐSTÐSTÕgjÐklÑgmÔgm€r#)ÚfieldsrQÚorders)$r@ÚtupleÚ isinstanceÚlistr r>r?rCÚ_get_table_aggregate_infoÚ_get_columns_for_selectÚ_get_order_by_queryrrr5Úbetweenr9Ú round_timerYrrÚwhererBrEÚgroup_byr Úin_r<ÚhavingÚ_get_by_usage_queryr=ÚexecuterrAÚfetchallÚcloseÚget_corrected_list) rGrRrSrCÚtable_aggregate_infoÚcolumns_to_selectÚorder_by_queryÚ where_queryÚgroup_by_time_queryÚqueryrQÚresultss ` r!rNz#HistoryShowDBGov.history_dbgov_show‰s;ø€ð Œ8•u‘w”wÒ Ð  $¤(¨b¢. .؈IØ Œ8Ð ­ °4´8½dÅE¸]Ñ(KÔ(KÐ ÐPTÔPXÐ\]ÒP]ÐP]؈Iå-¨dÔ.>Ñ?Ô?ˆÝ+¨D¬NÑ;Ô;ˆð” Ð"˜dˆð $×=Ò=¸fÀdÑKÔKÐð!×8Ò8Ð9MÑNÔNÐð×1Ò1Ð2FÑGÔGˆå�;œ>×1Ò1°&¸$Ñ?Ô?ÅÔAVÐZ^ÔZhÒAhÑiÔiˆ ð#Ÿošo¨fÑ5Ô5ÐÝ �d”h¥Ñ $Ô $ð åÕ2Ð3DÑEÔEÑFÔFß’•t˜K­¬¸D¼HÒ)DÑEÔEÑFÔFß’˜.Ñ)Ô)ð ð Œ~Ð)ØŸšÐ':½K¼OÑLÔL×RÒRÐSXÑYÔY�‘àŸšÐ':½K¼OÍ[ÔMjÑkÔk×qÒqÐrwÑxÔx��åÕ6Ð7HÑIÔIÑJÔJ×PÒPÐQ\Ñ]Ô]×fÒfÐguÑvÔvˆEå˜$œ(¥T­5 MÑ2Ô2ð IØŸ š ¥K¤O×$7Ò$7½¸T¼X¹¼Ñ$GÔ$GÑHÔH�à—N’NÝÔ%Ý”ñô÷Še�E‰lŒlð ð Œ=ð QØ—L’L ×!9Ò!9Ð:NÑ!OÔ!OÑPÔPˆEàŒ}×$Ò$ UÑ+Ô+ˆõ"ØÔ)Ø—’‘”ð�Hðððððð *Ð)Ð)Ð+[Ð+[Ð\ØGÐGÐGÐImÐImÐnð ð  ñ  ô  ˆð � Š ‰ Œ ˆ Ø×)Ò)Ñ+Ô+Ð+r#có’—g}t|j¦«D]/}| || ¦«¦«Œ0|S)zÑ Return list of columns that should be selected from table. :param table_aggregate_info: dict from _get_table_aggregate_info :return: query for each column :rtype: list )rrAÚappendÚlower)rGr€r�Ú column_names r!rsz(HistoryShowDBGov._get_columns_for_selectÔsU€ðÐÝ*¨4Ô+AÑBÔBð Pð PˆKØ × $Ò $Ð%9¸+×:KÒ:KÑ:MÔ:MÔ%NÑ OÔ OÐ OÐ OØ Ð r#có¢—|j�t|jt¦«r| ||z ¦«}n| ¦«}|S)zà Returns dictionary: { column_name: aggregate_query } Ignores t_from and t_to if self.uid is not None; :type t_from: int :type t_to: int :rtype: dict )r@rprqÚget_history_gov_all_users_func)rGrRrSÚ columns_infos r!rrz*HistoryShowDBGov._get_table_aggregate_infoàsM€ð Œ8Ð �z¨$¬(µDÑ9Ô9Ð Ø×>Ò>¸tÀf¹}ÑMÔMˆLˆLà×>Ò>Ñ@Ô@ˆLØÐr#cóH—ttjtj¦«tjtj¦«g¦« tj|k¦«}|j  |¦«  ¦«d\}}||fS)z^ Get min and max timestamp for given user id. :rtype: tuple(int, int) r) rrrLrr5rrwr@r=r|r})rGr@r…rPrOs r!rKz HistoryShowDBGov._get_min_max_tsòsz€õ �œ¥¤Ñ0Ô0µ$´(½;¼>Ñ2JÔ2JÐKÑLÔL×RÒRÕS^ÔSbÐfiÒSiÑjÔjˆØœ×.Ò.¨uÑ5Ô5×>Ò>Ñ@Ô@ÀÔC‰ˆ�Ø�vˆ~Ðr#cóð—|j� |jdkr |j|_|jdkr|j€d|_||j ¦«}|jdvr|jrt |¦«}|S)zt Create order_by query :param history_gov_aggregate_func: :return: sqlalchemy query NÚconr5Úid)r‘r�r5)rBÚ DEFAULT_ORDERr@r‰rFr)rGÚhistory_gov_aggregate_funcr‚s r!rtz$HistoryShowDBGov._get_order_by_queryûs}€ð Œ=Ð  D¤M°UÒ$:Ð$:Ø Ô.ˆDŒMØ Œ=˜DÒ Ð  T¤XÐ%5Ø ˆDŒMØ3°D´M×4GÒ4GÑ4IÔ4IÔJˆà Œ=Ð 3Ð 3Ð 3¸¼ Ð 3Ý! .Ñ1Ô1ˆNØÐr#cóx—g}t|j¦«D]›}| ¦«dkr.| |d|dz |jk¦«ŒH| ¦«dkr.| |d|dz |jk¦«ŒŽt ¦«‚t |ŽS)z Get by_usage query. :param table_aggregate_info: dict from _get_table_aggregate_info :return: ÚcpuÚlcpuÚioÚlio)rr<r‰rˆr;ÚNotImplementedErrorr )rGr€Ú filter_listÚ by_usage_items r!r{z$HistoryShowDBGov._get_by_usage_query sÝ€ð ˆ Ý,¨T¬]Ñ;Ô;ð ,ð ,ˆMØ×"Ò"Ñ$Ô$¨Ò-Ð-Ø×"Ò"Ø)¨%Ô0Ð3GÈÔ3OÑOÐSWÔSkÒkñôððð×$Ò$Ñ&Ô&¨$Ò.Ð.Ø×"Ò"Ø)¨$Ô/Ð2FÀuÔ2MÑMÐQUÔQiÒiñôððõ*Ñ+Ô+Ð+Ý�KÐ Ð r#cóæ—t|j¦«}| |dtjt j¦«¬¦«}| |dtjt j¦«¬¦«}|p|j}|�€Pt||t jt j t j tj t j ¦«tj t j ¦«tj t j¦«tjt jt j z¦«tj t jt jz¦«dtj t j¦«tj t j¦«tj t j¦«t't j¦«dœ¦«}�n˜t+t-|dz ¦«¦«}t||tj t j¦«t j t j tj t j ¦«|z tj t j ¦«|z tj t j¦«|z dtj t jt j z¦«|z tj t jt jz¦«tj t j¦«tj t j¦«tj t j¦«t't/t j¦«¦«dœ¦«}|S)z= :type time_period: int :rtype: dict r)ÚoffsetÚts_queryrN)ÚfromÚtor5r‘Úuserr•ÚreadÚwriter—r˜r�r–ÚlreadÚlwriteÚrestrictgN@)rŸr r5r‘r¡r•r¢r£r�r—r˜r–r¤r¥r¦)r r>rvrrLrr5rErr@rÚsum_cpuÚsumÚsum_readÚ sum_writeÚavgÚlimit_write_on_period_endÚlimit_read_on_period_endÚlimit_cpu_on_period_endr2r rYrr")rGÚ time_periodrRÚnormalized_fromÚ normalized_toÚ time_intervalÚ column_labelsÚminutes_passeds r!rŒz/HistoryShowDBGov.get_history_gov_all_users_func sZ€õ .¨dÔ.>Ñ?Ô?ˆðŸ/š/¨&¸ÅTÄXÍkÌnÑE]ÔE]˜/Ñ^Ô^ˆØŸš¨°qÅ4Ä8ÍKÌNÑC[ÔC[˜Ñ\Ô\ˆ à#Ð5 t¤~ˆ Ø Ñ Ý/à+Ø'Ý%œ.Ý%œ/Ý'œOÝœ8¥KÔ$7Ñ8Ô8Ý œH¥[Ô%9Ñ:Ô:Ý!œX¥kÔ&;Ñ<Ô<Ýœ(¥;Ô#8½;Ô;OÑ#OÑPÔPÝœ8¥KÔ$IÍKÔLpÑ$pÑqÔqØÝ œH¥[Ô%HÑIÔIÝ!œX¥kÔ&JÑKÔKÝ"œh¥{Ô'LÑMÔMÝ 5µkÔ6SÑ TÔ TððñôˆM‰Mõ(!¥ m°dÑ&:Ñ!;Ô!;Ñ<Ô<ˆNÝ/à+Ø'Ýœ(¥;¤>Ñ2Ô2Ý%œ/Ý'œOÝœ8¥KÔ$7Ñ8Ô8¸>ÑIÝ œH¥[Ô%9Ñ:Ô:¸^ÑKÝ!œX¥kÔ&;Ñ<Ô<¸~ÑMØÝœ(¥;Ô#8½;Ô;OÑ#OÑPÔPÐSaÑaÝœ8¥KÔ$IÍKÔLpÑ$pÑqÔqÝ œH¥[Ô%HÑIÔIÝ!œX¥kÔ&JÑKÔKÝ"œh¥{Ô'LÑMÔMÝ 5Õ6JÍ;ÔKhÑ6iÔ6iÑ jÔ jððñôˆMð&Ðr#rcó—|€ tj}|jrp|jjjdkr.t ||z |jz |zt¦«|jz|zStj ||z |jz |z¦«|jz|zS|S)a Round time depending on time_unit. Returns query, that returns nearest (N * time_unit + time_from) for current ts. :param ts_query: custom column :type time_from: int :type offset: int :return: NÚsqlite) rr5rEr=ÚurlÚ drivernamer rrÚfloor)rGÚ time_fromr�ržs r!rvzHistoryShowDBGov.round_timeWs”€ð Ð Ý"”~ˆHà Œ>ð ØŒ}Ô Ô+¨xÒ7Ð7å˜h¨Ñ2°d´nÑDÀvÑMÕPWÑXÔXÐ[_Ô[iÑiÐluÑuÐuå”z 8¨iÑ#7¸4¼>Ñ"IÈFÑ"RÑSÔSÐVZÔVdÑdÐgpÑpÐpàˆOr#) Nr6NNNNNFNr7rl)rN)Ú__name__Ú __module__Ú __qualname__r’rIrTrNrsrrrKrtr{rŒrv©r#r!r4r4;s䀀€€€Ø€Mð ØØØØØ ØØØØð0ð0ð0ð0ðdððð2I,ðI,ðI,ðV !ð !ð !ðððð$ðððððð"!ð!ð!ð(5ð5ð5ð5ðnðððððr#r4N)ÚmathrÚ sqlalchemyrrrrrr r r Ú lvestats.libr Úlvestats.lib.commons.dateutilr rrrrÚlvestats.lib.lveinfolibrrrrrÚ lvestats.ormrr"r2Úobjectr4r¾r#r!úrÆswððÐÐÐÐÐà$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ø5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5ØÐÐÐÐÐà%Ð%Ð%Ð%Ð%Ð%ððððððððððððððð4Ð3Ð3Ð3Ð3Ð3ØeÐeÐeÐeÐeÐeÐeÐeÐeÐeØ8Ð8Ð8Ð8Ð8Ð8Ø$Ð$Ð$Ð$Ð$Ð$ð ð ð ðððð&pðpðpðpðp�vñpôpðpðpðpr#