以下内容来自【2021阿里云开发者大会】中的内容分享,本次分享的题目是《AIOps:自适应机器学习异常检测》,该分享意在阐述机器学习算法在企业中的落地实践,通过算法和算力尽可能的提升企业运维人员的效率,为业务的快速发展保驾护航。
分享人:
- 阿里云SLS 刘贵阳(悟冥)、胡文杰(笃林)
接下来正式进入本次分享:
业务快速发展和传统监控难以支撑之间的矛盾
1. 回顾运维监控人员的日常工作
- 当一个新业务上线前,运维人员都需要明确服务的部署情况,确定监控对象,以及监控对象的一些可观测性指标,并根据此完成相关日志数据的采集和处理;这里面会涉及到很多日志采集、指标加工等一系列脏活累活;
- 当确定了监控对象的黄金指标后,往往都需要先适配一组规则:某个接口每分钟的平均请求延时不要超过多少毫秒;单位分钟内的错误请求数量,不要超过多少等等;
- 随着业务逐步对外提供服务,以及各种运营活动的加推,我们运维监控同学一定会面临两个突出的问题:误报太多和漏报的风险,那么这两个问题都在现阶段都需要人工介入,进行阈值的调整;尤其是漏报的问题,更加需要人工盯屏的形式,设计新的监控规则去覆盖一些事件;
上述的场景中还都是在业务指标监控中所涉及到的,还没有提到服务的全链路的监控问题,服务部署环境中机器的监控问题。
2. 困难和挑战:监控对象呈爆炸式增长
我们的上层业务的部署形式逐渐想容器化和微服务化方向演进。我们的应用程序部署有之前的单物理机到单个容器中。这里带来了几个问题:
- 传统的部署模型,监控对象较为确定,对应的观测指标也比较确定,且存活的生命周期较长,因此可以较好的完成异常的监控;
- 服务在新的架构上部署后,其中涉及的组件和模块都增加了很多,其大都混部在相同的物理机器上,彼此之间的会有较大的影响,且服务对象的生命周期偏短,较难进行完整的监控;
且在公司中往往会有上百的研发人员,一般会维护上千的应用和服务,每个月多有上百次的变更,每分钟会涉及到几十甚至几百GB的监控数据。在这样庞大且复杂的规模下,传统的基于规则的监控无法更好的满足服务的稳定性要求。
3. 困难和挑战:传统的监控规则泛化能力弱
在我们的服务过程中,我们会发现传统监控规则泛化能力弱的几个典型问题:
- 基于人工规则的监控会有漏报、误报、规则阈值无法自适应的问题
- 如第一排中第一张图所示:其中时序曲线描述的是一个周期性的批处理作业的CPU利用率的曲线,我们可以看到,周期性的突刺信号是正常的,而图中有两个点是有问题的,对于特别到的突刺点来说,我们通过阈值的方式是可以较好的抓到的,但是对于图中红圈标注的点来说,通过规则的形式是很难写出来的;
- 第二张图描述的是线上服务的内存的曲线,我们可以看到前面是比较平稳的,在某个时刻发生变更后,机器的内存上涨,对于传统的监控规则来说,后续的超过阈值的时间点都是异常,但是真实的业务场景中,更合理的是关注到某个时刻指标发生了突变,并且持续了一段时间后趋于稳定,那么后续的异常点就不应该持续的报出来;
- 新业务的指标监控无法复用现有的监控规则
- 对于上图中,我们可以看到两条关于访问请求的时序指标,通过几个维度来分析下:
- Y轴的范围差距是比较大的,第一张图是按照K(千)来划分的,第二张图是按照Mil(百万)来划分的;
- 我们可以看到指标的波动性还是比较大的,且曲线的形态差异较大,我们使用的传统的同比、环比、均值等策略无法实现我们的监控预期
自适应时序监控的设计方案
在两年前,我们在思考一个事情,能否充分利用机器学习的能力来解决监控系统中时序异常检测的问题,将更多的基于《规则+人工经验》的能力,逐步转移到《算法+经验知识》的系统能力。让可观测性平台具备自适应、自学习、自反馈的能力。接下来,让我们一起来看下SLS在这个问题上的探索。
1. 智能时序系统的基础能力
- 系统应该具备的基础能力如下:
- 准确且全面的发现异常:这里要求系统的对于时序异常识别的准确率和召回率都要求较高,这个是智能系统需要的最为核心也作为基础的能力
- 同时系统需要具有一定的适应能力,因为系统是给“人”来使用的,算法判定的结果是通过数值的角度去分析的,异常不等同于故障(这里我们去区分下不同的定义:一个是Incident、一个是Problem)
- 算法的输出结果应该是结构化的,且其异常应该具备可比较的分数,且分数可以量化到[0, 1]之间;便于对接后续的业务系统
- 同时支持较好的扩展能力:可支持数十万时序监控对象进行较为复杂的模型监控
2. SLS的解决方案
- 在图中第一部分描述的是我们服务部署环境中所需要的关注的一些服务的相关日志,主要包含了:程序日志数据、组件日志数据、以及对应的时序指标数据、外带上系统的事件数据等,这些数据统一都可以按照Log模型、Metric模型和Trace模型统一存储在SLS平台中。
- SLS平台提供了丰富的数据处理手段,可以针对原始的数据做行处理,解决杂乱数据规整、富化、分发的能力,同时平台上提供了兼容SQL92的查询分析能力,可以快速的定制SQL的调度任务,提取相关的指标数据,供后续的分析和可视化。
- 用户可以开启智能巡检服务,消费结构化的指标数据,通过智能算法产生结构化的异常事件,通知到用户,用户可以对异常事件进行相关的反馈,后续我们会进行逐步跟告警管理系统打通,解决事件跟踪和关系推断的问题。
- 对于上图中,左边:数据接入和数据预处理部分、右边:告警管理这两部分会有单独的详细介绍,这里我们着重介绍下智能巡检服务。
3. SLS智能巡检服务简介
具体的算法原理:采用无监督学习算法,自动识别实体的数据特征,根据数据特征选择不同的算法组合,针对数据流实时建模,完成异常检测任务,并根据用户的打标信息,训练监督模型,实现算法的不断优化,提高准确率。具体拆解如图中流程图所示:
- 巡检系统的处理对象是监控指标,当监控对象有较多的历史数据时,系统会进行时序画像的构建:主要是从业务的周期性、趋势性、波动性等几个维度去刻画,能较好的学习时序的状态;当某个对象的时序数据较少时,我们会先退化到统计建模的策略,主要去分析指标的局部统计特征,当数据逐步累积到一定量后,会进行详细的时序画像的构建;
- 我们构建的是一个时序的巡检系统,处理的对象是实时的数据流,逐点送入时序建模(Time2Graph算法),会对接我们的异常判别模型,输出对应的标准异常事件后会通过钉钉机器人的渠道,将结果通知到用户,用户可以选择对系统的输出进行反馈,平台会自动的收集到您的反馈信息,完成特征和标签的对应,训练出对于异常事件样本的监督模型,将模型应用到异常判别器,优化系统给用户的输出,真正做到千线千面;
- 值得一提的是:这套系统中核心的时序建模算法演化自《Time2Graph系列算法》,核心作者就是我们团队的 胡文杰 同学,相关论文已经发表在AAAI、WSDM、TKDE顶级数据挖掘会议上,感兴趣的各位可以翻阅论文,欢迎讨论交流。
在SLS平台中的使用展示
智能巡检服务目前已经在线上正式对外发布,各位可以查询SLS官方文档提供了详细的操作说明,您在使用过程中遇到问题可以联系我们,希望时序巡检服务可以解决您在日常监控中反复配置若干规则的繁琐和低效,提升运维同学的幸福指数。
大家在使用过程中,遇到问题可以通过如下方式联系我们