3

只需半分钟,ARMS 帮你配置出“高质量”告警

 1 year ago
source link: https://www.51cto.com/article/763694.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

只需半分钟,ARMS 帮你配置出“高质量”告警

作者:图杨 2023-08-16 14:51:35
传统的告警规则是静态阈值告警,工程师们会对每个指标设定一个固定的阈值来定义指标的“正常水位”,当指标的实际值超出阈值时,对应的工程师就会收到告警。
d8021ce97e28e73122a26717ecf6665864699a.jpg

某位资深运维工程师A:“一天不收个几十条告警,我都觉得心里不踏实” 。运维工程师B:“我那几个告警天天告,我的应用一点问题都没有,但是我又不敢关”。运维工程师C:“我每天都要花大量的时间,整理已经发生的告警:查它们是什么原因导致的,是故障还是误报,要不要解决,要不要屏蔽。”运维工程师D:“要不我们给告警数配置一个告警吧,一天收100条告警是正常的,哪天告出来200条估计就是有问题了”。会出现这样的对话不是因为这几位运维工程师不专业,实际上,误告警泛滥,真告警被淹没,就是大多数团队,甚至顶尖的互联网企业的运维团队的现状。想要配置出“系统无异常时不误告,有异常时及时告”的“高质量”的告警规则是非常具有挑战性的。

所以这些告警都是些什么?为了保证系统和应用的稳定性,工程师们会搭建监控系统以实时地采集比如RT(响应时间)、QPS(调用次数)、Error Rate(错误率)、HTTP状态码、Full GC次数等关键指标,并对核心应用的关键指标进行实时地巡检,当检测到指标当前值超出“正常水位”时,相关的工程师就会收到对应的告警。

那这些误告警又是怎么产生的呢?传统的告警规则主要是静态阈值告警,当某指标的实际值超出用户设定的阈值,就认为是系统出现了异常。但是,想要快速选定合适的阈值,配出“高质量”告警,是很难的。阿里云应用实时监控服务ARMS通过对近百位用户的访谈与调研,发现平均每个用户每天收到1275条告警。而且,我们对 6 万条关于响应时间和错误率突增的告警进行了分析,发现其中只有 3.05%的告警是“真”告警,剩下的96.95%都是由于阈值设置不当引发的误告警。

为什么配出”高质量“告警很难?

传统的告警规则是静态阈值告警,工程师们会对每个指标设定一个固定的阈值来定义指标的“正常水位”,当指标的实际值超出阈值时,对应的工程师就会收到告警。比如当应用的RT超出1s,就算是异常。但是合适的静态阈值,是很难定义的。因为:

1. 同一指标,不同应用,不同接口的“正常水位”不同。

现实生活中,SRE(运维工程师)需要对很多应用、很多接口配置告警。即使是同一个指标,不同应用,不同接口的“正常水位”都是是不一样的。下图是同一家公司,不同应用的错误率指标。

图片

下图是同一应用,不同接口的平均响应时间指标:

图片

SRE需要为每一个应用、每一个接口的每一个指标来设定“正常水位”。 这对于有几百个应用、几十条关键指标的公司来说,仅靠人力来不断地设定和维护指标的“正常水位”需要花费大量的时间。

更可怕的是,随着业务的发展,代码不断变更,各项指标的“正常水位”会不断地变化。这意味着SRE要不断地调整告警阈值。

2. 有的指标,不同时段的“正常水位”不一样

比如某工作网站的访问量,在10:00-18:00时段内,访问量低于1000是异常的;但是在夜间,比如22:00-6:00,访问量超过1000可能是收到了攻击。在这种场景下,指标的“正常水位”会随着时间变化而不断变化。如果我们硬配置一个阈值,比如低于1000就告警,那整个晚上都会受到告警的打扰。

有的SRE可能会表示,那我晚上自动吧告警关掉就好了,但是现实生活中,这种起伏不定的指标,很难有像“1000”这么规整的阈值,现实生活中的调用量指标是下面的样子,就是会有一些令人意想不到的“大毛刺”。

图片

3. 告警阈值的合理性难以及时验证

