1414import urllib .request
1515from typing import Any
1616
17+ from quant_platform_kit .common .operational_notification_localization import (
18+ format_operational_alert ,
19+ operational_notification_text ,
20+ resolve_operational_notification_locale ,
21+ )
22+
1723
1824ERROR_SEVERITIES = {"ERROR" , "CRITICAL" , "ALERT" , "EMERGENCY" }
1925FAILURE_WORDS = (
@@ -60,6 +66,14 @@ def _env_bool(name: str, default: bool = False) -> bool:
6066 return value in {"1" , "true" , "yes" , "y" , "on" }
6167
6268
69+ def _notification_locale () -> str :
70+ return resolve_operational_notification_locale (os .environ .get ("NOTIFY_LANG" ))
71+
72+
73+ def _notice (key : str , / , ** values : object ) -> str :
74+ return operational_notification_text (_notification_locale (), key , ** values )
75+
76+
6377def _load_services () -> list [str ]:
6478 services = []
6579 enabled_target_services = []
@@ -669,7 +683,8 @@ def main() -> int:
669683 services = _load_services ()
670684 except RuntimeError as exc :
671685 services = []
672- issues .append (f"service configuration error: { exc } " )
686+ issues .append (_notice ("runtime_guard_service_configuration_error" ))
687+ details .append (f"service configuration error: { exc } " )
673688 scheduler_pattern = (
674689 os .environ .get ("RUNTIME_GUARD_SCHEDULER_JOB_PATTERN" )
675690 or _scheduler_job_pattern_for_services (services )
@@ -683,7 +698,8 @@ def main() -> int:
683698 try :
684699 entries = _run_gcloud_logging (project , log_filter , limit )
685700 except RuntimeError as exc :
686- issues .append (f"Cloud Run log query failed for { service } : { exc } " )
701+ issues .append (_notice ("runtime_guard_cloud_run_log_query_failed" , service = service ))
702+ details .append (f"Cloud Run log query failed for { service } : { exc } " )
687703 continue
688704 queried_services .add (service )
689705 failures = [entry for entry in entries if _is_failure (entry )]
@@ -692,7 +708,13 @@ def main() -> int:
692708 success_count_by_service [service ] = service_success_count
693709 success_count += service_success_count
694710 if failures :
695- issues .append (f"{ len (failures )} Cloud Run failure log(s) for { service } " )
711+ issues .append (
712+ _notice (
713+ "runtime_guard_cloud_run_failure_logs" ,
714+ count = len (failures ),
715+ service = service ,
716+ )
717+ )
696718 details .extend (_summarize (entry ) for entry in failures [:5 ])
697719
698720 if services and require_success :
@@ -702,8 +724,11 @@ def main() -> int:
702724 queried_services ,
703725 ):
704726 issues .append (
705- f"no successful Cloud Run request found for { service } "
706- f"in the last { lookback_minutes } minutes"
727+ _notice (
728+ "runtime_guard_no_successful_request" ,
729+ service = service ,
730+ lookback_minutes = lookback_minutes ,
731+ )
707732 )
708733
709734 if check_scheduler and scheduler_pattern :
@@ -732,10 +757,16 @@ def main() -> int:
732757 continue
733758 failures .append (entry )
734759 if failures :
735- issues .append (f"{ len (failures )} Cloud Scheduler failure log(s)" )
760+ issues .append (
761+ _notice (
762+ "runtime_guard_scheduler_failure_logs" ,
763+ count = len (failures ),
764+ )
765+ )
736766 details .extend (_summarize (entry ) for entry in failures [:5 ])
737767 except RuntimeError as exc :
738- issues .append (f"Cloud Scheduler log query failed: { exc } " )
768+ issues .append (_notice ("runtime_guard_scheduler_log_query_failed" ))
769+ details .append (f"Cloud Scheduler log query failed: { exc } " )
739770 elif check_scheduler :
740771 print ("Skipping Cloud Scheduler check because no scheduler job pattern could be derived." , file = sys .stderr )
741772
@@ -752,18 +783,15 @@ def main() -> int:
752783 f"{ os .environ ['GITHUB_SERVER_URL' ]} /{ os .environ ['GITHUB_REPOSITORY' ]} "
753784 f"/actions/runs/{ os .environ ['GITHUB_RUN_ID' ]} "
754785 )
755- message_lines = [
756- f"[Runtime Guard] { name } " ,
757- f"Project: { project } " ,
758- f"Lookback: { lookback_minutes } minutes" ,
759- "Issues:" ,
760- * [f"- { issue } " for issue in issues ],
761- ]
762- if details :
763- message_lines .extend (["Details:" , * details [:10 ]])
764- if run_url :
765- message_lines .append (f"Workflow: { run_url } " )
766- message = "\n " .join (message_lines )
786+ message = format_operational_alert (
787+ locale = _notification_locale (),
788+ alert_type = "runtime_guard" ,
789+ name = name ,
790+ context = {"project" : project , "lookback_minutes" : lookback_minutes },
791+ issues = issues ,
792+ technical_details = details [:10 ],
793+ workflow_url = run_url ,
794+ )
767795 print (message )
768796 _send_telegram (message [:3900 ])
769797 return 1 if fail_workflow else 0
0 commit comments