[comment]: # ({b8c65ad1-b8c65ad1})
# 7 可计算监控项

[comment]: # ({/b8c65ad1-b8c65ad1})

[comment]: # ({b61f1d79-43ebe58c})
### 概述

此监控项类型允许对已存在的指标进行计算。计算型监控项本身不会采集任何数据。

例如，您可能希望：

-   对两个值进行计数。
-   计算多个监控项值的平均值。
-   计算一组监控项的总值。

结果值会像其他任何监控项一样存储在 Zabbix 数据库中；历史值和趋势值都会被存储，并且可以生成图形。

计算基于公式进行。公式的语法与[触发器表达式](/manual/config/triggers/expression)共用。

实际上，可以通过将复杂的数据处理逻辑放在计算型监控项中来保持触发器的简洁——然后在触发器中使用监控项键来引用该计算型监控项。

指定计算数据源有两种方式：

1. 在公式中指定监控项。
2. 基于选择监控项的过滤器执行[数据聚合](#data-aggregations)。

第二种方式允许计算组平均值、总值等。

所有计算都由 Zabbix 服务器完成；proxy 或 agent 完全不参与。请注意，大量使用具有较长时间周期的计算型监控项可能会影响服务器性能。

[comment]: # ({/b61f1d79-43ebe58c})

[comment]: # ({d549a268-ddc35784})
### 可配置字段

要使用计算型监控项，请选择监控项类型 **Calculated**。

![](../../../../../assets/en/manual/config/items/itemtypes/calculated_item.png){width="600"}

**key** 是唯一的监控项标识符（每个主机内唯一）。您可以使用受支持的符号创建任意
key 名称。key 允许在触发器中引用该计算型监控项。

必须在 **Formula** 字段中输入计算定义。 

公式与 key 之间没有任何关联。key 参数
不会以任何方式在公式中使用。

与触发器表达式不同，Zabbix 处理计算型监控项时是根据
监控项更新间隔进行的，而不是在接收到新值时进行。

请注意，如果您选择 *Numeric (unsigned)* 作为信息类型，而计算结果是浮点值，则会将其截断为整数。

[comment]: # ({/d549a268-ddc35784})

[comment]: # ({d529721d-f105da1a})
### 简单计算公式

简单公式的语法为：

    function(/主机/key,<parameter1>,<parameter2>,...)

其中：

|Element|Description|
|---|-------|
|`function`|[支持的函数](/manual/config/triggers/expression#functions)之一：last、min、max、avg、count 等|
|`host`|用于计算的监控项所属的主机。<br>可省略当前主机（即如 `function(//key,parameter,...)` 所示）。|
|`key`|用于计算的监控项的键。<br>不支持返回二进制或 JSON [数据类型](/manual/config/items/item#configuration)值的监控项。<br>如果更改了被引用监控项的键，则必须在公式中手动更新该键。<br>历史函数引用的所有监控项都必须存在并且正在采集数据。|
|`parameter(s)`|函数的参数（如需要）。<br>支持[时间后缀](/manual/appendix/suffixes#time-suffixes)和[内存大小后缀](/manual/appendix/suffixes#memory-size-suffixes)。|

更复杂的公式可以组合使用函数、运算符和括号。

请参见计算型监控项公式示例：

-   [(1) 接口总流量](#total-traffic-on-interface)
-   [(2) 可用磁盘空间百分比](#percentage-of-free-disk-space)
-   [(3) 入站流量百分比](#percentage-of-incoming-traffic)
-   [(4) 已处理值的平均数量](#average-number-of-processed-values)

某些变量可通过[用户宏](/manual/config/macros/user_macros)传递给公式。  
请注意，用户宏：

-   将被解析——如果用于引用函数参数、监控项过滤器参数或常量。
-   **不会**被解析——如果用于引用函数、主机名、监控项键、监控项键参数或运算符。

允许与字符串进行比较。

如果缓存中没有最近的数据，并且函数中未定义查询时间段，Zabbix 默认会向过去最多回溯一周，以查询数据库中的历史值。

计算型监控项在以下几种情况下可能变为不支持：

-   被引用的监控项
    -   未找到
    -   已禁用，或属于已禁用的主机
    -   不受支持（nodata() 函数以及带有未知值的[运算符](/manual/config/triggers/expression#operators)除外）
-   没有可用于计算函数的数据
-   除以零
-   使用了错误的语法

[comment]: # ({/d529721d-f105da1a})

[comment]: # ({69899e6b-63d83a0c})
### 数据聚合

数据聚合基于一个用于选择多个监控项的过滤器。数据聚合也是一种计算型监控项，不过在公式中使用的语法略有不同。

要获取聚合值，请使用支持的[聚合函数](/manual/config/triggers/expression/aggregate)之一：`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 函数](/manual/config/triggers/expression/aggregate/foreach)。

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

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

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

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

请参见聚合计算示例：

-   [(5) 主机的总入站流量](#total-incoming-traffic-for-host)
-   [(6) 组的总磁盘空间](#total-disk-space-for-group)
-   [(7) 组的平均处理器负载](#average-processor-load-for-group)
-   [(8) 组和标签的平均处理器负载](#average-processor-load-for-group-and-tag)
-   [(9) 已处理值的平均数量](#average-number-of-processed-values)
-   [(10) 组的平均查询数量](#average-number-of-queries-for-group)
-   [(11) 成功 DNS 检查的总数](#total-number-of-successful-dns-checks)
-   [(12) 组中不受支持监控项的总数](#total-number-of-unsupported-items-for-group)
-   [(13) 组的接口统计](#interface-stats-for-group)

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

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

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

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

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

[comment]: # ({fdfb8008-82c22f4f})
### 计算监控项示例

[comment]: # ({/fdfb8008-82c22f4f})

[comment]: # ({a3322852-5d068733})
##### (1) 接口上的总流量

```default
last(//net.if.in[eth0,bytes])+last(//net.if.out[eth0,bytes])
```

计算 eth0 上的总带宽。

[comment]: # ({/a3322852-5d068733})

[comment]: # ({3ed08673-426ab71a})
##### (2) 可用磁盘空间百分比

```default
100*last(//vfs.fs.size[/,free])/last(//vfs.fs.size[/,total])
```

Zabbix 将获取 `/` 上可用磁盘空间和总磁盘空间的最新值，并根据给定公式计算百分比。

[comment]: # ({/3ed08673-426ab71a})

[comment]: # ({0bc6aaac-f8b53af1})
##### (3) 入站流量百分比

```default
100*last(//net.if.in[eth0,bytes])/(last(//net.if.in[eth0,bytes])+last(//net.if.out[eth0,bytes]))
```

计算总流量中入站流量所占的百分比。

[comment]: # ({/0bc6aaac-f8b53af1})

[comment]: # ({537f0855-77bcdfd9})
##### (4) 已处理值的平均数量

```default
avg(/Zabbix server/zabbix[wcache,values],10m)
```

计算 Zabbix 在 10 分钟内处理的值数量的平均值。

[comment]: # ({/537f0855-77bcdfd9})

[comment]: # ({8d1ddbe3-3182672a})
##### (5) 主机的总入站流量

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

计算主机上所有匹配 `net.if.in[*]` 的监控项总和。

[comment]: # ({/8d1ddbe3-3182672a})

[comment]: # ({e432a117-874bcf94})
##### （6）组的总磁盘空间

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

计算所有 `MySQL Servers` 的总磁盘空间。

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

[comment]: # ({9125c3ca-cdf2da8b})
##### （7）组的平均处理器负载

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

计算所有 `MySQL Servers` 的平均处理器负载。

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

[comment]: # ({fca20d64-0233edd3})
##### （8）组和标签的平均处理器负载

```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")]))
```

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

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

[comment]: # ({89b53708-db9c8fce})
##### (9) 组的平均查询数

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

计算 `MySQL Servers` 每秒查询数的 5 分钟平均值。

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

[comment]: # ({7b156968-9e0ef2e9})
##### (10) 成功 DNS 检查总数

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

计算所有主机上成功 DNS 检查的总数。  
显示的监控项形式 `net.dns[192.0.2.0,example.com,A]` 只是一个可能键值的示例。

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

[comment]: # ({/7b156968-9e0ef2e9})

[comment]: # ({ecf9b800-3e9404a6})
##### （11）组中不受支持监控项的总数

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

计算 `Zabbix servers` 的不受支持监控项总数。

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

[comment]: # ({b2771cd7-30448f5d})
##### （12）组的接口统计信息

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

计算 `video` 组的接口统计信息。

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

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

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

|表达式|示例|
|-|---------|
|有效|`avg(last(/host/key1),last(/host/key2)*10,last(/host/key1)*100)`<br><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)))`|
|无效|`sum(/host/key,10+2)`<br><br>`sum(/host/key, avg(10,2))`<br><br>`sum(/host/key,last(/host/key2))`|

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

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

无法保证等式两部分始终具有相同的一组值。
在表达式的一部分被求值时，请求时间段内可能会到达一个新值，此时表达式的另一部分将具有不同的一组值。

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