1 聚合计算
概述
聚合计算是一种 计算项目 类型,允许 Zabbix 服务器从多个项目收集信息,然后根据所使用的聚合函数计算聚合。
聚合计算不需要在受监控的主机上运行任何代理。
语法
要检索聚合值,请使用受支持的聚合函数之一:avg、max、min、sum 等。
然后添加 foreach 函数作为唯一参数,并使用其监控项过滤器来选择所需的监控项:
aggregate_function(function_foreach(/host/key?[group="host group"],timeperiod))
foreach 函数(例如 avg_foreach、count_foreach 等)会为每个选定的监控项返回一个聚合值。
监控项通过监控项过滤器(/host/key?[group="host group"])从监控项历史数据中进行选择。
更多详细信息,请参见 foreach functions。
如果某些监控项在请求的时间段内没有数据,则在计算时会忽略它们。 如果没有任何监控项有数据,则该函数将返回错误。
或者,您也可以将多个监控项列为聚合的参数:
aggregate_function(function(/host/key,parameter),function(/host2/key2,parameter),...)
请注意,这里的 function 必须是历史/趋势函数。
如果聚合结果为浮点值,而被聚合监控项的信息类型为 Numeric (unsigned),则该结果将被截断为整数。
以下位置支持用户宏和低级别发现宏:
- 监控项键参数
- 函数参数
- 过滤条件(主机组名称和标签名称)
- 表达式常量
在以下情况下,聚合计算可能会变为不受支持:
- 未找到任何被引用的监控项(这可能是因为监控项键不正确、监控项均不存在,或所有包含的组都不正确)
- 没有可用于计算函数的数据
使用示例
用于聚合计算的键的示例
示例 1
主机组“MySQL Servers”的磁盘总空间。
sum(last_foreach(/*/vfs.fs.size[/,total]?[group="MySQL Servers"]))
示例 2
主机上所有匹配 net.if.in[*] 的监控项最新值之和。
sum(last_foreach(/host/net.if.in[*]))
示例 3
主机组“MySQL Servers”的平均处理器负载。
avg(last_foreach(/*/system.cpu.load[,avg1]?[group="MySQL Servers"]))
示例 4
主机组“MySQL Servers”每秒查询次数的 5 分钟平均值。
avg(avg_foreach(/*/mysql.qps?[group="MySQL Servers"],5m))
示例 5
具有特定标签的多个主机组中所有主机上的平均 CPU 负载。
avg(last_foreach(/*/system.cpu.load?[(group="Servers A" or group="Servers B" or group="Servers C") and (tag="Service:" or tag="Importance:High")]))
示例 6
对整个主机组的最新监控项值总和使用的计算。
sum(last_foreach(/*/net.if.out[eth0,bytes]?[group="video"])) / sum(last_foreach(/*/nginx_stat.sh[active]?[group="video"]))
示例 7
主机组“Zabbix servers”中不受支持的监控项总数。
sum(last_foreach(/*/zabbix[host,,items_unsupported]?[group="Zabbix servers"]))
示例 8
所有主机上 DNS 检查的最新数值结果之和。
这里显示的监控项形式 net.dns[192.0.2.0,example.com,A] 只是一个可能的键示例。
sum(last_foreach(/*/net.dns[*,*,*]))
请注意,通配符必须与键中的参数数量匹配(这里 net.dns 有三个参数:ip、name、type)。
正确/错误语法示例
表达式(包括函数调用)不能用作历史、趋势或 foreach 函数参数。 但是,这些函数本身可以用于其他(非历史)函数参数。
| 表达式 | 示例 |
|---|---|
| 有效 | avg(last(/host/key1),last(/host/key2)*10,last(/host/key1)*100)max(avg(avg_foreach(/*/system.cpu.load?[group="Servers A"],5m)),avg(avg_foreach(/*/system.cpu.load?[group="Servers B"],5m)),avg(avg_foreach(/*/system.cpu.load?[group="Servers C"],5m))) |
| 无效 | sum(/host/key,10+2)sum(/host/key, avg(10,2))sum(/host/key,last(/host/key2)) |
请注意,在如下表达式中:
sum(sum_foreach(//resptime[*],5m))/sum(count_foreach(//resptime[*],5m))
无法保证等式两部分始终具有相同的一组值。 在计算表达式的一部分时,请求时间段内可能会到达一个新值,此时表达式的另一部分就会具有不同的一组值。