Log Service根據警示條件運算式的執行結果來判斷是否產生警示。
在判斷警示條件運算式的執行結果時,您查詢語句的執行結果將作為輸入,日誌欄位作為變數,一旦條件為真則觸發警示。
限制說明
警示條件運算式相關限制說明如下所示:
-
負數需要使用括弧,如 x+(-100)<100。
-
數實值型別都被當成64位浮點數,如果使用比較操作(例如等於)可能存在誤差。
-
變數只能包含字母和數字,且首字母必須是字母。
-
運算式長度為1~128個字元。
-
組合求值時最多計算1000種組合,如果沒有找到結果為真的組合,則視為false。
-
最多隻支援三個查詢。
-
若且唯若運算式的值為true時,才會觸發警示。例如100+100,計算結果為200,不會觸發警示。
-
true、false、貨幣符號($)和英文句點(.)是保留詞,不能作為變數使用。
基礎文法
警示條件運算式支援如下文法類型。
|
文法類型 |
說明 |
樣本 |
|
基礎運算子 |
支援加減乘除、模數運算子,如下所示: +-*/% |
|
|
比較子 |
支援大於(>)、大於等於(>=)、小於(<)、小於等於(<=)、等於(==)、不等於(!=)、正則匹配 (=~)、 正則不匹配(!~)8種比較子。 說明
|
|
|
邏輯操作符 |
支援與(&&)、或(||)。 |
|
|
取反首碼操作 |
支援取反首碼操作(!)。 |
!(a < 1 && a > 100) |
|
數值常量 |
支援數值常量,作為64位浮點數處理。 |
x > 100 |
|
字串常量 |
支援字串常量,格式為'字串',例如'string'。 |
foo == 'string' |
|
布爾常量 |
支援布爾常量,true、false。 |
(x > 100) == true |
|
括弧 |
支援使用括弧改變計算的優先順序。 |
x * (y + 100) > 100 |
|
contains函數 |
支援使用contains函數判斷是否包含子串,例如contains(foo, 'hello')返回true則表示foo中包含hello子串。 |
contains(foo, 'hello') |
多個結果組合求值
-
文法
支援關聯多個查詢,在使用多個查詢結果進行計算時,變數需要加上特定首碼以區分從哪個結果中擷取對應的變數值,格式為$N.fieldname,其中N為查詢編號,詳情請參見如何查看查詢編號。目前最多配置三個查詢,則N的取值範圍為0~2。如$0.foo表示第1個查詢的foo欄位。當僅有一個查詢時,首碼可以省略。
-
運算式求值
在多個查詢結果返回時,根據運算式的變數來判斷需要使用哪些結果求值。例如您配置了三個查詢,分別返回了x、y、z條結果,警示條件運算式為$0.foo > 100 && $1.bar < 100,則說明判斷運算式的值只需要使用前兩個結果,進行x*y次求值直到某次求值返回true,或者達到計算次數上限後直接返回false,目前計算次數上限為1000次。
運算方式
-
number為64位浮點數類型。
-
string常量需要使用單引號或英文雙引號進行包裹,例如'string'、"string"。
-
布爾值包括true和false。
|
運算子 |
運算方式 |
||
|
變數與變數運算 |
非string常量與變數運算 |
string常量與變數運算 |
|
|
四則運算(+-*/%) |
左右值轉number後運算。 |
不支援。 |
|
|
比較運算: 大於(>)、大於等於(>=)、小於(<)、小於等於(<=)、等於(==)、不等於(!=) |
按照以下優先順序決定運算順序:
|
左右值轉number後運算(數值序)。 |
左右值按string類型運算(字典序)。 |
|
正則是否匹配: 正則匹配 (=~)、 正則不匹配(!~) |
左右值按string類型運算。 |
不支援。 |
左右值按string類型運算。 |
|
邏輯運算: 與(&&)、或(||) |
不支援對查詢結果欄位直接應用該運算子,左右值必須分別為子運算式,且運算結果為布爾值。 |
||
|
取反首碼(!) |
不支援對查詢結果欄位直接應用該運算子,被取反的值必須為子運算式,且運算結果為布爾值。 |
||
|
字串尋找(contains) |
左右值轉string類型運算。 |
不支援。 |
左右值按string類型運算。 |
|
括弧() |
決定運算結合順序與優先順序。 |
||
樣本
-
樣本1:如果1天(相對)內任務成功率低於90%且延時超過60秒則產生警示。警示名稱設定為任務延時警示,關聯兩個圖表:圖表0名稱為任務成功率,查詢語句為
* | select round(sum(case when code = 200 then 1 else 0 end) * 100.0 / count(*), 2) as success,查詢區間為1天(相對);圖表1名稱為延時情況,查詢語句為delay > 0 | select time_series(__time__, '10m', '%m-%d %H:%i', '0') as time, round(avg(delay)/100, 3) as delay group by time order by time limit 14400,查詢區間為1天(相對)。檢查頻率為固定間隔15分鐘,觸發條件為$0.success < 90 && $1.delay > 60。 -
樣本2:如果15分鐘內狀態代碼500出現10次則產生警示。警示名稱設定為500 狀態代碼警示,關聯圖表0名稱為響應狀態分布,查詢語句為
* | SELECT status, COUNT(*) as total GROUP BY status,查詢區間為15分鐘(相對)。檢查頻率為固定間隔15分鐘,觸發條件為$0.status == 500 && $0.total > 10。 -
樣本3:如果1小時內加工速率低於1000條則產生警示。警示名稱設定為資料加工速率過低警示,關聯圖表0名稱為加工速率 (lines/s),查詢語句為
__topic__: __etl-log-status__ AND __tag__: __schedule_type__: Resident and event_id: "shard_worker:metrics:checkpoint" | select time_series(__time__, '1m', '%y/%m/%d %H:%i', '0') as dt, round(sum("progress.accept") / 60.0, 3) as "accept", round(sum("progress.dropped") / 60.0, 3) as "dropped", round(sum("progress.delivered") / 60.0, 3) as "delivered", round(sum("progress.failed") / 60.0, 3) as "failed" group by dt order by dt asc limit 10000,查詢區間為1小時(相對)。檢查頻率為固定間隔1小時,觸發條件為$0.accept < 1000。