use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct ContextBundle {
pub items: Vec<ContextItem>,
#[serde(default)]
pub redactions: RedactionStats,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ContextItem {
pub source: String,
pub content: String,
pub truncated: bool,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq)]
pub struct RedactionStats {
#[serde(default)]
pub bearer_tokens: u32,
#[serde(default)]
pub api_keys: u32,
#[serde(default)]
pub jwts: u32,
#[serde(default)]
pub emails: u32,
#[serde(default)]
pub db_credentials: u32,
#[serde(default)]
pub env_secrets: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
#[serde(rename_all = "snake_case", tag = "kind")]
pub enum Event {
Heartbeat {
uptime_secs: u64,
},
ServiceDown {
name: String,
},
ServiceUp {
name: String,
},
DiskWarning {
mount: String,
percent: u8,
},
DiskHigh {
mount: String,
percent: u8,
},
MemoryWarning {
percent: u8,
},
MemoryHigh {
percent: u8,
},
LoadWarning {
load_1m: f32,
},
LoadHigh {
load_1m: f32,
},
HostUnreachable,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EventEnvelope {
pub server_name: String,
pub timestamp: i64,
pub event: Event,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub context: Option<ContextBundle>,
}