KPI2Event.java
10.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
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));
;
}
}