From 83fdb180aa950736dd72d86e5e8b5ec4b31e9fd5 Mon Sep 17 00:00:00 2001 From: mbecker20 Date: Mon, 3 Jun 2024 03:01:23 -0700 Subject: [PATCH] avoid deployment state change alert involving status Unknown --- bin/core/src/monitor/alert/deployment.rs | 49 +++++++++++++++--------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/bin/core/src/monitor/alert/deployment.rs b/bin/core/src/monitor/alert/deployment.rs index ba0d27689..d670bbef9 100644 --- a/bin/core/src/monitor/alert/deployment.rs +++ b/bin/core/src/monitor/alert/deployment.rs @@ -2,7 +2,7 @@ use std::collections::HashMap; use monitor_client::entities::{ alert::{Alert, AlertData}, - deployment::Deployment, + deployment::{Deployment, DeploymentState}, server::stats::SeverityLevel, update::ResourceTarget, }; @@ -18,30 +18,45 @@ pub async fn alert_deployments( server_names: HashMap, ) { let mut alerts = Vec::::new(); - for v in deployment_status_cache().get_list().await { - if v.prev.is_none() { + for status in deployment_status_cache().get_list().await { + // Don't alert if prev None + let Some(prev) = status.prev else { + continue; + }; + + // Don't alert if either prev or curr is Unknown. + // This will happen if server is unreachable, so this would be redundant. + if status.curr.state == DeploymentState::Unknown + || prev == DeploymentState::Unknown + { continue; } - let prev = v.prev.as_ref().unwrap().to_owned(); - if v.curr.state != prev { + + if status.curr.state != prev { // send alert - let d = resource::get::(&v.curr.id).await; - if let Err(e) = d { - error!("failed to get deployment from db | {e:#?}"); + let Ok(deployment) = + resource::get::(&status.curr.id) + .await + .inspect_err(|e| { + error!("failed to get deployment from db | {e:#?}") + }) + else { + continue; + }; + if !deployment.config.send_alerts { continue; } - let d = d.unwrap(); - let target: ResourceTarget = (&d).into(); + let target: ResourceTarget = (&deployment).into(); let data = AlertData::ContainerStateChange { - id: v.curr.id.clone(), - name: d.name, + id: status.curr.id.clone(), + name: deployment.name, server_name: server_names - .get(&d.config.server_id) + .get(&deployment.config.server_id) .cloned() .unwrap_or(String::from("unknown")), - server_id: d.config.server_id, + server_id: deployment.config.server_id, from: prev, - to: v.curr.state, + to: status.curr.state, }; let alert = Alert { id: Default::default(), @@ -52,9 +67,7 @@ pub async fn alert_deployments( data, ts, }; - if d.config.send_alerts { - alerts.push(alert); - } + alerts.push(alert); } } if alerts.is_empty() {