§ Å«jÈ'ãóü—dZddlZddlZddlmZddlmZmZmZm Z ddl Z ddl m Z m Z m Z ddlmZmZdZdeefd „ZeGd „d ¦«¦«Zdeefd „Zd „Zde eeeffd„Zd„ZdS)zF Represents storage where ssa data is collected, stored and extracted éN)Ú dataclass)ÚListÚIteratorÚTupleÚDict)ÚfuncÚcastÚdistinct)Ú session_scopeÚ RequestResulti@BÚreturncó.—g}dx}}d}t|¦«D]g\}\}}|dz}|�||kr|}|�||kr|}|tkr| |¦«ŒBtjd|¦«}|tkr|||<Œh|tkr ||d<||d<|S)ai Collect a per-path durations list bounded to ``MAX_URL_DURATION_SAMPLES``. Below the cap every duration is kept (order preserved). Above it, reservoir sampling (Algorithm R) keeps a uniform random sample so percentile/mean estimates stay statistically representative without letting one hot path materialise an arbitrarily large list. Nrééÿÿÿÿ)Ú enumerateÚMAX_URL_DURATION_SAMPLESÚappendÚrandomÚrandint) Ú dur_groupÚ reservoirÚtrue_minÚtrue_maxÚtotalÚseenÚ_ÚdurationÚidxs úJ/opt/cloudlinux/venv/lib64/python3.11/site-packages/ssa/modules/storage.pyÚ_sample_durationsr sÛ€ð€IØÐ€HˆxØ €EÝ(¨Ñ3Ô3ð *ð *ш‰mˆq�(Ø�q‘ˆØ Ð ˜x¨(Ò2Ð2؈HØ Ð ˜x¨(Ò2Ð2؈HØ Õ*Ò *Ð *Ø × Ò ˜XÑ &Ô &Ð &Ð &å”.  DÑ)Ô)ˆCØÕ-Ò-Ð-Ø!)� ˜#‘øð  Õ'Ò'Ð'؈ �!‰ Ø ˆ �"‰ Ø ÐócóD—eZdZUeed<eeed<eed<eed<dS)Ú DomainDataÚ domain_nameÚdomain_total_reqsÚis_a_wordpress_domainÚ urls_numberN)Ú__name__Ú __module__Ú __qualname__ÚstrÚ__annotations__rÚintÚbool©r!rr#r#?sF€€€€€€àÐÐÑØ˜C”yÐ Ð Ñ ØÐÐÑØÐÐÑÐÐr!r#c #ózK—t|¦«5}| tjt jdtj¦«t jtj¦«t j tj ¦«t j ttj ¦«¦«¦« tjt jdtj¦«¦« tjt jdtj¦«¦«}t!j|d„¬¦«}|D]^\}}t%|¦«}d}dgdz}|D]*\} } } } } | |t'| ¦«<t|| ¦«}Œ+t)||| |¬¦«V—Œ_ ddd¦«dS#1swxYwYdS)z7 Iterates data from database domain-by-domain. ú%Hcó—|dS©Nrr/©Úitems rúz#iter_domains_data..Xs €ÐVZÐ[\ÔV]€r!©Úkeyré)r$r%r&r'N)r Úqueryr ÚdomainrÚstrftimeÚ created_atÚCountÚidÚmaxÚ wordpressÚcountr ÚpathÚgroup_byÚorder_byÚ itertoolsÚgroupbyÚtupler-r#)ÚengineÚdbÚresults_by_hourÚresults_by_hour_groupedr$ÚgroupÚdomain_results_by_hourr'Úrequests_number_by_hourrÚhourÚ requests_numÚ is_wordpressÚurlss rÚiter_domains_datarTGsãèè€õ �vÑ Ô ð "à �HŠHÝÔ$Ý” ˜d¥MÔ$<Ñ=Ô=Ý” �=Ô+Ñ,Ô,Ý”�Ô0Ñ1Ô1Ý” �8¥MÔ$6Ñ7Ô7Ñ8Ô8ñ  ô ÷ŠX•mÔ*­D¬M¸$Å Ô@XÑ,YÔ,YÑ ZÔ Zß ŠX•mÔ*­D¬M¸$Å Ô@XÑ,YÔ,YÑ ZÔ Zð õ#,Ô"3°OÐI]ÐI]Ð"^Ñ"^Ô"^Ðà"9ð ð Ñ ˆK˜Ý%*¨5¡\¤\Ð "àˆKð() c¨B¡hÐ #Ø=Sð 5ð 5Ñ9��4˜ |°TØ5AÐ'­¨D© ¬ Ñ2Ý! +¨tÑ4Ô4� � åØ'Ø"9Ø&2Ø'ð ñôð ð ð ð ð ðððñôðððððððøøøððððððs’FF0Æ0F4Æ7F4c #ó K—t|¦«5}| tjt jdtj¦«t jttj tj ¦«¦«  d¦«t j tj¦«  d¦«t jttjtj ¦«¦«  d¦«¦« tj|k¦« tj |¦«¦« tjt jdtj¦«¦« tjt jdtj¦«¦«}d}dgdzdgdzdgdz}}}|D]q\} } } } } |r/|| kr)|t+||||¬¦«fV—dgdzdgdzdgdz}}}| |t-| ¦«<| |t-| ¦«<| |t-| ¦«<| }Œr| t+| |||¬¦«fV—ddd¦«dS#1swxYwYdS) z6 Iterates urls data from database url-by-url. r1Úurl_throttled_reqsÚurl_total_reqsÚ url_slow_reqsNrr9©rCrVrWrX)r r:r rCrr<r=ÚSumr Úhitting_limitsÚ sqlalchemyÚIntegerÚlabelr>r?Úis_slow_requestÚfilterr;Úin_rDrEÚdictr-)rIr$Ú all_pathsrJÚ urls_dataÚ previous_pathrVrWrXrCrPÚurl_throttled_reqÚ url_total_reqÚ url_slow_reqs rÚiter_urls_datarimsºèè€õ �vÑ Ô ð-  "à �HŠHÝÔ"Ý” ˜d¥MÔ$<Ñ=Ô=Ý”��mÔ:½JÔVÑ*WÔ*WÑ XÔ Xß ŠX•mÔ(­$¬-¸½mÔ>VÑ*WÔ*WÑ XÔ Xð ðˆ Ø=>¸CÀ"¹HÀqÀcÈBÁhÐQRÐPSÐVXÑPX¨M˜NÐàJSð !ð !Ñ FˆD�$Ð)¨=¸,Øð a °$Ò!6Ð!6à!ÝØ*Ø+=Ø'5Ø&3ð ñôðððððFGÀCÈ"ÁHÈqÈcÐTVÉhÐYZÐX[Ð^`ÑX`°M NÐ"à,=Ð �s 4™yœyÑ )Ø(5ˆN�3˜t™9œ9Ñ %Ø'3ˆM�#˜d™)œ)Ñ $à ˆMˆMð Ý ØØ#5Ø-Ø+ð  ñ ô ð ð ð ð ðK- ð- ð- ñ- ô- ð- ð- ð- ð- ð- ð- ð- øøøð- ð- ð- ð- ð- ð- s’I$JÊJÊ Jc#óˆK—t|¦«5}| tjtj¦« tj|k¦« tj¦«}tj |d„¦«}|D]\}}|d„|D¦«fV—Œ ddd¦«dS#1swxYwYdS)zA Get information about durations of requests url-by-url. có—|dSr3r/r4s rr6z#get_url_durations..­s €ÀdÈ1Äg€r!có—g|]\}}|‘ŒSr/r/)Ú.0rrs rú z%get_url_durations..¯s€Ð:Ð:Ð:¡[ Q¨˜Ð:Ð:Ð:r!N) r r:r rCrr`r;rErFrG)rIr$rJrdÚdurations_by_pathr8rMs rÚget_url_durationsrp¡s èè€õ �vÑ Ô ð ; "à �HŠH•]Ô'­Ô)?Ñ @Ô @ß ŠV•MÔ(¨KÒ7Ñ 8Ô 8ß ŠX•mÔ(Ñ )Ô )ð õ&Ô-¨iÐ9MÐ9MÑNÔNÐØ+ð ;ð ;‰JˆC�ØÐ:Ð:°EÐ:Ñ:Ô:Ð:Ð :Ð :Ð :Ð :ð ;ð ;ð ;ð ;ñ ;ô ;ð ;ð ;ð ;ð ;ð ;ð ;ð ;øøøð ;ð ;ð ;ð ;ð ;ð ;s’BB7Â7B;Â>B;c #ó¢K—t|¦«5}| tjt jdtj¦«t jttj tj ¦«¦«  d¦«t j tj¦«  d¦«t jttjtj ¦«¦«  d¦«¦« tj|k¦« tjt jdtj¦«¦« tjt jdtj¦«¦«}| tjtj¦« tj|k¦« tj¦«}t+j|d„¬¦«}t+j|d„¬¦«}t/|d¦«}t/|d¦«}|�Ø|�Ö|\} } |\} } | | kr›d gd z} d gd z}d gd z}| D]>\}}}}}|| t1|¦«<||t1|¦«<||t1|¦«<Œ?t3| ¦«}| |t5| | ||¬ ¦«fV—t/|d¦«}t/|d¦«}n'| | krt/|d¦«}nt/|d¦«}|�|­Öddd¦«dS#1swxYwYdS) u Stream per-URL data for a single domain. Yields ``(path, durations, url_data)`` per path, where: - ``path`` is the URL path (str); - ``durations`` is a list of raw request durations for that path; - ``url_data`` is a dict with per-hour aggregates (``url_throttled_reqs``, ``url_total_reqs``, ``url_slow_reqs`` as 24-element lists) plus ``path``. Merges two ``ORDER BY path`` streams in lock-step instead of materialising the per-domain ``{path: [durations...]}`` dict up front, which caused OOM on large databases (CLPRO-3077). A second benefit: this drops the redundant ``WHERE path IN (...)`` clause — both queries already filter by ``domain``, so the path list adds no selectivity, only memory pressure on the SQL parser. r1rVrWrXcó—|dSr3r/©Úrs rr6z&iter_domain_url_data..Øó €ÀÀ1Ä€r!r7có—|dSr3r/rss rr6z&iter_domain_url_data..Ùrur!Nrr9rY)r r:r rCrr<r=rZr r[r\r]r^r>r?r_r`r;rDrErrFrGÚnextr-r rb)rIr$rJÚ agg_queryÚ dur_queryÚ agg_by_pathÚ dur_by_pathÚagg_itemÚdur_itemÚagg_pathÚ agg_groupÚdur_pathrrVrWrXrrPÚ throttledrÚslowÚ durationss rÚiter_domain_url_datar„²sDèè€õ$ �vÑ Ô ð=3 "à �HŠHÝÔ"Ý” ˜d¥MÔ$<Ñ=Ô=Ý”��mÔ:½JÔVÑ*WÔ*WÑ XÔ Xß ŠX•mÔ(­$¬-¸½mÔ>VÑ*WÔ*WÑ XÔ Xð ð �HŠH•]Ô'­Ô)?Ñ @Ô @ß ŠV•MÔ(¨KÒ7Ñ 8Ô 8ß ŠX•mÔ(Ñ )Ô )ð õ  Ô'¨ °~°~ÐFÑFÔFˆ ÝÔ'¨ °~°~ÐFÑFÔFˆ å˜  TÑ*Ô*ˆÝ˜  TÑ*Ô*ˆàÐ" xÐ';Ø"*Ñ ˆH�iØ"*Ñ ˆH�ià˜8Ò#Ð#Ø&' S¨2¡XÐ"Ø"#  r¡�Ø!"  b¡� Ø7@ð4ð4Ñ3�A�t˜Y¨¨tØ4=Ð&¥s¨4¡y¤yÑ1Ø05�N¥3 t¡9¤9Ñ-Ø/3�M¥# d¡)¤)Ñ,Ð,å-¨iÑ8Ô8� ðØÝØ%Ø+=Ø'5Ø&3ð ñôð ð ð ð õ   ¨TÑ2Ô2�Ý  ¨TÑ2Ô2��ؘHÒ$Ð$õ    ¨TÑ2Ô2��å  ¨TÑ2Ô2�ðGÐ" xÐ';ð5=3ð=3ð=3ñ=3ô=3ð=3ð=3ð=3ð=3ð=3ð=3ð=3øøøð=3ð=3ð=3ð=3ð=3ð=3s’L%MÍMÍ M)Ú__doc__rFrÚ dataclassesrÚtypingrrrrr\rr r Ússa.dbr r rr-r r#rTrir+rpr„r/r!rúr‰sqððððÐÐÐØ € € € Ø!Ð!Ð!Ð!Ð!Ð!Ø.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.àÐÐÐØ+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+à/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ð %Ðð  D¨¤Ið ð ð ð ðF ðððððñôñ „ðð# ¨*Ô!5ð#ð#ð#ð#ðL1 ð1 ð1 ðh;¨d°3¸¸c¼ °?Ô.Cð;ð;ð;ð;ð"O3ðO3ðO3ðO3ðO3r!