如何使用下探分析定位多维指标异常根因

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 在系统运维过程中,关键指标的异常变化往往意味着服务异常、系统故障等等。因此我们往往会对一些关键指标进行自动巡检,例如异常检测和时序预测等等,及时感知指标的异常变化,了解系统的健康状况。对于复杂系统来说,感知到异常后直接在系统层面根因定位可能是十分困难的。因此我们需要一些手段缩小问题的排查范围或者直接定位问题,如使用 trace 根因分析等等。阿里云日志服务上线了下探分析功能,用于多维指标异常根因定位。我们将介绍该功能的使用场景和使用案例。

使用场景

很多时序指标可以分解为若干个维度,每一个维度都具有不同的值域。例如网站的访问流量可以按照流量的来源省份分解,如分解为来自河南的访问流量和来自广东的访问流量等等;也可以按照流量的来源渠道分解,如分解为来自 PC 端的流量和来自移动端的流量。也可以按照多个维度的组合对时序指标进行分解,如来自河南的移动端的流量和来自广东的 PC 端的流量等等。如果时序指标可以划分成 n 各维度 dim1, dim2, ... , dimn, 每个维度分别有 m1, m2, ... , mn 个可选值。那么时序指标可以分解为 m1 x m2 x ... x mn 个最细粒度的子时序指标。以访问流量举例,省份维度有 33 个可选值,渠道维度有 2 个可选值,那么总计有 66 个子时序指标。全局的指标是这些子时序指标聚合而成的。如果时序指标可以分解成很多维度,或者某些维度的可选值有很多,那么会有很多子指标序列。全局序列的异常变动往往是由若干个子序列的异常变动导致的。如果我们分别对每一子序列都配置一个异常检测任务,那么这些任务的配置量和维护成本都会很高。往往我们都只对若干聚合后的关键指标配置异常检测任务,如监控网站访问的总流量(不区分其各个维度)。这种情况下如果总流量检测到异常,由于其维度组合数量很多,我们很难人工判断到底是哪些省份,或者是哪些渠道,或者是哪些省份的哪些渠道访问流量异常导致了全局的流量异常。为了处理这种全局指标出现异常时,怎样快速定位异常维度根因的问题,我们上线了下探分析功能,帮助您自动定位多维指标场景的异常根因,缩小故障排查范围。样例总览图如下

image.png


使用案例

下面我们介绍如何使用日志服务提供的智能巡检服务和下探分析服务,对时序指标的异常变动进行多维指标的根因下探。智能巡检任务下探分析任务的详细配置请参考官方帮助文档。我们案例中使用的数据包括三个维度,attr_a,attr_b 和 attr_c,每个维度有 5 个可选值,即有 125 个最细粒度的子指标序列。


智能巡检任务配置

首先我们使用智能巡检任务对指标进行异常检测,由于我们后续使用下探任务进行多维度的根因定位,因此我们只需要对总的序列配置异常检测任务即可。其中主要配置步骤是通过 SQL 构造待检测的指标序列,SQL 需要返回时间列、实体列和指标列,以便智能巡检任务可以使用这些列构造指标序列

image.png

从构造指标序列的 SQL 中我们直接讲各个维度组合的子序列的指标聚合,即仅对总指标序列进行异常检测。其他参数配置参考智能巡检任务帮助文档。

后续的下探分析任务使用智能巡检的检测结果作为异常事件触发多维指标的根因定位。智能巡检的检测结果写入到指定的 internal-ml-log 日志库中。检测结果的  json 形式大致如下,我们对构造异常事件所需的字段简要介绍一下

{
"__tag__:__data_type__": "anomaly_detect",
"__tag__:__instance_name__": "29030-f13218bd704462b86a8b64e27881fa32",
"__tag__:__job_name__": "etl-1681354396022-265300",
"__tag__:__model_name__": "13fd1a10d5921e99bd06b81590017ed6",
"__tag__:__schedule_id__": "f13218bd704462b86a8b64e27881fa32",
"algo_type": "supervised_anomaly_detection",
"entity": {
"entity": "artificial"  },
"meta": {
"project_name": "sls-ml-demo",
"logstore_name": "artificial-series",
"topic": ""  },
"result": {
"dim_name": "metric",
"score": "0.0012267196",
"anomaly_type": "None",
"is_anomaly": false,
"value": 3244.0964077708954  },
"version": "v0.3"}

字段

说明

__tag__:__data_type__

标识数据的类型,值为 anomaly_detect 时表示是异常检测结果,数据的写入时间,__time__ (日志服务保留字段),是异常事件发生的时间

__tag__:__job_name__

标识智能巡检任务的名称

result.score

标识事件的异常程度,取值为 0 ~ 1,取值越大,异常程度越高

进入配置的智能巡检任务的仪表盘页面,我们可视化的查看检测到的异常事件(异常分数 result.score 大于设置的阈值的事件),如下所示智能巡检任务检查到若干指标的异常变动

image.png

