一、規則引擎說明
規則引擎是基於ANTLR 4實現的一套腳本語言,主要用於告警處理。
二、變量聲明
通過表達式:變量名 = string
在規則中聲明變量,其中,變量名只能爲大小寫字母、數字和下劃線。示例:
abc = 1
$ABC = "hello"
@BCD = "world"
每條規則語句以換行符結尾。
注意:在規則處理上下文中,有三種特殊的變量,分別如下:
a) 以$開頭,如:$alarmId,此種變量爲規則的輸入參數,進入規則處理之前所有告警字段都會轉化爲$形式再進行處理。
b) 以@開頭,如:@AlarmName,此種變量爲規則的輸出參數,若希望經過規則處理之後返回的字段,都需要變成@形式纔可以返回其值。
c) 以%開頭,如:%Name,此種變量爲探針級別的參數,高於規則上下文,目前只有探針名一個參數,即%Name。
三、運算符
- 與或非運算符:&&、||、!
- 比較運算法:>、>=、<、<=、==、!=
- 計算運算符:+、-、*、/
四、流程控制
- if…else if…else…控制語句,語法定義如下:
if (...) {
...
} else if (...) {
...
} else {
...
}
- switch控制語句,語法定義如下:
switch (...) {
case "" | "":
...
break
case "":
...
default:
...
}
- foreach語句,語法定義如下:
foreach (key in $*|array|($vall,$val2,...$valn)) {
...
}
參考示例如下:
for (val in $*) {
log(info,"val is " + val)
}
array arrTest
arrTest["abc"] = 1
arrTest["bcd"] = 2
for (val in arrTest) {
log(info,"val is " + val)
}
for (val in ($1,$2,$3,$4)) {
log(info,"val is " + val)
}
五、集合
- table,語法定義如下:
引用式:
table table_name = "./table_name"
default = {"", ..., ""}
直接式:
ta ble table_name = {
{"key", "value"},
...
{"key", "value"}
default = "default_values"
}
示例如下:
引用式:
table AlarmSeverity = "./Huawei/M2000/AlarmSeverity"
default = {"", ""}
==================
AlarmSeverity(tab,tab+,table):
1 Cleared
2 Minor
3 Major
4 Critical
5 Error
直接式:
table AlarmSeverity = {
{"1","Cleared"},
{"2","Minor"},
{"3","Major"},
{"4","Critical"},
{"5","Error"},
default = "UnKnown"
}
- array,語法定義如下:
array array_name
array_name[String|number] = [String|number]
示例如下:
array arrayVo
arrayVo["test"] = 1
arrayVo[2] = "1001"
arrayVo[$a] = $b
log(info,"arrayVo["test"]=" + arrayVo["test"])
log(info,"arrayVo["2"]=" + arrayVo["2"])
log(info,"arrayVo["$a"]=" + arrayVo["$a"])
六、系統函數
注意:所有帶參數的函數,使用時每個參數之間不能存在空格。
- getdate,返回當前時間毫秒數,用法如下:
$currentTime = getdate
log(info, "Current millisecond = " + $currentTime) # 1469689875121, JavaSystem.currentTimeMillis()
- match,精確匹配字符串,返回true或false,用法如下:
if (match($AlarmName, "LinkDown")) {
log(info, "It's matched")
} else {
log(info, "It's not matched")
}
- rematch,模糊匹配,基於Java的正則表達式實現,返回true或false,用法如下:
if (rematch($AlarmName, ".*LinkDown.*")) {
log(info, "It's matched")
} else {
log(info, "It's not matched")
}
- extract,截取字符串中匹配的數據,基於Java正則表達式的group實現,返回匹配到的字符串,用法如下:
$AlertKey = "Node=123,alarmname=linkdown"
$Node = extract($AlertKey,".*Node=([0-9*],.*)")
log(info,"$Node=" + $Node) #123
- exits,判斷某個變量是否存在,返回true或false,用法如下:
if (exist($AlarmName)) {
log(info, "It's exists")
} else {
log(info, "It's not exists")
}
- DateToTime,將制定日誌轉化爲毫秒級,時區以探針運行時區爲準,返回毫秒數,用法如下:
$NV_EVENT_TIME = "2020-05-18 10:52:00"
$EventTime = DateToTime($NV_EVENT_TIME,"yyyy-MM-dd HH:mm:ss")
這裏的DateTime的第二個參數的格式參考Java語言提供的SimpleDateFormat類格式。
- int,將數字字符串轉換爲int數值,若不可轉化則會出現異常,返回int數值,用法如下:
$val = int("1111")
- ltrim,去掉字符串的左邊空格,返回處理後的字符串,用法如下:
$node = ltrim($node)
- rtrim,去掉字符串的右邊空格,返回處理後的字符串,用法如下:
$node = rtrim($node)
- lookup,根據指定Key獲取其對應的1個或多個字段的value,lookup(key, table_name),用法如下:
$Severity = lookup($Severity,AlarmServerity)
[@SiteCode, @SiteName, @SitePriority, @Location, @ZoneTime, @SiteType, @collocation_name, @collocation_Id, @power_type, @LocalNodeAlias $#124;\||] = lookup(@Node, deviceSite3G4G)
-
log,打印日誌,格式:log(level, “”),其中level取值爲debug,info,warn,error。
-
setContextVar,設置環境變量到規則引擎的環境變量中去,例如可以在core.properties裏面定義一個探針運行時的環境變量。
@ccc=setContextVar("xxxxName")
@ddd=$xxxxName
xxxxNamexxxxName
@ccc=setContextVar("xxxxName","abcd")
@ddd=$abcd
abcd
@ccc=setContextVar("xxxxName","abcd")@ddd=$abcd
abcd
- TimeFromIBMTime,將IBM的時間格式轉換爲UTC的時間,用法如下:
@mv36AlarmRaisingTimeTest = TimeFromIBMTime($mv36AlarmRaisingTimeTest)
-
hostname,獲取執行機器的主機名。
-
lower,將字符串轉換爲小寫字母。
lower("ABcD")
- substr,截取字符串。
substr("ssss",1,2)
-
clear,清空規則引擎中的環境變量,包括輸入輸出和一些中間變量。
-
getenv,獲取執行環境的環境變量的值,相當於Java中調用System.getProperty()。
getenv("Probe_Name")
-
getpid,獲取執行進程的PID。
-
getplatform,獲取運行平臺名稱。
-
recover,將設置的discard標示清空。
-
remove,移除變量的定義。
remove("passwd")
-
update,更新事件。
-
updateload,觸發更新事件。
-
upper,將字符串轉換爲大寫字母。
upper("abcD")
- hashCode,輸出字符串的hashCode碼,輸出爲格式化後的20位hashCode,前十位爲String的hashCode,後十位爲字符串倒序的hashCode碼。
@alarmId=hashCode($alarmID)
七、特殊語句
- discard,丟棄次規則處理的結果,一般用於丟棄告警的場景,如告警風暴發生時,丟棄低優先級的告警,用法如下:
if(int($AlarmStomFlg) == 1 && int($Severity) <= 2) { # ,2
discard
}
- include,引用其他規則文件或lookup文件,支持classpath路徑、相對路徑和絕對路徑三種引用方式,用法如下:
include "classpath:config/abc.rules" # classpath
include "./rules/test.rules" # (config),
include '/opt/ict/collector/instance/Probe-0010/config/lookup/Device.lookup" #