KPI2Event.java 10.1 KB
package com.sitech.ismp.app.event;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.apache.log4j.Logger;

import bsh.Interpreter;

import com.sitech.base.AgentProperties;
import com.sitech.base.Config;
import com.sitech.database.dao.TbCfgEventDao;
import com.sitech.database.domain.TbCfgEvent;
import com.sitech.ismp.coll.basic.TblATO_EVENT;
import com.sitech.ismp.messageObject.AlarmEvent;
import com.sitech.ismp.messageObject.EventProcessLog;
import com.sitech.ismp.messageObject.PerformanceObject;
import com.sitech.util.Formater;
import com.sitech.util.RandomGUID;
import com.sitech.util.mq.TunnelFactory;


public class KPI2Event {
	private static Logger logger = Logger.getLogger("EVENT");

	private static Logger dq = Logger.getLogger("DQ");
	
	private static HashMap<String, TblATO_EVENT> mpEventCancel = new HashMap<String, TblATO_EVENT>();
	
	public static int EVENT_CANCEL_CLASS = 6; // 告警消除的级别标号
	
	private static  TbCfgEventDao dao = new TbCfgEventDao();
	
	/**
	 * 处理重复的告警消除发送逻辑判断
	 * true需要发送消除,false不需要
	 */
	private boolean doEventCancel(TblATO_EVENT event) {
		String key = event.getKPI_ID() + "_" + event.getUNIT_ID();

		if (EVENT_CANCEL_CLASS != event.getEVENT_CLASS()) {
			mpEventCancel.remove(key);
			return true;
		}

		TblATO_EVENT lastCancel = mpEventCancel.get(key);
		if (lastCancel == null) {
			mpEventCancel.put(key, event);
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 未完成配置数据变化告警和增加监控实体告警
	 * 
	 * 使用给定的告警配置,进行告警生成,上报等
	 */
	public short generation(String unitId, String kpiId, Date cllTime, String kpiValue, List<TbCfgEvent> eventConfigList) {

		try {
			String eventId = RandomGUID.getRandomGUID();

			// 告警处理日志
			EventProcessLog processLog = createEventProcessLog(eventId, unitId, kpiId);		
			
			TbCfgEvent config = ExpressionHelper.getMostMatchExpression(unitId, kpiId, eventConfigList);
			
			// 没有匹配的告警配置
			if (config == null) {
				return 0;
			}
			Vector<String> expressionSet = new Vector<String>();
			expressionSet.add(config.getEXPRESSION1());
			expressionSet.add(config.getEXPRESSION2());
			expressionSet.add(config.getEXPRESSION3());
			expressionSet.add(config.getEXPRESSION4());
			expressionSet.add(config.getEXPRESSION5());
			// 告警清除表达式默认为true
			expressionSet.add("true");

			for (int i = 0; i < expressionSet.size(); i++) {
				String EXPRESSION = null;
				try {
					EXPRESSION = (String) expressionSet.get(i);
					if (EXPRESSION == null || EXPRESSION.trim().equals("")) {
						continue;
					}
					
					Interpreter interpreter = new Interpreter();
					interpreter.set("UNIT_ID", unitId);
					interpreter.set("KPI_ID", kpiId);
					interpreter.set("KPI_VALUE", kpiValue);
					interpreter.set("CLL_TIME", Formater.datetimeToString(cllTime));
					
					interpreter.set("M_UNIT_ID", unitId);
					interpreter.set("M_KPI_ID", kpiId);
					interpreter.set("M_KPI_VALUE", kpiValue);
					interpreter.set("M_CLL_TIME", Formater.datetimeToString(cllTime));
					
					interpreter.eval("result=" + EXPRESSION);
					Boolean bool = (Boolean) interpreter.get("result");

					if (bool.booleanValue()) { // 条件成立,生成新事件, 设置告警字段
						TblATO_EVENT tblato_event = new TblATO_EVENT();

						tblato_event.setEVENT_ID(eventId); // 随即生成一个GUID作为唯一键
						tblato_event.setUNIT_ID(unitId);
						tblato_event.setKPI_ID(kpiId);
						tblato_event.setKPI_VALUE(kpiValue);
						tblato_event.setEVENT_CLASS((short) getEventLevel(i));
						tblato_event.setCLL_TIME(cllTime);
						tblato_event.setGENERANT_TIME(new java.util.Date());
						tblato_event.setEVENT_TITLE(unitId + "的" + kpiId + "值为: "
								+ kpiValue);
						tblato_event.setCFG_GUID(config.getGUID());
						tblato_event.setCFG_EXPRESSION(EXPRESSION);
						
						if(doEventCancel(tblato_event)) {
							sendEvent2Workstation(tblato_event); // 新事件处理

							processLog.setOutTime(new Date().getTime());
							// 0:正常结束,处理结束 1:正常结束,转发  2:异常结束
							processLog.setStatus(1);
							
							writeEventProcessLog(processLog);
							logger.info("New Event, UNIT_ID=" + unitId + ", KPI_ID=" + kpiId
									+ ", KPI_VALUE=" + kpiValue + ", EXPRESSION="
									+ EXPRESSION + ", EVENT_CLASS=" + getEventLevel(i)
									+ ", CFG_GUID=" + config.getGUID() + " \t:"
									+ bool.booleanValue());
							
						} else {
							logger.info("Event has canceled before, UNIT_ID=" + unitId + ", KPI_ID=" + kpiId
								+ ", KPI_VALUE=" + kpiValue + ", EXPRESSION="
								+ EXPRESSION + ", EVENT_CLASS=" + getEventLevel(i)
								+ ", CFG_GUID=" + config.getGUID() + " \t:"
								+ bool.booleanValue());
						}

						break;
					} else{
						logger.info("-- UNIT_ID=" + unitId + ", KPI_ID=" + kpiId
								+ ", KPI_VALUE=" + kpiValue + ", EXPRESSION="
								+ EXPRESSION + ", EVENT_CLASS=" + getEventLevel(i)
								+ ", CFG_GUID=" + config.getGUID() + " \t:"
								+ bool.booleanValue());
					}// end if
					
					logger.info("-- UNIT_ID=" + unitId + ", KPI_ID=" + kpiId
							+ ", KPI_VALUE=" + kpiValue + ", EXPRESSION="
							+ EXPRESSION + ", EVENT_CLASS=" + getEventLevel(i)
							+ ", CFG_GUID=" + config.getGUID() + " \t:"
							+ bool.booleanValue());
				} catch (Exception e) {
					logger.error("-- Exception while parse to event, UNIT_ID="
							+ unitId + ", KPI_ID=" + kpiId + ", KPI_VALUE="
							+ kpiValue + ", EXPRESSION=" + EXPRESSION, e);
					continue;
				}
			} // end for
		} catch (Exception e) {
			logger.error("-- Exception while parse to event", e);
			return -1;
		}
		return 0;
	}

	private EventProcessLog createEventProcessLog(String eventId,
			String unitId, String kpiId) {
		EventProcessLog processLog = new EventProcessLog();		
		processLog.setSerailNo(eventId);
		processLog.setEventId(eventId);
		processLog.setInTime(new Date().getTime());
		processLog.setKpiId(kpiId);
		processLog.setUnitId(unitId);
		processLog.setModuleId(AgentProperties.AGENT_ID);
		// 11-50-100-10-01 Agent告警触发
		processLog.setNodeId("11-50-100-10-01");
		processLog.setNextNode("workstation_filter");
		return processLog;
	}
	
	private void writeEventProcessLog(EventProcessLog msg){
		if (AgentProperties.COLL_DQ_DATA) {
			dq.info(msg);
		}
	}

	/**
	 * 根据unit_id得到相关的告警配置,然后使用该告警配置,进行告警生成,上报等
	 * 
	 * @param UNIT_ID
	 * @param KPI_ID
	 * @param CLL_TIME
	 * @param KPI_VALUE
	 * @return
	 */
	public short generation(String unitId, String kpiId, Date cllTime, String kpiValue) {
		List<TbCfgEvent> eventConfigList = null;
		try {
			eventConfigList = this.getCfgEvents(kpiId);
		} catch (Exception e) {
			logger.error("Exception While Refresh Event Config Cache!", e);
			return -1;
		}
		
		return this.generation(unitId, kpiId, cllTime, kpiValue, eventConfigList);
	}
	

	public void generation(List<PerformanceObject> result) {
		// 根据KPI_ID进行分组
		Map<String, List<PerformanceObject>> map = new HashMap<String, List<PerformanceObject>>();
		for (PerformanceObject kpi : result) {
			List<PerformanceObject> tmp = map.get(kpi.getKpiId());
			if (tmp == null) {
				tmp = new ArrayList<PerformanceObject>();
				map.put(kpi.getKpiId(), tmp);
			}
			tmp.add(kpi);
		}
		
		for(String kpiId : map.keySet()){
			// 每个KPI_ID查询一次数据库
			List<TbCfgEvent> eventConfigList = this.getCfgEvents(kpiId);
			if (null == eventConfigList || eventConfigList.isEmpty()) {
				continue;
			}
			
			List<PerformanceObject> kpiList = map.get(kpiId);
			for(PerformanceObject obj : kpiList){
				generation(obj.getUnitId(), obj.getKpiId(), obj.getCllTime(), obj.getKpiValue(), eventConfigList);
			}
		}
	}

	private short getEventLevel(int i) { // 根据序号产生告警级别
		return (short) (i + 1);
	}

	public boolean sendEvent2Workstation(TblATO_EVENT tblato_event) throws Exception {
		AlarmEvent alarmEvent = getAlarmEventObj(tblato_event);
		TunnelFactory.getTunnel(Config.Q_WORSTATION).writeData(alarmEvent);
		return true;
	}
	
	/**
	 * getAlarmEventObj: 转换为JMS消息对象
	 * @param event
	 * @return 
	 * @throws 
	 * @since Ver 1.1
	 */
	private AlarmEvent getAlarmEventObj(TblATO_EVENT event) {
		AlarmEvent jmsObj = new AlarmEvent();
		jmsObj.setAgentId(AgentProperties.AGENT_ID);
		jmsObj.setEventId(event.EVENT_ID);
		jmsObj.setCfgExpression(event.CFG_EXPRESSION);
		jmsObj.setCfgGuid(event.CFG_GUID);
		jmsObj.setCllTime(event.CLL_TIME);
		jmsObj.setCllTimeStr(Formater.datetimeToString(event.CLL_TIME));
		jmsObj.setGenerantTime(event.getGENERANT_TIME());
		jmsObj.setEventClass(event.EVENT_CLASS);
		jmsObj.setEventTitle(event.EVENT_TITLE);
		jmsObj.setKpiId(event.KPI_ID);
		jmsObj.setKpiValue(event.KPI_VALUE);
		jmsObj.setUnitId(event.UNIT_ID);
		// 告警类型 1: 告警, 2:预警
		// agent生成的全部为告警
		jmsObj.setEventType(1);
		return jmsObj;
	}

	/**
	 * 获取缓存的告警配置,如果缓存过旧,那么更新缓存
	 * 
	 * @return
	 * @throws Exception
	 */
	private List<TbCfgEvent> getCfgEvents(String kpiId) {
		return dao.queryEventCfgByKpiId(kpiId);
	}
	
	public static void main(String[] args) throws ParseException {
		KPI2Event kpi2event = new KPI2Event();
		TblATO_EVENT event = new TblATO_EVENT();
		event.setUNIT_ID("abc");
		event.setKPI_ID("PM-01");
		event.setEVENT_CLASS(6);
		
		
		System.out.println(kpi2event.doEventCancel(event));
		System.out.println(kpi2event.doEventCancel(event));
		System.out.println(kpi2event.doEventCancel(event));
		

		event.setEVENT_CLASS(1);
		System.out.println(kpi2event.doEventCancel(event));
		
		event.setEVENT_CLASS(6);
		System.out.println(kpi2event.doEventCancel(event));
		
		event.setEVENT_CLASS(6);
		System.out.println(kpi2event.doEventCancel(event));
		
		event.setEVENT_CLASS(1);
		System.out.println(kpi2event.doEventCancel(event));
		
		event.setEVENT_CLASS(6);
		System.out.println(kpi2event.doEventCancel(event));
		
		event.setEVENT_CLASS(1);
		System.out.println(kpi2event.doEventCancel(event));
		;
	}
}