[comment]: # attributes: notoc

[comment]: # ({14681e09-a4f8cca1})
# 5 趋势函数

趋势函数与[历史函数](/manual/config/triggers/expression/history)不同，它使用[趋势](/manual/config/items/history_and_trends#keeping-trends)数据进行计算。

趋势会存储按小时聚合的值。  
趋势函数使用这些小时平均值，因此适用于长期分析。

趋势函数结果会被缓存，因此对具有相同参数的同一函数进行多次调用时，只会从数据库中获取一次信息。  
趋势函数缓存由[TrendFunctionCacheSize](/manual/appendix/config/zabbix_server#trendfunctioncachesize)服务器参数控制。

**仅**引用趋势函数的触发器，会按照表达式中最小的时间周期进行一次求值。  
例如，如下触发器：

```default
trendavg(/host/key,1d:now/d) > 1 or trendavg(/host/key2,1w:now/w) > 2
```

将每天求值一次。  
如果触发器同时包含趋势函数和历史函数（或[日期和时间](/manual/config/triggers/expression/time)和/或[nodata()](/manual/config/triggers/expression/history#nodata)函数），则会按照[通常原则](/manual/config/triggers#calculation-time)进行计算。

此处列出的所有函数均支持用于：

-   [触发器表达式](/manual/config/triggers/expression)
-   [计算型监控项](/manual/config/items/itemtypes/calculated)
-   [表达式宏](/manual/config/macros/expression_macros)

这些函数仅列出名称而未附加更多信息。  
单击函数可查看完整详细信息。

|Function|Description|
|--|--------|
|[baselinedev](#baselinedev)|返回最近一个数据周期与前几个季节中相同数据周期之间的偏差次数（基于 stddevpop 算法）。|
|[baselinewma](#baselinewma)|使用加权移动平均算法，对多个相等时间周期（“季节”）中相同时间范围的数据求平均，以计算基线。|
|[trendavg](#trendavg)|定义时间周期内趋势值的平均值。|
|[trendcount](#trendcount)|定义时间周期内，用于计算趋势值的成功检索到的历史值数量。|
|[trendmax](#trendmax)|定义时间周期内趋势值的最大值。|
|[trendmin](#trendmin)|定义时间周期内趋势值的最小值。|
|[trendstl](#trendstl)|返回检测周期内的异常率——一个介于 0 和 1 之间的小数值，即 `((异常值数量)/(总值数量))`。|
|[trendsum](#trendsum)|定义时间周期内趋势值的总和。|

[comment]: # ({/14681e09-a4f8cca1})

[comment]: # ({9b47c9ce-2a63633f})
##### 通用参数

-   `/host/key` 是常见的必填第一参数
-   `time period:time shift` 是常见的第二参数，其中：
    -   **time period** - 时间周期（最小为“1h”），定义为 \<N>\<time unit>，其中 `N` - 时间单位的数量，`time unit` - h（小时）、d（天）、w（周）、M（月）或 y（年）。
    -   **time shift** - [时间周期偏移](/manual/config/triggers/expression#time-shift)（请参见函数示例）

[comment]: # ({/9b47c9ce-2a63633f})

[comment]: # ({405ac9eb-bbe5ecf2})
### 函数详情

有关函数参数的一些通用说明：

-   函数参数以逗号分隔
-   可选函数参数（或参数部分）以 `<` `>` 表示
-   每个函数的特定参数会在对应函数中说明
-   `/host/key` 和 `time period:time shift` 参数绝不能加引号

[comment]: # ({/405ac9eb-bbe5ecf2})

[comment]: # ({e17e8d2f-f42e2c92})
##### baselinedev(/host/key,data period:time shift,season unit,num seasons) {#baselinedev}

返回最后一个数据周期与前几个季节中相同数据周期之间的偏差次数（使用 stddevpop 算法）。<br>

参数：

-   参见[通用参数](#common-parameters)<br>
-   **data period** - 一个季节内的数据收集周期，定义为 <N><time unit>，其中：<br>`N` - 时间单位的数量<br>`time unit` - h（小时）、d（天）、w（周）、M（月）或 y（年），必须等于或小于 season<br>
-   **season unit** - 定义一个季节的日历单位（h、d、w、M、y）；不能小于 data period<br> 
-   **num seasons** - 要评估的季节数量

示例：

```default
baselinedev(/host/key,1d:now/d,"M",6) #计算前一天与前 6 个月中同一天之间的标准差（总体）次数。如果某个月中不存在该日期，则使用该月的最后一天（将分析 7 月 31 日与 1 月 31 日、2 月 28 日……6 月 30 日之间的关系）
baselinedev(/host/key,1h:now/h,"d",10)  #计算前一小时与之前 10 天中每天相同时段之间的总体标准差次数
```

[comment]: # ({/e17e8d2f-f42e2c92})

[comment]: # ({508adac0-447a9dac})
##### baselinewma(/host/key,data period:time shift,season unit,num seasons) {#baselinewma}

使用加权移动平均算法，通过对多个相等时间周期（“季”）中相同时间范围的数据取平均值来计算基线。<br>

参数：

-   参见[通用参数](#common-parameters)<br>
-   **data period** - 一个季内的数据收集周期，定义为 <N><time unit>，其中：<br>`N` - 时间单位的数量<br>`time unit` - h（小时）、d（天）、w（周）、M（月）或 y（年），必须等于或小于 season<br>Time shift - 时间周期偏移量，以季为单位定义数据收集时间范围的结束点（见示例）<br>
-   **season unit** - 定义一个季的日历单位（h、d、w、M、y）；不能小于 data period<br>
-   **num seasons** - 要评估的季数

示例：

```default
baselinewma(/host/key,1h:now/h,"d",3) #计算截至昨天的最近 3 个完整天中相同小时的基线。如果“now”是星期一 13:30，则将分析星期五、星期六和星期日 12:00-12:59 的数据
baselinewma(/host/key,2h:now/h,"d",3) #计算截至昨天的最近 3 个完整天中相同两小时时间范围的基线。如果“now”是星期一 13:30，则将分析星期五、星期六和星期日 11:00-12:59 的数据
baselinewma(/host/key,1d:now/d,"M",4) #计算以上一个完整月之前的 4 个月中与“昨天”处于同一月内日期的基线。如果所需日期不存在，则取当月最后一天。如果今天是 9 月 1 日，则将分析 7 月 31 日、6 月 30 日、5 月 31 日和 4 月 30 日的数据。
```

[comment]: # ({/508adac0-447a9dac})

[comment]: # ({2e9dd145-50d2db8d})
##### trendavg(/host/key,time period:time shift) {#trendavg}

定义时间段内趋势值的平均值。

参数：

-   参见[通用参数](#common-parameters)

示例：

```default
trendavg(/host/key,1h:now/h) #前一小时的平均值（例如 12:00-13:00）
trendavg(/host/key,1h:now/h-1h) #两小时前的平均值（11:00-12:00）
trendavg(/host/key,1h:now/h-2h) #三小时前的平均值（10:00-11:00）
trendavg(/host/key,1M:now/M-1y) #一年前上个月的平均值
```

[comment]: # ({/2e9dd145-50d2db8d})

[comment]: # ({533dfdf1-d66e1f00})
##### trendcount(/host/key,time period:time shift) {#trendcount}

在定义的时间段内，用于计算趋势值的成功检索到的历史值数量。

参数：

-   参见[通用参数](#common-parameters)

示例：

```default
trendcount(/host/key,1h:now/h) #前一小时的值数量（例如 12:00-13:00）
trendcount(/host/key,1h:now/h-1h) #两小时前一小时的值数量（11:00-12:00）
trendcount(/host/key,1h:now/h-2h) #三小时前一小时的值数量（10:00-11:00）
trendcount(/host/key,1M:now/M-1y) #一年前上个月的值数量
```

[comment]: # ({/533dfdf1-d66e1f00})

[comment]: # ({f0a89e58-43665d11})
##### trendmax(/host/key,time period:time shift) {#trendmax}

定义时间段内趋势值的最大值。

参数：

-   参见[通用参数](#common-parameters)

示例：

```default
trendmax(/host/key,1h:now/h) #前一小时的最大值（例如 12:00-13:00）
trendmax(/host/key,1h:now/h) - trendmin(/host/key,1h:now/h) → 计算前一小时（12:00-13:00）的最大值与最小值之差（趋势差值）
trendmax(/host/key,1h:now/h-1h) #两小时前（11:00-12:00）的最大值
trendmax(/host/key,1h:now/h-2h) #三小时前（10:00-11:00）的最大值
trendmax(/host/key,1M:now/M-1y) #一年前上个月的最大值
```

[comment]: # ({/f0a89e58-43665d11})

[comment]: # ({793872d7-3c0143a2})
##### trendmin(/host/key,time period:time shift) {#trendmin}

定义时间段内趋势值中的最小值。

参数：

-   参见[通用参数](#common-parameters)

示例：

```default
trendmin(/host/key,1h:now/h) #前一小时的最小值（例如 12:00-13:00）
trendmax(/host/key,1h:now/h) - trendmin(/host/key,1h:now/h) → 计算前一小时（12:00-13:00）的最大值与最小值之差（趋势增量）
trendmin(/host/key,1h:now/h-1h) #两小时前的最小值（11:00-12:00）
trendmin(/host/key,1h:now/h-2h) #三小时前的最小值（10:00-11:00）
trendmin(/host/key,1M:now/M-1y) #一年前上个月的最小值
```

[comment]: # ({/793872d7-3c0143a2})

[comment]: # ({0ebc63ad-aba289ed})
##### trendstl(/host/key,eval period:time shift,detection period,season,<deviations>,<devalg>,<s window>) {#trendstl}

返回检测周期内的异常率——一个介于 0 和 1 之间的小数值，计算方式为 `((异常值数量)/(总值数量))`。

参数：

-   参见[通用参数](#common-parameters)<br>
-   **eval period** - 必须进行分解的时间周期（最小为 `1h`），定义为 <N><time unit>，其中<br>`N` - 时间单位的数量<br>`time unit` - h（小时）、d（天）、w（周）、M（月）或 y（年）<br>
-   **detection period** - eval period 结束前用于计算异常的时间周期（最小为 `1h`，不能长于 eval period），定义为 <N><time unit>，其中<br>`N` - 时间单位的数量<br>`time unit` - h（小时）、d（天）、w（周）<br>
-   **season** - 预期会出现重复模式（“季节性”）的最短时间周期（最小为 `2h`，不能长于 eval period，且 eval period 中的条目数必须大于结果频率（season/h）的两倍），定义为 <N><time unit>，其中<br>`N` - 时间单位的数量<br>`time unit` - h（小时）、d（天）、w（周）
-   **deviations** - 计为异常的偏差数（由 devalg 计算，可为小数）（必须大于或等于 1，默认值为 3）
-   **devalg**（必须用双引号括起来）- 偏差算法，可以是 *stddevpop*、*stddevsamp* 或 *mad*（默认）
-   **s window** - 用于提取季节性成分的 loess 窗口跨度（以滞后数计）（默认值为 eval period 中条目数 * 10 + 1）

示例：

```default
trendstl(/host/key,100h:now/h,10h,2h) #分析最近 100 小时的趋势数据，找出该周期最后 10 小时的异常率，预期周期性为 2h，如果评估周期中余项序列的值达到该余项序列 MAD 的 3 倍偏差，则视为异常
trendstl(/host/key,100h:now/h-10h,100h,2h,2.1,"mad") #分析截至 10 小时前的 100 小时趋势数据，找出整个周期的异常率，预期周期性为 2h，如果评估周期中余项序列的值达到该余项序列 MAD 的 2.1 倍偏差，则视为异常
trendstl(/host/key,100d:now/d-1d,10d,1d,4,,10) #分析截至 1 天前的 100 天趋势数据，找出该周期最后 10d 的异常率，预期周期性为 1d，如果评估周期中余项序列的值达到该余项序列 MAD 的 4 倍偏差，则视为异常，并将用于提取季节性成分的 loess 窗口默认跨度“eval period 中条目数 * 10 + 1”覆盖为 10 个滞后
trendstl(/host/key,1M:now/M-1y,1d,2h,,"stddevsamp") #分析一年前的上个月，找出该周期最后一天的异常率，预期周期性为 2h，如果评估周期中余项序列的值达到该余项序列样本标准差的 3 倍偏差，则视为异常
```

[comment]: # ({/0ebc63ad-aba289ed})

[comment]: # ({f897c466-1b9f4c40})
##### trendsum(/host/key,time period:time shift) {#trendsum}

定义时间段内趋势值的总和。

参数：

-   参见[通用参数](#common-parameters)

示例：

```default
trendsum(/host/key,1h:now/h) #前一小时的总和（例如 12:00-13:00）
trendsum(/host/key,1h:now/h-1h) #两小时前一小时的总和（11:00-12:00）
trendsum(/host/key,1h:now/h-2h) #三小时前一小时的总和（10:00-11:00）
trendsum(/host/key,1M:now/M-1y) #一年前上个月的总和
```

[comment]: # ({/f897c466-1b9f4c40})

[comment]: # ({ba58f5e4-9e520569})
参见[所有支持的函数](/manual/config/triggers/expression#functions)。

[comment]: # ({/ba58f5e4-9e520569})
