日志服务根据告警条件表达式的执行结果来判断是否产生告警。
在判断告警条件表达式的执行结果时,您查询语句的执行结果将作为输入,日志字段作为变量,一旦条件为真则触发告警。
限制说明
告警条件表达式相关限制说明如下所示:
-
负数需要使用括号,如 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。