Skip to the content.

饿了么监控系统 EMonitor 与 CAT 的对比

作者:李刚(乒乓狂魔)
创作日期:2019-10-31
专栏地址:【稳定大于一切】 PDF 格式:饿了么监控系统 EMonitor 与 CAT 的对比

背景介绍

饿了么监控系统 EMonitor:是一款服务于饿了么所有技术部门的一站式监控系统,覆盖了系统监控、容器监控、网络监控、中间件监控、业务监控、接入层监控以及前端监控的数据存储与查询。每日处理总数据量近PB,每日写入指标数据量百T,每日指标查询量几千万,配置图表个数上万,看板个数上千。

CAT:是基于Java 开发的实时应用监控平台,为美团点评提供了全面的实时监控告警服务。

本文通过对比分析下两者所做的事情为契机讨论监控系统或许该有的面貌,以及浅谈下监控系统发展的各个阶段

CAT做的事情(开源版)

首先要强调的是这里我们只能拿到 GitHub上 开源版 CAT 的最新版 3.0.0,所以是基于此版本进行对比。

接下来说说 CAT 做了哪些事情?

1 抽象出监控模型

抽象出 Transaction、Event、Heartbeat、Metric 4种监控模型。

针对 Transaction 和 Event 都固定了 2 个维度:type 和 name,并且针对 type 和 name 进行分钟级聚合成报表并展示曲线。

image.png

2 采样链路

针对上述 Transaction、Event 的 type 和 name 分别有对应的分钟级的采样链路。

image.png

3 自定义的 Metric 打点

目前支持 Counter 和 Timer 类型的打点,支持 tag,单机内单个 Metric 的 tag 组合数限制 1000。并且有简单的监控看板,如下图所示:

image.png

4 与其他组件集成

比如和 Mybatis 集成,在客户端开启相关的 SQL 执行统计,并将该统计划分到 Transaction 统计看板中的 type=SQL 的一栏下:

image.png

5 告警

可以针对上述的 Transaction、Event 等做一些简单的阈值告警。

饿了么 EMonitor 和 CAT 的对比

饿了么 EMonitor 借鉴了 CAT 的相关思想,同时又进行了改进。

1 引入 Transaction、Event 的概念

针对 Transaction 和 Event 都固定了 2 个维度:type 和 name,不同地方在于聚合用户发过来的数据。

CAT的架构图如下所示:

image.png

CAT的消费机需要做如下2件事情:

EMonitor的架构图如下所示:

image.png

EMonitor 分 2 路对数据进行隔离处理:

所以 EMonitor 和 CAT 的一个很大不同点就在于对指标的处理上,EMonitor 交给专业的时序数据库来做,而 CAT 自己做聚合就显得功能非常受限,如下所示:

但是CAT也有自己的优势:

2 采样链路

目前 CAT 和 EMonitor 都可以通过 type 和 name 来过滤采样链路,不同点在于

EMonitor 的链路如下所示:

image.png

3 自定义的 Metric 打点

EMonitor 支持 Counter、Timer、Histogram、Payload、Gauge 等等多种形式的打点方式,并且支持 tag。

也就是任意 Metric 打点都可以流经 EMonitor 进行处理了并输送到 LinDB 时序数据库中。至此,EMonitor 就可以将任何监控指标统一在一起了,比如机器监控都可以通过 EMonitor 来保存了,这为一站式监控系统奠定了基础。

自定义 Metric 看板

CAT 只有一个简易的 Metric 看板。而 EMonitor 针对 Metric 开发了一套可以媲美 Grafana 的指标看板,相比 Grafana 的优势如下:

类 SQL 的配置查询指标方式如下所示:

image.png

看板整体如下所示:

image.png

移动端显示如下:

image.png

4 与其他组件集成

image.png

目前 EMonitor 已经打通了 IaaS 层、PaaS 层、应用层的所有链路和指标的监控,再也不用在多个监控系统中切换来切换去了,如下所示

image.png

以打通饿了么分库分表中间件 DAL 为例:

image.png

image.png

再以打通饿了么 SOA 服务为例:

image.png image.png

5 告警

可以针对所有的监控指标配置如下告警方式:

浅谈监控系统的发展趋势

