EMonitor开发完成后,凭借优异的用户体验与产品集成度,很快在用户中普及开来。但是,EMonitor要成为饿了么的一站式可观测性平台,还剩下最后一战--NOC可观测性大屏。
NOC可观测性大屏替换饿了么有一套完善的应急处理与保障团队,包括7*24值班的NOC(Network Operation Center)团队。在NOC的办公区域,有一整面墙上都是可观测性大屏,上面显示着饿了么的实时的各种业务曲线。下图为网上找的一张示例图,实际饿了么的NOC大屏比它更大、数据更多。
当时这个可观测大屏是将Grafana的指标看版投影上去。我们希望将NOC大屏也替换成EMonitor的看版。如前文所说,我们逐步将用户的Statsd指标数据转换成了LinDB指标,在NOC团队的协助下,一个一个将Grafana的可观测性指标“搬”到EMonitor上。此外,在原来白色主题的EMonitor之上,我们开发了黑色主题以适配投屏上墙的效果(白色背景投屏太刺眼)。
终于赶在2018年的双十一之前,EMonitor正式入驻NOC可观测大屏。在双十一当天,众多研发挤在NOC室看着墙上的EMonitor看版上的业务曲线不断飞涨,作为可观测性团队的一员,这份自豪之情由衷而生。经此一役,EMonitor真正成为了饿了么的“一站式可观测性平台”,Grafana、Statsd、InfluxDB等都成了过去时。
报警Watchdog 2.0同样在EMonitor之前,亦有Statsd与InfluxDB对应的多套报警系统。用户若想要配置业务报警、链路报警、机器报警,需要辗转多个报警系统之间。各系统的报警的配置规则、触达体验亦是千差万别。Watchdog报警系统也面临着统一融合的挑战。
- 在调研其他系统的报警规则实现后,Watchdog中仍以LinDB的指标作为元数据实现。
- 针对其他报警系统的有显著区别的订阅模式,我们提出了"报警规则 一个规则多个订阅标签 一个用户订阅多个标签"的方式,完美迁移了几乎其他系统所有的报警规则与订阅关系。
- 其他各系统在报警触达与触达内容上也略有不同。我们统一整合成“邮件 短信 钉钉 语音外呼”四种通知方式,并且提供可参数化的自定义Markdown模板,让用户可自己定时报警信息。
经过一番艰苦的报警配置与逻辑整合后,我们为用户“自动”迁移了上千个报警规则,并最终为他们提供了一个统一的报警平台。
报警,更精准的报警外卖行业的业务特性是业务的午高峰与晚高峰,在业务曲线上便是两个波峰的形状。这样的可观测数据,自然难以简单使用阈值或比率来做判断。即使是根据历史同环比、3-Sigma、移动平均等规则,也难以适应饿了么的可观测性场景。因为,饿了么的业务曲线并非一成不变,它受促销、天气因素、区域、压测等因素影响。开发出一个自适应业务曲线变化的报警算法,势在必行。
我们经过调研既有规则,与饿了么的业务场景,推出了全新的“趋势”报警。简要算法如下:
- 计算历史10天的指标数据中值作为基线。其中这10天都取工作日或非工作日。不取10天的均值而取中值是为了减少压测或机房流量切换造成的影响。
- 根据二阶滑动平均算法,得到滑动平均值与当前实际值的差值。
- 将基线与差值相加作为预测值。
- 根据预测值的数量级,计算出波动的幅度(如上界与下界的数值)。
- 若当前值不在预测值与波动幅度确定的上下界之中,则触发报警。
如上图所示,22点01分的实际值因不在上下界所限定的区域之中,会触发报警。但从后续趋势来看,该下降趋势符合预期,因此实际中还会辅以“偏离持续X分钟”来修正误报。(如该例中,可增加“持续3分钟才报警”的规则,该点的数据便不会报警)算法中部分参数为经验值,而其中波动的阈值参数用户可按照自己业务调整。用户针对具备业务特征的曲线,再也不用费心的去调整参数,配置上默认的“趋势”规则就可以覆盖大多数的可观测性场景,目前“趋势”报警在饿了么广泛运用。
智能可观测性:根因分析,大显神威作为AIOPS中重要的一环,根因分析能帮助用户快速定位故障,缩短故障响应时间,减少故障造成的损失。2020年初,我们结合饿了么场景,攻坚克难,攻破“指标下钻”、“根因分析”两大难关,在EMonitor上成功落地。
根因分析最大的难点在于:包含复杂维度的指标数据难以找到真正影响数据波动的具体维度;孤立的指标数据也难以分析出应用上下游依赖引起的故障根因。例如,某个应用的异常指标突增,当前我们只能知道突增的异常名、机房维度的异常分布、机器维度的异常分布等,只有用户手工去点击异常指标看来链路之后,才能大致判断是哪个SOA方法/DB请求中的异常。继而用户根据异常链路的环节,去追溯上游或下游的应用,重复类似的排查过程,最后以人工经验判断出故障点。
因此,在“指标下钻”上,我们针对目标指标的曲线,细分成最精细的每个维度数据(指标group by待分析的tag维度),使用KMeans聚类找出故障数据的各维度的最大公共特征,依次计算找到最优的公共特征,如此便能找到曲线波动对应的维度信息。