14 计算监控项
概述
一个计算型 监控项 允许基于一些已有 监控项 的值进行 create 计算。例如,你可能想要计算某个 监控项 值的小时平均值,或者计算一组 监控项 的总值。这就是计算型 监控项 的用途。
计算可以使用以下两种方式:
- 单个 监控项 的单独值
- 复杂过滤器用于选择多个 监控项 进行聚合(详情请参阅 aggregate calculations)
计算型 监控项 是创建虚拟数据源的一种方式。所有计算仅由 Zabbix server 完成。这些值会基于使用的算术表达式定期计算。
生成的数据将存储在 Zabbix 数据库中,与任何其他 监控项 一样;历史值和趋势值都会被存储,并且可以生成图表。
如果计算结果是一个 float 值,并且该计算型 监控项 的信息类型为数值(无符号),则结果将被截断为一个 integer。
此外,如果缓存中没有最近的数据,且函数中未定义查询时间段,则 Zabbix 默认会回溯至多一周的时间,以从数据库中 query 历史值。
计算型 监控项 与其触发器的 expressions 共享语法。在计算型 监控项 中允许与字符串进行比较。计算型 监控项 可以像任何其他 监控项 类型一样被宏或其他实体引用。
要使用计算型 监控项,请选择 监控项 类型为 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 server的性能。
示例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]))
另请参见:聚合计算示例