Skip to main content

max / makenotwork

2.3 KB · 81 lines History Blame Raw
1 //! backup alert/recovery messages. Domain half of the Alerter split;
2 //! shared dispatch/cooldown plumbing lives in the parent module.
3
4 use tracing::instrument;
5
6 use super::{AlertCategory, AlertMeta, Alerter, backup_status_detail, backup_status_priority};
7
8 impl Alerter {
9 #[instrument(skip_all)]
10 pub async fn send_backup_stale_alert(
11 &self,
12 target: &str,
13 label: &str,
14 database: &str,
15 status: &str,
16 age_hours: Option<i64>,
17 ) {
18 let alert_key = format!("backup:{target}:{database}");
19 let detail = backup_status_detail(status, age_hours);
20
21 let subject = format!("[PoM] {label}: {database} backup {status}");
22 let body = format!(
23 "Target: {label} ({target})\n\
24 Database: {database}\n\
25 Status: {status}\n\
26 Detail: {detail}\n\
27 Instance: {}\n\
28 Time: {}\n\n\
29 - PoM",
30 self.instance_name,
31 chrono::Utc::now().to_rfc3339(),
32 );
33
34 let priority = backup_status_priority(status);
35 self.fire_failure(
36 &subject,
37 &body,
38 priority,
39 "pom-backup",
40 Some(&format!("{target}:{database}")),
41 AlertMeta {
42 key: &alert_key,
43 category: AlertCategory::BackupStale,
44 from: None,
45 to: Some(status),
46 error: None,
47 },
48 )
49 .await;
50 }
51
52 #[instrument(skip_all)]
53 pub async fn send_backup_recovery(&self, target: &str, label: &str, database: &str) {
54 let alert_key = format!("backup:{target}:{database}");
55 let subject = format!("[PoM] {label}: {database} backup recovered");
56 let body = format!(
57 "Target: {label} ({target})\n\
58 Database: {database}\n\
59 Backup is now current.\n\
60 Instance: {}\n\
61 Time: {}\n\n\
62 - PoM",
63 self.instance_name,
64 chrono::Utc::now().to_rfc3339(),
65 );
66
67 self.fire_recovery(
68 &subject,
69 &body,
70 AlertMeta {
71 key: &alert_key,
72 category: AlertCategory::BackupRecovery,
73 from: None,
74 to: Some("ok"),
75 error: None,
76 },
77 )
78 .await;
79 }
80 }
81