1 聚合计算

概述

聚合计算是一种calculated item类型,允许通过Zabbix server从多个监控项收集信息,
然后根据所使用的聚合函数计算出一个聚合值。

聚合计算不需要在被监控的主机上运行任何agent。

语法

要检索聚合值,请使用以下受支持的aggregate functions之一:avgmaxminsum等。然后将foreach函数作为唯一参数添加,并使用其监控项过滤器来选择所需的监控项:

aggregate_function(function_foreach(/主机/key?[group="主机组"],timeperiod))

一个foreach函数(例如avg_foreachcount_foreach等)将为每个选定的监控项返回一个聚合值。监控项通过使用监控项过滤器(/host/key?[group="host group"])从监控项历史记录中选择。有关更多详细信息,请参见foreach functions

如果某些监控项在请求的时间段内没有数据,则它们将在计算中被忽略。如果没有监控项具有数据,该函数将返回错误。

或者,您可以将多个监控项作为参数列出以进行聚合:

aggregate_function(function(/主机/key,parameter),function(/host2/key2,parameter),...)

请注意,此处的function必须是一个历史/趋势函数。

如果聚合结果为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

5分钟内每秒平均执行的queries数量,针对主机组“MySQL Servers”。

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

无法保证方程的两个部分始终具有相同的值集。 当表达式的一部分被计算时,可能会有新的值在请求的时间段内到达,这样表达式的另一部分就会具有不同的值集。