in alerting/service/src/main/java/org/apache/karaf/decanter/alerting/service/event/Handler.java [76:128]
public void handleEvent(Event event) {
try {
String uuid = store.store(event);
for (Rule rule : rules) {
if (rule.getPeriod() != null) {
long timestamp = System.currentTimeMillis() - PeriodParser.parse(rule.getPeriod());
List<Alert> known = store.query("(" + rule.getCondition() + ") AND NOT alertUUID:" + uuid);
if (known.size() == 1) {
List<Alert> recover = store.query("alertUUID:" + uuid + " AND NOT (" + rule.getCondition() + ")");
if (recover.size() != 1 && (((Long) known.get(0).get("alertTimestamp")) < timestamp)) {
// not recover during the period
dispatcher.postEvent(prepareEvent(known.get(0), rule, false));
store.delete(rule.getCondition());
}
store.delete("alertUUID:" + uuid);
} else {
// flag
List<Alert> toFlag = store.query("alertUUID:" + uuid + " AND (" + rule.getCondition() + ")");
if (toFlag.size() == 1) {
store.flag("alertUUID:" + uuid, rule.getName());
}
}
} else {
if (!rule.isRecoverable()) {
List<Alert> alerts = store.query(rule.getCondition());
for (Alert alert : alerts) {
dispatcher.postEvent(prepareEvent(alert, rule, false));
store.delete("alertUUID:" + alert.get("alertUUID"));
}
} else {
List<Alert> known = store.query("(" + rule.getCondition() + ") AND NOT alertUUID:" + uuid);
if (known.size() == 1) {
List<Alert> recover = store.query("alertUUID:" + uuid + " AND NOT (" + rule.getCondition() + ")");
if (recover.size() == 1) {
dispatcher.postEvent(prepareEvent(recover.get(0), rule, true));
store.delete(rule.getCondition());
}
store.delete("alertUUID:" + uuid);
} else {
List<Alert> toSend = store.query("alertUUID:" + uuid + " AND (" + rule.getCondition() + ")");
if (toSend.size() == 1) {
store.flag("alertUUID:" + uuid, rule.getName());
dispatcher.postEvent(prepareEvent(toSend.get(0), rule, false));
}
}
}
}
}
store.eviction();
} catch (Exception e) {
LOGGER.error("Can't process alerting for event", e);
}
}