@@ -488,54 +488,6 @@ impl Display for AlertState {
488
488
}
489
489
}
490
490
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
-
539
491
#[ derive( Debug , serde:: Serialize , serde:: Deserialize , Clone , Default ) ]
540
492
#[ serde( rename_all = "camelCase" ) ]
541
493
pub enum Severity {
@@ -1531,10 +1483,21 @@ impl AlertManagerTrait for Alerts {
1531
1483
}
1532
1484
1533
1485
/// 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 > {
1486
+ async fn get_alert_by_id ( & self , id : Ulid ) -> Result < Box < dyn AlertTrait > , AlertError > {
1535
1487
let read_access = self . alerts . read ( ) . await ;
1536
1488
if let Some ( alert) = read_access. get ( & id) {
1537
- Ok ( alert. to_alert_config ( ) )
1489
+ let alert: Box < dyn AlertTrait > = match & alert. get_alert_type ( ) {
1490
+ AlertType :: Threshold => {
1491
+ Box :: new ( ThresholdAlert :: from ( alert. to_alert_config ( ) ) ) as Box < dyn AlertTrait >
1492
+ }
1493
+ AlertType :: Anomaly => {
1494
+ return Err ( AlertError :: NotPresentInOSS ( "anomaly" . into ( ) ) ) ;
1495
+ }
1496
+ AlertType :: Forecast => {
1497
+ return Err ( AlertError :: NotPresentInOSS ( "forecast" . into ( ) ) ) ;
1498
+ }
1499
+ } ;
1500
+ Ok ( alert)
1538
1501
} else {
1539
1502
Err ( AlertError :: CustomError ( format ! (
1540
1503
"No alert found for the given ID- {id}"
@@ -1557,31 +1520,33 @@ impl AlertManagerTrait for Alerts {
1557
1520
new_state : AlertState ,
1558
1521
trigger_notif : Option < String > ,
1559
1522
) -> Result < ( ) , AlertError > {
1560
- let store = PARSEABLE . storage . get_object_store ( ) ;
1523
+ // let store = PARSEABLE.storage.get_object_store();
1561
1524
1562
1525
// 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( ) ) ;
1526
+ let mut write_access = self . alerts . write ( ) . await ;
1527
+ let mut alert: Box < dyn AlertTrait > = if let Some ( alert) = write_access. get ( & alert_id) {
1528
+ match & alert. get_alert_type ( ) {
1529
+ AlertType :: Threshold => {
1530
+ Box :: new ( ThresholdAlert :: from ( alert. to_alert_config ( ) ) ) as Box < dyn AlertTrait >
1531
+ }
1532
+ AlertType :: Anomaly => {
1533
+ return Err ( AlertError :: NotPresentInOSS ( "anomaly" . into ( ) ) ) ;
1534
+ }
1535
+ AlertType :: Forecast => {
1536
+ return Err ( AlertError :: NotPresentInOSS ( "forecast" . into ( ) ) ) ;
1537
+ }
1538
+ }
1539
+ } else {
1540
+ return Err ( AlertError :: CustomError ( format ! (
1541
+ "No alert found for the given ID- {alert_id}"
1542
+ ) ) ) ;
1579
1543
} ;
1580
- drop ( writer) ;
1581
1544
1582
- if trigger_notif. is_some ( ) {
1583
- trace ! ( "trigger notif on-\n {}" , alert. state) ;
1584
- alert. trigger_notifications ( trigger_notif. unwrap ( ) ) . await ?;
1545
+ let current_state = alert. get_state ( ) ;
1546
+
1547
+ if current_state. ne ( & new_state) {
1548
+ alert. update_state ( false , new_state, trigger_notif) . await ?;
1549
+ write_access. insert ( * alert. get_id ( ) , alert. clone_box ( ) ) ;
1585
1550
}
1586
1551
1587
1552
Ok ( ( ) )
0 commit comments