diff --git a/src/enrgdaq/daq/jobs/healthcheck.py b/src/enrgdaq/daq/jobs/healthcheck.py index 193c449..2b5577b 100644 --- a/src/enrgdaq/daq/jobs/healthcheck.py +++ b/src/enrgdaq/daq/jobs/healthcheck.py @@ -22,10 +22,16 @@ class AlertCondition(str, Enum): UNSATISFIED = "unsatisfied" -class HealthcheckItem(Struct): - """Represents a healthcheck item with alert information.""" +class HealthcheckItem(Struct, kw_only=True): + """Represents a healthcheck item with alert information. + + Attributes: + alert_info (DAQAlertInfo): The alert information. + alive_alert_info (Optional[DAQAlertInfo]): The alert information for when the item gets back alive (after being down). + """ alert_info: DAQAlertInfo + alive_alert_info: Optional[DAQAlertInfo] = None class HealthcheckStatsItem(HealthcheckItem): @@ -211,14 +217,16 @@ def handle_checks(self): item_id = hash(msgspec.json.encode(item)) if should_alert and item_id not in self._sent_alert_items: self._sent_alert_items.add(item_id) - self._send_alert(item) + self._send_alert(item.alert_info) elif not should_alert and item_id in self._sent_alert_items: self._sent_alert_items.remove(item_id) + if item.alive_alert_info: + self._send_alert(item.alive_alert_info) - def _send_alert(self, item: HealthcheckItem): + def _send_alert(self, alert_info: DAQAlertInfo): self._put_message_out( DAQJobMessageAlert( date=datetime.now(), - alert_info=item.alert_info, + alert_info=alert_info, ) ) diff --git a/src/tests/test_healthcheck.py b/src/tests/test_healthcheck.py index 0451de4..a795d03 100644 --- a/src/tests/test_healthcheck.py +++ b/src/tests/test_healthcheck.py @@ -41,7 +41,7 @@ def test_handle_checks_should_alert(self, mock_send_alert): self.daq_job_healthcheck.handle_checks() - mock_send_alert.assert_called_once_with(self.healthcheck_item) + mock_send_alert.assert_called_once_with(self.healthcheck_item.alert_info) @patch("enrgdaq.daq.jobs.healthcheck.DAQJobHealthcheck._send_alert") def test_handle_checks_should_not_alert(self, mock_send_alert): @@ -63,7 +63,7 @@ def test_handle_checks_should_not_alert_twice_in_a_row(self, mock_send_alert): # First check should trigger an alert self.daq_job_healthcheck.handle_checks() - mock_send_alert.assert_called_once_with(self.healthcheck_item) + mock_send_alert.assert_called_once_with(self.healthcheck_item.alert_info) # Reset mock to check for second call mock_send_alert.reset_mock() @@ -84,7 +84,7 @@ def test_handle_checks_should_alert_then_not_alert_then_alert_again( # First check should trigger an alert self.daq_job_healthcheck.handle_checks() - mock_send_alert.assert_called_once_with(self.healthcheck_item) + mock_send_alert.assert_called_once_with(self.healthcheck_item.alert_info) # Reset mock to check for second call mock_send_alert.reset_mock() @@ -99,7 +99,7 @@ def test_handle_checks_should_alert_then_not_alert_then_alert_again( minutes=10 ) self.daq_job_healthcheck.handle_checks() - mock_send_alert.assert_called_once_with(self.healthcheck_item) + mock_send_alert.assert_called_once_with(self.healthcheck_item.alert_info) def test_parse_interval(self): self.assertEqual(self.healthcheck_item.parse_interval(), timedelta(minutes=5))