@@ -488,54 +488,6 @@ impl Display for AlertState {
488488 }
489489}
490490
491- impl AlertState {
492- pub async fn update_state (
493- & self ,
494- new_state : AlertState ,
495- alert_id : Ulid ,
496- ) -> Result < ( ) , AlertError > {
497- match self {
498- AlertState :: Triggered => {
499- if new_state == AlertState :: Triggered {
500- let msg = format ! ( "Not allowed to manually go from Triggered to {new_state}" ) ;
501- return Err ( AlertError :: InvalidStateChange ( msg) ) ;
502- } else {
503- // update state on disk and in memory
504- let guard = ALERTS . read ( ) . await ;
505- let alerts = guard. as_ref ( ) . ok_or_else ( || {
506- AlertError :: CustomError ( "Alert manager not initialized" . into ( ) )
507- } ) ?;
508- alerts
509- . update_state ( alert_id, new_state, Some ( "" . into ( ) ) )
510- . await ?;
511- }
512- }
513- AlertState :: Silenced => {
514- // from here, the user can only go to Resolved
515- if new_state == AlertState :: Resolved {
516- // update state on disk and in memory
517- let guard = ALERTS . read ( ) . await ;
518- let alerts = guard. as_ref ( ) . ok_or_else ( || {
519- AlertError :: CustomError ( "Alert manager not initialized" . into ( ) )
520- } ) ?;
521- alerts
522- . update_state ( alert_id, new_state, Some ( "" . into ( ) ) )
523- . await ?;
524- } else {
525- let msg = format ! ( "Not allowed to manually go from Silenced to {new_state}" ) ;
526- return Err ( AlertError :: InvalidStateChange ( msg) ) ;
527- }
528- }
529- AlertState :: Resolved => {
530- // user shouldn't logically be changing states if current state is Resolved
531- let msg = format ! ( "Not allowed to go manually from Resolved to {new_state}" ) ;
532- return Err ( AlertError :: InvalidStateChange ( msg) ) ;
533- }
534- }
535- Ok ( ( ) )
536- }
537- }
538-
539491#[ derive( Debug , serde:: Serialize , serde:: Deserialize , Clone , Default ) ]
540492#[ serde( rename_all = "camelCase" ) ]
541493pub enum Severity {
@@ -1530,11 +1482,11 @@ impl AlertManagerTrait for Alerts {
15301482 Ok ( alerts)
15311483 }
15321484
1533- /// Returns a sigle alert that the user has access to (based on query auth)
1534- async fn get_alert_by_id ( & self , id : Ulid ) -> Result < AlertConfig , AlertError > {
1485+ /// Returns a single alert that the user has access to (based on query auth)
1486+ async fn get_alert_by_id ( & self , id : Ulid ) -> Result < Box < dyn AlertTrait > , AlertError > {
15351487 let read_access = self . alerts . read ( ) . await ;
15361488 if let Some ( alert) = read_access. get ( & id) {
1537- Ok ( alert. to_alert_config ( ) )
1489+ Ok ( alert. clone_box ( ) )
15381490 } else {
15391491 Err ( AlertError :: CustomError ( format ! (
15401492 "No alert found for the given ID- {id}"
@@ -1557,31 +1509,33 @@ impl AlertManagerTrait for Alerts {
15571509 new_state : AlertState ,
15581510 trigger_notif : Option < String > ,
15591511 ) -> Result < ( ) , AlertError > {
1560- let store = PARSEABLE . storage . get_object_store ( ) ;
1512+ // let store = PARSEABLE.storage.get_object_store();
15611513
15621514 // read and modify alert
1563- let mut alert = self . get_alert_by_id ( alert_id) . await ?;
1564- trace ! ( "get alert state by id-\n {}" , alert. state) ;
1565-
1566- alert. state = new_state;
1567-
1568- trace ! ( "new state-\n {}" , alert. state) ;
1569-
1570- // save to disk
1571- store. put_alert ( alert_id, & alert) . await ?;
1572-
1573- // modify in memory
1574- let mut writer = self . alerts . write ( ) . await ;
1575- if let Some ( alert) = writer. get_mut ( & alert_id) {
1576- trace ! ( "in memory alert-\n {}" , alert. get_state( ) ) ;
1577- alert. set_state ( new_state) ;
1578- trace ! ( "in memory updated alert-\n {}" , alert. get_state( ) ) ;
1515+ let mut write_access = self . alerts . write ( ) . await ;
1516+ let mut alert: Box < dyn AlertTrait > = if let Some ( alert) = write_access. get ( & alert_id) {
1517+ match & alert. get_alert_type ( ) {
1518+ AlertType :: Threshold => {
1519+ Box :: new ( ThresholdAlert :: from ( alert. to_alert_config ( ) ) ) as Box < dyn AlertTrait >
1520+ }
1521+ AlertType :: Anomaly => {
1522+ return Err ( AlertError :: NotPresentInOSS ( "anomaly" . into ( ) ) ) ;
1523+ }
1524+ AlertType :: Forecast => {
1525+ return Err ( AlertError :: NotPresentInOSS ( "forecast" . into ( ) ) ) ;
1526+ }
1527+ }
1528+ } else {
1529+ return Err ( AlertError :: CustomError ( format ! (
1530+ "No alert found for the given ID- {alert_id}"
1531+ ) ) ) ;
15791532 } ;
1580- drop ( writer) ;
15811533
1582- if trigger_notif. is_some ( ) {
1583- trace ! ( "trigger notif on-\n {}" , alert. state) ;
1584- alert. trigger_notifications ( trigger_notif. unwrap ( ) ) . await ?;
1534+ let current_state = alert. get_state ( ) ;
1535+
1536+ if current_state. ne ( & new_state) {
1537+ alert. update_state ( false , new_state, trigger_notif) . await ?;
1538+ write_access. insert ( * alert. get_id ( ) , alert. clone_box ( ) ) ;
15851539 }
15861540
15871541 Ok ( ( ) )
0 commit comments