B站的业务规模和用户群体不断扩大,对于服务的稳定性和可用性的要求也日益增高。这就需要B站的监控告警系统能够及时、准确地发现和定位问题,以便尽快解决,维护好用户的使用体验。
本文是对B站在告警监控系统上的一次重要迭代和优化的详细记录。文章详细阐述了B站对告警平台设计思路和优化迭代,以及在实现过程中遇到的问题和解决方法。特别是对于告警定位的精准性和定位效率的提升,文章给出了新的设计方案和实践方法。
作者介绍
TakinTalks稳定性社区专家团成员,哔哩哔哩资深开发工程师。2020年加入B站先后负责事件平台,链路追踪,AIOps及告警平台方向技术演进&平台迭代。完成了新一代告警平台落地,达成了99分位一分钟内的异常端到端发现,实现了人均告警从每周 1000+条/人到70+条/人告警治理上的突破。
温馨提醒:本文约6000字,预计花费8分钟阅读。
后台回复 “交流” 进入读者交流群;回复“1130”获取课件;
在B站的多元化业务中,告警平台起着至关重要的作用。无论是视频播放、弹幕发送、用户评论、直播间管理,还是后台的内容审核、数据统计等,都离不开系统的稳定运行。告警平台可以实时监控这些业务系统的运行状态,一旦出现异常,就会及时发出告警示,使运维人员能够迅速定位问题,及时进行处理。
然而,维护这些业务的稳定运行并非易事。从告警发生的前、中、后三个阶段,即生产端、传输端和消费端来看,B站的告警平台设计都面临着不小的挑战和复杂性。考虑到这些业务需求和复杂度,我们着手对B站新一代告警平台进行了全面升级,结果达成了人均告警减少90%,根因分析准确率高达87.9%的突破。在本文中,我将概述新一代告警平台的设计理念,并重点分享该平台在告警降噪和告警智能化分析方面的实施策略。在告警平台的设计和迭代过程中,我们不断收到各类业务需求。总体上,这些需求的核心都集中在“以质量为中心,及时发现并处理异常,确保业务稳定性”。具体来说,需求场景可划分为风险场景和故障场景。在风险场景中,需要提前感知并有效应对潜在问题;而在故障场景中,需要迅速发现线上问题,及时响应,以实现快速恢复。在满足这些业务需求的过程中,我们提炼出三个核心诉求和目标:-
有效性:我们期望所有收到的告警都是有效的,即每次接收到告警时,都确实存在异常,而且这条告警对当前的接收者是具有意义的。
-
及时性:对于高优先级的异常,我们希望能在第一时间触达并被用户感知,以便他们能够及时采取行动进行处理。
-
覆盖性与跟进:我们期望实现告警的全面覆盖和跟进。从用户的角度来看,他们希望所有自己负责的业务或应用的场景都能被告警覆盖,同时,他们也希望能了解不同场景的告警覆盖情况。当规则产生异常后,用户需要有一个便捷的方式去快速处理并跟进解决问题。
1.2.1 闭环模型
在告警平台的详细设计中,我们基于前述的目标和业务需求,构建了一个闭环模型。这个模型旨在保证各关联方的积极参与,从而推动目标的持续改善。特别的,告警定义和告警治理是模型中的两个关键环节,因为它们决定了告警降噪和召回效果的优劣。接下来将详细介绍B站告警定义、检测、通道侧功能的设计。重点是告警处理、根因分析以及告警治理侧的实践内容。1.2.2 告警接入
在告警接入环节,主要区分了三个场景,这些场景的设计可以覆盖业务对于告警接入的大部分需求。我们为平台覆盖的告警场景提供告警规则和模板的开放接口能力,支持多租户规则集成。不同租户可以基于预定义的模板进行配置,可以在业务申请或者注册资源时,快速完成告警的定义和覆盖,整个过程成本低,便捷性高。我们为业务直接开放告警规则定义,包括规则的触发条件配置、表达式及通知策略的配置。我们开放事件集成能力,用户可以通过注册事件完成准入,主动触发方式发送到告警平台,告警平台完成后续闭环的处理。1.2.3 告警计算
我们设计了一个分布式的告警计算引擎,实现了多级的调度。基于线上全量生效的规则,进行全局调度,将告警的场景、可用区调度到不同的可用区和计算集群下。在同一个计算集群下,进行本地调度,将任务调度到不同的计算节点,实现负载均衡。计算节点会周期性地检测数据判断告警是否触发,触发后将投递到告警通道。1.2.4 告警通道
主要做降噪、渲染、分发,以实现准确的投递和快速的触达。对于引擎侧产生的告警事件,在通道会生成告警消息,然后先经过降噪模块,依次完成通知窗口拦截、通知频率拦截、接警拦截、静默拦截、抑制拦截、告警聚合等。接下来,经过告警渲染分发模块,完成渲染接收人、渲染通知通道、渲染通知模板,最终触达到用户并更新告警的投递状态。下面我将主要阐述B站在告警治理的实践过程中,如何推行告警治理策略,降低告警噪声,以及提高告警的有效性。过去一段时间里,B站的告警通知泛滥问题,对技术团队和平台来说,这已经成为一个多年的困扰,也是一个较大的痛点。一方面,随着稳定性问题的出现以及新平台的接入,告警规则和配置不断增加;另一方面,又缺乏有效的告警治理和运营分析机制。这导致告警数量越来越多,很多用户也不会去主动治理告警,反而选择设定免打扰。最后,真实的风险和异常往往被淹没在众多告警中,无法第一时间被感知到。用一句话来概括,就是“太多的告警就相当于没有告警”。-
告警定义不合理:很多规则缺乏有效的维护,大量的规则在触发后,并不代表有异常发生,业务也不会去处理。此外,有些告警的粒度太细,导致同一异常触发后产生大量的告警,放大了整个通知的影响。
-
通知人数放大:由于历史组织架构的变更或临时排查问题,定位权限相耦合,导致服务树长期缺乏治理,造成告警通知人数的大幅度放大,经常发给一些无关的人员。
-
缺少分析治理工具:虽然大家都知道告警太多了,需要治理,但是却没有头绪,也没有合适的平台能力帮助他们分析告警主要集中的部分,从而进行有针对性的治理。
-
缺乏有效的运营机制:大家对治理告警的动力不足,同时也缺乏有效的机制和规范约束。在历史上可能经过一些短期治理后,告警又出现反弹,治理效果就不复存在。
在分析了告警泛滥的原因后,我们开始了告警治理,这个过程主要分为三个阶段。第一阶段:目标设定
经过多轮的会议和讨论,我们确定了告警数的指标,将原先每周超过1000条的告警数量降低到每周80条。这个目标在初始阶段看起来几乎是不可能完成的。然而,我们认为这80条告警是一个业务人员能够逐条响应处理的合理范围。于是,我们坚持以这个目标去执行,并尽力去达成。第二阶段:数据分析
我们将告警数据集成到数据仓库中,提供了多维度的分析视图,为告警治理提供了数据支持。通过计算公式来确定影响因子,公式基于告警通知数量,即:告警通知数量=告警数*每次触发通知的人数*降噪系数。这个公式帮助我们明确了治理的方向和重点。第三阶段:治理动作
首先,优化了告警项,与SRE和平台同事一起评估了默认告警项的合理性,对无效的告警项进行了关闭处理。对于一些不合理的告警项,我们评估并优化了其表达式和默认阈值等条件,以降低告警噪声并提高告警的有效性。其次,为了解决通知人数放大的问题,优化了告警接收人的设置。我们深度参与并推动了服务树研发和负责人角色的校准,并推出了值班,升级等能力,以缩小告警的通知范围,有效地降低了通知人数放大的噪声。最后,丰富了通道的告警降噪策略,支持了规则组的微调拦截能力,以及多维度下的告警汇总和聚合能力,从而更高效降低了告警噪声。在进行了一系列的告警治理行动后,我们对治理过程进行了总结和思考。主要从以下三个方面进行分享:在整个治理过程中,集中处理的主要是无效的噪声告警,然而,绝不能忽视真实且有效的告警。在治理中,我们始终坚守一个原则,即不能牺牲异常的召回率。因此,我们将注意力集中在那些持续触发、重复触发以及异常放大等不合理的规则上,以及Top级别的规则上,并对这些问题进行专项治理。实际上,治理过程就是一个运营推进的过程。在这个过程中,创建了数十个群组,制定了无数的治理、推进和跟进文档,以确保整个密集且强制性的告警治理工作的落实。同时,也与各个场景平台以及SRE进行了紧密合作,共同推动了告警治理工作。我们借鉴了毛剑老师的理念,强调分层分级,抓住重点,尤其是保证业务可用性的核心告警。对于事件类的告警,建议记录并可查询,以避免淹没其他重要的告警通知。对于一些不适合直接通知业务侧的依赖告警,建议通过关联的方式来呈现,这样可以有效地降低告警的噪声。-
中位数告警1000次/周减少到74次/周,减少到原来的7.4%;
-
整体告警通知数从治理前300w+减少到22w+,减少到原来的7%;
-
人均告警通知数从1600+减少到140,减少到原来的8.8%;
为了确保告警治理所取得的成果能够持续稳定,我们构建了一套长效治理机制,具体包含以下三个方面:包含了一个告警治理分析大盘,它被集成在告警平台上。这个大盘支持从业务、个人和公司等多个视角,通过多个维度对告警的分布和趋势进行分析。此外,我们还利用了一些治理工具,为快速治理提供了必要的能力。我们与SRE各个组件平台达成了共识,制定了共同的目标,并生成了各类数据报表的订阅。持续跟进这些报表,以防止告警的恶化,并持续进行告警治理。针对新接入的规则和平台场景,增加了一些告警数据接入的人工校验,以及平台侧的校验和噪声监控。对于一些不合理的规则,我们会建议对应的接入方进行优化,以保持告警治理成果。结合当下业界广泛运用的前沿技术,例如异常检测、智能降噪、智能合并策略以及根因分析等,我将重点分享B站在根因分析方面的实践和实战经验。随着SLO体系的日益完善,更多的业务被接入到SLO体系中。这使得我们有了明确的异常定义和触发对象,能够更精确地实施根因分析。此外,B站已经设定了 “1-5-10” 的目标。目前,已经通过优化告警计算采集和通道,实现了99分位端到端一分钟内的问题发现。然而,对于5分钟的定位,仍存在一些瓶颈。定位过程过于依赖人工经验,存在一定的不确定性。人工专家经验因人而异,同时受场景影响,导致定位效率也不一致。另外,由于平台能力的建设和交互,以及一些极端情况下的响应延时,如凌晨故障或者出差等场景,都会影响定位效率。最后,用户需求的积累也在不断增加。随着业务和基础设施的增长,人们越来越关注告警定位的效率,并积累了大量定位告警的经验。因此,对于根因分析的需求日益迫切,同时,根因分析的实施条件也逐渐成熟。3.2.1 根因分析设计1.0版
首先,我们采用了以SLO告警为基础的设计方案,对微服务架构下的黄金指标进行定位能力的设计,这就是1.0版根因分析设计。整个设计方案主要包含三个阶段。首阶段,我们监听SLO的告警触发,关联错误的范围和数据,然后基于这些数据分析日志指标,挖掘出异常的维度。例如,错误可能集中在特定集群的某个实例下,或者某个上游请求的某个接口。第二阶段,我们根据这些错误维度,对应用侧的链路调用进行关联,找出异常期间的异常链路。通过聚合分析,能区分出耗时和错误的场景,通过关键路径分析和剪枝下钻的方式,定位到异常链路下的异常节点。最后一阶段,将定位到的异常节点映射到知识图谱中,通过数据图谱关联到相关的数据库、缓存、消息队列、容器、机器、交换机、机柜、机房等信息。然后,结合异常、告警、变更等信息,通过关联分析模型进行打分推荐,最终推荐出可能的Top根因排序。尽管这个1.0版的根因分析设计在某些场景下的准确率可以接受,但是它仍然存在一些瓶颈。3.2.2 根因分析设计2.0版
在设计2.0版的根因分析时,我们进行了全面的调研,深入了解了业界资深的SRE和业务同事们在定位问题时的过程。总结下来,这个过程主要是:在告警触发后,根据专家的经验,关联到具体的异常事件;然后再根据这些经验,分析这个异常可能由哪些原因导致,并找出这些原因的相关指标和日志等观测数据;最后,通过观察这些数据,判断出导致异常的根源。在设计2.0版的过程中,我们力求将这个过程普遍化,并构建一个异常知识图谱,将专家的经验沉淀下来。同时,也开放了根因分析的集成和知识目录的功能,提供通用的根因分析能力。根因分析的实现主要围绕知识的定义。这里的知识主要是基于异常节点定义。每个异常都会定义在具体的某个实体节点下,例如某个应用或某个数据库的集群实例。每个异常都会关联到具体的数据节点,比如日志、指标、告警等,通过这些数据我们可以检测和判断异常的发生。同时,异常之间也存在传导关系,一个异常可能由哪些异常导致,这些异常之间的传导链路和关联关系是怎样的。这就是我们在知识工程中定义的整个知识结构。这种基于知识图谱的根因分析方式,很好地解决了1.0版中遇到的问题。使我们能够更深入地理解异常发生的原因,更准确地定位到问题的根源。通过将专家的经验进行系统化的沉淀,不仅提高了问题定位的效率,也使得知识的传承和积累成为可能。3.2.3 AIOps算法支持
根因分析的能力建设,离不开AIOps算法的支撑。目前,我们已经构建了一个全面的算法体系,设计了指标、日志、事件、链路等多个场景。同时,也根据不同类型的数据,支持了时序预测、异常检测、指标分类以及日志聚类、多维下钻,和事件聚类、链路分析等多个场景的算法能力。3.2.4 关联分析模型升级
在关联分析的过程中,我们将异常图通过特征构建、模型加载,基于模型推理预测并打分,最终推荐出异常的根因和传导路径。特征设计包括:时间依赖特征、图关系/距离特征、因果特征、路径相似特征、事件类别特征。模型构建方面,在初期主要是基于冷启动的方式,预定义了一些异常之间的传播系数。随着样本标注数据的增多,开始进行模型的训练,并基于模型进行推理和推荐。此外,我们也支持GBDT模型,以进一步提升关联分析能力。在根因分析的过程中,我们面临着一些难点和重点。难点主要在于,如何有效评价推荐的根因,以及如何获取用户的准确率和评价数据。这对于评估不同版本,以及根因分析的准确率和有效性,以及帮助模型进行迭代至关重要。为了解决这个难题,我们进行了以下四部分工作:在整个过程中,一个重点是围绕专家经验的收集和构建。我们会与不同业务和SRE同学深度沟通,梳理相关的异常知识和专家经验,完成这部分知识的定义。对于组件方面,我们会与相关同学持续完善这部分知识的定义和构建能力。针对一些特殊场景,也会提供外部专家经验的集成方案,提供根因分析的集成能力和接口,让外部的根因也可以通过分析能力完成,实现人工告警的推荐、展示和评价。3.4.1 上游流量突增导致服务限流,可用率下降
在这种情况下,可以基于告警关联到具体服务的SLO异常,并且下钻得到具体的异常接口和错误。同时,通过异常关联分析可以检测到上游的流量突增,明确具体哪一个入口的流量突增。有了这些信息,业务侧可以对上游的服务进行一些限流的配置并进行修复。3.4.2 下游变更导致服务异常影响网关接口可用率
可以通过根因分析关联到具体的链路,并关联到具体下游的异常和变更。最终,可以推荐出AI服务的变更是影响网关接口的主要原因。业务同学可以快速找到对应的变更人,然后进行排查和回滚等止损操作。3.4.3 下游Redis请求异常影响服务接口
可以通过内部分析以及异常关联到具体的服务,并构建起异常的传导路径。同时,可以推荐出具体的异常请求耗时和日志。此外,业务侧也可以与相关组件的同学一起进行更深入的定位。平均分析耗时:4s内(这意味着,在告警发出后,平均仅需4秒钟就可以推荐出根因,业务人员打开告警卡片就可以直接看到对应的异常根因。)设计告警平台时,需要考虑到多种多样的业务需求和不同的应用场景。理解这些需求的本质,然后基于这个本质来构建平台的能力以及关键功能模型,并设计出闭环逻辑,以此来设计出更贴近业务需求的告警平台。其次,告警治理过程是必不可少的。无论告警的数量多少,只有通过完善的告警治理机制,才能使整个系统的闭环优化规则的定义,持续提升告警的有效性,发挥告警的价值。最后,告警与人工智能的结合是未来的发展趋势。通过深度结合的一些能力,可以提升故障发现的准确率,减少定位和恢复止损的时间,为质量管理和系统稳定性提供保障。(全文完)
1、这个告警治理是否主要靠人力筛选减少规则?
2、业务侧的告警关联降噪可以举个例子吗?是在监控侧关联还是在告警侧关联?业务告警可以和基础告警关联吗?
3、告警后有进一步的自动分析场景吗?
4、监控告警通知的发送状态和效果怎么管理?怎么处理通知失败或异常的情况?
5、在告警合并方面,高优告警怎么不被淹没?同时保证低优告警的质量巡检?
6、怎么优化根因分析的效率和准确性,来支持实时分析和批量处理呢?根因分析过程中,大量的数据和日志信息怎么管理和存储?有哪些最佳实践和经验可以分享?
以上问题答案,欢迎点击“阅读全文”,观看完整版解答!
!!重要通知!!
TakinTalks社区第二本印刷物《SRE可靠性体系建设实战笔记》已正式启动,现公开征集共创作者,一起布道SRE!招募对象:运维负责人、SRE负责人、架构师等稳定性相关职位,团队负责人/总监级以上若您有意成为本书作者之一,请您与我们联系,获取本书目录。添加助理小姐姐,凭截图免费领取以上所有资料
并免费加入「TakinTalks读者交流群」
声明:本文由公众号「TakinTalks稳定性社区」联合社区专家共同原创撰写,如需转载,请后台回复“转载”获得授权。
更多故障治理内容
📢点击【阅读原文】直达TakinTalks稳定性社区,获取更多实战资料!
本篇文章来源于微信公众号:TakinTalks稳定性社区
本文来自投稿,不代表TakinTalks稳定性技术交流平台立场,如若转载,请联系原作者。