14 计算监控项
概述
计算型监控项允许基于某些现有监控项的值创建计算。例如,您可能希望计算某个监控项值的每小时平均值,或者计算一组监控项的总值。这就是计算型监控项的用途。
计算可以使用以下两种方式:
- 单个监控项的单个值
- 用于选择多个监控项进行聚合的复杂过滤器(详情请参见 聚合计算)
计算型监控项是一种创建虚拟数据源的方式。所有计算都仅由 Zabbix 服务器执行。数值会根据所使用的算术表达式定期计算。
生成的数据会像其他任何监控项一样存储在 Zabbix 数据库中;历史数据和趋势数据都会被保存,并且可以生成图形。
如果计算结果为浮点值,并且计算型监控项的信息类型为 Numeric (unsigned),则该值会被截断为整数。
另外,如果缓存中没有最近的数据,并且函数中没有定义查询周期,Zabbix 默认会向前追溯最多一周,从数据库中查询历史值。
计算型监控项与触发器表达式共享语法。计算型监控项中允许与字符串进行比较。计算型监控项可以像其他任何监控项类型一样,通过宏或其他实体进行引用。
要使用计算型监控项,请选择监控项类型 Calculated。
可配置字段
key 是一个唯一的监控项标识符(按主机区分)。你可以使用受支持的符号创建任意 key 名称。
计算定义应填写在 Formula 字段中。公式与 key 之间没有关联。key 参数不会以任何方式用于公式中。
简单公式的语法如下:
function(/host/key,<parameter1>,<parameter2>,...)
其中:
| function | 受支持的函数 之一:last、min、max、avg、count 等 |
| host | 用于计算的监控项所属的主机。 当前主机可以省略(即如 function(//key,parameter,...))。 |
| key | 用于计算的监控项的 key。 不支持返回二进制 数据类型 值的监控项。 |
| parameter(s) | 函数参数(如需要)。 支持时间后缀和内存大小后缀。 |
公式中的用户宏 如果用于引用函数参数、监控项过滤器参数或常量,将会被展开。若用于引用函数、主机名、监控项 key、监控项 key 参数或运算符,则不会展开。
更复杂的公式可以使用函数、运算符和括号的组合。你可以使用触发器表达式中支持的所有函数和运算符。其逻辑和运算符优先级完全相同。
与触发器表达式不同,Zabbix 会根据监控项更新间隔处理计算型监控项,而不是在接收到新值时处理。
计算型监控项公式中引用的所有历史函数所涉及的监控项都必须存在并且正在采集数据。此外,如果你更改了被引用监控项的 key,则必须手动更新所有使用该 key 的公式。
在以下几种情况下,计算型监控项可能变为不受支持:
- 被引用的监控项
- 未找到
- 已禁用
- 属于已禁用的主机
- 不受支持(
nodata()函数以及对未知值使用的运算符除外)
- 没有可用于计算函数的数据
- 除以零
- 使用了错误的语法
用法示例
示例 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]))
另请参见:聚合计算示例