當您創建報警規則時,如果需要配置復雜的報警條件,則需要通過報警規則表達式來實現。本文為您介紹報警規則表達式的基本元素、歷史函數和應用場景。
基本元素
云監控通過報警規則表達式對監控指標的聚合數據或監控指標的某個實例進行計算,當監控數據滿足該表達式時,觸發報警。報警規則表達式包括:監控指標、監控指標的成員、運算符、函數和監控數據,例如:@cpu_total[60].$instanceId != 'i-2ze3jvsy7620giru****' && @cpu_total[60].$Average > 60
。
監控指標
各云產品的監控指標名稱,請參見云產品監控項 。
監控指標的報警規則表達式為
@監控指標名稱[聚合周期]
,例如:云服務器ECS的監控指標為CPUUtilization,報警規則表達式為@CPUUtilization[60]
。說明關于如何查詢某個云產品的監控指標的聚合周期,請參見云服務器ECS中的Min Periods列。
監控指標名稱需要符合正則表達式
[a-zA-Z][_a-zA-Z0-9]*
,不符合該正則表達式的監控指標需要用@(監控指標名稱)[聚合周期]
來代替,例如:@('vm.DiskIORead')[60]
。
在報警規則表達式中,監控指標不能單獨出現,需要配合監控指標成員來確定具體的監控數據。
監控指標成員
監控指標成員確定監控指標的某個數據。監控指標成員需要以$開頭,在報警規則表達式中的訪問方式是
@指標[聚合周期].$指標成員
,例如:云服務器ECS的監控指標CPUUtilization的Statistics為Average、Minimum和Maximum,監控指標CPUUtilization的平均值的報警規則表達式為@CPUUtilization[60].$Average
;云服務器ECS的監控指標CPUUtilization的Dimensions為userId
和instanceId
,監控指標CPUUtilization的實例ID的報警規則表達式為@CPUUtilization[60].$instanceId
。說明關于如何查詢某個云產品的監控指標的成員,請參見云服務器ECS中的Dimensions和Statistics列。
運算
計算監控數據是否達到報警條件。
基本運算符
運算符分類
運算符及其說明
數學運算符
+
:加。-
:減。*
:乘。/
:除。%
:取模。**
:指數。
比較運算符
==
:等于。!=
:不等于。>
:大于。>=
:大于等于。<
:小于。<=
:小于等于。
邏輯運算符
&&
或and
:邏輯與。||
或or
:邏輯或。!
或not
:邏輯非。
示例:
$Average > 50 && $instanceId != 'i-not-exist'
。說明當數學運算符或比較運算符兩邊不是同一類型時,string類型轉為number類型,例如:
'123' + 321 == 123 + '321' == 444
。字符串操作
字符串操作
說明
示例
matches
正則表達匹配。
通過邏輯非和
matches
運算符來判斷一個字符串是否匹配某個正則表達式。!("hello" matches "^fo.+")
說明由于
!
的優先級比matches高,因此必須使用括號。contains
包含字符串。
'abcdef' contains 'cde'
startsWith
字符串指定前綴。
'abcdef' startsWith 'abc'
endsWith
字符串指定后綴。
'abcdef' endsWith 'def'
成員關系運算符
成員關系運算符
說明
示例
in
包含。
userld in [120886317861****,425876]
userld
是120886317861****
或20654616023382****
。"foo"in{'foo':1,'bar':2}
foo是
foo
或bar
。
not in
不包含。
userld not in [120886317861****,425876]
userld
不是120886317861****
和20654616023382****
。"foo"in{'foo1':1,'bar':2}
foo不是
foo1
和bar
。
三元運算
?:
:效果與C++和Java語言中的三元運算相同,例如:@CPUUtilization[60].$Average > 30? "ok": "lower"
。
數據操作
數據類型
數據類型
說明
示例
string
單引號或雙引號內的字符串。
"hello", 'hello'
number
數值??梢允钦麛祷蚋↑c數。
說明當數值為整數時,可以使用數字分隔符,便于維護和閱讀。
103, 2.5, .5, 2e+6
1_000_000
array
數組。
[1, 2, 3]
map或dict
字典。
{"foo":"bar"}
bool
布爾值。
true
或false
nil
空值,即無數據。
nil
內置函數
內置函數
說明
len(array|map|string)
Array、Map或字符串的長度。
now()
返回毫秒級的時間戳(UTC)。
abs(number)
絕對值,返回浮點數。
rand()
返回一個介于
[0, 1)
的浮點數。rand(N)
返回一個介于
[0, N)
的浮點數。toLower(string)
字符串轉小寫。
toUpper(string)
字符串轉大寫。
同比環比
說明指標,例如:
@cpu_total[60]
。聚合方式(字符串),例如:
'$Average'
。對比結果(布爾值),本周期大于上個周期為
true
,小于上個周期為false
。
函數
說明
CompareLastPeriod(指標, 聚合方式, 對比結果)
環比上個周期,例如:
CompareLastPeriod(@cpu_total[60], '$Average', true)
。假設本周期cpu_total的平均值為20%,上周期cpu_total的平均值為15%,對比結果不同取值的計算方法如下:
當為
true
時,該表達式的結果為(20-15)× 100÷20。當為
false
時,該表達式的結果為(15-20)× 100÷20。
CompareLastHour(指標, 聚合方式, 對比結果)
同比上個小時。
CompareLastHour(@cpu_total[60], '$Average', true) > 10
:表示當cpu_total的平均值同比上個小時上漲10%時,觸發報警。CompareYesterday(指標, 聚合方式, 對比結果)
同比昨天。
CompareYesterday(@cpu_total[60], '$Average', true) > 10
:表示當cpu_total的平均值同比昨天上漲10%時,觸發報警。CompareLastWeek(指標, 聚合方式, 對比結果)
同比上周。
CompareLastWeek(@cpu_total[60], '$Average', true) > 10
:表示當cpu_total的平均值同比上周上漲10%時,觸發報警。ComparePast(指標, 聚合方式, 對比結果, seconds)
同比
seconds
之前的數據,該函數是同比和環比的完整形式。以上四個函數是該函數的簡化調用,例如:
CompareLastHour(@cpu_total[60], '$Average', true)
等價于ComparePast(@cpu_total[60], '$Average', true, 3600)
。CompareYesterday(@cpu_total[60], '$Average', true)
等價于ComparePast(@cpu_total[60], '$Average', true, 24*60*60)
。CompareLastWeek(@cpu_total[60], '$Average', true)
等價于ComparePast(@cpu_total[60], '$Average', true, 7*24*60*60)
。
歷史函數
函數
說明
LastPeriod(指標)
取上個周期的數據,例如:
LastPeriod(@cpu_total[60]).$Average > 75
表示cpu_total
上個周期的平均值大于75%,觸發報警。LastHour(指標)
取一小時之前的數據,例如:
LastHour(@cpu_total[60]).$Average > 75
表示cpu_total
一小時之前的平均值大于75%,觸發報警。Yesterday(指標)
取昨天相同時刻的數據,例如:
Yesterday(@cpu_total[60]).$Average > 75
表示cpu_total
昨天相同時刻的平均值大于75%,觸發報警。LastWeek(指標)
取上周相同時刻的數據,例如:
LastWeek(@cpu_total[60]).$Average > 75
表示cpu_total
上周相同時刻的平均值大于75%,觸發報警。Past(指標, seconds)
取seconds秒之前的數據,seconds應為指標聚合周期的整數倍,該函數是上述歷史函數的完整形式,例如:
Past(@cpu_total[60], 3600) > 75
等價于LastHour(@cpu_total[60]).$Average > 75
。
應用場景
報警規則表達式的應用場景及其說明如下表所示。
應用場景 | 報警規則表達式 | 說明 |
應用分組中某個特殊實例使用高優先級的排他性閾值(多閾值) |
| 僅實例為 |
局部黑名單 |
| 當實例為 |
多指標組合 |
| 當實例的cpu_total平均值>50%且memory_usage平均值>80%時,觸發報警。 |
指標延遲上報報警 |
| 當心跳超時大于1分鐘時,觸發報警。 說明 reportTime為監控指標的上報時間,是指標自帶字段。 |