当您创建报警规则时,如果需要配置复杂的报警条件,则需要通过报警规则表达式来实现。本文为您介绍报警规则表达式的基本元素,及其应用场景。

基本元素

云监控通过报警规则表达式对监控指标的聚合数据或监控指标的某个实例进行计算,当监控数据满足该表达式时,触发报警。报警规则表达式包括:监控指标、监控指标的成员、运算符、函数和监控数据,例如:@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为userIdinstanceId,监控指标CPUUtilization的实例ID的报警规则表达式为@CPUUtilization[60].$instanceId
    说明 关于如何查询某个云产品的监控指标的成员,请参见云服务器ECS中的DimensionsStatistics列。
  • 运算
    计算监控数据是否达到报警条件。
    • 基本运算符
      运算符分类 运算符及其说明
      数学运算符
      • +:加。
      • -:减。
      • *:乘。
      • /:除。
      • %:取模。
      • **:指数。
      比较运算符
      • ==:等于。
      • !=:不等于。
      • >:大于。
      • >=:大于等于。
      • <:小于。
      • <=:小于等于。
      逻辑运算符
      • &&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]

        userld120886317861****20654616023382****

      • "foo"in{'foo':1,'bar':2}

        foo是foobar

      not in 不包含。
      • userld not in [120886317861****,425876]

        userld不是120886317861****20654616023382****

      • "foo"in{'foo1':1,'bar':2}

        foo不是foo1bar

    • 三元运算

      ?::效果与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 布尔值。 truefalse
      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)

应用场景

报警规则表达式的应用场景及其说明如下表所示。
应用场景 报警规则表达式 说明
应用分组中某个特殊实例使用高优先级的排他性阈值(多阈值) @cpu_total[60].$Average > (@cpu_total[60].$instanceId == 'i-io8kfvcpp7x5****'? 80: 50) 仅实例为i-io8kfvcpp7x5****时,cpu_total的平均值大于80,才会触发报警;其他实例的cpu_total的平均值大于50,就会触发报警。
局部黑名单 @cpu_total[60].$instanceId != 'i-io8kfvcpp7x5****' && @cpu_total[60].$Average > 50 当实例为i-io8kfvcpp7x5****时,返回false,不会触发报警;其他实例的cpu_total平均值大于50,就会触发报警。
多指标组合 @cpu_total[60].$Average > 50 && @memory_usage[60].$Average > 80 当实例的cpu_total平均值>50%且memory_usage平均值>80%时,触发报警。
指标延迟上报报警 now() - @heartbeat[60].$reportTime > 60_000 当心跳超时大于1分钟时,触发报警。
说明 reportTime为监控指标的上报时间,是指标自带字段。now()函数为系统内置函数,返回当前时间为毫秒级UTC时间戳。