CAT(Central Application Tracking)是基于 Java 开发的实时应用监控平台,包括实时应用监控,业务监控。
CAT 作为服务端项目基础组件,提供了 Java, C/C++, Node.js, Python, Go 等多语言客户端,已经在美团点评的基础架构中间件框架(MVC 框架,RPC 框架,数据库框架,缓存框架等,消息队列,配置系统等)深度集成,为美团点评各业务线提供系统丰富的性能指标、健康状况、实时告警等。
CAT 很大的优势是它是一个实时系统,CAT 大部分系统是分钟级统计,但是从数据生成到服务端处理结束是秒级别,秒级定义是 48 分钟 40 秒,基本上看到 48 分钟 38 秒数据,整体报表的统计粒度是分钟级;第二个优势,监控数据是全量统计,客户端预计算;链路数据是采样计算。
Github: https://github.com/dianping/cat
Cat 功能亮点实时处理:信息的价值会随时间锐减,尤其是事故处理过程中
全量数据:全量采集指标数据,便于深度分析故障案例
高可用:故障的还原与问题定位,需要高可用监控来支撑
故障容忍:故障不影响业务正常运转、对业务透明
高吞吐:海量监控数据的收集,需要高吞吐能力做保证
可扩展:支持分布式、跨 IDC 部署,横向扩展的监控系统
为什么要用 Cat?场景一:用户反馈 App 无法下单,用户反馈无法支付,用户反馈商品无法搜索等问题
场景一的问题在于当系统出现问题后,第一反馈的总是用户。我们需要做的是什么,是在出问题后研发第一时间知晓,而不是让用户来告诉我们出问题了。
Cat 可以出故障后提供秒级别的异常告警机制,不用再等用户来反馈问题了。
场景二:出故障后如何快速定位问题
一般传统的方式当出现问题后,我们就会去服务器上看看服务是否还存活。如果存活就会看看日志是否有异常信息。
在 Cat 后台的首页,会展示各个系统的运行情况,如果有异常,则会大片飘红,非常明显。最直接的方式还是直接查看 Problem 报表,这里会为我们展示直接的异常信息,快速定位问题。
场景三:用户反馈订单列表要 10 几秒才展示,用户反馈下单一直在转圈圈
场景三属于优化相关,对于研发来说,优化是一个长期的过程,没有最好只有更好。优化除了需要有对应的方案,最重要的是要对症下药。
所谓的对症下药也就是在优化之前,你得先知道哪里比较慢。RPC 调用慢?数据库查询慢?缓存更新慢?
Cat 可以提供详细的性能数据,95 线,99 线等。更细粒度的就是可以看到某个请求或者某个业务方法的所有耗时逻辑,前提是你做了埋点操作。
Cat 报表Cat 目前有五种报表,每种都有特定的应用场景,下面我们来具体聊聊这些报表的作用。
Transaction 报表适用于监控一段代码运行情况,比如:运行次数、QPS、错误次数、失败率、响应时间统计(平均影响时间、Tp 分位值)等等场景。
埋点方式:
public void shopService() { Transaction transaction = Cat.newTransaction("ShopService", "Service"); try { service(); transaction.setStatus(Transaction.SUCCESS); } catch (Exception e) { transaction.setStatus(e); // catch 到异常,设置状态,代表此请求失败 Cat.logError(e); // 将异常上报到cat上 // 也可以选择向上抛出: throw e; } finally { transaction.complete(); } }可以在基础框架中对 Rpc, 数据库等框架进行埋点,这样就可以通过 Cat 来监控这些组件了。
业务中需要埋点也可以使用 Cat 的 Transaction,比如下单,支付等核心功能,通常我们对 URL 进行埋点就可以了,也就包含了具体的业务流程。
适用于监控一段代码运行次数,比如记录程序中一个事件记录了多少次,错误了多少次。Event 报表的整体结构与 Transaction 报表几乎一样,只缺少响应时间的统计。
埋点方式:
Cat.logEvent("Func", "Func1");Problem 记录整个项目在运行过程中出现的问题,包括一些异常、错误、访问较长的行为。
如果有人反馈你的接口报 500 错误了,你进 Cat 后就直接可以去 Problem 报表了,错误信息就在 Problem 中。
Problem 报表不需要手动埋点,我们只需要在项目中集成日志的 LogAppender 就可以将所有 error 异常记录,下面的段落中会讲解如何整合 LogAppender。
Heartbeat 报表Heartbeat 报表是 CAT 客户端,以一分钟为周期,定期向服务端汇报当前运行时候的一些状态。
系统指标有系统的负载信息,内存使用情况,磁盘使用情况等。
JVM 指标有 GC 相关信息,线程相关信息。
Business 报表