minor refactor, code duplication
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
use crate::{
|
use crate::{
|
||||||
http::{AlertMessage, Status},
|
http::AlertMessage,
|
||||||
jsonrpc::{Envelope, RpcClient, RpcClientError, SignalMessage, connect_tcp},
|
jsonrpc::{Envelope, RpcClient, RpcClientError, SignalMessage, connect_tcp},
|
||||||
prometheus::{Prometheus, PrometheusConfig},
|
prometheus::{Prometheus, PrometheusConfig},
|
||||||
};
|
};
|
||||||
@@ -644,10 +644,7 @@ impl Gateway {
|
|||||||
.alerts
|
.alerts
|
||||||
.iter()
|
.iter()
|
||||||
.map(|alert| {
|
.map(|alert| {
|
||||||
let symbol = match alert.status {
|
let symbol = alert.status.symbol();
|
||||||
Status::Firing => "🔴",
|
|
||||||
Status::Resolved => "🟢",
|
|
||||||
};
|
|
||||||
let name = alert
|
let name = alert
|
||||||
.labels
|
.labels
|
||||||
.get("alertname")
|
.get("alertname")
|
||||||
@@ -679,10 +676,7 @@ impl Gateway {
|
|||||||
let now = Utc::now();
|
let now = Utc::now();
|
||||||
|
|
||||||
for alert in msg.alerts.iter() {
|
for alert in msg.alerts.iter() {
|
||||||
let symbol = match alert.status {
|
let symbol = alert.status.symbol();
|
||||||
Status::Firing => "🔴",
|
|
||||||
Status::Resolved => "🟢",
|
|
||||||
};
|
|
||||||
let since = {
|
let since = {
|
||||||
let dur = (now - alert.starts_at).to_std().unwrap_or_default();
|
let dur = (now - alert.starts_at).to_std().unwrap_or_default();
|
||||||
// reduce precision to at most seconds
|
// reduce precision to at most seconds
|
||||||
|
|||||||
@@ -5,8 +5,6 @@ use serde::{Deserialize, Serialize};
|
|||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use url::Url;
|
use url::Url;
|
||||||
|
|
||||||
pub type Timestamp = DateTime<Utc>;
|
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
|
#[derive(Clone, Copy, Debug, Deserialize, Serialize)]
|
||||||
#[serde(rename_all = "snake_case")]
|
#[serde(rename_all = "snake_case")]
|
||||||
pub enum Status {
|
pub enum Status {
|
||||||
@@ -14,6 +12,15 @@ pub enum Status {
|
|||||||
Firing,
|
Firing,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Status {
|
||||||
|
pub fn symbol(&self) -> char {
|
||||||
|
match self {
|
||||||
|
Status::Firing => '🔴',
|
||||||
|
Status::Resolved => '🟢',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone, Debug, Deserialize, Serialize)]
|
#[derive(Clone, Debug, Deserialize, Serialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct AlertMessage {
|
pub struct AlertMessage {
|
||||||
@@ -41,8 +48,8 @@ pub struct Alert {
|
|||||||
pub labels: BTreeMap<String, String>,
|
pub labels: BTreeMap<String, String>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub annotations: BTreeMap<String, String>,
|
pub annotations: BTreeMap<String, String>,
|
||||||
pub starts_at: Timestamp,
|
pub starts_at: DateTime<Utc>,
|
||||||
pub ends_at: Timestamp,
|
pub ends_at: DateTime<Utc>,
|
||||||
#[serde(alias = "generatorURL")]
|
#[serde(alias = "generatorURL")]
|
||||||
pub generator_url: String,
|
pub generator_url: String,
|
||||||
pub fingerprint: String,
|
pub fingerprint: String,
|
||||||
@@ -68,11 +75,11 @@ mod tests {
|
|||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_alert_message_parsing() {
|
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();
|
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.len(), 2);
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
msg.alerts[0].annotations.get("summary").unwrap(),
|
msg.alerts[0].annotations.get("summary").unwrap(),
|
||||||
|
|||||||
Reference in New Issue
Block a user