14 计算监控项
概述
计算监控项允许您根据某些现有监控项的值创建计算。例如,您可能希望计算某个监控项值的每小时平均值,或计算一组监控项的总值。这正是计算监控项的用途。
计算可以使用以下内容:
- 单个监控项的单个值
- 用于选择多个监控项进行聚合的复杂筛选器(详情请参阅聚合计算)
计算监控项是一种创建虚拟数据源的方式。所有计算仅由 Zabbix 服务器执行,并由 history poller 进程处理。系统会根据所使用的表达式定期计算值。
请注意,计算监控项可以访问其他监控项的历史数据,包括创建计算监控项的用户无权访问的监控项。
如果不希望出现此行为,可以将 StartHistoryPollers 配置参数设置为 0,以禁用计算监控项。
计算结果会像其他监控项一样存储在 Zabbix 数据库中;历史数据和趋势数据都会被存储,并且可以生成图形。
如果计算结果为浮点值,而计算监控项的信息类型为数值(无符号),则该值会被截断为整数。
此外,如果缓存中没有近期数据,并且函数中未定义查询周期,Zabbix 默认会最远回溯一周,从数据库中查询历史值。
计算监控项与触发器表达式共用相同的语法。计算监控项允许与字符串进行比较。与其他监控项类型一样,计算监控项可以被宏或其他实体引用。
要使用计算监控项,请选择监控项类型 计算。
可配置字段
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]))
另请参见:聚合计算示例