package com.hangum.tadpole.monitoring.core.jobs.monitoring;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import com.hangum.tadpole.commons.libs.core.define.PublicTadpoleDefine;
import com.hangum.tadpole.engine.query.dao.system.UserDBDAO;
import com.hangum.tadpole.engine.query.dao.system.monitoring.MonitoringIndexDAO;
import com.hangum.tadpole.engine.query.dao.system.monitoring.MonitoringResultDAO;
import com.hangum.tadpole.engine.query.sql.TadpoleSystem_UserDBQuery;
import com.hangum.tadpole.engine.query.sql.TadpoleSystem_monitoring;
import com.hangum.tadpole.monitoring.core.manager.cache.MonitoringCacheRepository;
import com.hangum.tadpole.monitoring.core.manager.event.EventManager;
import com.hangum.tadpole.monitoring.core.utils.MonitoringDefine;
import com.hangum.tadpole.monitoring.core.utils.Utils;
/**
* Tadpole monitoring job
*
* @author hangum
*
*/
public class MonitoringJob implements Job {
private static final Logger logger = Logger.getLogger(MonitoringJob.class);
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
List<MonitoringResultDAO> listMonitoringResult = new ArrayList<MonitoringResultDAO>();
try {
String strRelationUUID = UUID.randomUUID().toString();
for (MonitoringIndexDAO monitoringIndexDAO : TadpoleSystem_monitoring.getAllMonitoringList()) {
if(logger.isDebugEnabled()) logger.debug("==[title]===> " + monitoringIndexDAO.getTitle());
UserDBDAO userDB = TadpoleSystem_UserDBQuery.getUserDBInstance(monitoringIndexDAO.getDb_seq());
MonitoringResultDAO resultDao = null;
try {
JsonArray jsonArray = Utils.selectToJson(userDB, monitoringIndexDAO);
for(int i=0; i<jsonArray.size(); i++) {
resultDao = new MonitoringResultDAO();
resultDao.setUnique_id(UUID.randomUUID().toString());
resultDao.setUserDB(userDB);
resultDao.setMonitoring_seq(monitoringIndexDAO.getMonitoring_seq());
resultDao.setMonitoring_index_seq(monitoringIndexDAO.getSeq());
resultDao.setMonitoring_type(monitoringIndexDAO.getMonitoring_type());
resultDao.setKpi_type(monitoringIndexDAO.getKpi_type());
JsonObject jsonObj = jsonArray.get(i).getAsJsonObject();
JsonPrimitive jsonValue = jsonObj.getAsJsonPrimitive(monitoringIndexDAO.getIndex_nm().toLowerCase());
String strIndexValue = jsonValue != null?jsonValue.getAsString():"";
resultDao.setIndex_value(strIndexValue);
//결과를 저장한다.
boolean isError = MonitorErrorChecker.isError(jsonObj, monitoringIndexDAO);
resultDao.setResult(isError?MonitoringDefine.MONITORING_STATUS.WARRING.getName():MonitoringDefine.MONITORING_STATUS.CLEAN.getName());
resultDao.setSystem_description(String.format("%s %s %s", monitoringIndexDAO.getCondition_value(), monitoringIndexDAO.getCondition_type(), strIndexValue));
resultDao.setUser_seq(userDB.getUser_seq());
resultDao.setDb_seq(userDB.getSeq());
if(PublicTadpoleDefine.YES_NO.YES.name().equals(monitoringIndexDAO.getIs_result_save())) {
resultDao.setQuery_result(jsonObj.toString());
}
resultDao.setMonitoringIndexDAO(monitoringIndexDAO);
resultDao.setCreate_time(new Timestamp(System.currentTimeMillis()));
if(isError && PublicTadpoleDefine.YES_NO.YES.name().equals(monitoringIndexDAO.getIs_snapshot_save())) {
resultDao.setSnapshot(Utils.getDBVariable(userDB));
}
// 후속작업을 위해 사용자 별로 모니터링 데이터를 모읍니다.
listMonitoringResult.add(resultDao);
} // end for
// update index parameter.
updateParameterValue(monitoringIndexDAO, jsonArray);
} catch (Exception e) {
logger.error("monitoring Job exception " + monitoringIndexDAO.getTitle(), e);
// 오류를 모니터링 항목에 넣습니다.
resultDao = new MonitoringResultDAO();
resultDao.setUnique_id(UUID.randomUUID().toString());
resultDao.setUserDB(userDB);
resultDao.setMonitoring_seq(monitoringIndexDAO.getMonitoring_seq());
resultDao.setMonitoring_index_seq(monitoringIndexDAO.getSeq());
resultDao.setMonitoring_type(monitoringIndexDAO.getMonitoring_type());
resultDao.setKpi_type(monitoringIndexDAO.getKpi_type());
resultDao.setIndex_value("0");
//결과를 저장한다.
resultDao.setResult(MonitoringDefine.MONITORING_STATUS.CRITICAL.toString());
resultDao.setSystem_description(e.getMessage());
resultDao.setUser_seq(userDB.getUser_seq());
resultDao.setDb_seq(userDB.getSeq());
resultDao.setQuery_result("");
resultDao.setMonitoringIndexDAO(monitoringIndexDAO);
resultDao.setCreate_time(new Timestamp(System.currentTimeMillis()));
if(PublicTadpoleDefine.YES_NO.YES.name().equals(monitoringIndexDAO.getIs_snapshot_save())) {
resultDao.setSnapshot(Utils.getDBVariable(userDB));
}
// 후속작업을 위해 사용자 별로 모니터링 데이터를 모읍니다.
listMonitoringResult.add(resultDao);
}
}
} catch(Exception e) {
logger.error("get monitoring list", e);
}
afterProceedingResultData(listMonitoringResult);
}
/**
* update index parameter
*
* @param monitoringIndexDAO
* @param jsonArray
*/
private void updateParameterValue(MonitoringIndexDAO monitoringIndexDAO, JsonArray jsonArray) {
if(StringUtils.isNotEmpty(monitoringIndexDAO.getParam_1_column())) {
if(jsonArray.size() != 0) {
JsonObject jsonObj = (JsonObject)jsonArray.get(jsonArray.size()-1);
JsonElement jsonValue = jsonObj.get(monitoringIndexDAO.getParam_1_column().toLowerCase());
String strIndexValue = jsonValue != null?jsonValue.getAsString():"";
JsonElement jsonValue2 = jsonObj.get(monitoringIndexDAO.getParam_2_column());
String strIndexValue2 = jsonValue2 != null?jsonValue2.getAsString():"";
monitoringIndexDAO.setParam_1_init_value(strIndexValue);
monitoringIndexDAO.setParam_2_init_value(strIndexValue2);
try {
TadpoleSystem_monitoring.updateParameter(monitoringIndexDAO);
} catch (Exception e) {
logger.error("Update index parameter", e);
}
}
}
}
/**
* after proceeding monitoring result data
* - save data
* - user notification
* - cache monitoring data
*
* @param listMonitoringData
*/
private void afterProceedingResultData(List<MonitoringResultDAO> listMonitoringData) {
// 데이터를 저장한다.
TadpoleSystem_monitoring.saveMonitoringResult(listMonitoringData);
/////////////////////////////////////////////////////////////////////////////////////////////
// 후속 작업을 위해 사용자 별로 모니터링 데이터를 담습니다.
Map<String, List<MonitoringResultDAO>> mapMonitoringData = new HashMap<>();
List<MonitoringResultDAO> listErrorMonitoringResult = new ArrayList<MonitoringResultDAO>();
{
List<MonitoringResultDAO> listMonitoringResult;
String strEmail = "";
for (MonitoringResultDAO resultDao : listMonitoringData) {
if(!MonitoringDefine.MONITORING_STATUS.CLEAN.getName().equals( resultDao.getResult() )) {
listErrorMonitoringResult.add(resultDao);
}
strEmail = resultDao.getMonitoringIndexDAO().getEmail();
if(mapMonitoringData.get(strEmail) == null) {
listMonitoringResult = new ArrayList<MonitoringResultDAO>();
listMonitoringResult.add(resultDao);
mapMonitoringData.put(strEmail, listMonitoringResult);
} else {
mapMonitoringData.get(strEmail).add(resultDao);
}
}
}
// 사용자별로 담아 cache 메니저에 데이터를 전달한다.
sendCacheManager(mapMonitoringData);
// 이벤트 처리를 처리 모듈에 보낸다.
sendEventManager(listErrorMonitoringResult);
}
/**
* send cache Manager
*
* @param mapMonitoringData
*/
private void sendCacheManager(Map<String, List<MonitoringResultDAO>> mapMonitoringData) {
Set<String> emailSet = mapMonitoringData.keySet();
for (String strEmail : emailSet) {
MonitoringCacheRepository cacheInstance = MonitoringCacheRepository.getInstance();
cacheInstance.put(strEmail, mapMonitoringData.get(strEmail));
}
}
/**
* send event manager
*
* @param listErrorMonitoringResult
*/
private void sendEventManager(List<MonitoringResultDAO> listErrorMonitoringResult) {
if(!listErrorMonitoringResult.isEmpty()) {
EventManager.getInstance().proceedEvent(listErrorMonitoringResult);
}
}
}