1 聚合计算
概述
聚合计算是一种calculated item 类型,允许通过Zabbix server从多个监控项收集信息, 然后根据所使用的聚合函数计算结果。
聚合计算监控项仅支持无符号integer和float值(信息类型)。
聚合计算不需要在被监控的主机上运行任何agent。
语法
要获取聚合数据,您可以:
- 列出多个监控项进行聚合:
Note that function here must be a history/trend function.
- use the foreach function, as the only parameter, and its item filter to select the required items:
aggregate_function(foreach_function(/主机/key?[group="主机组"],timeperiod))
聚合函数是支持的aggregate functions之一:avg、max、min、sum等。
foreach函数(例如avg_foreach、count_foreach等)会为每个选中的监控项返回一个聚合值。通过使用监控项过滤器(/host/key?[group="host group"])从监控项历史记录中选择监控项。
如果某些监控项在请求的时间段内没有数据,则会在计算中被忽略。如果所有监控项都没有数据,函数将返回错误。
更多详情,请参阅foreach functions。
如果聚合结果为float值,且聚合监控项的信息类型为Numeric(unsigned),则该值将被截断为integer。
支持在以下位置使用用户宏和低级发现宏:
- 监控项键参数
- 函数参数
- 过滤条件(主机组名称和标签名称)
- 表达式常量
在以下情况下,聚合计算可能变为不支持:
- 未找到任何引用的监控项(可能由于监控项键不正确、所有监控项不存在或包含的组全部不正确导致)
- 没有可用于计算函数的数据
使用示例
聚合计算键值示例.
示例1
MySQL服务器组主机组的总磁盘空间.
sum(last_foreach(/*/vfs.fs.size[/,total]?[group="MySQL Servers"]))
示例2
匹配主机上net.if.in[*]的所有监控项最新值之和。
sum(last_foreach(/主机/net.if.in[*]))
示例3
MySQL服务器组主机组的平均处理器负载
avg(last_foreach(/*/system.cpu.load[,avg1]?[group="MySQL Servers"]))
示例4
每秒queries数的5分钟平均值(针对主机组) MySQL服务器
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[主机,,items_unsupported]?[group="Zabbix servers"]))
正确/错误语法示例
表达式(包括函数调用)不能作为历史数据、趋势数据或foreach function参数使用。不过,这些函数本身可以用于其他(非历史相关的)函数参数中。
| 表达式 | 示例 |
|---|---|
| 有效 | 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))
无法保证等式两边的值集始终保持一致。当表达式的一部分正在计算时,请求周期内可能会收到新值,从而导致表达式的另一部分具有不同的值集。