7 可计算监控项
概述
计算型监控项允许基于某些现有监控项的值创建计算。例如,您可能希望计算某个监控项值的每小时平均值,或者计算一组监控项的总值。这正是计算型监控项的用途。
计算可同时使用:
- 单个监控项的单个值
- 用于选择多个监控项进行聚合的复杂过滤器(详见聚合计算)
计算型监控项是一种创建虚拟数据源的方式。所有计算都仅由 Zabbix 服务器执行。系统会根据所使用的算术表达式定期计算其值。
生成的数据会像其他任何监控项一样存储在 Zabbix 数据库中;历史值和趋势值都会被存储,并且可以生成图形。
如果计算结果是浮点值,而计算型监控项的信息类型为 Numeric (unsigned),则该结果将被截断为整数。
此外,如果缓存中没有最近的数据,并且函数中未定义查询时间段,Zabbix 默认会向过去最多回溯一周,从数据库中查询历史值。
计算型监控项与触发器表达式共用相同的语法。
如果您熟悉触发器表达式,可以将计算型监控项理解为用于分析某些值的函数,但不需要与阈值进行比较。
计算型监控项中允许与字符串进行比较。
与其他任何监控项类型一样,计算型监控项也可以被宏或其他实体引用。
要使用计算型监控项,请选择监控项类型 Calculated。
可配置字段
key 是唯一的监控项标识符(每个主机内唯一)。您可以使用受支持的符号创建任意 key 名称。
计算定义应填写在 Formula 字段中。公式与 key 之间 没有关联。key 参数 不会以任何方式在公式中使用。
简单公式的语法为:
function(/host/key,<parameter1>,<parameter2>,...)
其中:
| Element | Description |
|---|---|
function |
支持的函数之一:last、min、max、avg、count 等 |
host |
用于计算的监控项所属的主机。 当前主机可以省略(即如 function(//key,parameter,...))。 |
key |
用于计算的监控项的 key。 不支持返回二进制或 JSON 数据类型值的监控项。 |
parameter(s) |
函数的参数(如需要)。 支持时间后缀和内存大小后缀。 |
如果用户宏 在公式中用于引用函数参数、 监控项过滤器参数或常量,则会被展开。用户宏 如果引用的是函数、主机名、监控项 key、 监控项 key 参数或运算符,则不会被展开。
更复杂的公式可以使用函数、运算符和 括号的组合。您可以使用触发器表达式中支持的所有函数和运算符。其逻辑和运算符 优先级完全相同。
与触发器表达式不同,Zabbix 处理计算型监控项时是根据 监控项更新间隔,而不是在接收到新值时进行处理。
计算型监控项公式中由历史函数引用的所有监控项 都必须存在并且正在采集数据。此外,如果您更改了 被引用监控项的 key,则必须手动更新所有使用该 key 的 公式。
在以下几种情况下,计算型监控项可能会变为不支持:
- 被引用的监控项
- 未找到
- 已禁用
- 属于已禁用的主机
- 不受支持(
nodata()函数以及带有 unknown 值的运算符除外)
- 没有可用于计算函数的数据
- 被零除
- 使用了错误的语法
用法示例
示例 1
计算 '/' 上可用磁盘空间的百分比。
使用函数 last:
100*last(//vfs.fs.size[/,free])/last(//vfs.fs.size[/,total])
Zabbix 将获取可用磁盘空间和总磁盘空间的最新值,并根据给定公式计算百分比。
示例 2
计算 Zabbix 处理的值的 10 分钟平均值。
使用函数 avg:
avg(/Zabbix Server/zabbix[wcache,values],10m)
请注意,可计算监控项选取长时间段的数据会影响 Zabbix 服务器的性能。
示例 3
计算 eth0 上的总带宽。
两个函数之和:
last(//net.if.in[eth0,bytes])+last(//net.if.out[eth0,bytes])
示例 4
计算传入流量的百分比。
更复杂的表达式:
100*last(//net.if.in[eth0,bytes])/(last(//net.if.in[eth0,bytes])+last(//net.if.out[eth0,bytes]))
另请参见:聚合计算示例