@@ -24,7 +24,6 @@ pub mod target;
24
24
25
25
pub use self :: rule:: Rule ;
26
26
use self :: target:: Target ;
27
- use crate :: event:: Event ;
28
27
29
28
#[ derive( Default , Debug , Serialize , Deserialize ) ]
30
29
#[ serde( rename_all = "camelCase" ) ]
@@ -44,46 +43,58 @@ pub struct Alert {
44
43
}
45
44
46
45
impl Alert {
47
- pub async fn check_alert ( & self , event : & Event ) -> Result < ( ) , ( ) > {
48
- let event_json : serde_json :: Value = serde_json :: from_str ( & event . body ) . map_err ( |_| ( ) ) ? ;
46
+ pub fn check_alert ( & self , stream_name : String , event_json : & serde_json :: Value ) {
47
+ let resolves = self . rule . resolves ( event_json ) ;
49
48
50
- if self . rule . resolves ( & event_json) {
51
- log:: info!( "Alert triggered for stream {}" , self . name) ;
52
- for target in self . targets . clone ( ) {
53
- let context = Context :: new (
54
- event. stream_name . clone ( ) ,
55
- self . name . clone ( ) ,
56
- self . message . clone ( ) ,
57
- self . rule . trigger_reason ( ) ,
58
- ) ;
59
- actix_web:: rt:: spawn ( async move {
60
- target. call ( & context) ;
61
- } ) ;
49
+ match resolves {
50
+ AlertState :: Listening | AlertState :: Firing => ( ) ,
51
+ alert_state @ ( AlertState :: SetToFiring | AlertState :: Resolved ) => {
52
+ let context = self . get_context ( stream_name, alert_state) ;
53
+ for target in & self . targets {
54
+ target. call ( context. clone ( ) ) ;
55
+ }
62
56
}
63
57
}
58
+ }
64
59
65
- Ok ( ( ) )
60
+ fn get_context ( & self , stream_name : String , alert_state : AlertState ) -> Context {
61
+ Context :: new (
62
+ stream_name,
63
+ self . name . clone ( ) ,
64
+ self . message . clone ( ) ,
65
+ self . rule . trigger_reason ( ) ,
66
+ alert_state,
67
+ )
66
68
}
67
69
}
68
70
69
71
pub trait CallableTarget {
70
72
fn call ( & self , payload : & Context ) ;
71
73
}
72
74
75
+ #[ derive( Debug , Clone ) ]
73
76
pub struct Context {
74
77
stream : String ,
75
78
alert_name : String ,
76
79
message : String ,
77
80
reason : String ,
81
+ alert_state : AlertState ,
78
82
}
79
83
80
84
impl Context {
81
- pub fn new ( stream : String , alert_name : String , message : String , reason : String ) -> Self {
85
+ pub fn new (
86
+ stream : String ,
87
+ alert_name : String ,
88
+ message : String ,
89
+ reason : String ,
90
+ alert_state : AlertState ,
91
+ ) -> Self {
82
92
Self {
83
93
stream,
84
94
alert_name,
85
95
message,
86
96
reason,
97
+ alert_state,
87
98
}
88
99
}
89
100
@@ -93,4 +104,22 @@ impl Context {
93
104
self . alert_name, self . stream, self . message, self . reason
94
105
)
95
106
}
107
+
108
+ fn default_resolved_string ( & self ) -> String {
109
+ format ! ( "{} on {} is now resolved " , self . alert_name, self . stream)
110
+ }
111
+ }
112
+
113
+ #[ derive( Debug , PartialEq , Eq , Clone , Copy ) ]
114
+ pub enum AlertState {
115
+ Listening ,
116
+ SetToFiring ,
117
+ Firing ,
118
+ Resolved ,
119
+ }
120
+
121
+ impl Default for AlertState {
122
+ fn default ( ) -> Self {
123
+ Self :: Listening
124
+ }
96
125
}
0 commit comments