优步的软件架构由数千个microservices这使得我们的团队能够快速迭代并支持我们公司的全球增长。这些微服务支持各种解决方案,如移动应用程序、内部和基础设施服务以及产品,以及影响城市和副城市级别的这些产品的复杂配置。
为了维护我们的成长和架构,优步的可观察性团队建立了一种强大,可扩展的指标和警报管道,负责检测,减轻和通知其服务的问题,并在其事件时立即通知其服务。具体来说,我们建立了两个中的数据中心警报系统,称为umonitor和neris,该系统流入相同的通知和警报管道。uMonitor是我们的基于指标的警报系统,用于针对我们的指标数据库进行检查M3,而Neris主要在主机级基础架构中寻找警报。
Neris和uMonitor都利用通用管道发送通知和重复数据删除。我们将深入研究这些系统,并讨论我们推动更多的缓解行动,我们新的警报重复数据删除平台Origami,以及创建高信噪比警报的挑战。
此外,我们还开发了一个黑匣子警报系统,在我们的内部系统失败或我们有完整的数据中心中断的情况下,从数据中心中检测到数据中心外的高水平中断。未来的博客文章将讨雷竞技到底好不好用论此设置。
提醒Uber.
以优步的规模,监控和预警需要跳出传统现成的解决方案。Uber的预警始于Nagios,发出石墨阈值检查碳使用源代码控制脚本的度量标准。由于我们碳指标集群的可伸缩性问题,我们决定建立我们自己的大规模指标平台,M3。为提高我们的警报系统的可用性,我们开发了梅托纳,我们的本土,时间序列的基于时间序列的基于度量标准的警报系统,用于存储在M3中的指标。对于未存储在M3中的指标,我们构建了Neris来执行主机级警报检查。
uMonitor是通过灵活性的,并在用案例多样性的构建。某些警报是在终端错误和CPU /内存消耗等标准度量上自动生成的。其他警报由与其需求特定的指标相关的各个团队创建。我们建立了uMonitor作为处理这些不同用例的平台,具体而言,
- 轻松管理警报:迭代以确定警报的适当函数和阈值
- 灵活的操作:分页、电子邮件、聊天等通知。支持自动缓解,如回滚部署和配置更改
- 处理高基数:能够对最小范围的关键问题发出警报,但不会让团队在较大的宕机时被通知淹没
使用uMonitor进行基于指标的警报
uMonitor有三个独立的组件:一个存储服务,它具有警报管理api,并封装了Cassandra警报和状态存储;一个调度程序,它跟踪所有警报,并为每个警报每分钟向工作人员分派警报检查任务;以及根据警报定义的底层度量执行警报检查的工作人员。
工作者在Cassandra存储中保持警报检查状态,并确保通过主动重试机制至少发送一次通知。工作人员还负责每隔一小时(通常是每小时)就继续发出警报。目前,uMonitor有12.5万个警报配置,每秒检查超过140万个时间序列的7亿个数据点。
警报定义有一个M3查询(要么是Graphite,要么是M3QL)和确定警报是否违反阈值的阈值。查询从M3返回一个或多个时间序列,并对每个基础序列应用阈值。如果查询违反了阈值,则发送警报操作。在Cassandra中存储状态的帮助下,工作人员维护一个状态机,该状态机确保至少在触发警报时发送通知,在警报仍然被触发时定期重新发送通知,并在问题得到缓解时解决通知。
阈值分为静态阈值和异常阈值。对于具有特定稳定状态的指标,或者我们可以通过计算成功/失败百分比等值来构造返回一致值的查询,我们通常使用静态阈值。对于周期性指标,如每个城市的行程数和其他业务指标,uMonitor使用阿哥斯,以生成基于历史数据的度量异常值的动态阈值。
主机与Neris警报
Neris是我们的内部基于主机的警报系统,为M3指标系统中不可用的每个主机指标构建的高分辨率高基数。M3中没有主机指标的原因有两个。首先,在主机上检查每分钟在每个数据中心的40000台主机上生成的150万个主机指标要比查询中央指标存储更高效;因此,摄取和存储指标的开销是不必要的。其次,直到最近,M3的留存策略导致指标存储10秒为48小时,指标存储1分钟为30天,并且不需要存储具有这种留存率和解决方案的主机指标。由于Nagios需要为每次检查编写和部署代码,这不会随着基础设施的增长而扩展,所以我们决定内部构建一个系统。
Neris有一个代理,它在我们的数据中心的每个主机上运行,并定期(每分钟)对主机本身执行警报检查。然后代理将检查结果发送到聚合层,聚合层又将聚合的结果发送到Origami。Origami负责根据查看失败警报的数量和底层警报的临界性的规则决定发送什么警报。利用Origami, Neris在每个数据中心的主机群中每分钟运行大约150万次检查。
在每个主机上启动代理时,Neris从一个名为Object Config的中央配置存储中获取主机的警报定义信息,该配置存储被Uber的底层基础设施服务广泛使用。确定哪些警报将在给定主机上运行取决于它的角色。例如,运行Cassandra的主机将检查Cassandra的状态、磁盘使用情况和其他指标。大多数这样的主机级检查都是由基础设施平台团队创建和维护的。
处理基数
高基数一直是我们的警报平台的最大挑战。传统上,这是通过具有警报查询返回多个系列并允许在警报周围的简单规则来处理,如果超过一定比例的系列违反阈值,则围绕警报才能进行火灾。uMonitor还允许用户将警报设置为依赖于其他警报 - 警报跟踪更具范围的问题取决于更大的范围警报,如果较大的范围警报正在触发,则抑制了依赖警报。
只要查询返回有限数量的序列,并且可以很容易地定义依赖项,上述技术就可以很好地工作。然而,随着优步的发展,在数百个城市经营许多不同的产品线,基数性挑战要求一个更通用的解决方案。我们使用Origami来帮助处理高基数。Neris使用Origami作为其主要的重复数据删除和通知引擎,它支持uMonitor警报的统一通知。
对于业务指标,当我们需要每张城市,每个应用程序都需要警告每个城市时,Origami非常有用。Origami允许用户创建City,产品和应用程序版本的组合的底层警报/检查,并在汇总策略上提醒,以接收每个城市/产品/应用程序版本的通知。在更大的中断(例如,当许多城市同时存在问题时),Origami将发送卷起的通知,指示剥离底层警报列表。
在主机警报方案中,ORGAMI为我们提供了基于警报的聚合状态发送不同的通知严重性的功能。让我们考虑Cassandra群集上的磁盘空间使用示例。在这种情况下,折纸通知策略可能如下所示:
- 如果少于3台主机的磁盘使用率为70%,则发送邮件通知
- 如果超过3台主机的磁盘使用率为70%,则发送一个页面
- 如果一个或多个主机的磁盘使用率达到90%,则发送一个页面
提醒通知
有用的警报通知是扩展警报系统的主要挑战。警报操作主要是从通知开始的,比如为高优先级的问题找一个随叫随到的工程师,为信息问题使用聊天或电子邮件。我们现在的重点已经转向建立缓解行动。大多数事件和中断都是由于配置更改或部署而发生的。uMonitor为回滚最近的配置更改和部署的缓解操作提供了一流的支持。对于具有更复杂的缓解运行本的团队,我们支持webhook,它可以对具有关于警报的完整上下文的端点发出POST调用,从而可以运行缓解运行本。此外,通过利用Origami中的重复数据删除管道,我们可以在较大的宕机时抑制更细粒度的通知。
除了上面提到的,我们一直在努力使通知更相关,并让他们针对正确的个人。最近的工作涉及识别配置/部署更改所有者,并在他们所修改的服务发出警报时直接与他们联系。通过组合来自的跟踪信息,我们做了额外的努力,在相关服务失败的警报通知中提供更多上下文Jaeger以及警报信息。
警报管理
正如前面提到的,我们努力将uMonitor构建为一个平台,其他团队可以在此基础上针对特定的用例进行构建。主机警报设置和管理通常是专门的,主要针对维护自己专用硬件的团队,以及为公司构建基础设施平台(包括存储、指标和计算解决方案等)的团队。警报在团队的独立git存储库中配置,该存储库与Object Config同步。
在高层次上,uMonitor有三类警报:
- 根据所有服务的CPU、磁盘使用和RPC统计的标准指标自动生成警报
- 通过UI创建的一次性警报以检测特定问题
- 通过脚本和uMonitor之上的外部配置系统创建和管理警报
随着团队以尽可能细的粒度检测可警告的问题,我们看到了上一类警报的最大增长。对这种粒度的需求源于优步的全球增长。支持优步移动应用的服务的代码更改通常会在几个小时内向特定的城市群体推出。重要的是,我们要在城市层面监控我们的平台的健康状况,以便在问题变得更广泛之前找出问题所在。此外,由工程和当地行动小组控制的配置参数对于每个城市都是不同的。例如,由于正在进行的游行等活动,城市中的载客车可能会被堵在街道上,或其他事件可能导致交通变化。
许多团队已经在uMonitor上构建了处理此类用例的警报生成解决方案。这些工具解决的一些挑战是:
- 跨各个维度迭代和生成警报
- 根据特定的业务信息(如特定国家/城市的假期)确定警报计划,并在uMonitor中配置该信息以防止虚假警报
- 在静态或当前异常阈值不起作用的情况下,根据过去的数据或对适用于特定业务线的基础度量的复杂查询确定阈值(以下关于警告查询的更多信息)
此外,这些解决方案中有许多会生成与生成的警报同步的指示板。
uMonitor还提供了强大的编辑和root原因UI。UI的编辑和实验方面至关重要,因为由于变化和尖峰,大多数度量不能用于警报。可观察性团队提供有关如何创建更适合警报的查询的指导方针。
预警查询
Graphite查询语言和M3QL提供了一种允许更多自定义解决方案的函数。下面,我们概述了如何使查询返回更一致的值的一些示例,以使指标更加警觉:
- 在几分钟内比尔斯卡的Motheraverage提醒,以平滑指标中的任何尖峰
- 将上面的操作与维持周期结合起来,以便仅在阈值违规持续了一定时间时发送通知
- 对于具有上下模式的度量标准,使用衍生功能以确保任一方向的尖峰突然突然
- 对百分比/比率发出警报,以便度量不受度量大小变化的影响
未来的计划
我们只是刚刚开始扩展我们的系统,使其能够检测微小的问题,只向用户显示适当的信息,避免不必要的警报。实现这一点的工作正在整个管道的所有部分进行,包括更有效的度量集合、扩展和简化警报执行基础设施,以及构建允许跨各种来源关联信息的ui和接口。
如果以上任何一种情况让你想要大规模地解决可观察性的挑战,请考虑申请一个角色在我们的团队。
Shreyas Srivatsan是高级纽约市工程办公室可观察性团队的高级软件工程师,致力于改善优步的警报和监控基础设施。






