Skip to main content

max / makenotwork

1.9 KB · 68 lines History Blame Raw
1 //! latency 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};
7
8 impl Alerter {
9 #[instrument(skip_all)]
10 pub async fn send_latency_drift_alert(&self, target: &str, label: &str, drift_message: &str) {
11 let alert_key = format!("latency:{target}");
12 let subject = format!("[PoM] {target}: latency drift detected");
13 let body = format!(
14 "Target: {label} ({target})\n\
15 {drift_message}\n\
16 Instance: {}\n\
17 Time: {}\n\n\
18 - PoM",
19 self.instance_name,
20 chrono::Utc::now().to_rfc3339(),
21 );
22
23 self.fire_failure(
24 &subject,
25 &body,
26 "medium",
27 "pom-latency",
28 Some(target),
29 AlertMeta {
30 key: &alert_key,
31 category: AlertCategory::LatencyDrift,
32 from: None,
33 to: None,
34 error: Some(drift_message),
35 },
36 )
37 .await;
38 }
39
40 #[instrument(skip_all)]
41 pub async fn send_latency_recovery(&self, target: &str, label: &str) {
42 let alert_key = format!("latency:{target}");
43 let subject = format!("[PoM] {target}: latency recovered");
44 let body = format!(
45 "Target: {label} ({target})\n\
46 Latency returned to normal.\n\
47 Instance: {}\n\
48 Time: {}\n\n\
49 - PoM",
50 self.instance_name,
51 chrono::Utc::now().to_rfc3339(),
52 );
53
54 self.fire_recovery(
55 &subject,
56 &body,
57 AlertMeta {
58 key: &alert_key,
59 category: AlertCategory::LatencyRecovery,
60 from: None,
61 to: None,
62 error: None,
63 },
64 )
65 .await;
66 }
67 }
68