# 7 可计算监控项

#### 概述

你可以基于其它监控项来创建可计算监控项。

因此，可计算监控项是创建虚拟数据源的一种方式，这些值将根据算术表达式定期计算。所有计算都由Zabbix服务器完成，与Zabbix
agent或proxy执行的计算无关。

生成的数据将存储在Zabbix数据库中，与其他监控项一样
-这就意味着要存储历史和趋势值，以便快速生成图表。可计算监控项可用于触发器表达式中，由宏或其它实体引用，与任何其它监控项类型相同。

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

#### 可配置字段

对于每一台主机，**key**
是唯一的监控项标识符。您可以使用支持的符号创建任何键名。

计算定义应在 **公式**
字段中输入。公式和键值之间实际上没有联系，键值参数在公式中不会以任何方式使用。

一个简单公式的正确语法是：

    func(<key>|<hostname:key>,<parameter1>,<parameter2>,...)

|参数               定|<|
|------------------------|-|
|**func**|触发器表达式支持的[函数](/manual/appendix/triggers/functions): last, min, max, avg, count等|
|**key**|另一监控项的键值，该键值的数据是你想要使用的。 它可以被定义为 **key** 或者 **hostname:key**。<br>*注意:* 强烈建议将整个键放在双引号(“…”)中，以避免由于键内的空格或逗号而导致错误的解析。\\\\如果键中也有引用的参数，那么必须使用反斜杠(\\)来转义这些双引号。 请参考下文的 **示例 5** 。|
|**parameter(s)**|功能参数（如果需要）|

<note
tip>从可计算监控项公式引用的所有监控项都必须存在并且正在收集数据
([功能和不支持的监控项](/manual/appendix/triggers/functions#functions_and_unsupported_items)除外)。
此外，如果更改引用项的项键，则必须手动更新正在使用这个键值的公式。
:::

::: noteimportant
 如果用于引用函数参数或常数，公式中的
[用户宏](/manual/config/macros/user_macros) 将被扩展。
如果引用函数、主机名、监控项键值、键值参数或运算符，用户宏将不会被扩展。
:::

更为复杂的公式可以使用函数、运算符和括号的组合。你可以使用触发器表达式支持的所有功能和
[运算符](/manual/config/triggers/expression#operators)。请注意，语法略有不同，但是逻辑和运算符的优先级完全相同。

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

::: noteclassic
如果计算结果是一个浮点值，且如果可计算监控项信息类型是
*Numeric (unsigned)* ，则该值将被修剪为一个整数。
:::

在几种情况下，可计算监控项可能不受支持:

1.  引用的监控项
    -   没有找到
    -   被禁用了
    -   属于一个被禁止的主机
    -   不支持 (查阅例外情况
        [功能和不支持的监控项](/manual/appendix/triggers/functions#functions_and_unsupported_items),
        [具有不支持的监控项和未知值的表达式](/manual/config/triggers/expression#expressions_with_unsupported_items_and_unknown_values)
        and [运算符](/manual/config/triggers/expression#operators))
2.  没有数据来计算一个函数
3.  被零除
4.  使用不正确的语法

在Zabbix 1.8.1中引入了对可计算监控项的支持。\
从Zabbix
3.2开始，可计算监控项在某些情况下可能涉及不支持的监控项，如这些所述
[功能和不支持的监控项](/manual/appendix/triggers/functions#functions_and_unsupported_items)，
[具有不支持的监控项和未知值的表达式](/manual/config/triggers/expression#expressions_with_unsupported_items_and_unknown_values)
和 [运算符](/manual/config/triggers/expression#operators) 。

#### 用法示例

##### 示例 1

计算根分区上可用磁盘空间的百分比

使用 **last** 功能：

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

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

##### 示例 2

计算Zabbix处理的数值的10分钟的平均值

使用 **avg** 功能：

    avg("Zabbix Server:zabbix[wcache,values]",600)

请注意，长时间使用可计算监控项可能会影响Zabbix server的性能。

##### 示例 3

计算eth0的总带宽

两个功能综合：

    last("net.if.in[eth0,bytes]")+last("net.if.out[eth0,bytes]")

##### 示例 4

计算入站流量的百分比

更为复杂的表达式：

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

##### 示例 5

在可计算监控项中正确使用聚合

注意双引号是如何在引号内转义的：

    last("grpsum[\"video\",\"net.if.out[eth0,bytes]\",\"last\"]") / last("grpsum[\"video\",\"nginx_stat.sh[active]\",\"last\"]") 
