5 趋势函数

历史函数不同,趋势函数使用趋势数据进行计算。

趋势会存储按小时汇总的值。 趋势函数使用这些每小时平均值,因此适用于长期分析。

趋势函数结果会被缓存,因此对同一函数、相同参数的多次调用,只会从数据库获取一次信息。 趋势函数缓存由TrendFunctionCacheSize服务器参数控制。

仅引用趋势函数的触发器会按照表达式中最小的时间周期每次评估一次。 例如,像下面这样的触发器:

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

将按天评估一次。 如果触发器同时包含趋势和历史(或日期和时间和/或nodata())函数,则会按照通常原则进行计算。

此处列出的所有函数都支持以下场景:

以下仅列出函数名称,不提供额外信息。 点击函数可查看完整详情。

Function Description
baselinedev 返回最后一个数据周期与前几个季节中相同数据周期之间的偏差数量(采用 stddevpop 算法)。
baselinewma 使用加权移动平均算法,通过对多个相等时间周期(“季节”)中相同时间范围的数据求平均来计算基线。
trendavg 定义时间段内趋势值的平均值。
trendcount 在定义时间段内,用于计算趋势值的已成功获取的历史值数量。
trendmax 定义时间段内趋势值的最大值。
trendmin 定义时间段内趋势值的最小值。
trendstl 返回检测期间的异常率 - 一个介于 0 和 1 之间的小数值,即 ((异常值数量)/(总值数量))
trendsum 定义时间段内趋势值的总和。
通用参数
  • /host/key 是一个常见的必填第一个参数
  • time period:time shift 是一个常见的第二个参数,其中:
    • 时间周期 - 时间周期(最小为 '1h'),定义为 <N><时间单位>,其中 N - 时间单位的数量,time unit - h(小时)、d(天)、w(周)、M(月)或 y(年)。
    • 时间偏移 - 时间偏移(参见函数示例)

函数详情

关于函数参数的一些一般说明:

  • 函数参数之间用逗号分隔
  • 可选函数参数(或参数的一部分)用 < > 表示
  • 每个函数都会说明其特定参数
  • /host/keytime period:time shift 参数绝不能加引号
baselinedev(/host/key,data period:time shift,season unit,num seasons)

返回最后一个数据周期与前几个季节中相同数据周期之间的偏差数量(按 stddevpop 算法计算)。

参数:

  • 参见 common parameters
  • data period - 一个季节内的数据采集周期,定义为 <N><time unit>,其中:
    N - 时间单位的数量
    time unit - h(小时)、d(天)、w(周)、M(月)或 y(年),必须小于或等于 season
  • season unit - 定义一个季节的日历单位(h、d、w、M、y);不能小于 data period
  • num seasons - 要评估的季节数量

示例:

baselinedev(/host/key,1d:now/d,"M",6) #计算前一天与之前 6 个月中相同日期之间的标准差数量(总体)。如果前一个月中不存在该日期,则使用该月的最后一天(将分析 Jul,31 对 Jan,31、Feb,28、...、June,30)
baselinedev(/host/key,1h:now/h,"d",10)  #计算前一小时与之前 10 天中相同一天时刻之间的总体标准差数量
baselinewma(/host/key,data period:time shift,season unit,num seasons)

使用加权移动平均算法,通过对多个相等时间周期(“季节”)中相同时间范围的数据取平均值来计算基线。

参数:

  • 参见 common parameters
  • data period - 一个季节内的数据采集周期,定义为 <N><time unit>,其中:
    N - 时间单位的数量
    time unit - h(小时)、d(天)、w(周)、M(月)或 y(年),必须小于或等于 season
    Time shift - 时间周期偏移量,定义了按季节划分的数据采集时间范围的结束时间(参见示例)
  • season unit - 定义一个季节的日历单位(h、d、w、M、y);不能小于 data period
  • num seasons - 要评估的季节数量

示例:

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 日的数据。
trendavg(/host/key,time period:time shift)

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

参数:

示例:

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) #一年前上个月的平均值
trendcount(/host/key,time period:time shift)

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

参数:

示例:

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) #一年前上个月的值数量
trendmax(/host/key,time period:time shift)

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

参数:

示例:

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)最大值和最小值之间的差值(趋势 delta)
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) #一年前上个月的最大值
trendmin(/host/key,time period:time shift)

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

参数:

示例:

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) #一年前上个月的最小值
trendstl(/host/key,eval period:time shift,detection period,season,<deviations>,<devalg>,<s window>)

返回检测期间内的异常率 - 一个介于 0 和 1 之间的小数值,即 ((异常值数量)/(总值数量))

参数:

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

示例:

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 天趋势数据,找出该期间最后 10 天的异常率,预期周期为 1d;如果评估期间的残差序列值达到该残差序列 MAD 的 4 个偏差,则视为异常,并将季节性提取的 loess 窗口默认跨度“eval period 中条目数的 10 倍加 1”覆盖为 10 个滞后
trendstl(/host/key,1M:now/M-1y,1d,2h,,"stddevsamp") #分析一年前的上个月,找出该期间最后 1 天的异常率,预期周期为 2h;如果评估期间的残差序列值达到该残差序列样本标准差的 3 个偏差,则视为异常
trendsum(/host/key,time period:time shift)

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

参数:

示例:

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) #一年前上个月的总和

请参见 all supported functions