作者|梵登、白玙
审核&校对:白玙
编辑&排版:雯燕
背景
异常检测作为智能运维(AIOps)系统中基础且重要功能,其旨在通过算法自动地发现 KPI 时间序列数据中的异常波动,为后续的告警、自动止损、根因分析等提供决策依据。那么,我们该如何在实际场景中使用异常检测呢,而异常检测又是什么,今天我们就进行一次深入讲解。
什么是异常检测?
在一切开始前,我们首先需要了解什么是异常检测。异常检测是指从时间序列或者事件日志中,去识别出不正常的事件、现象等。我们这里讲的异常检测特指时间序列的异常检测。通过对时间序列的值大小,曲线形态等进行综合判定,可以发现曲线异常点。异常的表现一般是指时间序列发生了不符合预期的上升、下降或者波动。
举例来说:某台机器的内存使用率指标一直在 40% 左右的水位波动, 突然飙升至 100%;某个 Redis 数据库的连接数正常水平一直在 100 数量左右, 突然发生了大规模的下跌至 0 的现象;某个业务的在线人数在 10 万左右波动,突然下跌到了 5 万等等。
什么是时间序列?
时间序列是指一组按照时间发生先后顺序进行排列的数据点序列,通常一组时间序列的时间间隔为一恒定值(如 1 分钟、5 分钟)。
当前开源 Prometheus 是如何做异常检测的?
目前开源版本的 Prometheus 检测能力还是基于设定阈值规则方式进行,而这种依赖阈值设定的方式就引出了以下问题。
常见问题
问题 1:面对数以万计的指标数量,如何快速又合理的完成检测配置?
由于不同类型指标的含义差别大,对应设定的合理阈值也不太一样。哪怕是同一种类型指标,由于业务状态不一样,往往不能用相同阈值。因此,在配置阈值时,运维人员需要根据对应的业务情况去配置自认为合理的阈值。由于运维人员认知水平和工作经验存在差异,因此不同人员配置的阈值也存在差别。其次,很多指标没有明确合理的范围定义,这导致很多阈值配置都是“拍脑袋”确定的,随机性比较强。
举例来说:某在线人数指标, 必须仔细观察分析历史指标曲线的数值分布和变化趋势,才能设置出合理的阈值。
问题 2:随着业务的演化,如何进行检测规则的维护?
对于相对稳定的业务,业务指标长期处于稳定状态,这种情况下配置的阈值可以发挥比较长时间作用。但对于时刻变化的业务, 伴随业务的不断演化,指标的水位和走势也是在不断变化。这些变化很容易导致一开始设定的阈值检测,经过一段时间则不太满足检测现状。这时候则需要运维专家定期核查检测阈值是否还符合当前检测需求,对不合理的配置进行维护与修改。因此,静态阈值方式存在着维护成本高的问题。
举例来说:某 IO 吞吐量一开始稳定在 1 万的量值附近波动,一开始设定了检测阈值为超过 2 万则告警。但随着业务发展,IO 吞吐量已稳定在 2.5 万左右,这时候一开始设定的阈值就导致了源源不断的告警叨扰。
问题 3:数据质量不佳如何解决?
数据质量不佳表现为几种具体现象:采集延迟大、数据缺失值多、数据毛刺点比较多(反应在曲线上则是不够平滑)。对于前面俩种, 更多的是从采集、聚合侧进行针对性优化。ARMS-Prometheus 持续在采集能力进行优化。而对于数据毛刺点很多的数据质量问题,静态阈值方式无法有效的规避。而在 ARMS- 托管版 Prometheus 的智能算子中, 我们则针对多毛刺点进行了有效的识别,保证了毛刺点不会形成无效告警, 减少用户侧/运维侧形成叨扰。
阿里云 Prometheus 监控是怎么解决这些问题
面对以上问题,阿里云 Prometheus 监控的检测配置能力除了支持原生的设定阈值检测方式,全面新增支持模板设定检测阈值方式与智能检测算子方式。
业务价值 1:高效高质量的告警配置
(1)针对明确的应用场景配置检测规则,阿里云 Prometheus 监控提供成熟的告警配置模板化,用户无需人工设定阈值, 只需要选择对应的模版即可。
例如:机器指标场景下, 配置“机器指标的 cpu 使用率 >80%”的模板。模板的方式解决了配置中明确异常且业务比较稳定的应用场景痛点。
(2)针对不明确的指标场景或不好设定的业务指标场景,则推荐使用智能检测算子功能。
例如需要对某在线人数指标设定阈值, 这时需要花费很长的时间观察历史曲线状态才能配置出合理的阈值。这种场景下用户可以直接选择智能检测算子。
业务价值 2:自适应追踪业务变化,大大降低检测阈值维护成本
阿里云 Prometheus 监控的智能检测算子功能,通过设定参考历史数据长度的参数,模型可以自适应的追踪指标趋势的变化,无需人工定期去审查配置规则。
业务价值 3: 对于质量不佳,缺失值/毛刺点过多的指标也可以实现智能检测
在智能检测算子功能中, 如果历史数据出现了缺失,算法可以线性插值,多项式插值等多种方式,自动填补缺失值。
对于不平滑的指标曲线检测,智能检测算子也自适应的选择针对该场景的最优模型进行检测,保证整体的检测效果。
如何应用在具体业务场景里
水位突增/突降型指标:某业务的 qps 指标
在业务开始设定阈值时, 通过观察很有可能设定阈值不超过 150。但随着业务迭代,qps 指标也会发生各种各样的变化。从指标上则表现为:出现阶段性的突增至某个值,然后平稳的状态。这种情况下,设定的静态阈值很难持续满足检测需求。另外一方面, 稳定情况也会出现突发的下跌, 只设置上限的静态阈值是检测出这种下跌情况的。这种情形下, 智能检测算子则可以自适应的跟踪业务水平的变化,智能识别业务的突增或突降。
周期性的指标:
在指标画像模块,如果识别出当前的指标具有一定的周期,则会从中提取出对应的周期值、周期偏移值, 以及整体趋势曲线。在原始的时间序列去除周期性、趋势性后,利用残差进行异常检测。以上图的周期指标为例, 11.30 分左右的周期与其他周期出现明显差别。传统静态阈值很难去解这类场景下的检测问题, 而利用智能检测算子,则可以识别出该种异常。
趋势破坏型的指标:
此外,还有一种常见类型的指标异常是,在某一阶段内, 指标一直呈现上升(或者下降)趋势。在某一个节点出现突发性的趋势破坏,局部呈现了和整体趋势不一样。这种异常类型也是很常见的,但是静态阈值很难设定来解决这种情形。而智能检测算子则针对这种类型可以进行准确了的识别异常。
最佳实践
阿里云Prometheus监控内使用流程
目前阿里云 Prometheus 监控已经支持智能检测算子功能,只需登陆 ARMS-Prometheus/grafana,输入对应的 PromQL 即可。
算子定义
"anomaly_detect": {
Name: anomaly_detect",
ArgTypes: []ValueType{ValueTypeMatrix, ValueTypeScalar},
ReturnType: ValueTypeVector,
},
输入:指标的时间序列,类型为range vector;检测参数,使用默认的3即可
输出:异常返回1, 正常返回0
使用 case:
anomaly_detect(node_memory_free_bytes[20m],3)
- 输入的必须是 range vector,因此需要在指标名称后增加[180m], 时间范围默认选择 180m,参数默认选择 3
- 如果先进行了其他聚合函数操作,则需要[180m:],使之变为 range vector,如下:anomaly_detect(sum(node_memory_free_bytes)[180m:],3)
使用示例:
step 1: 登陆到 ARMS-Prometheus 或 Grafana 中选择对应的 Prometheus 数据源
选择对应的数据源:
step 2: 选择指标, 并查看
step 3: 输入异常检测算子
关于 Prometheus- 智能检测算子
阿里云 Prometheus 监控智能检测算子,总结业界数十款领先的算法方案实践设计而成。针对常见的指标类型建立了指标画像,并自适应的选择最佳模型去进行检测计算。每一条指标数据输入模型后, 模型首先会对当前的指标建立指标画像,包括平稳性,抖动性,趋势性,周期性,是否为特殊节假日/活动等。根据这些画像特征构建之后, 模型自适应选择最优一种或者多种算法组合来解当前的指标检测问题,保证了整体效果最优。目前已经支持的功能包括:突增检测、毛刺检测、周期识别(识别周期性、周期的偏移)。
通过阿里云 Prometheus 监控中集成智能检测算子, 我们希望给用户可以提供开箱即用、持续迭代更新的智能检测服务。目前用户可以在阿里云 Prometheus 监控中查看并使用智能检测算子,而基于 ARMS 的原生配置智能检测告警功能和 Grafana 动态展示将在近期推出。
点击这里,立即接入 Prometheus 监控!