基于无监督学习的接口异常检测及根因定位方法
2023-11-22孙健飞
孙健飞
中国移动通信集团江苏有限公司
0 引言
当前,业务故障发现主要依赖对黄金指标(如交易量、交易响应时间、交易成功率)设定阈值或者同环比的对比。这种检测方法适用场景单一,在面对业务系统中大量差异化的KPI 数据检测时显得力不从心;对监控指标需配置大量规则,且无法做到规则与业务指标的准确匹配,导致误告警数量较多,需要投入人力筛选出有效告警。告警出现后,需对日志、报文进行分析排查原因,无法快速有效地判定根因。近年来,系统运维领域开始应用AIops 技术,以期提升运维效率,减少人工成本,但当前的技术主要采用有监督学习算法进行异常检测,采用单维分析方法进行故障根因定位,存在以下问题:
有监督学习易用性差:现有的AIops 算法,基本为有监督学习,使用时需要大量的人工标注;难以适应多样时间序列的数据特性,难以支持不同领域的异常检测,普适性较差;为获得更好的效果,需要频繁调整参数,易用性较差。
单维分析根因定位难:故障出现后,需要人工对日志、报文进行分析排查原因,随着接口依赖关系的增多,不仅需要分析接口本身性能,还需要人工从地市、渠道、分组、资源池等多个维度,进行联合分析,工作量巨大且难以快速有效根因定位。
因此,如何快速有效进行接口监控及故障定位是亟待解决的问题。
1 研究背景
软件系统作为服务或者能力提供方,通常以接口的形式对外提供服务,供外部渠道调用。为了便于对内部系统的服务接口进行集中化管理,一般将能力开放平台作为内外部系统交互的枢纽,将内部系统的接口信息在能力开放平台进行注册,由该平台作为对外提供服务的核心网关,便于对服务接口进行统一管理,包括注册、注销、业务量监控、失败告警、性能监测等。
随着业务规模的快速发展以及外部需求的日益增多,内部系统服务接口数量也越来越多,如何对这些接口准确地进行异常指标检测、故障预警、根因定位,第一时间提醒运维人员介入处理,成为亟待解决的运维难题。目前,能力开放平台对所有接口都配置了固定阈值监控,但是存在阈值设置依赖运维专家经验、阈值大小设定不合理、无法通过固定阈值覆盖全部接口、告警误报漏报、告警后根因定位困难等问题,亟待采用一套智能化的、快速精准的接口异常检测及根因定位方法,进行接口故障预警和性能管理。
2 方案描述
2.1 整体方案
搭建大数据处理平台,接入能力开放平台实时访问日志,按分钟级聚合出接口交易量、响应时间、成功率、响应率等核心指标。
建设业务指标异常检测和根因定位算法引擎,实现的算法包括变分自编码器、渐进梯度回归树、差分指数滑动平均、极值理论、周期性中值检测、LightGBM、蒙特卡洛搜索树等。
实现基于动态阈值的告警设定、告警列表查看、异常指标详情查询、根因定位查询、算法页面调参、模型训练等多种功能。
算法引擎对接大数据处理平台数据,实现业务指标实时异常检测,发现异常后发送告警短信,并自动触发根因定位算法,给出故障根因,缩小故障排查范围。系统架构及数据流图如图1 所示。
图1 系统架构及数据流图
2.2 功能架构
系统主要包括采集、存储、分析、服务、展示这5 个层级。
采集层:包括数据源层和数据处理层,通过Kafka 实时对接能力开放平台接口访问数据;
存储层:主要存储时序指标、日志文档、系统设置;
分析层:实时聚合计算能开访问数据,供业务指标异常检测算法和业务多维根因定位算法消费;
服务层:整合分析结果,向上层提供展示接口;
展示层:告警信息、指标异常波动、根因定位分析、仪表盘统一展示。
3 方法实现
通过引入AI 组合算法,结合接口历史数据指标进行无监督学习,可对接口的成功率、响应时长、失败量等性能指标进行实时异常检测,通过动态阈值触发机制实现智能告警,相较于传统的固定阈值触发告警,准确度更高。异常检测后,从故障接口出现时间段的大量交易明细中,利用渠道、应用集群、业务可用性等维度组合检测故障前后指标的劣化趋势进行根因排序,可快速对故障进行定界分析。
3.1 引入时序数据解析框架,提升海量数据处理能力
搭建大数据处理平台,接入能力开放平台实时访问日志,按照接口分类分钟级聚合出交易量、响应时间、成功率、响应率等核心指标。通过Kafka 搭建海量时序数据队列,以满足数据短期内接入的缓冲需求,并选择ElasticSearch 和InfluxDB 作为日志和指标两类时序数据的主要持久化数据库,以满足大量日增时序数据的归档和索引需求。
方案数据管理根据存储策略和对应存储方式,将数据架构分为数据管道、模型配置存储、日志持久存储和指标持久存储四个模块,架构模型如图2 所示。
图2 数据管理架构模型
在数据处理设计上,提供流式数据处理组件,通过拖拽方式,对指定数据源数据进行格式清洗,并输出到指定数据源。
3.2 构建业务指标异常检测算法引擎,实现动态阈值告警
业务指标异常检测的整体架构设计如图3 所示。
图3 异常检测设计架构
特征描述器:对于一条时间序列,首先对其特征进行表述。关注的特征包括:通过算法自动找到时间序列的周期、是否具有向上/向下的趋势性、周期偏移情况、数据抖动程度、上下界极限值、是否可以用阈值的方法、阈值采用多少合适。经过特征描述器描述后的数据会带有KPI 的关键特性信息,交给检测器。
检测器:根据时间序列的特征,计算资源的分配以及数据的时间,合理选用不同的模型组合来训练并生成对应的模型。通过分析KPI 历史数据,提取各项指标的关键特征,最终生成检测模型供后续分类器进行异常判断。
分类器:根据当前数据特性,并对比检测器提供的模型特性,最终给出检测结果。
实现算法:变分自编码器、渐进梯度回归树、差分指数滑动平均、极值理论、周期性中值检测。
数据积累到一定程度即可开始在实际环境中在线检测,在线检测使用已训练好的模型对应的关键特征生成算法来生成新的时间点的特征,并用已训练好的模型对新的时间点的异常程度打分,在线检测的过程中,需要对以下实际问题进行处理:
(1)缺点:某一固定时间采集点没有数据。
(2)乱序:后面的时间先到异常检测算法,而之前时间的点还在队列中。
(3)特征变化:由于新的部署等情况,时间序列的特征与之前不一样。
对于每个时间点对应的值,算法可以给出一个异常分数,根据异常检测的默认阈值,可以给出一个点是否是异常的结果,由于现实中时间序列的含义千差万别,一样的时间序列如果含义不同,预期的异常检测效果可能会不一样,所以提供敏感度供用户调整以达到用户满意的效果(用户唯一需要调整的参数,而且大多数时候并不需要调整),如果用户不知道如何调整敏感度以达到他们预期的效果,方案也提供标注反馈的方式,用户将他认为的异常漏报和正常误报标出,算法可以自动调整以达到用户预期的效果。
针对不同的场景,选择适合的算法来进行异常检测。大量的实验表明,没有一种算法或者开源解决方案能够处理多样的时间序列类型,而本方案的单指标异常检测算法也是多个算法的组合,通过特征描述器来指导用户选择特征和模型。
3.3 建立根因智能分析方法,快速定位接口降质原因
KPI 指标(请求量、失败量、响应时间等)与多维属性(能力提供方、地市、渠道等),是接口重要的监控内容。当一个KPI 的总体值发生异常时,想要解除异常,定位出导致该异常的根因所在的位置是关键一步,然而,这一步常常是充满挑战的,尤其当根因是多个维度属性值组合的时候。主要困难和挑战有以下两个方面:
(1)不同组合的访问量是相互依赖和影响的,真正的根因元素的访问量异常,可导致其他元素的访问量发生变化。
(2)由于KPI 拥有多维属性,因此随着维度的增加或粒度的细化,元素的数目往往呈现指数级增长趋势,可能需要在成千上万的多维属性空间进行搜索。
一种典型场景,当某个业务出现问题时,结合该业务多维度属性信息(例如地市、机房、交易类型等)尽可能准确地找到故障的根因集合,尽快恢复系统故障。
要解决上述问题,首先,需要解决由于元素间存在复杂关系导致的难以衡量任意一个元素集合接近根因的程度,本方案提出评判多维指标体系中元素集合是异常根因的可能性的评分方法。其次,为了解决巨大空间的搜索问题,使用“先聚类,再搜索”的搜索策略,以及多种剪枝方法,在不影响结果的前提下降低复杂度。
业务指标多维根因定位的整体架构设计如图4 所示。
图4 业务指标多维根因定位设计架构
当告警发生后,系统自动触发多维分析算法。算法会选取告警发生前后几分钟内的数据作为根因定位的源数据。根据告警发生时刻的维度组合对其他时间的数据进行缺失值填充、按维度聚合、KPI 计算等。例如,当某接口成功率异常,系统会选取异常时间点前后的一批数据按照地市、提供方、渠道、IP 等分维度进行预处理。处理完成后系统根据其数据规模来判断采用何种检测方式。算法采用的是可加和指标(整体指标值可由下层指标加和得到,例如,总交易量指标由各交易量相加得出)检测,维度组合分析过程中,其分析路径为一个树状的结构。在维度过多时,叶子节点的交易量会非常小,极限情况下只会在0-1 之间波动,此时再使用叶子节点的变化来衡量上层节点的“影响”(Potential Score)会不准确,所以数据评估的主要作用就是根据数据量选择部分异常检测或全局异常检测。检测完成后,系统针对每一个维度组合的异常检测得分进行极大值、极小值聚类,根据聚类结果确定搜索顺序。系统的维度指标通常较多,所以其维度组合也较多,如果对所有的维度组合都进行根因搜索,计算量巨大,对系统性能消耗严重,所以要对不相关的维度组合进行“剪枝”,“剪枝”过后的维度组合就会形成备选根因素的集合,最后经过组合、合并形成最终的分析结果。多维指标异常检测示意如图5 所示。
图5 多维指标异常检测示意图
规模较小的数据只对最外层(浅蓝色)维度组合进行异常检测,内层异常得分直接来源于其子节点加和。方案会根据参考的历史时间序列长度以及算法训练的时间综合选择不同的异常检测算法。主要用到的算法有LightGBM、极值理论。
4 应用效果
目前,该方案已应用于生产系统主要接口。接口触发告警时,将系统智能识别的结果与运维人员判定进行对比,结果一致,减少了运维人员手动排查问题的工作量。
2021 年06 月17 日17:27:00,接口VOUCHER 响应时间突增到4.1 秒,响应率突降到61%,系统成功率突降到61%,如图6 所示。
图6 接口指标异常检测实例
业务指标异常发生后,系统自动触发多维度根因定位算法进行根因分析,如图7 所示。
图7 指标多维根因分析实例
原因分析:经过系统对告警触发的维度因素及数据的智能化分析,推荐出引发本次告警的TOP3 维度组合,包括接口使用方(CHANNEL_ID)、接口提供方(APPLYER_ID)、 主机(HOST), 从图10 中可以看出, 具 体 为CHANNEL_ID=109000000030、APPLYER_ID=401000000002、HOST 为a19xtf2k6 和a19xtf2k7 的维度组合;从前两项维度组合可以看出,指标数据发生异常前,接口VOUCHER 平均响应时间是0.3 秒,指标数据发生异常后,接口VOUCHER平均响应时间分别突增到8.4秒和10秒以上。此刻所监控的整体接口响应时间达到2.5 秒,较告警发生前性能下降88.5%。可见此维度组合的数据异常度最高。
效果说明: 经过确认, 接口提供方APPLYER_ID=401000000002、HOST 为a19xtf2k6 和a19xtf2k7 的这两台机器,由于定时任务程序被异常触发,正在进行自动批量备份,占用了大量系统资源,主机CPU 使用率迅速被拉升,程序线程池被打满,导致接口使用方调用VOUCHER 业务响应时间升高。通过使用系统智能化的根因定位及异常检测算法,从异常发生到根因定位耗时5 分钟,传统方法通过告警及日志分析定位预计耗时30 分钟,节约了故障处理时长。
5 结束语
本文基于无监督学习技术,实现了对业务指标告警阈值的智能化设定,自适应方式避免了繁琐的手动配置阈值工作。同时,基于大数据和AI 技术,利用现有的AI 中台、数据中台、技术中台,提出动态基线异常检测算法和业务根因多维定位算法,实现了对业务指标异常的快速检测、故障根因快速定位,提升了业务支撑系统的数智化能力。该方案具有易于复制、便于推广的特点,已在能力开放平台规模使用,可适配基于虚机、容器环境的各类业务系统,也可进一步在管理信息等其他领域系统中进行推广使用。