检测到异常时,我们一般会参考其他的系统指标和服务的运行日志等等,通过各种线索判断系统是否出现异常、确定异常的根因。在复杂系统中这个根因定位过程缓慢繁琐,如果有方法可以自动的缩小异常的排查范围,那么将有效的提高对于服务的运维能力。如果像案例中的检测的指标可以分解为多个维度的子指标序列,那么我们可以尝试使用下探分析任务确定导致异常的根因维度。


下探分析任务配置

进入日志服务智能异常分析的下探分析页面,点击右上方的立即创建创建下探分析作业。


数据配置

进入作业配置,配置作业名称后进入数据配置页面。数据配置包括异常事件源配置和多维指标序列配置。下探分析作业统一使用 SQL 查询语句从日志库中获取这两类数据。


多维指标序列配置

与智能巡检任务配置类似,我们首先需要设置多维指标序列数据源的 project、日志库。之后我们配置 SQL 获取最细粒度的维度组合及其每一时刻的指标值。即 SQL 的查询结果列包含三个部分:时间列、维度列和指标列,通过 SQL 下探分析任务可以获知某个维度组合在某个时间点的取值是多少。如下所示

image.png

相比智能巡检获取全局指标序列的 SQL,下探分析使用的 SQL 显式的获取了各个维度组合序列。例如数据预览中的第一行表示 “满足 attr_a=a5 且 attr_b=b1 且 attr_c=c4 的指标在 2023-04-14 14:05:00(时间戳 1681452300)的取值是 19.665”。SQL 配置完成后,在数据预览框下方配置哪一列是时间列,哪些列是维度列,哪些列是指标列。除此以外,还需要配置 SQL 的调度粒度,由于在我们案例中数据点每隔5分钟采样一次,所以我们配置粒度为300秒(5分钟)。这样下探分析任务会每隔5分钟运行一次配置的 SQL 获取新的多维指标。建议在 SQL 中对待分析的序列按照一定的时间窗口进行聚合,如3分钟,5分钟等,粒度设置为时间窗口的长度即可。


异常事件源配置

在完成配置多维指标序列后,我们需要对异常事件源进行配置。下探分析任务从事件源获知什么时刻出现了异常事件,然后触发对于异常事件的多维指标异常根因定位。点击下方的添加事件配置创建事件源。异常事件使用 SQL 语句从日志库中获取的,我们首先需要配置 project 和日志库。由于我们使用智能巡检任务的检测结果,所以我们配置 project 为巡检任务使用的 project,日志库为保存检测结果的 internal-ml-log 日志库。之后我们通过 SQL 获取检测到的异常事件时间和异常,如下

*and __tag__:__job_name__: etl-1681354396022-265300and __tag__:__data_type__: anomaly_detect |selecttime, IF(score >0.8,true,false)as status
FROM(select    __time__ astime,    cast(json_extract(result,'$.score')asdouble)as score
FROM log
limit all
)limit1000000

在查询分析语句中我们使用 __tag__:__job_name__ 和 __tag__:__data_type__ 字段过滤出配置的智能巡检作业的异常检测结果。在 SQL 部分获取异常的发生事件和异常分数(result.score),只有当异常分数大于 0.8 认为检测到的异常是真实的异常。SQL 的结果列需要至少包含两列,时间列和状态列,只有当状态列取值为 true 或者为正数时,认为在对应时间确实有异常发生。具体配置如下

image.png

如果有多个事件源,也可以通过点击添加事件配置按键继续添加,配置完成后也可以对事件源进行热更新。


算法配置

完成数据配置后点击下一步进入算法配置页面,算法配置项的解释可以参考官方帮助文档。需要关注的是数据延迟配置项,表示下探分析任务在读取数据时需要等待的时间,以秒为单位。如果配置60秒延迟,那么任务需要等到 12:06 再读取 12:00 ~ 12:05 的数据时(延迟一分钟)。这是因为事件源中的异常事件数据写入到日志库中可能有一定的延迟,为了保证下探任务读到异常事件,需要设置其数据延迟大于日志事件的写入延迟。由于智能巡检任务从检测到异常事件到把检测结果写入到日志库大约有60秒的延迟,因此我们设置下探分析的数据延迟为90秒。配置如下

image.png

之后点击下方的完成按键就开始运行下探分析任务了。


下探分析结果说明

点击刚刚配置的下探分析作业,进入分析结果仪表盘。在页面上方选择适当的时间范围、事件源名称和事件发生的时间,就会在下方显示对于这个异常事件的根因定位结果。如果事件时间右侧显示绿色标签 “状态: 成功”,表示下探分析作业定位到了对应的异常事件的根因;如果显示红色标签 “状态: 失败”,表示没有定位到对应异常事件的根因,如下

image.png

如果定位到根因,那么在页面的下方会显示所有可能得根因,以及每一个根因导致异常事件的可能性。通过勾选这些根因,我们可以查看这些根因对于原始序列的影响

  • 正向显示:显示包含这些根因维度的子序列聚合后的序列的形态。如下,可以看到包含异常维度的序列在异常事件发生的时刻也有形态上的异常变化,说明勾选的维度可能确实是异常事件的根因。image.png
  • 反向显示:显示不包含这些根因维度的子序列聚合后的序列的形态。如下,可以看到不包含异常维度的序列在异常事件发生的时刻形态正常、无明显异动,说明勾选的维度可能确实是异常事件的根因。image.png

