use serde::{Deserialize, Serialize};
use std::time::Duration;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CloudAlertingConfig {
pub enabled: bool,
pub rules: Vec<AlertRule>,
pub notification_channels: Vec<NotificationChannel>,
pub escalation_policies: Vec<EscalationPolicy>,
pub management: AlertManagementConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AlertRule {
pub name: String,
pub description: String,
pub condition: AlertCondition,
pub severity: AlertSeverity,
pub channels: Vec<String>,
pub suppression: Option<SuppressionRule>,
pub tags: std::collections::HashMap<String, String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AlertCondition {
pub metric: String,
pub operator: ComparisonOperator,
pub threshold: f64,
pub window: Duration,
pub aggregation: AggregationFunction,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ComparisonOperator {
GreaterThan,
GreaterThanOrEqual,
LessThan,
LessThanOrEqual,
Equal,
NotEqual,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum AggregationFunction {
Average,
Sum,
Count,
Max,
Min,
Percentile(f64),
Custom(String),
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Serialize, Deserialize)]
pub enum AlertSeverity {
Critical,
High,
Medium,
Low,
Info,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SuppressionRule {
pub window: Duration,
pub conditions: Vec<SuppressionCondition>,
pub max_suppressions: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SuppressionCondition {
pub field: String,
pub value: String,
pub match_type: MatchType,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum MatchType {
Exact,
Pattern,
Regex,
Contains,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum NotificationChannel {
Email,
SMS,
Slack,
Teams,
PagerDuty,
Webhook,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EscalationPolicy {
pub name: String,
pub steps: Vec<EscalationStep>,
pub repeat: Option<RepeatPolicy>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EscalationStep {
pub step: u32,
pub delay: Duration,
pub targets: Vec<NotificationTarget>,
pub conditions: Vec<StepCondition>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct NotificationTarget {
pub target_type: TargetType,
pub identifier: String,
pub channels: Vec<NotificationChannel>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum TargetType {
User,
Group,
Role,
External,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct StepCondition {
pub condition_type: StepConditionType,
pub value: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum StepConditionType {
AlertSeverity,
AlertSource,
TimeOfDay,
DayOfWeek,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RepeatPolicy {
pub enabled: bool,
pub interval: Duration,
pub max_repeats: Option<u32>,
pub conditions: Vec<RepeatCondition>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RepeatCondition {
pub condition_type: RepeatConditionType,
pub value: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum RepeatConditionType {
NoAcknowledgment,
NoResolution,
ContinuedViolation,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct AlertManagementConfig {
pub auto_resolution: AutoResolutionConfig,
pub grouping: AlertGroupingConfig,
pub correlation: AlertCorrelationConfig,
pub history: AlertHistoryConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AutoResolutionConfig {
pub enabled: bool,
pub timeout: Duration,
pub conditions: Vec<ResolutionCondition>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResolutionCondition {
pub condition_type: ResolutionConditionType,
pub parameters: std::collections::HashMap<String, String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ResolutionConditionType {
MetricBelowThreshold,
NoNewViolations,
ManualResolution,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AlertGroupingConfig {
pub enabled: bool,
pub criteria: Vec<GroupingCriterion>,
pub window: Duration,
pub max_group_size: Option<u32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GroupingCriterion {
pub field: String,
pub method: GroupingMethod,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum GroupingMethod {
Exact,
Similar,
Pattern,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AlertCorrelationConfig {
pub enabled: bool,
pub rules: Vec<CorrelationRule>,
pub window: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CorrelationRule {
pub name: String,
pub rule_type: CorrelationRuleType,
pub pattern: String,
pub actions: Vec<CorrelationAction>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum CorrelationRuleType {
Sequence,
Temporal,
Causal,
Statistical,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CorrelationAction {
pub action_type: CorrelationActionType,
pub parameters: std::collections::HashMap<String, String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum CorrelationActionType {
CreateIncident,
UpdateSeverity,
SuppressAlerts,
TriggerRunbook,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AlertHistoryConfig {
pub enabled: bool,
pub retention: Duration,
pub archive: ArchiveConfig,
pub analytics: HistoryAnalyticsConfig,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ArchiveConfig {
pub enabled: bool,
pub archive_after: Duration,
pub storage_type: ArchiveStorageType,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ArchiveStorageType {
Local,
S3,
Database,
Custom(String),
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HistoryAnalyticsConfig {
pub enabled: bool,
pub types: Vec<AnalyticsType>,
pub frequency: Duration,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum AnalyticsType {
AlertTrends,
MeanTimeToResolution,
FalsePositiveRate,
AlertVelocity,
Custom(String),
}
impl Default for CloudAlertingConfig {
fn default() -> Self {
Self {
enabled: true,
rules: vec![],
notification_channels: vec![NotificationChannel::Email],
escalation_policies: vec![],
management: AlertManagementConfig::default(),
}
}
}
impl Default for AutoResolutionConfig {
fn default() -> Self {
Self {
enabled: false,
timeout: Duration::from_secs(3600), conditions: vec![],
}
}
}
impl Default for AlertGroupingConfig {
fn default() -> Self {
Self {
enabled: false,
criteria: vec![],
window: Duration::from_secs(300), max_group_size: Some(50),
}
}
}
impl Default for AlertCorrelationConfig {
fn default() -> Self {
Self {
enabled: false,
rules: vec![],
window: Duration::from_secs(600), }
}
}
impl Default for AlertHistoryConfig {
fn default() -> Self {
Self {
enabled: true,
retention: Duration::from_secs(86400 * 90), archive: ArchiveConfig::default(),
analytics: HistoryAnalyticsConfig::default(),
}
}
}
impl Default for ArchiveConfig {
fn default() -> Self {
Self {
enabled: false,
archive_after: Duration::from_secs(86400 * 30), storage_type: ArchiveStorageType::Local,
}
}
}
impl Default for HistoryAnalyticsConfig {
fn default() -> Self {
Self {
enabled: false,
types: vec![AnalyticsType::AlertTrends],
frequency: Duration::from_secs(86400), }
}
}