设置评估表达式

告警监控规则根据评估表达式的执行结果来判断是否满足触发告警条件,以及评估动态告警严重度。本文介绍评估表达式的使用方法。

概览

您查询语句的执行结果将作为输入,集合操作结果的字段作为变量,当评估表达式条件为真,则触发告警。

image

限制说明

告警监控规则的评估表达式相关限制说明如下所示:

  • 负数使用括号包裹,例如x+(-100)<100

  • 数值类型都被转换为64位浮点数,如果使用比较操作(例如等于)可能存在误差。

  • 变量名只能包含字母和数字,且必须以字母开头。

  • 评估表达式长度为1~128个字符。

  • 仅当评估表达式的值为true且满足连续触发阈值时,才会触发告警。例如评估表达式为100+100,计算结果为200,由于其结果是数字不是true,故不会触发告警。

  • true、false、美元符号($)和半角句号(.)是评估表达式的保留词,不能作为变量使用。

基础语法

告警监控规则的评估表达式支持如下语法类型。

说明

字段名称为结果集中的字段名称,建议使用英文字符串,不推荐使用纯数字、特殊符号(例如%)。如果字段名称为纯数字或者含有特殊符号,需使用英文中括号包裹。例如:

  • [5xx比例(%)] > 20

  • [404] > 20

语法类型

运算符

运算方式

示例

变量与变量运算

非String常量与变量运算

String常量与变量运算

基础运算符

四则运算,支持加减乘除、取模(+-*/%)

左右值转Number后运算。

左右值转Number后运算。

不支持。

  • x * 100 + y > 200

  • x % 10 > 5

比较运算符

比较运算:

大于(>)、大于等于(>=)、小于(<)、小于等于(<=)、等于(==)、不等于(!=)

按照以下优先级确定运算顺序:

  1. 左右值转Number后按照数值序运算。如果转换失败则执行下一优先级的运算。

  2. 左右值按String类型字典序运算。

左右值转Number后运算。

左右值按String类型运算(字典序)。

  • x >= 0

  • x < 100

  • x <= 100

  • x == 100

  • x == "foo"

  • (x > 100) == true

    说明

    支持布尔常量。

正则是否匹配:

正则匹配 (=~)、 正则不匹配(!~)

说明
  • 反斜线(\)需要转义。

  • 目前正则表达式支持符合RE2规范的语法。

左右值按String类型运算。

不支持。

左右值按String类型运算。

正则匹配:x =~ "\\w+"

逻辑操作符

逻辑运算:

与(&&)、或(||)

左右值必须为子运算式,且运算结果为布尔值。例如,评估表达式为$0.success_ratio < 90 && $1.平均响应时间 > 60

左右值必须为子运算式,且运算结果为布尔值。例如,评估表达式为$0.success_ratio < 90 && $1.平均响应时间 > 60

左右值必须为子运算式,且运算结果为布尔值。例如,评估表达式为$0.success_ratio < 90 && $1.平均响应时间 > 60

  • x >= 0 && y <= 100

  • x > 0 || y >0

取反前缀操作

取反前缀(!)

被取反的值必须为子运算式,且运算结果为布尔值。例如,评估表达式为!($0.success_ratio < 90)

不支持对集合操作结果的字段直接使用该运算符。

被取反的值必须为子运算式,且运算结果为布尔值。例如,评估表达式为!($0.success_ratio < 90)

不支持对集合操作结果的字段直接使用该运算符。

被取反的值必须为子运算式,且运算结果为布尔值。例如,评估表达式为!($0.success_ratio < 90)

不支持对集合操作结果的字段直接使用该运算符。

!(a < 1 && a > 100)

contains函数

字符串查找(contains)

左右值转String类型后进行运算。

不支持。

左右值按String类型运算。

contains(foo, 'hello')返回true则表示foo中包含hello子串。

括号

括号()

决定运算结合顺序与优先级。

决定运算结合顺序与优先级。

决定运算结合顺序与优先级。

x * (y + 100) > 100

对集合操作结果进行评估

日志服务支持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条数据,就满足触发条件。

    image

  • 有特定条数据:对集合操作结果中的数据条数进行判断,支持的运算符包括大于、小于、等于等。当数据条数满足特定条数据时,满足触发条件。例如集合操作结果中有4条数据,触发条件为有特定条数据>10条,则表示集合操作结果未满足触发条件,不会生成告警。

    image

  • 有数据匹配:对集合操作结果中的数据内容进行判断,只要有1条数据的内容匹配评估表达式,就满足触发条件。例如集合操作结果为1条数据(pv=900),触发条件为有数据匹配,pv > 1000,则表示集合操作结果未满足触发条件,不会生成告警。

    image

  • 有特定条数据匹配:对集合操作结果中的数据条数和数据内容进行判断。当有特定条数据的内容匹配评估表达式时,才会触发告警。例如集合操作结果中有4条数据(pv=900、pv=1100、pv=1200、pv=1001),触发条件为有特定条数据>3条,pv > 1000,则表示集合操作结果满足触发条件,生成告警。

    image

示例

示例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

image

示例2

如果15分钟内状态码500出现10次则产生告警。配置如下:

查询统计:统计每种状态码出现次数。查询分析语句为* | select status, COUNT(*) as total group by status

触发条件:告警评估表达式配置为status == 500 && total > 10

image