minor refactor, code duplication

This commit is contained in:
Chris Beck
2025-12-05 01:09:47 -07:00
parent 3d748572d4
commit 69c7c604c3
2 changed files with 16 additions and 15 deletions
+3 -9
View File
@@ -1,5 +1,5 @@
use crate::{
http::{AlertMessage, Status},
http::AlertMessage,
jsonrpc::{Envelope, RpcClient, RpcClientError, SignalMessage, connect_tcp},
prometheus::{Prometheus, PrometheusConfig},
};
@@ -644,10 +644,7 @@ impl Gateway {
.alerts
.iter()
.map(|alert| {
let symbol = match alert.status {
Status::Firing => "🔴",
Status::Resolved => "🟢",
};
let symbol = alert.status.symbol();
let name = alert
.labels
.get("alertname")
@@ -679,10 +676,7 @@ impl Gateway {
let now = Utc::now();
for alert in msg.alerts.iter() {
let symbol = match alert.status {
Status::Firing => "🔴",
Status::Resolved => "🟢",
};
let symbol = alert.status.symbol();
let since = {
let dur = (now - alert.starts_at).to_std().unwrap_or_default();
// reduce precision to at most seconds
+13 -6
View File
@@ -5,8 +5,6 @@ use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use url::Url;
pub type Timestamp = DateTime<Utc>;
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum Status {
@@ -14,6 +12,15 @@ pub enum Status {
Firing,
}
impl Status {
pub fn symbol(&self) -> char {
match self {
Status::Firing => '🔴',
Status::Resolved => '🟢',
}
}
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct AlertMessage {
@@ -41,8 +48,8 @@ pub struct Alert {
pub labels: BTreeMap<String, String>,
#[serde(default)]
pub annotations: BTreeMap<String, String>,
pub starts_at: Timestamp,
pub ends_at: Timestamp,
pub starts_at: DateTime<Utc>,
pub ends_at: DateTime<Utc>,
#[serde(alias = "generatorURL")]
pub generator_url: String,
pub fingerprint: String,
@@ -68,11 +75,11 @@ mod tests {
#[test]
fn test_alert_message_parsing() {
let text = r#"{"receiver":"notify-chris","status":"firing","alerts":[{"status":"firing","labels":{"alertname":"Low tick success rate","instance":"172.31.5.8:9000","job":"ec2"},"annotations":{"summary":"Low tick success rate"},"startsAt":"2025-11-07T04:21:46.17Z","endsAt":"0001-01-01T00:00:00Z","generatorURL":"http://ip-172-31-10-138.eu-west-3.compute.internal:9090/graph?g0.expr=rate%28tick_successes%5B5m%5D%29+%3C+0.9\u0026g0.tab=1","fingerprint":"543b6a7a3042ae2c"},{"status":"firing","labels":{"alertname":"Long tail tick times","instance":"172.31.5.8:9000","job":"ec2","quantile":"0.99"},"annotations":{"summary":"Long tail tick times"},"startsAt":"2025-11-07T04:50:01.17Z","endsAt":"0001-01-01T00:00:00Z","generatorURL":"http://ip-172-31-10-138.eu-west-3.compute.internal:9090/graph?g0.expr=tick_time%7Bquantile%3D%220.99%22%7D+%3E+0.8\u0026g0.tab=1","fingerprint":"97130d38ef0ff0a4"}],"groupLabels":{},"commonLabels":{"instance":"172.31.5.8:9000","job":"ec2"},"commonAnnotations":{},"externalURL":"http://ip-172-31-10-138.eu-west-3.compute.internal:9093","version":"4","groupKey":"{}:{}","truncatedAlerts":0}"#;
let text = r#"{"receiver":"notify-admin","status":"firing","alerts":[{"status":"firing","labels":{"alertname":"Low tick success rate","instance":"172.31.5.8:9000","job":"ec2"},"annotations":{"summary":"Low tick success rate"},"startsAt":"2025-11-07T04:21:46.17Z","endsAt":"0001-01-01T00:00:00Z","generatorURL":"http://ip-172-31-10-138.eu-west-3.compute.internal:9090/graph?g0.expr=rate%28tick_successes%5B5m%5D%29+%3C+0.9\u0026g0.tab=1","fingerprint":"543b6a7a3042ae2c"},{"status":"firing","labels":{"alertname":"Long tail tick times","instance":"172.31.5.8:9000","job":"ec2","quantile":"0.99"},"annotations":{"summary":"Long tail tick times"},"startsAt":"2025-11-07T04:50:01.17Z","endsAt":"0001-01-01T00:00:00Z","generatorURL":"http://ip-172-31-10-138.eu-west-3.compute.internal:9090/graph?g0.expr=tick_time%7Bquantile%3D%220.99%22%7D+%3E+0.8\u0026g0.tab=1","fingerprint":"97130d38ef0ff0a4"}],"groupLabels":{},"commonLabels":{"instance":"172.31.5.8:9000","job":"ec2"},"commonAnnotations":{},"externalURL":"http://ip-172-31-10-138.eu-west-3.compute.internal:9093","version":"4","groupKey":"{}:{}","truncatedAlerts":0}"#;
let msg: AlertMessage = serde_json::from_str(text).unwrap();
assert_eq!(&msg.receiver, "notify-chris");
assert_eq!(&msg.receiver, "notify-admin");
assert_eq!(msg.alerts.len(), 2);
assert_eq!(
msg.alerts[0].annotations.get("summary").unwrap(),