原理概述
时序预测作业与其他智能异常分析作业运行过程类似,包括数据读取、数据处理和输出结果三个步骤,并且以准实时的方式、每隔一段时间分别运行这三个步骤,这样您持续获知对于当前指标的预测结果。
- 数据读取:支持使用 SQL 查询的方式从 SLS 源 Logstore、MetricStore 获取指标序列,可以使用 SQL 同时获取多条指标序列,预测作业将分别对每条指标序列进行预测。
- 数据处理:预测算法基于 Prophet 的原理进行研发,算法认为指标序列可以分解为趋势项、周期项和假日项,并且分别对这三项进行拟合。使用 linear function 或者 logistic function 拟合趋势项,使用傅里叶函数拟合周期项,使用 indicator function 和 gaussian function 拟合假日项。最终对各个成分进行预测,预测结果的叠加即为对指标序列的预测结果。算法的细节介绍,请参看原论文。
- 输出结果:预测结果会全部写入到智能异常分析专用的 Logstore,internal-ml-log, 里面。您可以通过使用 SQL 语句在仪表盘中显示预测结果或者配置对于预测结果的告警。
算法配置
下面我们将以 nginx 访问日志为例,预测 nginx 访问流量的趋势走向。访问日志样例如下:
_container_ip_:172.30.58.6 _container_name_:nginx-ingress-controller _namespace_:kube-system _pod_name_:nginx-ingress-controller-5c9b6f978f-wcd5j _pod_uid_:366eae61-71b0-11e9-ab9c-00163e010d81 _source_:stdout body_bytes_sent:88188 client_ip:124.95.171.67 host:service.ali.com http_referer:- http_user_agent:Dalvik/1.6.0 (Linux; U; Android 4.4.4; HUAWEI G7-TL00 Build/HuaweiG7-TL00) method:GET proxy_upstream_name:prod-serviceA-8080 remote-user:- req_id:becb35139049e719f9c953c69869df39 request_length:531 request_time:0.004 status:200 upstream_addr:172.30.130.135:7873 upstream_response_length:88188 upstream_response_time:0.003 upstream_status:200 url:/web/data/queryMonitorData.do?_input_charset=utf-8 version:HTTP/1.1 x_forward_for:124.95.171.67
数据特征配置
在数据特征配置阶段,我们需要配置获取数据的 SQL 语句,然后配置时间、实体和特征字段以便从 SQL 的返回结果中构造指标序列。如下图所示
我们通过图示中的 SQL 语句获取了每个 proxy_upstream 每分钟的访问流量,注意预测作业在读取数据时以分页的方式不断读取所需数据,因此为了不重复消费或者遗漏数据,在 SQL 语句中我们需要添加 order by 子结构对查询结果进行排序,另外由于分页读取是自动进行的,在 SQL 语句后面不添加 limit 子结构。
每条指标序列表示某个实体的某个特征的值随时间变化的序列,我们通过对于下方时间、实体和特征字段的配置实现对于指标序列的获取。其中时间字段表示了指标序列的时间取值,上例中由 time 字段表示;实体字段和特征字段的组合标识了不同的指标序列,上例中由 proxy 字段表示实体,由 metric(即每分钟的访问量)字段表示特征,我们可以理解为预测作业将分别对每个实体的每个特征进行预测。如上图所示,配置页面以 proxy 为实体字段预览4个候选的实体值,我们可以从中勾选想要预测的实体,如果不勾选,默认对所有实体进行预测。假如我们配置了 n 个实体,m 个特征,那么总计会对 n*m 条序列进行预测,目前每个时序预测作业最多对5条指标序列进行预测,如果配置的序列数超过了上线,将从配置的序列中随机选择5条进行处理。
算法配置
算法配置中我们需要对待测序列中的周期成分和假日成分进行配置,另外还需要对于预测结果进行配置。
- 周期配置:非必填项。预测算法会自动识别一般指标序列常见的周期,包括天周期、周周期和年周期,对于这三个周期,我们不需要额外配置。对于指标序列中包含的其他周期,我们需要显示的进行配置。例如在上图中我们配置了数据的月周期,包括周期名称和周期长度。
- 假日配置:非必填项。配置对于指标序列走向有影响的假日,对于双休日不需要额外配置。通过选择所在国家,预测算法会自动考虑选中的国家的常见假日;如果有其他特殊假日或活动也会影响指标走向,我们需要在其他节假日中进行显式的配置。
- 预测配置:必填项。在预测配置中我们对于预测结果进行配置,配置项如下:
- 待测序列长度:表示待预测的指标序列的长度,其中数值项表示预测结果中时序点的个数,其后的单位表示每个点的时间单位。上例中我们要预测接下来120个点,每个点以分钟为粒度,即120分钟。
- 置信度:置信度主要影响预测结果中上下界的范围,置信度越高,预测结果中上下界之间范围越窄、其中的点出现的可能性越高。取值为 0.5~0.99,这里我们采用默认值 0.8。
- 采样数:采样数影响预测结果中上下界的精度,采样数越多,上下界的精度越高。
- 预测频率:预测作业会连续、每个一段时间对待测序列进行预测,预测频率表示每个多长时间对序列进行预测。
- 观测时长:观测时长表示在每次预测时将会考虑之前多长时间的历史数据,默认为3天。
- 调度配置:在调度配置中我们配置了预测作业首次预测的开始时间。
结果说明
在时序预测作业创建完成后,我们可以通过 智能异常分析 APP -> 时序预测 -> 作业标识 进入创建的作业中,查看作业的分析结果。
在页面上方有三个下拉选择框。通过选择预测ID选中某一次预测(预测作业的每次预测都由一个唯一ID标识),预测ID 格式为 Pred-{timestamp},{timestamp} 是预测进行的时间,{timestamp} 越大表示是对越新数据的预测结果;通过选择实体ID和指标选中要显示的指标序列。
预测结果如上面的曲线图所示,其中黄色曲线和灰色曲线分别表示数据上下界,蓝色曲线表示已发生的实际数据,绿色曲线表示预侧数据。曲线图中的红色竖线左侧数据表示对于已经发生的数据的拟合情况,右侧的数据即为预测结果。如果也测过程中出现异常情况,可以通过点击下面的查看异常事件显示。
所有的预测结果都写入到对应的 project 中的 internal-ml-log 这个 Logstore 中,您可以通过 SQL 语句进行查询,如下图所示
重要信息所在字段如下:
字段 |
字段含义 |
__tag__:__batch_id__ |
标识预测的预测ID |
__tag__:__job_name__ |
标识预测作业的名称 |
result.entity |
标识待测序列的实体值 |
result.metric |
标识待测序列的特征值 |
result.time |
标识该序列点发生的时间 |
result.value |
标识该序列点的实际值 |
result.expect_value |
标识该序列点的预测值 |
result.expect_lower |
标识该序列点的预测值上界 |
result.expect_upper |
标识该序列点的预测值下界 |
您可以通过 SQL 配合使用这些字段配置告警或者自定义仪表盘。