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]))

另请参见:聚合计算示例