fix: add webhook delivery for monitoring alerts
DiskUsage and ContainerCrash alerts now fire webhooks via send_webhook() after pushing WebSocket notifications. Added data_dir parameter to spawn_metrics_collector for webhook config access. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
pub mod collector;
|
||||
|
||||
use crate::webhooks::{self, WebhookEvent, WebhookPayload};
|
||||
use serde::{Deserialize, Serialize};
|
||||
use std::collections::VecDeque;
|
||||
use std::path::PathBuf;
|
||||
@@ -481,6 +482,7 @@ async fn save_alert_rules(data_dir: &std::path::Path, rules: &[AlertRule]) -> an
|
||||
pub fn spawn_metrics_collector(
|
||||
store: Arc<MetricsStore>,
|
||||
state: Option<Arc<crate::state::StateManager>>,
|
||||
data_dir: Option<PathBuf>,
|
||||
) {
|
||||
tokio::spawn(async move {
|
||||
// Wait 30s for system to stabilize after boot
|
||||
@@ -534,6 +536,31 @@ pub fn spawn_metrics_collector(
|
||||
state_mgr.update_data(data).await;
|
||||
info!("Fired {} alert(s)", alerts.len());
|
||||
}
|
||||
|
||||
// Fire-and-forget webhook delivery for mapped alert types
|
||||
if let Some(ref dir) = data_dir {
|
||||
for alert in &alerts {
|
||||
let event = match alert.kind {
|
||||
AlertRuleKind::DiskUsage => Some(WebhookEvent::DiskWarning),
|
||||
AlertRuleKind::ContainerCrash => Some(WebhookEvent::ContainerCrash),
|
||||
_ => None,
|
||||
};
|
||||
if let Some(event) = event {
|
||||
let payload = WebhookPayload {
|
||||
event,
|
||||
title: format!("{:?} Alert", alert.kind),
|
||||
message: alert.message.clone(),
|
||||
timestamp: chrono::Utc::now().to_rfc3339(),
|
||||
node_id: String::new(),
|
||||
details: Some(serde_json::json!({
|
||||
"value": alert.value,
|
||||
"threshold": alert.threshold,
|
||||
})),
|
||||
};
|
||||
webhooks::send_webhook(dir, payload).await;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Err(e) => {
|
||||
|
||||
@@ -77,7 +77,7 @@ impl Server {
|
||||
|
||||
// Create metrics store and spawn background collector
|
||||
let metrics_store = Arc::new(MetricsStore::with_data_dir(config.data_dir.clone()));
|
||||
crate::monitoring::spawn_metrics_collector(metrics_store.clone(), Some(state_manager.clone()));
|
||||
crate::monitoring::spawn_metrics_collector(metrics_store.clone(), Some(state_manager.clone()), Some(config.data_dir.clone()));
|
||||
|
||||
let api_handler = Arc::new(
|
||||
ApiHandler::new(config.clone(), state_manager.clone(), metrics_store).await?,
|
||||
|
||||
Reference in New Issue
Block a user