1 日志监控阶段

本阶段实现方式:程序打日志,使用 ELK 来存储和查询程序的运行日志,ELK 也能简单显示指标曲线。

排障过程:一旦有问题,则去 ELK 中搜索可能的异常日志来进行分析排障。

2 链路监控阶段

上一个阶段存在的问题:ELK 只是基于一行一行日志进行聚合或者搜索分析,日志之间没有上下文关联。很难知道一次请求耗时较长究竟耗时在哪个阶段。

本阶段实现方式:CAT 横空出世,通过建模抽象出 Transaction、Metric 等监控模型,将链路分析和简单的报表带入了大家的视野。

告警方式:针对报表可以进行阈值监控。

排障过程:一旦有告警,可以通过点击报表来详细定位到是哪个type或name有一定问题,顺便找到对应的链路,查看详细的信息。

3 指标监控阶段

上一阶段存在的问题:CAT 对自定义指标支持的比较弱,也无法实现或者展现更加多样的查询聚合需求。

本阶段的实现方式:支持丰富的 Metric 指标,将链路上的一些报表数据也可以划分到指标中,交给专业的时序数据库来做指标的存储和查询,对接或者自研丰富的指标看板如 Grafana。

告警方式:针对指标进行更加丰富的告警策略。

排障过程:一旦有告警,可能需要到各个系统上查看指标看板,粗略定位根因,再结合链路总和分析。

4 平台打通整合阶段

上一阶段存在的问题:系统监控、中间件和业务监控、部分业务监控、链路监控与指标监控都各搞一套数据收集、预处理、存储、查询、展现、告警流程,各个系统处理数据格式、使用方式不统一。

本阶段的实现方式:打通从系统层面、容器层面、中间件层面、业务层面等等的可能的链路和指标监控,统一数据的处理流程,同时整合发布、变更、告警与监控曲线结合,成为一站式监控平台。

告警方式:可以统一的针对各个层面的监控数据做统一化的告警。

排障过程:只需要在一个监控系统中就可以查看到所有的监控曲线和链路信息。

目前我们 EMonitor 已完成这个阶段,将公司之前存在已久的3套独立的监控系统统一整合成现如今的一套监控系统。

5 深度分析阶段

上一阶段存在的问题:

总之:之前的阶段都是去做一个监控平台,用户查询什么指标就展示相应的数据,监控平台并不去关心用户所存储数据的内容。现在呢就需要转变思路,监控平台需要主动去帮用户分析里面所存储的数据内容。

本阶段的实现方式:所要做的就是把帮用户分析的过程抽象出来,为用户构建应用大盘和业务大盘,以及为大盘做相关的根因分析。

根因分析:一个大盘有很多的环节,每个环节绑定有很多的指标,每次某个告警出来有可能需要详细的分析下每个环节的指标,比如消费kafka的延迟上升,有各种各样的原因都可能导致,每次告警排查都需要将分析流程再全部人为分析排查下,非常累,所以需要将定位根因的过程通过建模抽象下,来进行统一解决。

趋势报表分析:主动帮用户发现一些逐渐恶化的问题点,比如用户发布之后,接口耗时增加,很可能用户没有发现,虽然当前没有问题,但是很有可能在明天的高峰期就会暴露问题,这些都是已经实实在在发生的事故。

要想做主动分析,还深度依赖指标下钻分析,即某个指标调用量下降了,能主动分析出是哪些tag维度组合导致的下降,这是上述很多智能分析的基础,这一块也不简单。

告警方式:可以统一的针对各个层面的监控数据做统一化的告警。

排障过程:NOC根据业务指标或者业务大盘快速得知是哪些业务或者应用出先了问题,应用的owner通过应用大盘的体检得知相关的变动信息,比如是redis波动、database波动、上下游应用的某个方法波动等等,来达到快速定位问题目的,或者通过对大盘执行根因分析来定位到根因。

再谈Logging、Tracing、Metrics

常见一张 3 者关系的图

image.png

三者的确都不可或缺,相辅相成,但是我想说以下几点:

参考链接

加入我们

【稳定大于一切】打造国内稳定性领域知识库,让无法解决的问题少一点点,让世界的确定性多一点点