@@ -33,9 +33,17 @@ use self::target::Target;
3333#[ derive( Default , Debug , Serialize , Deserialize ) ]
3434#[ serde( rename_all = "camelCase" ) ]
3535pub struct Alerts {
36+ pub version : AlertVerison ,
3637 pub alerts : Vec < Alert > ,
3738}
3839
40+ #[ derive( Default , Debug , Serialize , Deserialize ) ]
41+ #[ serde( rename_all = "lowercase" ) ]
42+ pub enum AlertVerison {
43+ #[ default]
44+ V1 ,
45+ }
46+
3947#[ derive( Debug , Serialize , Deserialize ) ]
4048#[ serde( rename_all = "camelCase" ) ]
4149pub struct Alert {
@@ -54,7 +62,7 @@ impl Alert {
5462 match resolves {
5563 AlertState :: Listening | AlertState :: Firing => ( ) ,
5664 alert_state @ ( AlertState :: SetToFiring | AlertState :: Resolved ) => {
57- let context = self . get_context ( stream_name, alert_state) ;
65+ let context = self . get_context ( stream_name, alert_state, & self . rule ) ;
5866 ALERTS_STATES
5967 . with_label_values ( & [
6068 context. stream . as_str ( ) ,
@@ -69,15 +77,28 @@ impl Alert {
6977 }
7078 }
7179
72- fn get_context ( & self , stream_name : String , alert_state : AlertState ) -> Context {
80+ fn get_context ( & self , stream_name : String , alert_state : AlertState , rule : & Rule ) -> Context {
7381 let deployment_id = storage:: StorageMetadata :: global ( ) . deployment_id ;
82+ let additional_labels =
83+ serde_json:: to_value ( rule) . expect ( "rule is perfectly deserializable" ) ;
84+ let mut flatten_additional_labels = serde_json:: json!( { } ) ;
85+ flatten_json:: flatten (
86+ & additional_labels,
87+ & mut flatten_additional_labels,
88+ Some ( "rule" . to_string ( ) ) ,
89+ false ,
90+ Some ( "_" ) ,
91+ )
92+ . expect ( "can be flattened" ) ;
93+
7494 Context :: new (
7595 stream_name,
7696 self . name . clone ( ) ,
7797 self . message . clone ( ) ,
7898 self . rule . trigger_reason ( ) ,
7999 alert_state,
80100 deployment_id,
101+ flatten_additional_labels,
81102 )
82103 }
83104}
@@ -94,6 +115,7 @@ pub struct Context {
94115 reason : String ,
95116 alert_state : AlertState ,
96117 deployment_id : uid:: Uid ,
118+ additional_labels : serde_json:: Value ,
97119}
98120
99121impl Context {
@@ -104,6 +126,7 @@ impl Context {
104126 reason : String ,
105127 alert_state : AlertState ,
106128 deployment_id : uid:: Uid ,
129+ additional_labels : serde_json:: Value ,
107130 ) -> Self {
108131 Self {
109132 stream,
@@ -112,6 +135,7 @@ impl Context {
112135 reason,
113136 alert_state,
114137 deployment_id,
138+ additional_labels,
115139 }
116140 }
117141
0 commit comments