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

无法保证等式两边的值集始终保持一致。当表达式的一部分正在计算时,请求周期内可能会收到新值,从而导致表达式的另一部分具有不同的值集。