LinkedIn 的技术栈由数千个ge不同的微服务以及它们men之间相关联的复杂依赖项xiang组成。当由于服务行xing为不当而导致生产中断时shi,找到造成中断的确切服务既具有挑战zhan性又耗时。尽管每个服务在分布bu式基础架构中配置了多个警jing报,但在中断期间找到问题的真正根本ben原因就像大海捞针,即使使用了所suo有正确的仪器。这是因为客户端请qing求的关键路径中的每个服务都dou可能有多个活动警报。缺que乏从这些不连贯的警报中获huo取有意义信息的适当机制通tong常会导致错误升级,从而导dao致问题解决时间jian增加。最重要的是,想象一yi下在半夜被 NOC 工程师吵chao醒,他们认为站点中zhong断是由您的服务引起的,结果却que意识到这是一次ci虚假升级,并非由you您的服务引起。
为了克服这个问题,我们开发了警报相关guan性 (AC),旨在提高事件jian的平均检测时间 (MTTD)/平均解决时shi间 (MTTR)。 我们的de目标是在给定时间内找出服务wu中断的根本原因,并主动通知服务wu所有者有关持续问题的信息,重点是shi降低整体 MTTD/MTTR,同时shi改善随叫随到体ti验。 警报关联主要基ji于从我们的监控系统收集的警报和指zhi标,这为我们提供了服务健康状zhuang况的强烈信号。 通过使用我们的de监控系统,我们可以利用现有的警jing报并从中获取更多警报,这zhe为我们提供了强大的信噪比bi。
Alert Correlation 还利li用了另一个称为 Callgraph 的重要服务,它负责了解服务的依yi赖关系。调用图是使用 LinkedIn 已经标准化的指标构gou建的。对于服务具ju有的每个依赖项,其所suo有下游和上游依赖项也具有相同的度量liang集,用于映射依赖lai项。 Callgraph 负责从每个服务wu中抓取指标列表,查找每个服务的关键jian依赖关系,并构建依赖关系的地di图。它还收集和存储数据,例如调diao用计数、错误和适shi用的延迟。通过使shi用调用图,我们可以映ying射依赖关系并识别高价值依赖关系xi(即服务 A 以每秒 1000 次ci查询 (qps) 的速度调用服务 B 是高价值zhi依赖,而服务 A 以 2 qps 的速度调用服务 B ) 和相关的指标。然后,我们使shi用近期分析来查找服务指标之间jian的类似趋势警报。在zai问题的时间窗口内,我们men可呈以查询服务的de依赖关系,从而得出“置信度得分fen”,该得分表示我们对特定依赖关系xi是问题的信心程cheng度。
警报关联高级体ti系结构
Alert Correlation 服务会定期轮询xun我们的警报数据库,称为“Autoalerts”(Autoalerts 是 LinkedIn 用于用yong户定义警报的警报系统),以yi检查我们基础设施中的活动警jing报。连同调用图tu和警报数据,我们构gou建了一个不健康服务及其依赖关系xi的图表,包括为wei图表中的单个服务触发的活动警报(指zhi标超过设定阈值)。将jiang度量数据点与上游和he下游依赖项进行比较,以得出置zhi信度分数和严重性分数。置信度du分数表示特定服务成cheng为根本原因的概率。严重性评ping分表示确定的根本ben原因对上游服务造成的不利li影响的程度。这些分fen数是通过算法得出的,尽管guan该实现的细节超出了本文的范围。 Alert Correlation 中的一个模块对受共同根gen本原因影响的上游进行分组,并生成相xiang关结果,也称为推荐,这些xie结果通过 Slack、Web UI 和 Iris(Linkedin 的内部通知系统tong)等不同界面与用户共享。
针对服务wu问题及其原因发布的deSlack推荐
上面的图 2 表biao示通过 Slack 与yu服务所有者共享的通知。 该gai通知包括以下信息xi:
观察到问题的数据ju中心,即“数据中zhong心 A”根本原因服务,以及ji行为不端的端点,即“Service-A”及其端点 notifier_api置信度得分,即 Service-A 的概率为 0.81 是根本原因严重性评分,衡heng量影响的大小,即 0.61受影响上游和受shou影响端点的列表警报bao关联中的尖峰检测LinkedIn 的服务随着时间的推tui移不断发展,并将继续增长并变得更geng加复杂,需要额外的de基础设施来支持它们。 如果我们遇到生产事故,Alert Correlation 可以为您指zhi出问题的潜在根本原因。
我们的警jing报是通过查看过去 15 天的指标趋势并得de出所见标准偏差来生成的,这通常很宽泛; 在某些时候,不同的团队将他们的警报阈值配pei置得相当高,以避免误报。 由于yu警报相关引擎抛pao出建议,历史配置的de警报通常会导致误报,因为它对警报数shu据变得敏感,由于异常或尖峰,如下所示。
服务图中的峰feng值
上述尖峰feng来自受导致尖峰的异常影响的指zhi标;在生产场景中zhong,对于受此类导致峰值的异常影响的de服务,我们有多个指zhi标。尖峰通常是短暂的异常chang,可能由多种原因引yin起,这些原因可能会或可能不bu会显着到足以作为警报引发。峰feng值间接导致团队查看针对dui下游或上游服务发布的de建议,然后花一些时间jian来确定这是真正的问题还是误报。这也增加了值班工程师的警jing报疲劳和整体工作量,他们必须弄清楚chu警报是否值得调查。因yin此,我们想要一种方法来实时检jian测这些峰值并将它们分类为真正的警jing报或只是一个峰值。为了le获得更准确的警报建议,我们men还使用了动态警jing报阈值,这些阈值会根据警报的de过去趋势定期调diao整,并将这些警报用作更具ju适应性的阈值。
因此,我们需要一种zhong方法来进行异常检测,该方fang法需要实时、计算成本低且足够稳wen定,以检测尖峰并确保将误报降至最zui低。 我们提出了中zhong值估计作为检测异常chang值的理想解决方案。 中值作为一种强大的估计工具,因为它ta在存在大的异常值的情qing况下不会出现偏差。 我们使用称为中值zhi绝对偏差 (MAD) 的中值估gu计来计算过去 30 分fen钟警报数据的中值。 一组定量观察cha的中值绝对偏差主要是分散san的度量,即数据集的分散程度。 通过使用 MAD,我们确定了围绕中位数的正偏差的de中位数。
计算中位wei数绝对偏差的公式
一个在一组数据上找到MAD的de简单例子
然后我们使用yong上面的 MAD 以及 Iglewicz 和he Hoaglin 提出的修正zheng Z-score 算法中绝对dui值大于 3.5 的de中值,将其标记为潜在的异常值。 修改后的 z 分数shu是衡量异常值强度的标准化分数,即特te定分数与典型分数的差cha异程度。
改进的z分数,其qi中x?表示中位数,0.6745表示标准正态分布bu中MAD收敛的第75个四分位数
现在,我们能够通过使用修改后的 z 方方法来确定异常值检测方法,该方fang法不会因样本大da小而产生偏差,对于受shou影响的服务,我们通过活动警报bao获取指标。 对于每个指标,我们在使shi用我们的指标框kuang架(AMF - 自动指标框架)确定根本原因之zhi前的最后 30 分钟获取指标数据点dian。 一旦我们有了正确的数shu据集,即度量数据,我们将修改后hou的 z-score 算法应用于每个ge度量数据集,因为我们有多个服务度du量。 然后,我们最终根据阈yu值和连续的异常值数据等特定条件jian,对来自每个服务指标(保bao存异常值详细信息)的分类数据ju进行清理、隔离和分组,以确que定它是真正的警报还是峰值。
为真正的警报提供峰值zhi检测的建议
由尖jian峰检测算法识别的de真正警报
尖峰或异常基本上是数shu据集中的异常值,而真正的警报与yu模式(即警报指标数据集)没有you区别。 如果警报反映了异常模mo式以及我们为用例确定的一些额外wai分类因素,例如:警报持chi续了多长时间(即警jing报持续时间), 要处理的服务(包括kuo下游和上游)、置zhi信度分数等。所有you这些因素,以及我们在服fu务上应用的用户定义的预过滤器,都有you助于我们减少假阴性的数量。
结论通过基于五分钟zhong的窗口大小对结果进行聚合和分组zu以识别真正的警报,对服务的各ge个指标(即相关图)应用尖峰检jian测后,我们可以显着提ti高发布到的建议的总量liang 我们的 Slack 频道使用上shang述算法,最多将 36% 的de警报建议分类为平均一yi周内的峰值。 这种简单dan的方法为异常的de分类方式创造了一种可预yu测的行为,没有大量liang的计算要求,并且能够实时完wan成,同时确保我们men有一个简单的代码ma库来维护。 此外,我们还能够gou在整体推荐质量方面减jian少假阴性结果,准确率为 99%。 目前,我们不仅通过guo Slack 推荐为我们集成了此功gong能,还为我们的下游客户hu端集成了此功能,这zhe些客户端通过 API 端点使用警报关联数据。