如果想要增删改事件源,可以点击上方的事件数据管理,进入事件源管理页面。image.png

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
运维 监控 JavaScript
(ARMS-AIOps)一文教你用Attributor算法实现多维下钻分析
常见的AIOps应用路径为:对监控的各种关键性能指标(KPI)进行实时异常检测;对多维指标进行根源分析,快速下钻到异常维度和元素;基于应用拓扑和实时Trace,实现根因定位;结合CMDB、关联等、构建异常根因上下文,帮助快速修复问题。 作为KPI指标, 往往包含了很多维度和元素,最显而易见的则是对每一个维度的元素都进行实时异常检测。 对于维度组合笛卡尔集数量很长的场景, 该方案的成本则有点难以承受
6097 0
|
网络虚拟化
VLAN(虚拟局域网)简介与配置指南
VLAN(虚拟局域网)简介与配置指南
1140 1
|
存储 消息中间件 监控
阿里云sls日志服务简介和使用流程
阿里云SLS(Simple Log Service)是一种高度可扩展的、低成本的日志托管服务,它提供了全面的日志采集、存储、分析和呈现功能。阿里云SLS是全球首个在公共云上提供日志服务的企业,它具有高可靠性、高稳定性和高安全性等特点,可满足不同企业的日志需求。
|
缓存 运维 安全
云巧组件标准
可组装式应用的理论,结合了云原生的理念和交付质量要求,云巧对云巧组件设计了六大维度的标准。根据这六大维度名称的英文首字母组成单词ACCORD
2923 0
|
7月前
|
自然语言处理 算法 安全
从“是什么”到“为什么”:Aloudata Agent 智能归因的底层逻辑与配置指南
Aloudata Agent 是 Aloudata 推出的一套分析决策智能体,将 NoETL 明细语义层作为数据底座,以指标为中心进行语义一致的对话式数据分析。通过自然语言即刻获取数据结果,支持智能数据结果解读,以及智能多维归因和因子归因分析,让企业深层次洞察异常数据波动原因。
|
SQL JSON 前端开发
若依RuoYi脚手架二次开发教程(二次开发必学技能)
本次我们将通过一个菜品管理模块开发的案例,来演示拿到若依框架后,如何在若依管理系统上进行二次开发,升级改造为自己的管理系统。适合以若依作为项目脚手架的公司开发人员、毕业设计的学生及开源项目学习者。
10520 1
若依RuoYi脚手架二次开发教程(二次开发必学技能)
|
机器学习/深度学习 运维 监控
基于特征子空间的高维异常检测:一种高效且可解释的方法
本文探讨了一种替代传统单一检测器的方法,通过构建多个专注于特征子集(子空间)的检测器系统,来提高异常检测的准确性和效率。文章详细介绍了子空间方法在处理高维数据时的优势,包括缓解维度灾难、提高异常检测的可解释性和计算效率。同时,文中还讨论了子空间的选择策略,如基于领域知识、相关性、随机选择等,并介绍了PyOD工具包中实现子空间异常检测的具体方法。通过这些技术,异常检测系统能够更有效地识别数据中的异常记录,尤其是在特征数量众多的情况下。
631 9
基于特征子空间的高维异常检测:一种高效且可解释的方法
|
关系型数据库 MySQL Java
基于SpringBoot+Vue旅游管理系统【源码(完整源码请私聊)+论文+演示视频+包运行成功】
基于SpringBoot+Vue旅游管理系统【源码(完整源码请私聊)+论文+演示视频+包运行成功】
464 0
基于SpringBoot+Vue旅游管理系统【源码(完整源码请私聊)+论文+演示视频+包运行成功】
|
数据采集 编解码 监控
函数计算助力语雀构建稳定且安全的业务架构
语雀是一个专业的云端知识库,用于团队的文档协作。现在已是阿里员工进行文档编写和知识沉淀的标配,并于 2018 年开始对外提供服务。
6220 116
函数计算助力语雀构建稳定且安全的业务架构
|
C# Windows 开发者
超越选择焦虑:深入解析WinForms、WPF与UWP——谁才是打造顶级.NET桌面应用的终极利器?从开发效率到视觉享受,全面解读三大框架优劣,助你精准匹配项目需求,构建完美桌面应用生态系统
【8月更文挑战第31天】.NET框架为开发者提供了多种桌面应用开发选项,包括WinForms、WPF和UWP。WinForms简单易用,适合快速开发基本应用;WPF提供强大的UI设计工具和丰富的视觉体验,支持XAML,易于实现复杂布局;UWP专为Windows 10设计,支持多设备,充分利用现代硬件特性。本文通过示例代码详细介绍这三种框架的特点,帮助读者根据项目需求做出明智选择。以下是各框架的简单示例代码,便于理解其基本用法。
1423 0