SRE们配好一个告警阈值之后,也很难验证这个阈值是不是合理的。运维工程师们往往会不断地被打扰,他们要不断地调整阈值,才能得到一个较高质量的告警。当指标的正常水位随着业务变化而变化之后,周而复始,重新调整阈值。

业界是怎么协助用户配置出”高质量“告警的?

如何有效地帮助客户配制出“高质量”的告警规则,是每一个APM(应用性能监控)厂商关注的问题。为了解决这个问题,主流的APM厂商都提供了智能告警服务。主要思路就是用统计学算法或者机器学习算法,提取指标的特征,下面介绍业界如何解决上面提到的问题:

问题 1:同一指标,不同应用,不同接口的“正常水位”不同

为了解决阈值难配的问题,一些APM厂商给出了静态阈值推荐的功能。一般地,他们用算法为各个接口、各个应用,根据对于指标的历史数据学习指标特征,结合指标历史平均水位以及波动情况给出一个建议阈值。

但是,厂商给的是通用算法,SRE很难评估算法推荐的阈值是不是符合他的业务,是不是真的“高质量”的阈值。

问题 2:有的指标,不同时段的“正常水位”不一样

对于波动型指标,一些厂商推出了动态阈值(也称区间检测)功能。在这个场景下,指标的实际值不再和单一的静态阈值比较,而是和一个时间序列做对比。具体地,算法会根据指标历史数据学习其波动特征,并对未来一段时间指标正常变化范围进行预测。比如每天00:00对未来一天的指标“正常水位”的上下边界进行预测,等采集到实际值时,比如10:00时,将实际值与之前的预测值进行比较,实际值超过了边界就被判定为异常。下面是一个动态阈值功能的示意图,绿线是指标的实际值,蓝色阴影是算法计算出来的,指标在正常情况下的上下边界。

图片

这里的缺点在于:算法对用户来说是黑盒,SRE们不敢把关键的业务指标放心地交给算法。另外,这些算法是通用的,不一定符合SRE的实际业务需求。而且,很多APM厂商没有关注到这一点,没有给用户调节动态阈值的功能。

问题 3:告警阈值的合理性难以及时验证

一些APM厂商给出了阈值和指标过去一段时间实际值的对比图。但是,SRE们往往没有时间对每个应用、每条指标、每个接口都浏览一遍来设置合理的阈值。

另外,对于动态阈值的功能,很少有厂商给出对比图。SRE没有足够的信息来对告警阈值进行调整,只能不断地受到告警打扰再调节阈值。这样,有了几次误告警之后,SRE们就会把这些“华而不实”的AI功能关掉。

ARMS 是怎么帮用户实现半分钟配出”高质量“告警的?

为了解决这些问题,为了给用户提供“透明的”、“易用的”、“所见即所得”的智能化告警体验,ARMS对应用性能监控告警功能进行了全面升级。 下面我们介绍ARMS如何解决“高质量”告警难配的问题。

问题 1:同一指标,不同应用,不同接口的“正常水位”不同

实际上,对每一条指标配置一个合适的阈值其实都不算难,难的地方在于每个应用、每个接口、每种指标类型适合的阈值都不一样。SRE要遍历所有的指标,为他们设置合适的阈值,这是需要耗费大量时间的地方。

对于配静态阈值这种重复的工作,ARMS决定交给代码来做。用户只需要选择要配告警的应用、接口和指标类型。

图片
图片

然后点击“填入P4建议阈值”,ARMS就会自动拉取每个应用、每个接口对应指标的历史3天数据,然后用N-sigma算法,计算每个指标历史3天的均值和方差。当业务没有发生变化,我们默认指标服从一个正态分布,它偏离它的期望N倍标准差的概率很小。根据这个原理,我们给出一个推荐阈值。这里的"P4"是表示的是最不严重的告警,这个建议阈值仅仅表示指标有些许异常。

图片
图片

当用户的业务发生了变化,应用正常水位也发生了变化,那么用户也只需要编辑一下告警规则,再点一次“填入P4建议阈值”即可。真正做到了一次配置,随处生效。

问题 2:有的指标,不同时段的“正常水位”不一样

