当您创建报警规则时,如果需要配置复杂的报警条件,则需要通过报警规则表达式来实现。本文为您介绍报警规则表达式的基本元素、历史函数和应用场景。
基本元素
云监控通过报警规则表达式对监控指标的聚合数据或监控指标的某个实例进行计算,当监控数据满足该表达式时,触发报警。报警规则表达式包括:监控指标、监控指标的成员、运算符、函数和监控数据,例如:@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" not in {'foo1':1, 'bar':2}- foo不是 - foo1和- bar。
 
- 三元运算 - ?::效果与C++和Java语言中的三元运算相同,例如:- @CPUUtilization[60].$Average > 30? "ok": "lower"。
 
- 数据操作 - 数据类型 - 数据类型 - 说明 - 示例 - string - 单引号或双引号内的字符串。 - "hello", 'hello'- number - 数值。可以是整数或浮点数。 说明- 当数值为整数时,可以使用数字分隔符,便于维护和阅读。 - 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为监控指标的上报时间,是指标自带字段。 |