Uber的基础设施由数千个移动应用微服务、基础设施和内部服务组成。为了获得这些服务的高可观察性,Uber的Observability团队构建了两个内部监控解决方案:uMonitor(用于基于时间序列指标的警报和Neris(用于主机级别的检查和指标)。这两个系统都使用了通用管道来修改数据和去重。

Observability团队高级软件工程师Shreyas Srivatsan说,Uber的业务规模扩展很快就超过了他们初始监控和警报平台的应对能力。最开始,他们采用了Nagios,并使用脚本对Carbon指标进行阈值检查。但是,Nagios需要为每个度量指标编写和部署代码,随着团队和产品的增长,这些种方式无法进行很好的扩展。大约在同一时间,他们的Carbon集群也遇到了可扩展性问题。于是,Observability团队决定构建自己的度量数据库M3。

为了处理M3中的指标,该团队构建了uMonitor,这是一个基于时间序列指标的警报系统。在发布时,uMonitor有125,000个警报配置,每秒检查140多万个时间序列的7亿个数据点。uMonitor中的警报配置包含了一个查询(Graphite或M3QL)和一个阈值。查询从M3返回一个或多个时间序列,并将阈值应用于每个时间序列上。如果查询违反了阈值,就会触发警报。

uMonitor由三个独立的组件组成:提供了警报管理API的存储服务、调度程序和工作程序。存储服务对Cassandra数据库进行了包装,用于存储警报定义和警报的状态机。调度程序负责跟踪警报,并以分钟为间隔调度警报检查。工作程序针对底层指标执行警报检查,同时将状态保存到Cassandra中,以确保它们不会过度警报。

uMonitor架构

uMonitor会自动生成标准指标,如端点错误或CPU/内存消耗。其他警报可以由每个团队手动创建。目前,uMonitor支持两种类型的警报阈值:静态和异常。静态阈值对于稳定状态度量标准非常有用,例如总是返回一致值的查询。异常阈值由Uber的异常检测平台Argos提供支持。这个系统基于历史数据生成动态阈值。

Uber维护着第二个系统Neris,用于跟踪不存在M3指标系统中的主机指标。Srivatsan说,他们发现在一个集中式数据库中存储“数据中心40,000台主机每分钟产生的150万个主机指标”非常低效,所以他们选择直接查询主机。Neris在每台主机上运行一个代理,对该主机执行警报检查。在启动时,代理从Uber的中央配置存储(称为Object Config)中获取配置。配置将决定主机的角色,主机负责设置适当的检查。代理将这些检查的结果发送到聚合层,然后聚合层将数据发送到Origami。Origami负责根据一系列规则来决定应该发送哪些警报,并对警报进行去重。

Srivatsan表示,“基数太高一直是我们警报平台面临的最大挑战”。正如Aaron Sun所写的,“监控系统环境中的基数是指存储在时序数据库中唯一的指标时序的数量”。最初,Uber通过让警报查询返回多个时序并且只有在足够的时序超过阈值时才触发警报来解决高基数问题。这种情况适用于返回有限数量的时序查询。但是,当团队需要针对每个城市、每个产品和每个应用程序版本查询警报时,就不再适合使用这种方式了。

该团队开始使用Origami来解决这些更复杂的问题。如上所述,Origami能够进行数据去重和警报汇总。它还能够针对城市、产品和应用程序版本的组合创建警报,然后基于汇总策略触发警报。这些警报定义存储在各个团队的git存储库中,然后同步到Object Config。

随着平台的发展,警报已经从简单地通知轮班待命的工程师演变成可以自动触发回滚和其他缓解活动。uMonitor为回滚提供了完全支持,也可以POST到路由以触发更复杂的缓解策略。进一步的路线图改进包括更有效的度量收集、简化警报执行基础设施,以及创建UI以便于跨多个源关联数据。

查看英文原文:

https://www.infoq.com/news/2018/12/observability-uber

简析Uber的可伸缩监控:uMonitor和Neris相关推荐

  1. TCP/UDP,SOCKET,HTTP,FTP协议简析

    (一)TCP/UDP,SOCKET,HTTP,FTP简析 TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层: 网络层:IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议 传 ...

  2. 反病毒软件技术简析与探索(2009年5月18日)

    <下文是本人大三时期的一篇课外小论文,是基于大量的对杀毒软件杀毒能力的实验结果而写,请勿转载,谢谢.> 摘  要 为什么即使有杀毒软件的保护,还是有那么多的计算机系统遭到病毒的侵袭呢?答案 ...

  3. nginx master-worker工作模式简析

    一 master-worker nginx采用的是多进程的工作模式,在nginx启动后,会有一个master进程和多个互相独立的worker进程.master进程负责接收外部信号,然后通知各个work ...

  4. 金融牌照之基金销售、基金支付、基金管理牌照简析

    基金所有人都不陌生,但是在从事基金这个行业时有什么要求,什么限制和标准,很多人还是搞不清楚的.实际上我也是在学习的过程中,点滴积累和感悟记录下来,与有共同兴趣的伙伴一起分享. 本篇文章主要来简析一下从 ...

  5. java 进阶笔记线程与并发之ForkJoinPool简析

    简介 ForkJoinPool是一个线程池,支持特有的的ForkJoinTask,对于ForkJoinTask任务,通过特定的for与join方法可以优化调度策略,提高效率. 使用 通常,我们继承使用 ...

  6. Java中高级核心知识全面解析——Redis(集群【概述{主从复制、哨兵、集群化}、数据分区方案、节点通信机制、数据结构简析】)5

    目录 一.[集群]入门实践教程 1.Redis 集群概述 1)Redis 主从复制 2)Redis 哨兵 3)Redis 集群化 2.主从复制 1)主从复制主要的作用 2)快速体验 ①.第一步:本地启 ...

  7. Sleep()简析 和Sleep(0)的妙用

    Sleep()简析 和Sleep(0)的妙用 原贴地址:残月:Thread.sleep(0)的意义 HawkJony:Sleep(0)的妙用 Thread.Sleep(0) 表示挂起0毫秒,你可能觉得 ...

  8. 微前端调研及简析SPA实现原理

    最近对微前端讨论很多,梳理下自己对微前端的理解以及业内的一些微前端尝试反馈. 第零部分:自己对微前端理解 第一部分:基于Single-SPA微前端的一些demo 第二部分:Single-SPA微前端实 ...

  9. Android开机启动流程简析

    Android开机启动流程简析 (一) 文章目录 Android开机启动流程简析 (一) 前言 一.开机启动的流程概述 二.Android的启动过程分析 (1).总体流程 init简述 Zygote简 ...

