SLS 智能异常分析 APP 时序预测最佳实践

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 日志服务 SLS 智能异常分析 APP 提供自动化、智能化时序预测能力,可以根据历史数据预测时序指标接下来一段时间的走势。您可以使用指标的走势并配合告警对于系统的潜在风险进行预警,例如当某个指标的预测值超过某个阈值时对运维人员进行告警;另外指标的走势也可以帮助您及时进行决策,例如预测到 CPU 使用率将会持续上升时,及时对系统进行扩缩容。

原理概述

时序预测作业与其他智能异常分析作业运行过程类似,包括数据读取、数据处理和输出结果三个步骤,并且以准实时的方式、每隔一段时间分别运行这三个步骤,这样您持续获知对于当前指标的预测结果。

  • 数据读取:支持使用 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 配合使用这些字段配置告警或者自定义仪表盘。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
12天前
|
人工智能 Oracle Java
解决 Java 打印日志吞异常堆栈的问题
前几天有同学找我查一个空指针问题,Java 打印日志时,异常堆栈信息被吞了,导致定位不到出问题的地方。
28 2
|
14天前
|
XML JSON 监控
告别简陋:Java日志系统的最佳实践
【10月更文挑战第19天】 在Java开发中,`System.out.println()` 是最基本的输出方法,但它在实际项目中往往被认为是不专业和不足够的。本文将探讨为什么在现代Java应用中应该避免使用 `System.out.println()`,并介绍几种更先进的日志解决方案。
38 1
|
2月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP的编程实践中,设计模式是解决常见软件设计问题的最佳实践。单例模式作为设计模式中的一种,确保一个类只有一个实例,并提供全局访问点,广泛应用于配置管理、日志记录和测试框架等场景。本文将深入探讨单例模式的原理、实现方式及其在PHP中的应用,帮助开发者更好地理解和运用这一设计模式。
在PHP开发中,单例模式通过确保类仅有一个实例并提供一个全局访问点,有效管理和访问共享资源。本文详细介绍了单例模式的概念、PHP实现方式及应用场景,并通过具体代码示例展示如何在PHP中实现单例模式以及如何在实际项目中正确使用它来优化代码结构和性能。
43 2
|
1月前
|
监控 安全 Apache
构建安全的URL重定向策略:确保从Web到App平滑过渡的最佳实践
【10月更文挑战第2天】URL重定向是Web开发中常见的操作,它允许服务器根据请求的URL将用户重定向到另一个URL。然而,如果重定向过程没有得到妥善处理,可能会导致安全漏洞,如开放重定向攻击。因此,确保重定向过程的安全性至关重要。
51 0
|
2月前
|
Java
日志框架log4j打印异常堆栈信息携带traceId,方便接口异常排查
日常项目运行日志,异常栈打印是不带traceId,导致排查问题查找异常栈很麻烦。
|
2月前
|
开发者 Python
基于Python的日志管理与最佳实践
日志是开发和调试过程中的重要工具,然而,如何高效地管理和利用日志常常被忽略。本文通过Python中的logging模块,探讨如何使用日志来进行调试、分析与问题排查,并提出了一些实际应用中的优化建议和最佳实践。
|
2月前
|
JSON 缓存 fastjson
一行日志引发的系统异常
本文记录了一行日志引发的系统异常以及作者解决问题的思路。
|
3月前
|
人工智能 Java Spring
Spring框架下,如何让你的日志管理像‘AI’一样智能,提升开发效率的秘密武器!
【8月更文挑战第31天】日志管理在软件开发中至关重要,不仅能帮助开发者追踪问题和调试程序,还是系统监控和运维的重要工具。在Spring框架下,通过合理配置Logback等日志框架,可大幅提升日志管理效率。本文将介绍如何引入日志框架、配置日志级别、在代码中使用Logger,以及利用ELK等工具进行日志聚合和分析,帮助你构建高效、可靠的日志管理系统,为开发和运维提供支持。
61 0
|
3月前
|
SQL 数据库 Java
Hibernate 日志记录竟藏着这些秘密?快来一探究竟,解锁调试与监控最佳实践
【8月更文挑战第31天】在软件开发中,日志记录对调试和监控至关重要。使用持久化框架 Hibernate 时,合理配置日志可帮助理解其内部机制并优化性能。首先,需选择合适的日志框架,如 Log4j 或 Logback,并配置日志级别;理解 Hibernate 的多级日志,如 DEBUG 和 ERROR,以适应不同开发阶段需求;利用 Hibernate 统计功能监测数据库交互情况;记录自定义日志以跟踪业务逻辑;定期审查和清理日志避免占用过多磁盘空间。综上,有效日志记录能显著提升 Hibernate 应用的性能和稳定性。
49 0
|
2天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
64 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板