def housekeeping(expired_threshold: int = 2, info_threshold: int = 12) -> None: expired, unshelved = db.housekeeping(expired_threshold, info_threshold) for (id, event, last_receive_id) in expired: history = History(id=last_receive_id, event=event, status='expired', text='expired after timeout', change_type='status', update_time=datetime.utcnow()) db.set_status(id, 'expired', timeout=current_app.config['ALERT_TIMEOUT'], history=history) for (id, event, last_receive_id) in unshelved: history = History(id=last_receive_id, event=event, status='open', text='unshelved after timeout', change_type='status', update_time=datetime.utcnow()) db.set_status(id, 'open', timeout=current_app.config['ALERT_TIMEOUT'], history=history)
def deduplicate(self) -> 'Alert': now = datetime.utcnow() previous_status, previous_value = db.get_status_and_value(self) _, self.status = alarm_model.transition( previous_severity=self.severity, current_severity=self.severity, previous_status=previous_status, current_status=self.status) self.repeat = True self.last_receive_id = self.id self.last_receive_time = now from typing import Optional # noqa if self.status != previous_status: history = History( id=self.id, event=self.event, status=self.status, text='duplicate alert with status change', change_type='status', update_time=self.create_time) # type: Optional[History] elif current_app.config[ 'HISTORY_ON_VALUE_CHANGE'] and self.value != previous_value: history = History(id=self.id, event=self.event, value=self.value, text='duplicate alert with value change', change_type='value', update_time=self.create_time) else: history = None return Alert.from_db(db.dedup_alert(self, history))
def deduplicate(self): now = datetime.utcnow() previous_status, previous_value = db.get_status_and_value(self) self.status = status_code.status_from_severity( previous_severity=self.severity, current_severity=self.severity, previous_status=previous_status, current_status=self.status) self.repeat = True self.last_receive_id = self.id self.last_receive_time = now if self.status != previous_status: history = History(id=self.id, event=self.event, status=self.status, text='duplicate alert with status change', change_type='status', update_time=self.create_time) elif current_app.config[ 'HISTORY_ON_VALUE_CHANGE'] and self.value != previous_value: history = History(id=self.id, event=self.event, value=self.value, text='duplicate alert with value change', change_type='value', update_time=self.create_time) else: history = None return Alert.from_db(db.dedup_alert(self, history))
def create(self) -> 'Alert': if self.status == alarm_model.DEFAULT_STATUS: _, self.status = alarm_model.transition( previous_severity=alarm_model.DEFAULT_PREVIOUS_SEVERITY, current_severity=self.severity) trend_indication = alarm_model.trend( alarm_model.DEFAULT_PREVIOUS_SEVERITY, self.severity) self.duplicate_count = 0 self.repeat = False self.previous_severity = alarm_model.DEFAULT_PREVIOUS_SEVERITY self.trend_indication = trend_indication self.receive_time = datetime.utcnow() self.last_receive_id = self.id self.last_receive_time = self.receive_time self.history = [ History(id=self.id, event=self.event, severity=self.severity, value=self.value, text=self.text, change_type='severity', update_time=self.create_time) ] self.history.append( History(id=self.id, event=self.event, status=self.status, text='new alert status change', change_type='status', update_time=self.create_time)) return Alert.from_db(db.create_alert(self))
def housekeeping(expired_threshold: int = 2, info_threshold: int = 12) -> None: now = datetime.utcnow() expired, unshelved = db.housekeeping(expired_threshold, info_threshold) for (id, event, last_receive_id) in expired: history = History( id=last_receive_id, event=event, status='expired', text='auto-expired after timeout', change_type='status', update_time=now, user=g.login ) db.set_status(id, 'expired', timeout=current_app.config['ALERT_TIMEOUT'], update_time=now, history=history) for (id, event, last_receive_id) in unshelved: # as per ISA 18.2 recommendation 11.7.3 auto-unshelved alarms transition to open, not previous status history = History( id=last_receive_id, event=event, status='open', text='auto-unshelved after timeout', change_type='status', update_time=now, user=g.login ) db.set_status(id, 'open', timeout=current_app.config['ALERT_TIMEOUT'], update_time=now, history=history)
def deduplicate(self): now = datetime.utcnow() previous_status, previous_value = db.get_status_and_value(self) self.status = status_code.status_from_severity( previous_severity=self.severity, current_severity=self.severity, previous_status=previous_status, current_status=self.status) self.repeat = True self.last_receive_id = self.id self.last_receive_time = now if self.status != previous_status: history = History(id=self.id, event=self.event, status=self.status, text="duplicate alert with status change", change_type="status", update_time=now) elif self.value != previous_value: history = History(id=self.id, event=self.event, value=self.value, text="duplicate alert with value change", change_type="value", update_time=now) else: history = None return Alert.from_db(db.dedup_alert(self, history))
def deduplicate(self, duplicate_of) -> 'Alert': now = datetime.utcnow() status, previous_value, previous_status, _ = self._get_hist_info() _, new_status = alarm_model.transition(alert=self, current_status=status, previous_status=previous_status) self.repeat = True self.last_receive_id = self.id self.last_receive_time = now if new_status != status: r = status_change_hook.send(duplicate_of, status=new_status, text=self.text) _, (_, new_status, text) = r[0] self.update_time = now history = History( id=self.id, event=self.event, severity=self.severity, status=new_status, value=self.value, text=text, change_type=ChangeType.status, update_time=self.create_time, user=g.login, timeout=self.timeout, ) # type: Optional[History] elif current_app.config[ 'HISTORY_ON_VALUE_CHANGE'] and self.value != previous_value: history = History( id=self.id, event=self.event, severity=self.severity, status=status, value=self.value, text=self.text, change_type=ChangeType.value, update_time=self.create_time, user=g.login, timeout=self.timeout, ) else: history = None self.status = new_status return Alert.from_db(db.dedup_alert(self, history))
def deduplicate(self) -> 'Alert': now = datetime.utcnow() status, previous_value, previous_status = self._get_hist_info() _, new_status = alarm_model.transition( alert=self, current_status=status, previous_status=previous_status ) self.repeat = True self.last_receive_id = self.id self.last_receive_time = now if new_status != status: history = History( id=self.id, event=self.event, severity=self.severity, status=new_status, value=self.value, text='duplicate alert (with status change)', change_type='status', update_time=self.create_time, user=g.user, ) # type: Optional[History] self.update_time = now status_change_hook.send(self, status=new_status, text=self.text) elif current_app.config['HISTORY_ON_VALUE_CHANGE'] and self.value != previous_value: history = History( id=self.id, event=self.event, severity=self.severity, status=status, value=self.value, text='duplicate alert (with value change)', change_type='value', update_time=self.create_time, user=g.user ) else: history = None self.status = new_status return Alert.from_db(db.dedup_alert(self, history))
def from_status(self, status: str, text: str = '', timeout: int = None) -> 'Alert': now = datetime.utcnow() self.timeout = timeout or current_app.config['ALERT_TIMEOUT'] history = [ History(id=self.id, event=self.event, severity=self.severity, status=status, value=self.value, text=text, change_type='status', update_time=now, user=g.user) ] return Alert.from_db( db.set_alert(id=self.id, severity=self.severity, status=status, tags=self.tags, attributes=self.attributes, timeout=timeout, previous_severity=self.previous_severity, update_time=now, history=history))
def from_alert(alert, text): note = Note( text=text, user=g.user, note_type=NoteType.alert, attributes=dict( resource=alert.resource, event=alert.event, environment=alert.environment, severity=alert.severity, status=alert.status ), alert=alert.id, customer=alert.customer ) history = History( id=note.id, event=alert.event, severity=alert.severity, status=alert.status, value=alert.value, text=text, change_type=ChangeType.note, update_time=datetime.utcnow(), user=g.login ) db.add_history(alert.id, history) return note.create()
def from_action(self, action: str, text: str='', timeout: int=None) -> 'Alert': self.timeout = timeout or current_app.config['ALERT_TIMEOUT'] status, _, previous_status = self._get_hist_info(action) new_severity, new_status = alarm_model.transition( alert=self, current_status=status, previous_status=previous_status, action=action ) history = [History( id=self.id, event=self.event, severity=new_severity, status=new_status, value=self.value, text=text, change_type=action, update_time=datetime.utcnow() )] status_change_hook.send(self, status=new_status, text=text) return Alert.from_db(db.set_alert( id=self.id, severity=new_severity, status=new_status, tags=self.tags, attributes=self.attributes, timeout=timeout, previous_severity=self.severity if new_severity != self.severity else self.previous_severity, history=history) )
def from_action(self, action, text='', timeout=None): if action == actions.ACTION_UNACK: self.status = status_code.OPEN if action == actions.ACTION_SHELVE: self.status = status_code.SHELVED if action == actions.ACTION_UNSHELVE: self.status = status_code.OPEN if action == actions.ACTION_ACK: self.status = status_code.ACK if action == actions.ACTION_CLOSE: self.severity = current_app.config['DEFAULT_NORMAL_SEVERITY'] self.status = status_code.CLOSED self.timeout = timeout or current_app.config['ALERT_TIMEOUT'] history = History(id=self.id, event=self.event, severity=self.severity, status=self.status, text=text, change_type="action", update_time=datetime.utcnow()) return db.set_severity_and_status(self.id, self.severity, self.status, self.timeout, history)
def from_action(self, action: str, text: str = '', timeout: int = None) -> 'Alert': self.timeout = timeout or current_app.config['ALERT_TIMEOUT'] previous_status = db.get_status(self) severity, status = alarm_model.transition( previous_severity=self.previous_severity, current_severity=self.severity, previous_status=previous_status, current_status=self.status, action=action) history = History(id=self.id, event=self.event, severity=self.severity if self.previous_severity != self.severity else None, status=self.status, text=text, change_type='action', update_time=datetime.utcnow()) return Alert.from_db( db.set_alert(self.id, severity, status, self.tags, self.attributes, timeout, history))
def create(self) -> 'Alert': now = datetime.utcnow() trend_indication = alarm_model.trend( alarm_model.DEFAULT_PREVIOUS_SEVERITY, self.severity) _, self.status = alarm_model.transition(alert=self) self.duplicate_count = 0 self.repeat = False self.previous_severity = alarm_model.DEFAULT_PREVIOUS_SEVERITY self.trend_indication = trend_indication self.receive_time = now self.last_receive_id = self.id self.last_receive_time = now self.update_time = now self.history = [ History(id=self.id, event=self.event, severity=self.severity, status=self.status, value=self.value, text='new alert', change_type='new', update_time=self.create_time, user=g.user) ] return Alert.from_db(db.create_alert(self))
def update(self) -> 'Alert': now = datetime.utcnow() self.previous_severity = db.get_severity(self) self.trend_indication = alarm_model.trend(self.previous_severity, self.severity) status, _, previous_status = self._get_hist_info() _, new_status = alarm_model.transition(alert=self, current_status=status, previous_status=previous_status) self.duplicate_count = 0 self.repeat = False self.receive_time = now self.last_receive_id = self.id self.last_receive_time = now history = [ History(id=self.id, event=self.event, severity=self.severity, status=new_status, value=self.value, text='correlated alert', change_type='severity', update_time=self.create_time) ] if new_status != status: status_change_hook.send(self, status=new_status, text=self.text) self.status = new_status return Alert.from_db(db.correlate_alert(self, history))
def from_action(self, action: str, text: str = '', timeout: int = None) -> 'Alert': now = datetime.utcnow() status, _, previous_status, previous_timeout = self._get_hist_info( action) if action in ['unack', 'unshelve', 'timeout']: timeout = timeout or previous_timeout if action in ['ack', 'unack']: timeout = timeout or current_app.config['ACK_TIMEOUT'] elif action in ['shelve', 'unshelve']: timeout = timeout or current_app.config['SHELVE_TIMEOUT'] else: timeout = timeout or self.timeout or current_app.config[ 'ALERT_TIMEOUT'] new_severity, new_status = alarm_model.transition( alert=self, current_status=status, previous_status=previous_status, action=action) r = status_change_hook.send(self, status=new_status, text=text) _, (_, new_status, text) = r[0] try: change_type = ChangeType(action) except ValueError: change_type = ChangeType.action history = [ History(id=self.id, event=self.event, severity=new_severity, status=new_status, value=self.value, text=text, change_type=change_type, update_time=now, user=g.login, timeout=timeout) ] return Alert.from_db( db.set_alert( id=self.id, severity=new_severity, status=new_status, tags=self.tags, attributes=self.attributes, timeout=self.timeout, previous_severity=self.severity if new_severity != self.severity else self.previous_severity, update_time=now, history=history))
def set_status(self, status, text=''): history = History(id=self.id, event=self.event, status=status, text=text, change_type="status", update_time=datetime.utcnow()) return db.set_status(self.id, status, history)
def set_status(self, status, text='', timeout=None): timeout = timeout or current_app.config['ALERT_TIMEOUT'] history = History(id=self.id, event=self.event, status=status, text=text, change_type='status', update_time=datetime.utcnow()) return db.set_status(self.id, status, timeout, history)
def add_note(self, note: str) -> bool: history = History(id=self.id, event=self.event, severity=self.severity, status=self.status, value=self.value, text=note, change_type='note', update_time=datetime.utcnow()) return db.add_history(self.id, history)
def housekeeping(expired_threshold=2, info_threshold=12): for (id, event, last_receive_id) in db.housekeeping(expired_threshold, info_threshold): history = History( id=last_receive_id, event=event, status="expired", text="alert timeout status change", change_type="status", update_time=datetime.utcnow() ) db.set_status(id, "expired", history)
def from_status(self, status: str, text: str='', timeout: int=None) -> 'Alert': self.timeout = timeout or current_app.config['ALERT_TIMEOUT'] history = History( id=self.id, event=self.event, status=status, text=text, change_type='status', update_time=datetime.utcnow() ) return Alert.from_db(db.set_alert(self.id, self.severity, status, self.tags, self.attributes, timeout, history))
def update(self) -> 'Alert': now = datetime.utcnow() self.previous_severity = db.get_severity(self) previous_status = db.get_status(self) self.trend_indication = alarm_model.trend(self.previous_severity, self.severity) _, self.status = alarm_model.transition( previous_severity=self.previous_severity, current_severity=self.severity, previous_status=previous_status, current_status=self.status ) self.duplicate_count = 0 self.repeat = False self.receive_time = now self.last_receive_id = self.id self.last_receive_time = now history = [History( id=self.id, event=self.event, severity=self.severity, value=self.value, text=self.text, change_type='severity', update_time=self.create_time )] if self.status != previous_status: history.append(History( id=self.id, event=self.event, status=self.status, text='correlated alert status change', change_type='status', update_time=self.create_time )) return Alert.from_db(db.correlate_alert(self, history))
def update(self): now = datetime.utcnow() self.previous_severity = db.get_severity(self) previous_status = db.get_status(self) self.trend_indication = severity.trend(self.previous_severity, self.severity) self.status = status_code.status_from_severity( previous_severity=self.previous_severity, current_severity=self.severity, previous_status=previous_status, current_status=self.status ) self.duplicate_count = 0 self.repeat = False self.receive_time = now self.last_receive_id = self.id self.last_receive_time = now history = [History( id=self.id, event=self.event, severity=self.severity, value=self.value, text=self.text, change_type="severity", update_time=self.create_time )] if self.status != previous_status: history.append(History( id=self.id, event=self.event, status=self.status, text="correlated alert status change", change_type="status", update_time=self.create_time )) return Alert.from_db(db.correlate_alert(self, history))
def set_severity_and_status(self, severity: str, status: str, text: str='', timeout: int=None) -> 'Alert': timeout = timeout or current_app.config['ALERT_TIMEOUT'] history = History( id=self.id, event=self.event, severity=severity, status=status, text=text, change_type='action', update_time=datetime.utcnow() ) return db.set_severity_and_status(self.id, severity, status, timeout, history)
def delete_note(self, note_id): history = History(id=note_id, event=self.event, severity=self.severity, status=self.status, value=self.value, text='note dismissed', change_type=ChangeType.dismiss, update_time=datetime.utcnow(), user=g.login) db.add_history(self.id, history) return Note.delete_by_id(note_id)
def add_note(self, text: str) -> Note: note = Note.from_alert(self, text) history = History(id=note.id, event=self.event, severity=self.severity, status=self.status, value=self.value, text=text, change_type=ChangeType.note, update_time=datetime.utcnow(), user=g.login) db.add_history(self.id, history) return note
def create(self): if self.status == status_code.UNKNOWN: status = status_code.status_from_severity( current_app.config['DEFAULT_PREVIOUS_SEVERITY'], self.severity) else: status = self.status trend_indication = severity.trend( current_app.config['DEFAULT_PREVIOUS_SEVERITY'], self.severity) self.status = status self.duplicate_count = 0 self.repeat = False self.previous_severity = current_app.config[ 'DEFAULT_PREVIOUS_SEVERITY'] self.trend_indication = trend_indication self.receive_time = datetime.utcnow() self.last_receive_id = self.id self.last_receive_time = self.receive_time self.history = [ History(id=self.id, event=self.event, severity=self.severity, value=self.value, text=self.text, change_type='severity', update_time=self.create_time) ] if status != self.status: self.history.append( History(id=self.id, event=self.event, status=status, text="new alert status change", change_type='status', update_time=self.last_receive_time)) return Alert.from_db(db.create_alert(self))
def from_action(self, action: str, text: str = '', timeout: int = None) -> 'Alert': self.timeout = timeout or current_app.config['ALERT_TIMEOUT'] previous_status = db.get_status(self) new_severity, new_status = alarm_model.transition( previous_severity=self.previous_severity, current_severity=self.severity, previous_status=previous_status, current_status=self.status, action=action) history = [] if new_severity != self.previous_severity: history.append( History(id=self.id, event=self.event, severity=new_severity, text=text, change_type='action', update_time=datetime.utcnow())) if new_status != previous_status: history_text = 'alert status change from action' history.append( History(id=self.id, event=self.event, status=new_status, text=history_text, change_type='action', update_time=datetime.utcnow())) status_change_hook.send(self, status=new_status, text=history_text) return Alert.from_db( db.set_alert(self.id, new_severity, new_status, self.tags, self.attributes, timeout, history))
def set_status(self, status: str, text: str = '', timeout: int = None) -> 'Alert': now = datetime.utcnow() timeout = timeout or current_app.config['ALERT_TIMEOUT'] history = History( id=self.id, event=self.event, severity=self.severity, status=status, value=self.value, text=text, change_type='status', update_time=now, user=g.login ) return db.set_status(self.id, status, timeout, update_time=now, history=history)
def update(self, correlate_with) -> 'Alert': now = datetime.utcnow() self.previous_severity = db.get_severity(self) self.trend_indication = alarm_model.trend(self.previous_severity, self.severity) status, _, previous_status, _ = self._get_hist_info() _, new_status = alarm_model.transition(alert=self, current_status=status, previous_status=previous_status) self.duplicate_count = 0 self.repeat = False self.receive_time = now self.last_receive_id = self.id self.last_receive_time = now if new_status != status: r = status_change_hook.send(correlate_with, status=new_status, text=self.text) _, (_, new_status, text) = r[0] self.update_time = now else: text = self.text history = [ History(id=self.id, event=self.event, severity=self.severity, status=new_status, value=self.value, text=text, change_type=ChangeType.severity, update_time=self.create_time, user=g.login, timeout=self.timeout) ] self.status = new_status return Alert.from_db(db.correlate_alert(self, history))