最新文章

  1. 腾讯全力支持鸿蒙,腾讯宣布大力发展车联网,或与华为鸿蒙强强联合!
  2. 控制是否展示_非线性控制(四)描述函数法
  3. session 原理
  4. java 调用r语言包传参数_Java与R语言的配置,调用
  5. 基于C#的Access MsSQL MySQL 三种数据库访问演示(含源文件Demo)
  6. linux镜像文件iso下载RedHat,RedHat Enterprise Linux ISO文件下载镜像站点
  7. ckplayer php,CKplayer 站外调用示例
  8. gitlab安装注册记录——gitlab(一)
  9. 波特率(baud)与比特率(bit/s)的差别
  10. 导出excel中文文件名乱码问题
  11. POI获取单元格颜色与设置单元格颜色
  12. AGA 2019电竞狂欢盛宴开启:为全国校园电竞玩家“圆梦”
  13. 汽车功能安全工程师必看!ISO 26262认证基本原理解析
  14. 学计算机u盘多少g合适,装系统的u盘需要多大-大白菜装win7的系统一般要多少G的U?大 – 手机爱问...
  15. 关注民生民情——华北水利水电大学“情艺”国情社情调查
  16. Error setting expression 'file' with value '[Ljava.lang.String;@f0ceb'
  17. 邮箱怎么注册,电子邮件注册用什么邮箱?
  18. 【沙龙·南京】中国电信首届“天翼物联开发者大赛”广发英雄帖,邀众人才南京论剑
  19. SSM快速开发超市管理系统 用户详情功能实现(二)
  20. 今日,苹果发布 iPadOS/iOS 13 首个公测版更新

热门文章

  1. matlab表白_520新玩法!MATLAB大神教你画爱心
  2. 乐高ev3搭建图_乐高EV3作品|机械夹子(二)
  3. 会考flash中文字变形为三角形_关于信息技术会考 Flash操作题实用模版
  4. 对于初学者十条PCB元器件摆放小技巧
  5. 这些建议需要竞赛组委会酌情考虑
  6. 怎样调用php的足球联赛接口,足球赛事查询接口调用文档
  7. python截取数组的一半_python:28.数组中出现次数超过一半的数字
  8. 数字电路技术可能出现的简答题_技术货:模拟电路和数字电路PCB设计的区别
  9. mongo java mapreduce_MongoDB中MapReduce介绍与使用
  10. 静态移值编译的关键环境变量