def evaluate_trigger(self, trigger): """Evaluate Trigger.""" item = trigger.item alert_klass = ALERT_CLASS.get(item.itemtype.name) i = trigger.validate_rule(trigger.rule) if i is None: return False handler = trigger.trigger_handlers.get(i[0], None) if handler: alert = self.db_session.query(alert_klass)\ .filter(alert_klass.trigger_id == trigger.id)\ .filter(alert_klass.end_time.is_(None)).first() (is_active, time) = handler(trigger, self.db_session, i[1], i[2], i[3]) if is_active: if not alert: trigger.active_alert = True alert = alert_klass(trigger_id=trigger.id, start_time=time, end_time=None) self.db_session.add(alert) else: if alert: trigger.active_alert = False alert.end_time = time else: print("Handler not found") return False
def get_active_alert_count(self, item): """Get number of active alerts.""" alert_klass = ALERT_CLASS.get(item.itemtype.name) triggers = self.get_triggers(item) n_alerts = 0 for trigger in triggers: n_alerts += self.db_session.query(alert_klass)\ .filter(alert_klass.trigger_id == trigger.id)\ .filter(alert_klass.end_time.is_(None))\ .count() return n_alerts
def get_alerts(self, item, active=True, inactive=False): """Query Alerts.""" alert_klass = ALERT_CLASS.get(item.itemtype.name) alerts = [] triggers = self.get_triggers(item) for trigger in triggers: active_alert = self.db_session.query(alert_klass)\ .filter(alert_klass.trigger_id == trigger.id)\ .filter(alert_klass.end_time.is_(None)) alerts.extend(active_alert) return alerts
def get_last_alert_for_trigger(self, trigger): """Return last alert for a trigger. This function is used for every trigger individually... It makes more sense if we could query it for all triggers at once. """ alert_klass = ALERT_CLASS.get(trigger.item.itemtype.name) alert = self.db_session.query(alert_klass)\ .filter(alert_klass.trigger_id == trigger.id)\ .order_by(alert_klass.start_time.desc())\ .first() return alert
def get_host_severity(self, host): """Return highest severity of active triggers for this host.""" float_trigger_klass = TRIGGER_CLASS.get('float') float_alert_klass = ALERT_CLASS.get('float') severity = self.db_session.query(TriggerSeverity)\ .filter(TriggerSeverity.id.in_( self.db_session.query(float_trigger_klass.severity_id)\ .filter(float_trigger_klass.item_id.in_( self.db_session.query(Item.id)\ .filter(Item.host_id == host.id) ))\ .filter(float_trigger_klass.id.in_( self.db_session.query(float_alert_klass.trigger_id)\ .filter(float_alert_klass.end_time.is_(None)) )) ))\ .order_by(TriggerSeverity.level.desc())\ .first() return severity
def get_host_severity(self, host): """Return highest severity of active triggers for this host. This should be optimized... running x queries for each individual host that needs it is very slow. - Want to use UNION, but I couldn't get it working with SQLAlchemy. """ existing_query = None max_severity_level = -1 max_severity = None for key in TRIGGER_CLASS: trigger_klass = TRIGGER_CLASS.get(key) alert_klass = ALERT_CLASS.get(key) severity = self.db_session.query(TriggerSeverity)\ .filter(TriggerSeverity.id.in_( self.db_session.query(trigger_klass.severity_id)\ .filter(trigger_klass.item_id.in_( self.db_session.query(Item.id) .filter(Item.host_id == host.id) ))\ .filter(trigger_klass.id.in_( self.db_session.query(alert_klass.trigger_id) .filter(alert_klass.end_time.is_(None)) )) ))\ .order_by(TriggerSeverity.level.desc())\ .first() if severity is not None: if severity.level > max_severity_level: max_severity_level = severity.level max_severity = severity return max_severity