告警監控規則根據評估表達式的執行結果來判斷是否滿足觸發告警條件,以及評估動態告警嚴重度。本文介紹評估表達式的使用方法。
概覽
您查詢語句的執行結果將作為輸入,集合操作結果的字段作為變量,當評估表達式條件為真,則觸發告警。
限制說明
告警監控規則的評估表達式相關限制說明如下所示:
負數使用括號包裹,例如
x+(-100)<100
。數值類型都被轉換為64位浮點數,如果使用比較操作(例如等于)可能存在誤差。
變量名只能包含字母和數字,且必須以字母開頭。
評估表達式長度為1~128個字符。
僅當評估表達式的值為true且滿足連續觸發閾值時,才會觸發告警。例如評估表達式為
100+100
,計算結果為200,由于其結果是數字不是true,故不會觸發告警。true、false、美元符號($)和半角句號(.)是評估表達式的保留詞,不能作為變量使用。
基礎語法
告警監控規則的評估表達式支持如下語法類型。
字段名稱為結果集中的字段名稱,建議使用英文字符串,不推薦使用純數字、特殊符號(例如%)。如果字段名稱為純數字或者含有特殊符號,需使用英文中括號包裹。例如:
[5xx比例(%)] > 20
[404] > 20
語法類型 | 運算符 | 運算方式 | 示例 | ||
變量與變量運算 | 非String常量與變量運算 | String常量與變量運算 | |||
基礎運算符 | 四則運算,支持加減乘除、取模(+-*/%) | 左右值轉Number后運算。 | 左右值轉Number后運算。 | 不支持。 |
|
比較運算符 | 比較運算: 大于(>)、大于等于(>=)、小于(<)、小于等于(<=)、等于(==)、不等于(!=) | 按照以下優先級確定運算順序:
| 左右值轉Number后運算。 | 左右值按String類型運算(字典序)。 |
|
正則是否匹配: 正則匹配 (=~)、 正則不匹配(!~) 說明
| 左右值按String類型運算。 | 不支持。 | 左右值按String類型運算。 | 正則匹配: | |
邏輯操作符 | 邏輯運算: 與(&&)、或(||) | 左右值必須為子運算式,且運算結果為布爾值。例如,評估表達式為 | 左右值必須為子運算式,且運算結果為布爾值。例如,評估表達式為 | 左右值必須為子運算式,且運算結果為布爾值。例如,評估表達式為 |
|
取反前綴操作 | 取反前綴(!) | 被取反的值必須為子運算式,且運算結果為布爾值。例如,評估表達式為 不支持對集合操作結果的字段直接使用該運算符。 | 被取反的值必須為子運算式,且運算結果為布爾值。例如,評估表達式為 不支持對集合操作結果的字段直接使用該運算符。 | 被取反的值必須為子運算式,且運算結果為布爾值。例如,評估表達式為 不支持對集合操作結果的字段直接使用該運算符。 |
|
contains函數 | 字符串查找(contains) | 左右值轉String類型后進行運算。 | 不支持。 | 左右值按String類型運算。 |
|
括號 | 括號() | 決定運算結合順序與優先級。 | 決定運算結合順序與優先級。 | 決定運算結合順序與優先級。 |
|
對集合操作結果進行評估
日志服務支持3個集合關聯監控以及評估集合操作結果。
集合操作結果
查詢語句的執行結果作為輸入,集合操作結果的字段作為變量,進行告警評估。有關集合操作更多信息,請參見關聯多個查詢分析結果,如下對集合操作結果進行說明。
評估查詢和分析結果是針對集合操作(例如笛卡爾積、左連接等)后的最終集合結果進行評估。
如果多個查詢和分析結果中不含重復字段,則在評估表達式中引用字段時,可以不加$0、$1、$2等前綴。例如
name == 'sls'
。如果多個查詢和分析結果中包含重復字段,則在評估表達式中引用字段時,必須加$0、$1、$2等前綴。例如
$0.name == 'sls' || $1.name == 'ecs'
。
類別 | 子類 | 說明 |
日志 | 無SELECT語句 | 僅使用查詢語句進行查詢操作。 設置觸發條件表達式時可引用查詢結果中的字段。 |
使用SELECT * FROM log | 設置觸發條件表達式時可引用所有已開啟統計功能的字段。 | |
使用SELECT子查詢(包含SELECT * FROM (SELECT...)) | 設置觸發條件表達式時可引用SELECT子查詢中的字段。 | |
時序數據 | 使用SELECT promql(...) | 通過promql_query(string)、promql_query_range(string, string)函數返回固定字段metric、labels、time和value。其中日志服務會將labels字段按照Map格式展開。 設置觸發條件表達式時可引用metric、labels、time、value字段以及labels字段中的子字段。 |
使用SELECT a, b FROM (SELECT promql(...)) | 設置觸發條件表達式時可引用所有已開啟統計功能的字段。 | |
使用SELECT * FROM log | 設置觸發條件表達式時可引用所有已開啟統計功能的字段。 | |
資源數據 | 無 | 資源數據中的字段只支持簡單類型(例如字符串,浮點數,數字),不支持復雜類型(例如JSON)。 設置觸發條件表達式時可引用資源數據中的字段ID。 |
配置觸發條件
告警監控規則在評估集合操作結果時,如果集合操作結果滿足觸發條件,則表示評估通過,生成一條告警。觸發條件包括如下選項:
有數據:對集合操作結果中的數據條數進行判斷,只要有1條數據,就滿足觸發條件。
有特定條數據:對集合操作結果中的數據條數進行判斷,支持的運算符包括大于、小于、等于等。當數據條數滿足特定條數據時,滿足觸發條件。例如集合操作結果中有4條數據,觸發條件為有特定條數據>10條,則表示集合操作結果未滿足觸發條件,不會生成告警。
有數據匹配:對集合操作結果中的數據內容進行判斷,只要有1條數據的內容匹配評估表達式,就滿足觸發條件。例如集合操作結果為1條數據(pv=900),觸發條件為有數據匹配,pv > 1000,則表示集合操作結果未滿足觸發條件,不會生成告警。
有特定條數據匹配:對集合操作結果中的數據條數和數據內容進行判斷。當有特定條數據的內容匹配評估表達式時,才會觸發告警。例如集合操作結果中有4條數據(pv=900、pv=1100、pv=1200、pv=1001),觸發條件為有特定條數據>3條,pv > 1000,則表示集合操作結果滿足觸發條件,生成告警。
示例
示例1
如果15分鐘(相對)內請求成功率低于90%且平均響應時間高于60s則產生告警。配置如下:
查詢統計:
s0:計算請求的成功比率(success_ratio)。查詢分析語句為
* | select round(sum(if(status < 300, 1, 0)) * 100.0 / count(1) , 2) as success_ratio
s1:計算每分鐘的平均請求響應時間。查詢分析語句為
* | select date_format(date_trunc('minute',__time__), '%m-%d %H:%i') as t,avg(request_time) as "平均響應時間(s)" group by t order by t asc limit 2000
觸發條件:告警評估表達式配置為$0.success_ratio < 90 && $1.平均響應時間\(s\) > 60
示例2
如果15分鐘內狀態碼500出現10次則產生告警。配置如下:
查詢統計:統計每種狀態碼出現次數。查詢分析語句為* | select status, COUNT(*) as total group by status
觸發條件:告警評估表達式配置為status == 500 && total > 10