§ EHïižãóà—dZdZddlZddlZddlZddlmZddlmZddl m Z m Z ddl m Z ddlmZdd lmZmZdd lmZdd lmZdd lmZd dlmZd dlmZddlmZddlm Z ddl!m"Z"m#Z#ddl$m%Z%m&Z&m'Z'm(Z(Gd„de¦«Z)e*dkrce&¦«ej+dej,¬¦« e)¦« -¦«dS#e $rZ.e/e.¦«e0d ¦«‚dZ.[.wwxYwdS)zd This module contains SSA classes for sending e-mails with report and sending reports to ClickHouse z ssa.moduleséN)Ú EmailMessage)Úpartial)ÚOptionalÚAny)Ú gethostname)Úget_admin_email)ÚSessionÚResponse)Ú HTTPAdapter)ÚRequestException)ÚRetryé)ÚCommon)Ú DecisionMakeré)Ú stat_server)ÚSSAError)ÚMailerÚrender_report_table)Ú read_sys_idÚ sentry_initÚ duration_castÚ format_datecó⇗eZdZdZde›d�fdefˆfd„ Zddeddfd „Zd ede e fd „Z de efd „Z de efd „Z d edefd„Zededefd„¦«Zdedefd„Zdedefd„ZˆxZS)ÚStatisticsSenderz4 Send report to ClickHouse and over e-mails úhttps://z /api/clos-ssaÚ ch_endpointcó:•—t¦« ¦«tjd¦«|_|j dt ¦«t¦«|_||_ t¦«|_ tdtdg¦«tgd¢¦«d¬¦«}t|¬¦«}t¦«|_|j d|¦«t%|jjd ¬ ¦«|j_dS) NÚ stat_senderzStatisticsSender enabled: %séÚPOST)iöi÷iø)ÚtotalÚallowed_methodsÚstatus_forcelistÚbackoff_factor)Ú max_retriesré )Útimeout)ÚsuperÚ__init__ÚloggingÚ getLoggerÚloggerÚinfoÚ __package__rÚsys_idrrÚ mail_senderr Ú frozensetr r ÚsessionÚmountrÚrequest)ÚselfrÚ retry_confÚadapterÚ __class__s €úN/opt/cloudlinux/venv/lib64/python3.11/site-packages/ssa/modules/stat_sender.pyr*zStatisticsSender.__init__*sïø€Ý ‰Œ×ÒÑÔÐÝÔ'¨ Ñ6Ô6ˆŒ Ø Œ ×ÒÐ7½ÑEÔEÐEÝ!‘m”mˆŒ Ø&ˆÔÝ!™8œ8ˆÔå Ý+4°f°XÑ+>Ô+>Ý,5°o°o°oÑ,FÔ,FØ*+ð-ñ-ô-ˆ õ¨*Ð5Ñ5Ô5ˆÝ‘y”yˆŒ Ø Œ ×Ò˜: wÑ/Ô/Ð/Ý& t¤|Ô';ÀRÐHÑHÔHˆŒ ÔÐÐóNÚreportÚreturncó¬—|€ t¦« ¦«}|jr| |¦«| |¦«dS)zi Send given report over e-mail If no report given, get it from DecisionMaker API N)rÚget_json_reportÚsummary_notification_enabledÚ email_reportÚclickhouse_report)r6r<s r:ÚsendzStatisticsSender.send;sW€ð ˆ>Ý"‘_”_×4Ò4Ñ6Ô6ˆFà Ô ,ð &Ø × Ò ˜fÑ %Ô %Ð %Ø ×Ò˜vÑ&Ô&Ð&Ð&Ð&r;Ú report_viewcóä—| ¦«}|r×| d¦«rÄt|¦«\}}|j |dt |d¦«t ¦«|¬¦«}| tj |¦«dd|d›d�¬¦«| |d d|d›d �¬¦«|j  |¦«|Sd Sd S) z4 Create and send e-mail with report ÚdomainsÚ ssa_reportÚdate)Ú recipientÚtemplaterHÚhostnameÚhtmlÚjsonÚreport_z.json)ÚsubtypeÚfilenamerLz.htmlN) Úget_mail_recipientÚgetrr1Ú_messagerrÚadd_attachmentrMÚdumpsÚ_send)r6rDÚmail_toÚ report_tableÚmailÚmsgs r:rAzStatisticsSender.email_reportGs/€ð×)Ò)Ñ+Ô+ˆà ð �{—’ yÑ1Ô1ð Ý!4°[Ñ!AÔ!AÑ ˆL˜$ØÔ"×+Ò+Ø!Ø%Ý  ¨VÔ!4Ñ5Ô5Ý$™œØð ,ñôˆCð × Ò �tœz¨+Ñ6Ô6Ø'-Ø(L°+¸fÔ2EÐ(LÐ(LÐ(Lð ñ Nô Nð Nð × Ò ˜|Ø'-Ø(L°+¸fÔ2EÐ(LÐ(LÐ(Lð ñ Nô Nð Nð Ô × "Ò " 3Ñ 'Ô 'Ð 'àˆJð% ð ð ð r;cóÈ— | ¦«p t¦«S#t$r3}|j dt |¦«¦«Yd}~dSd}~wwxYw)z¬ Retrieve a recipient's e-mail: 1. get address from a wmt-api utility 2. if command failed or address is empty, get address of server admin zget_admin_email failed with: %sN)Úwmt_api_report_emailrÚ Exceptionr-ÚerrorÚstr)r6Úes r:rQz#StatisticsSender.get_mail_recipientasy€ð  Ià×,Ò,Ñ.Ô.ÐCµ/Ñ2CÔ2CÐ CøÝð Ið Ið IØ ŒK× Ò Ð?ÅÀQÁÄÑ HÔ HÐ HÐ HÐ HÐ HÐ HÐ HÐ Høøøøð Iøøøs‚!$¤ A!®(AÁA!cóp—d} tjd|›�dgddd¬¦«j ¦«}nX#tjt t tf$r3}|j  dt|¦«¦«Yd}~dSd}~wwxYw tj |¦«  d¦«  d ¦«S#tj$r3}|j  d t|¦«¦«Yd}~dSd}~wt $r|j  d |¦«YdSwxYw) zD Retrieve a recipient's e-mail address from WMT API zwmt-apiz&/usr/share/web-monitoring-tool/wmtbin/z --config-getT)ÚcheckÚtextÚcapture_outputzwmt-api utility failed: %sNÚconfigÚ report_emailz!wmt-api returned invalid json: %sz(wmt-api returned unexpected response: %s)Ú subprocessÚrunÚstdoutÚstripÚCalledProcessErrorÚAttributeErrorÚOSErrorÚ ValueErrorr-r^r_rMÚloadsrRÚJSONDecodeError)r6Ú_utilÚ api_responser`s r:r\z%StatisticsSender.wmt_api_report_emailms…€ðˆð Ý%œ>ØA¸%ÐAÐAØð!à Ø#ð %ñ%ô%ô&,¯EªE©G¬Gð ˆLøõ Ô-­~½wÝðð ð ð à ŒK× Ò Ð:½CÀ¹F¼FÑ CÔ CÐ CØ ˆFˆFˆFˆFˆFøøøøð øøøð  ,Ý”:˜lÑ+Ô+×/Ò/°Ñ9Ô9×=Ò=¸nÑMÔMÐ MøÝÔ#ð &ð &ð &Ø ŒK× Ò ÐAÝ! !™fœfñ &ô &ð &ð &ð &ð &ð &ð &ð &øøøøåð ,ð ,ð ,Ø ŒK× Ò ÐHØ*ñ ,ô ,ð ,ð ,ð ,ð ,ð ,øøøs3„49¹"BÁ(B  BÂ9C à D5Ã(D Ä (D5Ä4D5có —| d¦«rÔ|j d|j¦« |j |j| | |¦«¦«¬¦«}nV#t$rI}|j  d|d|ji¬¦«tdt|¦«›�¦«|‚d}~wwxYw|  |¦«S|j d ¦«d S) z+ Send report to ClickHouse rFzSending POST request to %s)rMzPOST failed with %sÚendpoint©Úextraz'Failed to POST data to SSA API server: Nz*Report is empty, not sending to ClickHouseF) rRr-r.rr3ÚpostÚ_ch_packÚclickhouse_formatr r^rr_Ú_process_response)r6rDÚrespr`s r:rBz"StatisticsSender.clickhouse_report†s5€ð �?Š?˜9Ñ %Ô %ð Ø ŒK× Ò Ð9Ø!Ô-ñ /ô /ð /ð OØ”|×(Ò(¨Ô)9ÀÇ Â Ø×*Ò*¨;Ñ7Ô7ñA9ôA9Ð(ñ:ô:��øå#ð Oð Oð OØ” ×!Ò!Ð"7¸Ø)3°TÔ5EÐ(Fð"ñHôHðHåØF½cÀ!¹f¼fÐFÐFñHôHØMNðOøøøøð Oøøøð ×)Ò)¨$Ñ/Ô/Ð /à ŒK× Ò ÐIÑ JÔ JÐ JØ�5s·AA?Á? C AC à CÚvaluecó"—t|¬¦«S)z< Pack given value into data field of a dict )Údata)Údict)r|s r:rxzStatisticsSender._ch_packšs€õ ˜ÐÑÔÐr;Úoriginal_reportc óf—t¦«}| d¦«D]Œ}| |j| d¦«| d¦«| d¦«| d¦«d„| d¦«D¦«dœ¦«Œ�|S) zd Format local report for sending to ClickHouse (required structures differ) rFÚnameÚ slow_urlsÚ slow_reqsÚ total_reqsc óê—g|]p}| d¦«| d¦«t| d¦«¦«t| dd¦«¦«dœ‘ŒqS)r‚Úreqs_numÚaverage_durationÚ correlationr)ÚurlÚcount_requestsÚ avg_durationr‰)rRrÚfloat)Ú.0Úus r:ú z6StatisticsSender.clickhouse_format..®sƒ€ððððð !Ÿušu V™}œ}Ø*+¯%ª%° Ñ*;Ô*;Ý(5ØŸEšEÐ"4Ñ5Ô5ñ)7ô)7å',¨Q¯UªU°=À!Ñ-DÔ-DÑ'EÔ'Eð ððððr;Úurls)Ú system_idÚdomainÚcount_slow_urlsÚcount_slow_requestsÚtotal_requestsÚdetails)ÚlistrRÚappendr0)r6r€Ú ch_reportr“s r:ryz"StatisticsSender.clickhouse_format¡sÄ€õ ‘F”Fˆ Ø%×)Ò)¨)Ñ4Ô4ð ð ˆFØ × Ò Ø!œ[Ø Ÿ*š* VÑ,Ô,Ø#)§:¢:¨kÑ#:Ô#:Ø'-§z¢z°+Ñ'>Ô'>Ø"(§*¢*¨\Ñ":Ô":ððð &Ÿzšz¨&Ñ1Ô1ðñôð ðñ ô ð ð ð Ðr;Úresponsecó�—|js1|j d|j|jd|ji¬¦«dS|j d|j|j|j¦«| ¦«}|ddkr'|j d|dd |i¬¦«dS|j d ¦«d S) z— Check received response :param response: a requests.Response object :return: True in case of success, False otherwise z&Unable to connect to server with %s:%sÚ resp_textruFz[%s:%s] Response received %sÚstatusÚokz Received response with status %sr›zSent to ClickHouse successfullyT) rŸr-r^Ú status_codeÚreasonrcr.rŠrM)r6r›Úresults r:rzz"StatisticsSender._process_responseºsî€ð Œ{ð +Ø ŒK× Ò ÐFØ&Ô2°H´OØ%0°(´-Ð$@ð ñ Bô Bð Bð�5à ŒK× Ò Ð;Ø%Ô1°8´?Ø%œ\ñ +ô +ð +ð—’‘”ˆØ �(Ô ˜tÒ #Ð #Ø ŒK× Ò Ð@Ø$ XÔ.°zÀ6Ð6Jð ñ Lô Lð Là�5à Œ ×ÒÐ:Ñ;Ô;Ð;؈tr;)N)Ú__name__Ú __module__Ú __qualname__Ú__doc__rr_r*rrCrrrArQr\ÚboolrBÚ staticmethodrrxr˜ryr rzÚ __classcell__)r9s@r:rr%s‘ø€€€€€ððð+P°[Ð*OÐ*OÐ*OðIðI CðIðIðIðIðIðIð" 'ð '˜4ð '¨4ð 'ð 'ð 'ð 'ð¨ð°¸,Ô1Gððððð4 I H¨S¤Mð Ið Ið Ið Ið, h¨s¤mð,ð,ð,ð,ð2¨Tð°dððððð(ð ˜ð  ð ð ð ñ„\ð ð °ð¸$ððððð2¨(ð°tððððððððr;rÚ__main__zstat_sender_standalone.log)rPÚlevel)1r¦r/rMr+rgÚ email.messagerÚ functoolsrÚtypingrrÚsocketrÚclcommon.cpapirÚrequestsr r Úrequests.adaptersr Úrequests.exceptionsr Ú$requests.packages.urllib3.util.retryr ÚcommonrÚdecision_makerrÚinternal.constantsrÚinternal.exceptionsrÚinternal.mailerrrÚinternal.utilsrrrrrr£Ú basicConfigÚINFOrCÚexcÚprintÚ SystemExit©r;r:úrÁsUðððð€ à € € € Ø€€€ØÐÐÐØ&Ð&Ð&Ð&Ð&Ð&ØÐÐÐÐÐØ Ð Ð Ð Ð Ð Ð Ð ØÐÐÐÐÐà*Ð*Ð*Ð*Ð*Ð*Ø&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø)Ð)Ð)Ð)Ð)Ð)Ø0Ð0Ð0Ð0Ð0Ð0Ø6Ð6Ð6Ð6Ð6Ð6àÐÐÐÐÐØ)Ð)Ð)Ð)Ð)Ð)Ø,Ð,Ð,Ð,Ð,Ð,Ø*Ð*Ð*Ð*Ð*Ð*Ø9Ð9Ð9Ð9Ð9Ð9Ð9Ð9ðððððððððððððlðlðlðlðl�vñlôlðlð^ ˆzÒÐØ€K�M„M€MØ€GÔÐ!=Ø%œlð,ñ,ô,ð,ðØÐÑÔ×ÒÑ!Ô!Ð!Ð!Ð!øØ ðððØ ˆˆc‰ Œ ˆ ؈j˜‰mŒmÐøøøøðøøøð ÐsÂ-C à C+ÃC&Ã&C+