diff options
Diffstat (limited to 'ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/listener/HealthMonitor.java')
-rw-r--r-- | ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/listener/HealthMonitor.java | 166 |
1 files changed, 133 insertions, 33 deletions
diff --git a/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/listener/HealthMonitor.java b/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/listener/HealthMonitor.java index 6c5810a8..6f934e98 100644 --- a/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/listener/HealthMonitor.java +++ b/ecomp-portal-BE-common/src/main/java/org/onap/portalapp/portal/listener/HealthMonitor.java @@ -37,18 +37,29 @@ */ package org.onap.portalapp.portal.listener; +import java.io.IOException; +import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.UUID; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; +import org.apache.commons.lang3.StringUtils; +import org.apache.zookeeper.ZooKeeper; +import org.apache.zookeeper.client.FourLetterWordMain; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; +import org.onap.music.datastore.PreparedQueryObject; +import org.onap.music.exceptions.MusicServiceException; +import org.onap.music.main.MusicCore; +import org.onap.music.main.MusicUtil; +import org.onap.portalapp.music.util.MusicProperties; import org.onap.portalapp.portal.logging.aop.EPMetricsLog; import org.onap.portalapp.portal.logging.format.EPAppMessagesEnum; import org.onap.portalapp.portal.logging.logic.EPLogUtil; -import org.onap.portalapp.portal.ueb.EPUebHelper; import org.onap.portalapp.portal.utils.EPCommonSystemProperties; import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate; import org.onap.portalsdk.core.util.SystemProperties; @@ -56,19 +67,23 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.EnableAspectJAutoProxy; import org.springframework.transaction.annotation.Transactional; + + + @Transactional @org.springframework.context.annotation.Configuration @EnableAspectJAutoProxy @EPMetricsLog public class HealthMonitor { - private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(HealthMonitor.class); + + ZooKeeper zookeeper = null; + + private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(HealthMonitor.class); @Autowired private SessionFactory sessionFactory; - @Autowired - private EPUebHelper epUebHelper; private static boolean databaseUp; private static boolean uebUp; @@ -76,7 +91,9 @@ public class HealthMonitor { private static boolean backEndUp; private static boolean dbClusterStatusOk; private static boolean dbPermissionsOk; - + private static boolean zookeeperStatusOk; + private static boolean cassandraStatusOk; + /** * Read directly by external classes. */ @@ -110,13 +127,22 @@ public class HealthMonitor { public static boolean isBackEndUp() { return backEndUp; } + + public static boolean isZookeeperStatusOk() { + return zookeeperStatusOk; + } + + public static boolean isCassandraStatusOk() { + return cassandraStatusOk; + } private void monitorEPHealth() throws InterruptedException { int numIntervalsDatabaseHasBeenDown = 0; int numIntervalsClusterNotHealthy = 0; int numIntervalsDatabasePermissionsIncorrect = 0; - int numIntervalsUebHasBeenDown = 0; + int numIntervalsZookeeperNotHealthy = 0; + int numIntervalsCassandraNotHealthy = 0; logger.debug(EELFLoggerDelegate.debugLogger, "monitorEPHealth thread started"); @@ -168,26 +194,47 @@ public class HealthMonitor { numIntervalsDatabasePermissionsIncorrect = 0; } } + + zookeeperStatusOk = this.checkZookeeperStatus(); + if (zookeeperStatusOk == false) { + if ((numIntervalsZookeeperNotHealthy % numIntervalsBetweenAlerts) == 0) { + logger.debug(EELFLoggerDelegate.debugLogger, + "monitorEPHealth: cluster nodes down, logging to error log to trigger alert."); + EPLogUtil.logEcompError(logger, EPAppMessagesEnum.MusicHealthCheckZookeeperError); + numIntervalsZookeeperNotHealthy++; + } else { + numIntervalsZookeeperNotHealthy = 0; + } + } + cassandraStatusOk = this.checkCassandraStatus(); + if (cassandraStatusOk == false) { + if ((numIntervalsCassandraNotHealthy % numIntervalsBetweenAlerts) == 0) { + logger.debug(EELFLoggerDelegate.debugLogger, + "monitorEPHealth: cluster nodes down, logging to error log to trigger alert."); + EPLogUtil.logEcompError(logger, EPAppMessagesEnum.MusicHealthCheckCassandraError); + numIntervalsCassandraNotHealthy++; + } else { + numIntervalsCassandraNotHealthy = 0; + } + } + // // Get UEB status. Publish a bogus message to EP inbox, if 200 OK // returned, status is Up. // If down, signal alert once every X intervals. // EP will ignore this bogus message. - // - uebUp = this.checkIfUebUp(); - if (uebUp == false) { - - if ((numIntervalsUebHasBeenDown % numIntervalsBetweenAlerts) == 0) { - logger.debug(EELFLoggerDelegate.debugLogger, - "monitorEPHealth: UEB down, logging to error log to trigger alert"); - // Write a Log entry that will generate an alert - EPLogUtil.logEcompError(logger, EPAppMessagesEnum.BeHealthCheckUebClusterError); - numIntervalsUebHasBeenDown++; - } else { - numIntervalsUebHasBeenDown = 0; - } - } + // Commenting this out as Dependency on UEB is being deprecated + /* + * uebUp = this.checkIfUebUp(); if (uebUp == false) { + * + * if ((numIntervalsUebHasBeenDown % numIntervalsBetweenAlerts) == 0) { + * logger.debug(EELFLoggerDelegate.debugLogger, + * "monitorEPHealth: UEB down, logging to error log to trigger alert"); // Write + * a Log entry that will generate an alert EPLogUtil.logEcompError(logger, + * EPAppMessagesEnum.BeHealthCheckUebClusterError); + * numIntervalsUebHasBeenDown++; } else { numIntervalsUebHasBeenDown = 0; } } + */ // The front end should be up because the API is called through // proxy front end server. @@ -309,6 +356,71 @@ public class HealthMonitor { return isUp; } + private boolean checkZookeeperStatus() { + + String[] zookeeperNodes = MusicUtil.getMyZkHost().split(","); + logger.info(EELFLoggerDelegate.applicationLogger, "MusicUtil.getMyZkHost()---- :" + MusicUtil.getMyZkHost()); + for (int i = 0; i < zookeeperNodes.length; i++) { + try { + logger.info(EELFLoggerDelegate.applicationLogger, "server ip--zookeeper :" + zookeeperNodes[i].trim()); + String[] iport = zookeeperNodes[i].split(":"); + String zkNodeStatistics = FourLetterWordMain.send4LetterWord(iport[0].trim(), + Integer.parseInt(iport[1].trim()), "stat"); + logger.info(EELFLoggerDelegate.applicationLogger, + "Getting Status for Zookeeper zkNodeStatistics :" + zkNodeStatistics); + if (StringUtils.isNotBlank(zkNodeStatistics)) { + String state = zkNodeStatistics.substring(zkNodeStatistics.indexOf("Mode:"), + zkNodeStatistics.indexOf("Node")); + logger.info(EELFLoggerDelegate.applicationLogger, + "Getting Status for zookeeper :" + zookeeperNodes[i].trim() + ":------:" + state); + if (state.contains("leader")) + return true; + } + } catch (Exception e) { + logger.error(EELFLoggerDelegate.errorLogger, "ZookeeperStatus Service is not responding", e.getCause()); + } + } + + return false; + } + + + public boolean checkCassandraStatus() { + logger.info(EELFLoggerDelegate.applicationLogger, "Getting Status for Cassandra"); + if (this.getAdminKeySpace()) { + return true; + } else { + logger.error(EELFLoggerDelegate.errorLogger, "Cassandra Service is not responding"); + return false; + } + } + + private Boolean getAdminKeySpace() { + String musicKeySpace = MusicProperties.getProperty(MusicProperties.MUSIC_SESSION_KEYSPACE ); + //deletePortalHealthcheck(musicKeySpace); + PreparedQueryObject pQuery = new PreparedQueryObject(); + pQuery.appendQueryString("insert into "+musicKeySpace+".healthcheck (id) values (?)"); + pQuery.addValue(UUID.randomUUID()); + try { + MusicCore.nonKeyRelatedPut(pQuery, MusicUtil.EVENTUAL); + } catch (MusicServiceException e) { + logger.error(EELFLoggerDelegate.errorLogger, "getAdminKeySpace() failed", e.getCause()); + return Boolean.FALSE; + } + return Boolean.TRUE; + } + + + private void deletePortalHealthcheck(String musicKeySpace) { + PreparedQueryObject pQuery = new PreparedQueryObject(); + pQuery.appendQueryString("TRUNCATE "+musicKeySpace+".healthcheck"); + try { + MusicCore.nonKeyRelatedPut(pQuery, MusicUtil.EVENTUAL); + } catch (MusicServiceException e) { + logger.error(EELFLoggerDelegate.errorLogger, "deletePortalHealthcheck() failed", e.getCause()); + } + } + private boolean checkDatabasePermissions() { boolean isUp = false; Session localSession = null; @@ -348,17 +460,5 @@ public class HealthMonitor { } return isUp; } - - private boolean checkIfUebUp() { - boolean uebUp = false; - try { - boolean isAvailable = epUebHelper.checkAvailability(); - boolean messageCanBeSent = epUebHelper.MessageCanBeSentToTopic(); - uebUp = (isAvailable && messageCanBeSent); - } catch (Exception e) { - logger.error(EELFLoggerDelegate.errorLogger, "checkIfUebUp failed", e); - } - return uebUp; - } - + } |