阈值

我们在创建监控项时已经使用了阈值。阈值用于我们判断获取的数值是否满足了某个触发条件。

变量

内置变量

监控项选择数据源后,就可以使用数据源提供的一些变量。比如对于负载(Load)数据源,提供的的变量有${load1}${load5}${load15}。可以在界面中查看这些变量及说明。

索引

如果获取的数据是一个数组的话,可以通过索引获取某个索引上的值,索引从0开始,比如:

  1. [1, 2.5, 3, 4.7, 5]

则:

  • ${0}表示第一个数据:1
  • ${1}表示第二个数据:2.5
  • ${2}的值为:3
  • 以此类推如果返回的数据是单行数据,则只支持${0},比如:
  1. "123"

${0} 的值为 123

索引也支持级联,对于:

  1. [
  2. { "name": "ZHANG" },
  3. { "name": "LI" },
  4. { "name": "WANG" }
  5. ]

则:

  • ${0.name}值为ZHANG
  • ${1.name}值为LI
  • ${2.name}值为WANG

$符号

从v0.0.10开始,可以使用一个单独的$来表示数组中的每一个元素,比如对于:

  1. [
  2. {
  3. "name": "ZHANG SAN",
  4. "count": 10
  5. },
  6. {
  7. "name": "LI SI",
  8. "count": 15
  9. },
  10. {
  11. "name": "WANG ER",
  12. "count": 20
  13. }
  14. ]

则:

  • ${$.count} 表示数组中任意一个元素中的count值,如果用于阈值判断,则自动会循环当前数组,有一个元素满足条件即返回。$符号不一定在最前面,也可以在中间,以下都是合法的:

  • ${$} - 每一个元素

  • ${$.count} - 每一个元素中的count
  • ${user.books.$.price} - user.books的每一个元素中的price

ROW变量

从v0.1.1开始,可以在通知消息中使用${ROW.xxx}变量来表示使用$匹配的变量,比如对于上面的JSON数据,可以设置通知消息为:

  1. 发现${ROW.name}有异常

又比如,对于硬盘分区数据:

  1. {
  2. "partitions": [
  3. {
  4. "free": 533154402304,
  5. "inodesFree": 9223372036854776000,
  6. "inodesPercent": 1.0842021724855044e-17,
  7. "inodesTotal": 9223372036854776000,
  8. "inodesUsed": 1,
  9. "name": "/private/var/vm",
  10. "percent": 0.20099320386597236,
  11. "total": 998921388032,
  12. "used": 1073762304
  13. },
  14. {
  15. "free": 533154402304,
  16. "inodesFree": 9223372036851067000,
  17. "inodesPercent": 4.021000112736095e-11,
  18. "inodesTotal": 9223372036854776000,
  19. "inodesUsed": 3708718,
  20. "name": "/",
  21. "percent": 46.52807144146622,
  22. "total": 998921388032,
  23. "used": 463919046656
  24. }
  25. ]
  26. }

如果设置阈值为${partitions.$.percent} gt 80,则:

  • ${ROW.name} - 匹配的分区数据的name
  • ${ROW.used} - 匹配的分区数据的已使用字节数
  • 依次类推…通知消息可以设置为:
  1. ${ROW.name}已使用80%

这样通知消息发出时,${ROW.name}就会被替换成相对应的分区名。

命名变量

如果获取的数据是一个键值对结构的话,可以通过命名获取某个键对应的值,比如:

  1. {
  2. "name": "ZHANG SAN",
  3. "age": 18,
  4. "books": [ "Java", "Golang", "Python" ]
  5. }

则:

  • ${name}表示name对应的值:ZHANG SAN
  • ${age}表示age对应的值:18
  • ${books}表示books对应的值 [ "Java", "Golang", "Python" ]
  • ${books.0}值为Java${books.1}值为Golang${books.2}表示Python

OLD变量

从 v0.0.10 开始起支持${OLD}变量,表示当前监控项获取的上一条数据,比如有两条记录:当前数据:

  1. {
  2. "load1": 3.2
  3. }

上一条数据:

  1. {
  2. "load1": 4.5
  3. }

那么 ${load1} - ${OLD.load1} 的值为 -1.3

如果没有上一条记录,则${OLD}值和当前数据值一致。

${OLD}的一个很大的用处是用来检测数据变化,从而发出通知或者执行其他操作。

Agent主机相关变量

从v0.1.1开始,Agent主机相关阈值的通知消息中可以使用一组内置的变量:

  • ${AGENT.name} - Agent主机名
  • ${AGENT.host} - Agent主机地址
  • ${APP.name} - App名称
  • ${ITEM.name} - 监控项名称

运算符

参数值支持加(+)、减(-)、乘(*)、除(/)、取余(%)等运算符,如果有这些运算符的时候,参数值支持Javascript语法,对于:

  1. {
  2. "load1": 3.2,
  3. "load5": 2.5,
  4. "load15": 4
  5. }

则:

  • ${load1} / 10 值为 0.32
  • ${load1} * ${load15} 值为 12.8
  • Math.abs(${load1} - 4) 值为 0.8,其中我们使用了Javascript的内置方法Math.abs()

Javascript

从v0.0.10开始,除了在参数值中包含一些运算符自动激活Javascript语法外,还可以直接使用javascript:表达式来表示当前表达式使用了Javascript语法,比如:

  1. javascript:new Date().getTime() / 1000 - ${timestamp}

例子中的${timestamp}从数值中获取。