From c2dc885354e5d3ad4d7247018a088f5fab9ba036 Mon Sep 17 00:00:00 2001 From: elong Date: Tue, 13 Sep 2016 10:18:54 -0400 Subject: [PATCH] 0002793: Add count and is_resolved to monitor events --- .../symmetric/model/MonitorEvent.java | 67 +++++++++++++++ .../symmetric/service/IMonitorService.java | 2 +- .../service/impl/MonitorService.java | 85 +++++++++++++++---- .../service/impl/MonitorServiceSqlMap.java | 21 +++-- .../src/main/resources/symmetric-schema.xml | 3 + 5 files changed, 155 insertions(+), 23 deletions(-) diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/model/MonitorEvent.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/model/MonitorEvent.java index bb7b835503..7b90b2ec3a 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/model/MonitorEvent.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/model/MonitorEvent.java @@ -37,10 +37,53 @@ public class MonitorEvent { protected long threshold; protected long value; + + protected int count; protected int severityLevel; + protected boolean isResolved; + protected boolean isNotified; + + protected Date lastUpdateTime; + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((eventTime == null) ? 0 : eventTime.hashCode()); + result = prime * result + ((monitorId == null) ? 0 : monitorId.hashCode()); + result = prime * result + ((nodeId == null) ? 0 : nodeId.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + MonitorEvent other = (MonitorEvent) obj; + if (eventTime == null) { + if (other.eventTime != null) + return false; + } else if (!eventTime.equals(other.eventTime)) + return false; + if (monitorId == null) { + if (other.monitorId != null) + return false; + } else if (!monitorId.equals(other.monitorId)) + return false; + if (nodeId == null) { + if (other.nodeId != null) + return false; + } else if (!nodeId.equals(other.nodeId)) + return false; + return true; + } public String getMonitorId() { return monitorId; @@ -114,4 +157,28 @@ public void setNotified(boolean isNotified) { this.isNotified = isNotified; } + public int getCount() { + return count; + } + + public void setCount(int count) { + this.count = count; + } + + public boolean isResolved() { + return isResolved; + } + + public void setResolved(boolean isResolved) { + this.isResolved = isResolved; + } + + public Date getLastUpdateTime() { + return lastUpdateTime; + } + + public void setLastUpdateTime(Date lastUpdateTime) { + this.lastUpdateTime = lastUpdateTime; + } + } diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/IMonitorService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/IMonitorService.java index 4b0507ee3a..00451bc4d8 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/IMonitorService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/IMonitorService.java @@ -40,7 +40,7 @@ public interface IMonitorService { public List getMonitorEvents(); - public List getMonitorEventsFiltered(int limit, String type, int severityLevel, String nodeId); + public List getMonitorEventsFiltered(int limit, String type, int severityLevel, String nodeId, boolean isResolved); public void saveMonitorEvent(MonitorEvent notificationEvent); diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/MonitorService.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/MonitorService.java index 725d35becc..576cc5e564 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/MonitorService.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/MonitorService.java @@ -107,6 +107,7 @@ public synchronized void update() { Map monitorTypes = extensionService.getExtensionPointMap(IMonitorType.class); Node identity = nodeService.findIdentity(); List activeMonitors = getActiveMonitorsForNode(identity.getNodeGroupId(), identity.getExternalId()); + Map unresolved = getMonitorEventsNotResolvedForNode(identity.getNodeId()); for (Monitor monitor : activeMonitors) { IMonitorType monitorType = monitorTypes.get(monitor.getType()); @@ -116,7 +117,7 @@ public synchronized void update() { long lastCheckTime = lastCheckTimeLong != null ? lastCheckTimeLong : 0; if (lastCheckTime == 0 || (System.currentTimeMillis() - lastCheckTime) / 1000 >= monitor.getRunPeriod()) { checkTimesByType.put(monitor.getMonitorId(), System.currentTimeMillis()); - updateMonitor(monitor, monitorType, identity); + updateMonitor(monitor, monitorType, identity, unresolved); } } } else { @@ -133,7 +134,7 @@ public synchronized void update() { IMonitorType monitorType = monitorTypes.get(monitor.getType()); if (monitorType != null && monitorType.requiresClusterLock() && (System.currentTimeMillis() - clusterLastCheckTime) / 1000 >= monitor.getRunPeriod()) { - updateMonitor(monitor, monitorType, identity); + updateMonitor(monitor, monitorType, identity, unresolved); } } @@ -172,7 +173,7 @@ public synchronized void update() { } } - protected void updateMonitor(Monitor monitor, IMonitorType monitorType, Node identity) { + protected void updateMonitor(Monitor monitor, IMonitorType monitorType, Node identity, Map unresolved) { long value = monitorType.check(monitor); boolean readyToCompare = true; @@ -198,17 +199,36 @@ protected void updateMonitor(Monitor monitor, IMonitorType monitorType, Node ide } } - if (readyToCompare && value >= monitor.getThreshold()) { - MonitorEvent event = new MonitorEvent(); - event.setMonitorId(monitor.getMonitorId()); - event.setNodeId(identity.getNodeId()); - event.setEventTime(new Date((System.currentTimeMillis() / 1000) * 1000)); - event.setHostName(hostName); - event.setType(monitor.getType()); - event.setValue(value); - event.setThreshold(monitor.getThreshold()); - event.setSeverityLevel(monitor.getSeverityLevel()); - saveMonitorEvent(event); + if (readyToCompare) { + MonitorEvent event = unresolved.get(monitor.getMonitorId()); + Date now = new Date((System.currentTimeMillis() / 1000) * 1000); + if (event != null && value < monitor.getThreshold()) { + updateMonitorEventAsResolved(event); + } else if (value >= monitor.getThreshold()) { + if (event == null) { + event = new MonitorEvent(); + event.setMonitorId(monitor.getMonitorId()); + event.setNodeId(identity.getNodeId()); + event.setEventTime(now); + event.setHostName(hostName); + event.setType(monitor.getType()); + event.setValue(value); + event.setCount(1); + event.setThreshold(monitor.getThreshold()); + event.setSeverityLevel(monitor.getSeverityLevel()); + event.setLastUpdateTime(now); + insertMonitorEvent(event); + } else { + event.setHostName(hostName); + event.setType(monitor.getType()); + event.setValue(value); + event.setCount(event.getCount() + 1); + event.setThreshold(monitor.getThreshold()); + event.setSeverityLevel(monitor.getSeverityLevel()); + event.setLastUpdateTime(now); + saveMonitorEvent(event); + } + } } } @@ -251,11 +271,22 @@ public List getMonitorEvents() { return sqlTemplate.query(getSql("selectMonitorEventSql"), new MonitorEventRowMapper()); } + protected Map getMonitorEventsNotResolvedForNode(String nodeId) { + List list = sqlTemplate.query(getSql("selectMonitorEventSql", "whereMonitorEventNotResolvedSql"), + new MonitorEventRowMapper(), nodeId); + Map map = new HashMap(); + for (MonitorEvent monitorEvent : list) { + map.put(monitorEvent.getMonitorId(), monitorEvent); + } + return map; + } + @Override - public List getMonitorEventsFiltered(int limit, String type, int severityLevel, String nodeId) { + public List getMonitorEventsFiltered(int limit, String type, int severityLevel, String nodeId, boolean isResolved) { String sql = getSql("selectMonitorEventSql", "whereMonitorEventFilteredSql"); ArrayList args = new ArrayList(); args.add(severityLevel); + args.add(isResolved ? 1 : 0); if (type != null) { sql += " and type = ?"; args.add(type); @@ -275,9 +306,22 @@ protected List getMonitorEventsForNotification(int severityLevel) @Override public void saveMonitorEvent(MonitorEvent event) { + if (!updateMonitorEvent(event)) { + insertMonitorEvent(event); + } + } + + protected void insertMonitorEvent(MonitorEvent event) { sqlTemplate.update(getSql("insertMonitorEventSql"), event.getMonitorId(), event.getNodeId(), - event.getEventTime(), event.getHostName(), event.getType(), event.getValue(), event.getThreshold(), - event.getSeverityLevel(), event.isNotified() ? 1 : 0); + event.getEventTime(), event.getHostName(), event.getType(), event.getValue(), event.getCount(), event.getThreshold(), + event.getSeverityLevel(), event.isResolved() ? 1 : 0, event.isNotified() ? 1 : 0, event.getLastUpdateTime()); + } + + protected boolean updateMonitorEvent(MonitorEvent event) { + int count = sqlTemplate.update(getSql("updateMonitorEventSql"), event.getHostName(), event.getType(), event.getValue(), + event.getCount(), event.getThreshold(), event.getSeverityLevel(), event.getLastUpdateTime(), + event.getMonitorId(), event.getNodeId(), event.getEventTime()); + return count != 0; } @Override @@ -295,6 +339,10 @@ protected void updateMonitorEventAsNotified(MonitorEvent event) { sqlTemplate.update(getSql("updateMonitorEventNotifiedSql"), event.getMonitorId(), event.getNodeId(), event.getEventTime()); } + protected void updateMonitorEventAsResolved(MonitorEvent event) { + sqlTemplate.update(getSql("updateMonitorEventResolvedSql"), event.getMonitorId(), event.getNodeId(), event.getEventTime()); + } + @Override public List getNotifications() { return sqlTemplate.query(getSql("selectNotificationSql"), new NotificationRowMapper()); @@ -371,8 +419,11 @@ public MonitorEvent mapRow(Row row) { m.setType(row.getString("type")); m.setThreshold(row.getLong("threshold")); m.setValue(row.getLong("event_value")); + m.setCount(row.getInt("event_count")); m.setSeverityLevel(row.getInt("severity_level")); + m.setResolved(row.getBoolean("is_resolved")); m.setNotified(row.getBoolean("is_notified")); + m.setLastUpdateTime(row.getDateTime("last_update_time")); return m; } } diff --git a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/MonitorServiceSqlMap.java b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/MonitorServiceSqlMap.java index d4441049ec..4a5564b151 100644 --- a/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/MonitorServiceSqlMap.java +++ b/symmetric-core/src/main/java/org/jumpmind/symmetric/service/impl/MonitorServiceSqlMap.java @@ -54,19 +54,30 @@ public MonitorServiceSqlMap(IDatabasePlatform platform, Map repl // Monitor Events putSql("selectMonitorEventSql", - "select monitor_id, node_id, event_time, type, event_value, threshold, severity_level, host_name, is_notified " + + "select monitor_id, node_id, event_time, type, event_value, event_count, threshold, severity_level, host_name, " + + "is_resolved, is_notified, last_update_time " + "from $(monitor_event) "); - putSql("whereMonitorEventFilteredSql", "where severity_level >= ?"); + putSql("whereMonitorEventNotResolvedSql", "where node_id = ? and is_resolved = 0"); + + putSql("whereMonitorEventFilteredSql", "where severity_level >= ? and is_resolved = ?"); putSql("whereMonitorEventForNotificationBySeveritySql", "where is_notified = 0 and severity_level >= ?"); putSql("insertMonitorEventSql", "insert into $(monitor_event) " + - "(monitor_id, node_id, event_time, host_name, type, event_value, threshold, severity_level, is_notified) " + - "values (?, ?, ?, ?, ?, ?, ?, ?, ?)"); - + "(monitor_id, node_id, event_time, host_name, type, event_value, event_count, threshold, severity_level, " + + "is_resolved, is_notified, last_update_time) " + + "values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); + + putSql("updateMonitorEventSql", + "update $(monitor_event) set host_name = ?, type = ?, event_value = ?, event_count = ?, threshold = ?, severity_level = ?, " + + "is_resolved = 0, last_update_time = ? where monitor_id = ? and node_id = ? and event_time = ?"); + + putSql("updateMonitorEventResolvedSql", + "update $(monitor_event) set is_resolved = 1, last_update_time = ? where monitor_id = ? and node_id = ? and event_time = ?"); + putSql("updateMonitorEventNotifiedSql", "update $(monitor_event) set is_notified = 1 where monitor_id = ? and node_id = ? and event_time = ?"); diff --git a/symmetric-core/src/main/resources/symmetric-schema.xml b/symmetric-core/src/main/resources/symmetric-schema.xml index f2ad727b7a..1f3fe8b30c 100644 --- a/symmetric-core/src/main/resources/symmetric-schema.xml +++ b/symmetric-core/src/main/resources/symmetric-schema.xml @@ -546,8 +546,11 @@ + + +