由于静态阈值告警难以满足如RT、QPS等波动型指标的监控功能,我们推荐动态阈值,也叫区间检测功能。这里我们会自动根据指标7天历史数据,预测指标未来上下边界。用户可以根据上下边界配置告警,当指标实际值超出上边界或下边界,触发告警。

ARMS主要使用了Meta(Facebook)公司2018年公布的Prophet算法[1]。算法会先根据指标历史7天数据,用时间序列分解算法,将指标分解成季节项、趋势项和残差项。举个例子[2],对于下面图 1 中的时间序列,Prophet算法会将它分解成有规律的趋势项(图2)季节项(图3)和没有规律的残差项。

图片
图片
图片

既然趋势项和季节项是有规律的,我们就可以对未来一段时间指标的值进行预测。但是还有残差项的存在,所以如果我们对指标的变化趋势预测得到的是一个区间,可以看图 1 中蓝色阴影部分。Prophet是一个无领域的,时序预测通用算法。我们对该算法做了一些实验之后,发现把它应用到APM领域,还需要大量的改造。

当用户配置区间检测任务之后,ARMS会在后台以每24h一次的频率,学习指标历史7天数据的特征,提取指标趋势性、季节性等特征,得到指标未来24h的预测曲线。再根据指标自身的波动情况,也就是误差方差的大小,为未来一天指标的数据做出一个估计区间。用户在配置区间检测告警中,可以对算法计算出来的上下边界进行预览。下图中,蓝线是指标的实际值,绿色的阴影是上下边界。

图片
图片

与静态阈值推荐功能不同的地方在于,当用户业务变化导致指标正常水位发生变化,用户不需要通过手动编辑告警规则的方式来更新阈值。这是因为ARMS持续地在以每天一次的频率学习指标的特征,并只预测未来一天的上下边界。SRE们不需要再一遍一遍来回地调整阈值。ARMS区间检测告警,一次配置,自适应学习指标特征,持久有效。

问题 3:告警阈值的合理性难以及时验证

为了帮助用户及时地验证告警的合理性,使得用户能够根据自身业务调整算法推荐的阈值,ARMS推出了如下的功能:

1. 为了方便用户根据自己的实际数据对阈值进行调整,我们给出了指标实际值和阈值的对比图

这里的P1、P2、P3、P4的阈值代表着不同的严重程度,当用户配置好各个阈值之后,ARMS会用不同的颜色标识出4个不同等级的阈值。

图片

2.提供了告警数预测功能

我们会根据指标历史24h数据,计算指标会超出每个阈值的次数来预测在该设定下告警的数量。并且,ARMS提供了指标详情信息,用户可以看到具体是哪些时刻,指标的实际值超出了当前的阈值。用户可以根据这些信息调整阈值,以适配实际业务需求。

 

图片

 

图片

3. 无论是静态阈值还是推荐阈值,ARMS都支持用户手动调节推荐阈值

在静态阈值配置的界面下, 用户可以按需地修改阈值;在区间检测功能中,用户可以滑动灵敏度按钮,从0到200挑选任意整数作为灵敏度。并且,图中标识着指标上下边界的绿色区间也会随着灵敏度的变化而变化。

图片

为了帮助用户快速配出“高质量“告警,ARMS提供了“静态推荐阈值”来帮助用户快速地计算指标的“正常水位”;并且,针对不同时间段“正常水位”不一样的指标,ARMS提供了“区间检测”功能。另外,ARMS提供了告警数预测功能,使得运维工程师们可以及时地评估告警规则的合理性。也让他们有足够的信息,根据自身业务来调节告警阈值以及区间检测中的灵敏度,一次性配出“高质量”告警。

运维工程师D表示:"用ARMS确实比给告警数配告警靠谱哈",运维工程师A、B、C:“赶紧上阿里云开通ARMS吧,我再也不想半夜被告警电话吵醒了”。

参考文献:

[1] Prophet算法

Taylor S J, Letham B. Forecasting at scale[J]. The American Statistician, 2018, 72(1): 37-45.

[2] 举个例子

https://zhuanlan.zhihu.com/p/52330017

责任编辑:庞桂玉 来源: 阿里巴巴中间件

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK