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