ExpressionHelper.java
5.04 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
package com.sitech.ismp.app.event;
import java.util.List;
import java.util.StringTokenizer;
import com.sitech.database.domain.TbCfgEvent;
import com.sitech.ismp.util.ConfigMatchUtil;
import com.sitech.util.ISMPDictionary;
/**
* 该类用于在产生告警过程中可能用到的 告警表示式匹配等功能
*
* @author winnerbao
*
*/
public class ExpressionHelper {
/**
* ExpressionHelper.genCondition方法中得到的条件太严格了
* 原因是采集程序中一个方法返回的unit_id的前三位也可能不一样!!! 所以这里的函数意义调整为
*
* kbp_classes为一系列10 , 10-10之类的字符串 生成UNIT ='10' or UNIT_ID like '10-10%' or
* UNIT_ID is null 这样的字符串
*
* 输入: 10-11, 10-11-12, 10-11-12-13 输出:UNIT ='10' or UNIT_ID like '10-11%'
* or UNIT_ID is null
*
* 1位的使用= 2位的使用 like value% =3, >3位的不处理,
*
* @param unit_id为实际采集的完整的unit_id
* @return
*/
public static String genCondition(String unit_id) {
String kbpClass = ExpressionHelper.getKbpClass(unit_id);
// kbp_classes 该kbp_class肯定至少包括 xx-yy两位
List<String> parentKbpClass = ISMPDictionary.getAllParent(kbpClass);
String result = "";
StringBuffer tempResult = new StringBuffer("");
StringTokenizer st = null;
for (String kbp : parentKbpClass) {
st = new StringTokenizer(kbp, "-");
int count = st.countTokens(); // 本kbp_class中的位数。 如10-10,返回为2
// 使用其他方法,使用11位的话,如果扩充unitid的时候会出问题
if (count == 1) {
tempResult.append("or UNIT_ID='").append(kbp).append("' ");
} else if (count == 2) {
tempResult.append("or UNIT_ID like '").append(kbp)
.append("%' ");
}
}// end for
tempResult.append(" or UNIT_ID='*' or UNIT_ID is null");
// 去掉开头的 or
result = tempResult.substring(0 + 2, tempResult.length());
return result;
}
/**
* 在relateExpressions中找到与当前unit_id ,kpi_id匹配,而且匹配度最高的一个
*
* @param unit_id
* @param kpi_id
* @param relateExpressions
* @return
*/
public static TbCfgEvent getMostMatchExpression(String UNIT_ID, String KPI_ID, List<TbCfgEvent> eventConfigList) {
if (eventConfigList == null || eventConfigList.size() == 0) {
return null;
}
int index;
int key = -1; // 用于记录当前最匹配的配置
int length = -1; // 用于记录当前最匹配的配置的kbp_class长度
try {
// 遍历匹配的告警配置列表,找出最匹配的一条
for (index = 0; index < eventConfigList.size(); index++) {
TbCfgEvent cfg = eventConfigList.get(index);
if (cfg.getKPI_ID().trim().equals(KPI_ID.trim())
&& cfg.getUNIT_ID().trim().equals(UNIT_ID.trim())) {
key = index;
// Loger.debugLog("MATCHED,UNIT_ID="+UNIT_ID+",KPI_ID="+KPI_ID);
break;
}
// 如果本条配置与atoEvent的kpi_id, unit_id , expression一致,那么计算其匹配度操作
if (ConfigMatchUtil.matchKPI_ID(cfg.getKPI_ID(), KPI_ID)
&& ConfigMatchUtil.matchUNIT_ID(cfg.getUNIT_ID(), UNIT_ID)) {
int this_kbp_length = 0;
if (cfg.getUNIT_ID() == null) {
this_kbp_length = 0;
} else {
this_kbp_length = cfg.getUNIT_ID().length();
}
// 如果本配置kbp_class长度大于当前最大长度,那么记录本配置为最匹配配置
// 只修改此处不能完全解决问题 ConfigMatchUtil.matchUNIT_ID 也需要修改 maxin
if (this_kbp_length > length) {
length = this_kbp_length;
key = index;
}
}
}// end for
} catch (Exception e) {
e.printStackTrace();
return null;
}
if (key != -1) { // 有匹配的,并得到了最匹配的
return eventConfigList.get(key);
} else {
return null;
}
}
/**
* 根据unit_id得到其冒号之前的部分 10-10:hhhh -> 10-10 10-11 -> 10-11
*
* @param unit_id
* @return
*/
private static String getKbpClass(String unitId) {
String kbpClass = "";
int posColon = unitId.indexOf(':');
if (posColon < 0) {
kbpClass = unitId;
} else {
kbpClass = unitId.substring(0, posColon);
}
return kbpClass;
}
public static void main(String[] args) {
// List<TbCfgEvent> eventConfigList = new ArrayList<TbCfgEvent>();
//
// TbCfgEvent cfg1 = new TbCfgEvent();
// cfg1.setKPI_ID("TEST-01-01");
// cfg1.setUNIT_ID("10-10-20:bnms_as2");
//
// TbCfgEvent cfg2 = new TbCfgEvent();
// cfg2.setKPI_ID("TEST-01-01");
// cfg2.setUNIT_ID("10-10-20:bnms_as2-/var/adm/ras/platfrm");
//
// TbCfgEvent cfg3 = new TbCfgEvent();
// cfg3.setKPI_ID("TEST-01-01");
// cfg3.setUNIT_ID("10-10-20-14:bnms_as");
//
// eventConfigList.add(cfg1);
// eventConfigList.add(cfg2);
// eventConfigList.add(cfg3);
//
// TbCfgEvent cfg = ExpressionHelper.getMostMatchExpression("10-10-20-14:bnms_as2-/var/adm/ras/platform", "TEST-01-01", eventConfigList);
// if(cfg == null){
// System.out.println("-- null");
// }else{
// System.out.println(cfg.getUNIT_ID());
// }
;
System.out.println(ExpressionHelper.genCondition("10-11-30-11:nms132-aaaa"));
}
}