1use serde::{Deserialize, Serialize};
4use std::time::Duration;
5
6#[derive(Debug, Clone, Serialize, Deserialize)]
8pub struct CloudAlertingConfig {
9 pub enabled: bool,
11 pub rules: Vec<AlertRule>,
13 pub notification_channels: Vec<NotificationChannel>,
15 pub escalation_policies: Vec<EscalationPolicy>,
17 pub management: AlertManagementConfig,
19}
20
21#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct AlertRule {
24 pub name: String,
26 pub description: String,
28 pub condition: AlertCondition,
30 pub severity: AlertSeverity,
32 pub channels: Vec<String>,
34 pub suppression: Option<SuppressionRule>,
36 pub tags: std::collections::HashMap<String, String>,
38}
39
40#[derive(Debug, Clone, Serialize, Deserialize)]
42pub struct AlertCondition {
43 pub metric: String,
45 pub operator: ComparisonOperator,
47 pub threshold: f64,
49 pub window: Duration,
51 pub aggregation: AggregationFunction,
53}
54
55#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
57pub enum ComparisonOperator {
58 GreaterThan,
59 GreaterThanOrEqual,
60 LessThan,
61 LessThanOrEqual,
62 Equal,
63 NotEqual,
64}
65
66#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
68pub enum AggregationFunction {
69 Average,
70 Sum,
71 Count,
72 Max,
73 Min,
74 Percentile(f64),
75 Custom(String),
76}
77
78#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Serialize, Deserialize)]
80pub enum AlertSeverity {
81 Critical,
82 High,
83 Medium,
84 Low,
85 Info,
86}
87
88#[derive(Debug, Clone, Serialize, Deserialize)]
90pub struct SuppressionRule {
91 pub window: Duration,
93 pub conditions: Vec<SuppressionCondition>,
95 pub max_suppressions: Option<u32>,
97}
98
99#[derive(Debug, Clone, Serialize, Deserialize)]
101pub struct SuppressionCondition {
102 pub field: String,
104 pub value: String,
106 pub match_type: MatchType,
108}
109
110#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
112pub enum MatchType {
113 Exact,
114 Pattern,
115 Regex,
116 Contains,
117}
118
119#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
121pub enum NotificationChannel {
122 Email,
123 SMS,
124 Slack,
125 Teams,
126 PagerDuty,
127 Webhook,
128 Custom(String),
129}
130
131#[derive(Debug, Clone, Serialize, Deserialize)]
133pub struct EscalationPolicy {
134 pub name: String,
136 pub steps: Vec<EscalationStep>,
138 pub repeat: Option<RepeatPolicy>,
140}
141
142#[derive(Debug, Clone, Serialize, Deserialize)]
144pub struct EscalationStep {
145 pub step: u32,
147 pub delay: Duration,
149 pub targets: Vec<NotificationTarget>,
151 pub conditions: Vec<StepCondition>,
153}
154
155#[derive(Debug, Clone, Serialize, Deserialize)]
157pub struct NotificationTarget {
158 pub target_type: TargetType,
160 pub identifier: String,
162 pub channels: Vec<NotificationChannel>,
164}
165
166#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
168pub enum TargetType {
169 User,
170 Group,
171 Role,
172 External,
173}
174
175#[derive(Debug, Clone, Serialize, Deserialize)]
177pub struct StepCondition {
178 pub condition_type: StepConditionType,
180 pub value: String,
182}
183
184#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
186pub enum StepConditionType {
187 AlertSeverity,
188 AlertSource,
189 TimeOfDay,
190 DayOfWeek,
191 Custom(String),
192}
193
194#[derive(Debug, Clone, Serialize, Deserialize)]
196pub struct RepeatPolicy {
197 pub enabled: bool,
199 pub interval: Duration,
201 pub max_repeats: Option<u32>,
203 pub conditions: Vec<RepeatCondition>,
205}
206
207#[derive(Debug, Clone, Serialize, Deserialize)]
209pub struct RepeatCondition {
210 pub condition_type: RepeatConditionType,
212 pub value: String,
214}
215
216#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
218pub enum RepeatConditionType {
219 NoAcknowledgment,
220 NoResolution,
221 ContinuedViolation,
222 Custom(String),
223}
224
225#[derive(Debug, Clone, Serialize, Deserialize, Default)]
227pub struct AlertManagementConfig {
228 pub auto_resolution: AutoResolutionConfig,
230 pub grouping: AlertGroupingConfig,
232 pub correlation: AlertCorrelationConfig,
234 pub history: AlertHistoryConfig,
236}
237
238#[derive(Debug, Clone, Serialize, Deserialize)]
240pub struct AutoResolutionConfig {
241 pub enabled: bool,
243 pub timeout: Duration,
245 pub conditions: Vec<ResolutionCondition>,
247}
248
249#[derive(Debug, Clone, Serialize, Deserialize)]
251pub struct ResolutionCondition {
252 pub condition_type: ResolutionConditionType,
254 pub parameters: std::collections::HashMap<String, String>,
256}
257
258#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
260pub enum ResolutionConditionType {
261 MetricBelowThreshold,
262 NoNewViolations,
263 ManualResolution,
264 Custom(String),
265}
266
267#[derive(Debug, Clone, Serialize, Deserialize)]
269pub struct AlertGroupingConfig {
270 pub enabled: bool,
272 pub criteria: Vec<GroupingCriterion>,
274 pub window: Duration,
276 pub max_group_size: Option<u32>,
278}
279
280#[derive(Debug, Clone, Serialize, Deserialize)]
282pub struct GroupingCriterion {
283 pub field: String,
285 pub method: GroupingMethod,
287}
288
289#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
291pub enum GroupingMethod {
292 Exact,
293 Similar,
294 Pattern,
295 Custom(String),
296}
297
298#[derive(Debug, Clone, Serialize, Deserialize)]
300pub struct AlertCorrelationConfig {
301 pub enabled: bool,
303 pub rules: Vec<CorrelationRule>,
305 pub window: Duration,
307}
308
309#[derive(Debug, Clone, Serialize, Deserialize)]
311pub struct CorrelationRule {
312 pub name: String,
314 pub rule_type: CorrelationRuleType,
316 pub pattern: String,
318 pub actions: Vec<CorrelationAction>,
320}
321
322#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
324pub enum CorrelationRuleType {
325 Sequence,
326 Temporal,
327 Causal,
328 Statistical,
329 Custom(String),
330}
331
332#[derive(Debug, Clone, Serialize, Deserialize)]
334pub struct CorrelationAction {
335 pub action_type: CorrelationActionType,
337 pub parameters: std::collections::HashMap<String, String>,
339}
340
341#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
343pub enum CorrelationActionType {
344 CreateIncident,
345 UpdateSeverity,
346 SuppressAlerts,
347 TriggerRunbook,
348 Custom(String),
349}
350
351#[derive(Debug, Clone, Serialize, Deserialize)]
353pub struct AlertHistoryConfig {
354 pub enabled: bool,
356 pub retention: Duration,
358 pub archive: ArchiveConfig,
360 pub analytics: HistoryAnalyticsConfig,
362}
363
364#[derive(Debug, Clone, Serialize, Deserialize)]
366pub struct ArchiveConfig {
367 pub enabled: bool,
369 pub archive_after: Duration,
371 pub storage_type: ArchiveStorageType,
373}
374
375#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
377pub enum ArchiveStorageType {
378 Local,
379 S3,
380 Database,
381 Custom(String),
382}
383
384#[derive(Debug, Clone, Serialize, Deserialize)]
386pub struct HistoryAnalyticsConfig {
387 pub enabled: bool,
389 pub types: Vec<AnalyticsType>,
391 pub frequency: Duration,
393}
394
395#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
397pub enum AnalyticsType {
398 AlertTrends,
399 MeanTimeToResolution,
400 FalsePositiveRate,
401 AlertVelocity,
402 Custom(String),
403}
404
405impl Default for CloudAlertingConfig {
406 fn default() -> Self {
407 Self {
408 enabled: true,
409 rules: vec![],
410 notification_channels: vec![NotificationChannel::Email],
411 escalation_policies: vec![],
412 management: AlertManagementConfig::default(),
413 }
414 }
415}
416
417impl Default for AutoResolutionConfig {
418 fn default() -> Self {
419 Self {
420 enabled: false,
421 timeout: Duration::from_secs(3600), conditions: vec![],
423 }
424 }
425}
426
427impl Default for AlertGroupingConfig {
428 fn default() -> Self {
429 Self {
430 enabled: false,
431 criteria: vec![],
432 window: Duration::from_secs(300), max_group_size: Some(50),
434 }
435 }
436}
437
438impl Default for AlertCorrelationConfig {
439 fn default() -> Self {
440 Self {
441 enabled: false,
442 rules: vec![],
443 window: Duration::from_secs(600), }
445 }
446}
447
448impl Default for AlertHistoryConfig {
449 fn default() -> Self {
450 Self {
451 enabled: true,
452 retention: Duration::from_secs(86400 * 90), archive: ArchiveConfig::default(),
454 analytics: HistoryAnalyticsConfig::default(),
455 }
456 }
457}
458
459impl Default for ArchiveConfig {
460 fn default() -> Self {
461 Self {
462 enabled: false,
463 archive_after: Duration::from_secs(86400 * 30), storage_type: ArchiveStorageType::Local,
465 }
466 }
467}
468
469impl Default for HistoryAnalyticsConfig {
470 fn default() -> Self {
471 Self {
472 enabled: false,
473 types: vec![AnalyticsType::AlertTrends],
474 frequency: Duration::from_secs(86400), }
476 }
477}