[comment]: # ({19cf85e8-bfe1a94d})
# 1 聚合计算

[comment]: # ({/19cf85e8-bfe1a94d})

[comment]: # ({96203d1d-f8e62abe})
#### 概述

聚合计算是一种 [计算项目](/manual/config/items/itemtypes/calculated)
类型，允许 Zabbix 服务器从多个项目收集信息，然后根据所使用的聚合函数计算聚合。

聚合计算不需要在受监控的主机上运行任何代理。

[comment]: # ({/96203d1d-f8e62abe})

[comment]: # ({29785699-63d83a0c})
#### 语法

要检索聚合结果，请使用受支持的 [aggregate functions](/manual/appendix/functions/aggregate#aggregate-functions-1) 之一：`avg`、`max`、`min`、`sum` 等。
然后将 **foreach** 函数作为唯一参数，并添加其监控项过滤器以选择所需的监控项：

```default
aggregate_function(function_foreach(/host/key?[group="host group"],timeperiod))
```

**foreach** 函数（例如 *avg_foreach*、*count_foreach* 等）会为每个选中的监控项返回一个聚合值。
监控项是通过监控项过滤器（`/host/key?[group="host group"]`）从监控项历史数据中选取的。
有关更多详细信息，请参见 [foreach functions](/manual/appendix/functions/aggregate/foreach)。

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

或者，您也可以将多个监控项作为聚合参数列出：

```default
aggregate_function(function(/host/key,parameter),function(/host2/key2,parameter),...)
```

请注意，这里的 `function` 必须是历史/趋势函数。

::: noteclassic
如果聚合结果为浮点值，并且聚合后的监控项信息类型为 *Numeric (unsigned)*，则会将其截断为整数。
:::

用户宏和低级别发现宏支持用于以下位置：

-   监控项键参数
-   函数参数
-   过滤条件（主机组名称和标签名称）
-   表达式常量

在以下情况下，聚合计算可能不受支持：

-   未找到任何引用的监控项（这可能发生在监控项键不正确、监控项不存在或所有包含的组都不正确时）
-   没有可用于计算函数的数据

[comment]: # ({/29785699-63d83a0c})

[comment]: # ({3bbe172c-3bbe172c})
#### 使用示例

用于聚合计算的键的示例

[comment]: # ({/3bbe172c-3bbe172c})

[comment]: # ({1306478c-874bcf94})
##### 示例 1

主机组“MySQL Servers”的磁盘总空间。

```default
sum(last_foreach(/*/vfs.fs.size[/,total]?[group="MySQL Servers"]))
```

[comment]: # ({/1306478c-874bcf94})

[comment]: # ({5c3dc788-3182672a})
##### 示例 2

主机上所有匹配 net.if.in\[\*\] 的监控项的最新值之和。

```default
sum(last_foreach(/host/net.if.in[*]))
```

[comment]: # ({/5c3dc788-3182672a})

[comment]: # ({beca1bb5-cdf2da8b})
##### 示例 3

主机组“MySQL Servers”的平均处理器负载。

```default
avg(last_foreach(/*/system.cpu.load[,avg1]?[group="MySQL Servers"]))
```

[comment]: # ({/beca1bb5-cdf2da8b})

[comment]: # ({c12aa12c-db9c8fce})
##### 示例 4

主机组“MySQL Servers”每秒查询数的 5 分钟平均值。

```default
avg(avg_foreach(/*/mysql.qps?[group="MySQL Servers"],5m))
```

[comment]: # ({/c12aa12c-db9c8fce})

[comment]: # ({c083097e-0233edd3})
##### 示例 5

具有特定标签的多个主机组中所有主机的平均 CPU 负载。

```default
avg(last_foreach(/*/system.cpu.load?[(group="Servers A" or group="Servers B" or group="Servers C") and (tag="Service:" or tag="Importance:High")]))
```

[comment]: # ({/c083097e-0233edd3})

[comment]: # ({0a45c034-30448f5d})
##### 示例 6

用于整个主机组最新监控项值总和的计算。

```default
sum(last_foreach(/*/net.if.out[eth0,bytes]?[group="video"])) / sum(last_foreach(/*/nginx_stat.sh[active]?[group="video"])) 
```

[comment]: # ({/0a45c034-30448f5d})

[comment]: # ({dd370fd1-3e9404a6})
##### 示例 7

主机组 'Zabbix servers' 中不受支持的监控项总数。

```default
sum(last_foreach(/*/zabbix[host,,items_unsupported]?[group="Zabbix servers"]))
```

##### 示例 8

所有主机上 DNS 检查的最新数值结果之和。
这里显示的监控项形式 `net.dns[192.0.2.1,example.com,A]` 只是一个可能键值的示例。

```default
sum(last_foreach(/*/net.dns[*,*,*]))
```

请注意，通配符必须与键中的参数数量一致（这里 [`net.dns`](/manual/config/items/itemtypes/zabbix_agent#net.dns) 有三个参数：ip、name、type）。

[comment]: # ({/dd370fd1-3e9404a6})

[comment]: # ({f6401cd3-f094da29})
##### 正确/错误语法示例

表达式（包括函数调用）不能用作 history、trend 或 foreach [function](/manual/appendix/functions) 参数。
但是，这些函数本身可以用于其他（非历史）函数参数中。

|Expression|Example|
|-|---------|
|Valid|`avg(last(/host/key1),last(/host/key2)*10,last(/host/key1)*100)`<br>`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)))`|
|Invalid|`sum(/host/key,10+2)`<br>`sum(/host/key, avg(10,2))`<br>`sum(/host/key,last(/host/key2))`|

请注意，在如下表达式中：

```default
sum(sum_foreach(//resptime[*],5m))/sum(count_foreach(//resptime[*],5m))
```

无法保证等式两部分始终具有相同的值集合。
当表达式的一部分正在计算时，请求时间段的新值可能会到达，从而使表达式的另一部分具有不同的值集合。

[comment]: # ({/f6401cd3-f094da29})
