CAT整体介绍

原文连接: http://www.kailing.pub/article/index/arcid/121.htmlhtml


CAT整体介绍
CAT(Central Application Tracking)是由吴其敏(前大众点评首席架构师,现携程架构负责人)主导设计基于Java开发打造的实时应用监控平台,为大众点评网提供了全面的监控服务和决策支持。mysql

CAT做为大众点评网基础监控组件,它已经在中间件框架(MVC框架,RPC框架,数据库框架,缓存框架等)中获得普遍应用,为点评各业务线提供系统的性能指标、健康情况、基础告警等。ios

CAT解决什么问题?git

  • 线上发布了服务,怎么知道它一切正常,好比发布5台服务器,如何直观了解是否有请求进来,访问一切正常。
  • 当年有一次将线上的库配置到了Beta,这么低级的错误,排错花了一个通宵,十几我的。
  • 某个核心服务挂了,致使大量报错,如何肯定究竟是哪里出了问题。
  • SOA带来的问题,调用XX服务出问题,很慢,是否能够衡量?
  • 应用程序有性能瓶颈,如何提供一些有效工具发现?
  • …...
CAT目前现状
      15台CAT物理监控集群
       单台机器15w qps
       2000+ 业务应用(包括部分.net以及Job)

7000+ 应用服务器github

50TB 消息,~450亿消息(天天)算法

CAT做者就CAT应用开发答疑解惑sql

第一个重点是埋点工做数据库


  • Transaction埋点,主要记录一些跨项目,跨模块一些调用。最主要有三个,远程服务,数据库以及缓存。点评是在中间件上作的埋点,好比PRC框架,数据访问层框架,缓存框架,而后在业务线所有升级框架。
  • Event埋点,主要记录事件以及异常。最多见的场景就是当埋Transaction时候,须要event做为补充,好比记录当时访问参数等。代码一些特殊诡异路径的分析,还有异常信息记录。
  • Metric埋点,主要用于记录了一些实际的业务指标,用于运维监控。Heartbeat不须要业务埋点。
  • 当业务须要监控本身一段代码访问行为,他能够本身使用API,常见有访问第三方服务等等,一些比较复杂的逻辑算法等。当业务用好以后发现能解决问题以后,基本用了就停不下来,有的team第三方购买的系统,都会加入cat埋点,由于遇到过第三方系统性能问题没办法分析。
  • 监控系统须要作成开放式系统,每一个核心的report最好能提供api,让其余程序可以访问,每一个业务的想看的一些指标展现各不相同,监控是没法完成业务定制化report需求,因此须要每一个报表都能api,把本身作成一个数据平台。目前有很多项目是本身写程序爬CAT数据,做为本身整个项目的周报,技术指标。还有一些用来推进业务进行技术优化的业务线横向报表原始数据都来自CAT。
  • CAT不只仅在生产环境作了部署,在线下以及性能环境也作了部署,qa作压力测试、功能测试都会去看cat上面的数据,相比于之前测试,能够大量节省他们的时间,跑一次自动化case回归,看看CAT上面的报错,响应时间,访问量,大概就知道程序是否存在问题。
  • 在实际推广过程当中,培训很重要,并非全部人都能很清楚知道和接受CAT怎么用,相对资深同事更加容易接受。不少其余的公司部署了CAT,就是由于有好几个同事都是从点评离职过去,部署起来的。
整个CAT项目从2012初到如今,到如今大约3年多时间,整个过程持续2-3我的,几点感触和你们分享
  • 先作小作精,再作大作全
  • 持续集成,持续发布,不断监控
  • 单机开发和调试
  • Everything Fails
  • 关注客户,快速响应
  • 站在巨人的肩膀上
在今天演讲的最后,请容许我打一次广告,CAT的地址 https://github.com/dianping/cat 有兴趣能够按照步骤搭建下,搭建过程咱们写了一键工具。 CAT不少其余的文档都写搭建的系统首页上,只要本机有个mysql便可,CAT就能单机部署并运行起来。
Q1:监控系统数据采集的频率如何把控?

CAT是全量数据采集,心跳数据是1分钟一次。若是服务器或者硬件监控,通常几秒一次。若是是特别重要的,能够一秒一次。

Q2:监控项通常都有哪些?

比较通用的监控项,也就是核心框架里面监控项目,好比远程访问,数据库访问,缓存访问的响应时间,访问量等。
心跳里面的监控项有
  • 系统内存、swap、load
  • GC信息,GC时间以及数量,Java内存状态
  • 核心的一些线程数,好比http,一些RPC框架线程等
Q3:报表系统如今有不少开源的东西能够作,尤老师有没推荐的?

建议报表系统仍是本身作比较合适,报表这类需求定制太多了,好比按照部门、产品线等统计。

Q4: 跟其余开源监控方案对好比何?

开源的监控系统,好比zabbix,nagios,cacit算是很成熟的一套监控系统,他们能经过脚本或者snmp协议等收集不少服务端的性能数据,并配置不少监控规则来发现服务器等一些问题。点评这些也在用,主要是zabbix,他和CAT互相补充。
以前小米开源的系统应该也是基于指标的画图以及告警,和CAT应该是两类不一样的系统。

Q5: 能不能举例说明一下服务监控和App监控的具体作法,有没有最佳实践?

服务端监控,就应该相似于我上面讲的CAT在服务端监控一些作法,不只仅包括问题发现,还包括了性能调优,路径分析等等,这样才能把帮助业务分析并找到问题。

App监控,因为时间问题,今天没有讲到,这里说几个点吧。App监控点评作了三个部分:
  • 返回码系统(多维度下,API、城市、运营商、网络、APP版本等)
  • 实时Crash日志(版本、平台、模块等维度)
  • 测速系统(打开一个APP某个页面的分段速度测试,一个页面可能包括广告,导航、图片等,每一个阶段的速度测试)
Q6: 有没有CAT跟Dubbo集成的案例?

Dubbo是阿里的一套PRC开源框架,目前咱们没有集成的case,CAT和点评PRC组件集成得很好,坚信应该不是问题。

Q7: Cat是否适合创业公司用?但愿不要过重。
  • 创业公司能够根据本身实际须要,以及对于CAT的理解作出的一个评估。我理解的监控,是承接了公司整个开发流程上闭环的一个重要角色。监控能帮助应用发现问题,分析问题,找到问题,而后在快速进行迭代。若是要我说,我以为应该是适合的。
  • 重和不重,这点我不太好说,埋点的深度决定了监控的高度,能够轻量级使用,也能够重度使用。服务端对于创业公司来讲应该很轻量,只须要MySQL便可,只要本地磁盘足够OK,HDFS均可以不须要。
Q8:实施&运维的成本多大?

我的以为运维成本不大,主要是使用以及依赖组件不多,MySQL,极端状况HDFS均可以不须要。

Q9:数据传输用Netty而不是基于现有消息队列,是为何?

基于性能考虑。Netty自己是很是成熟的开源网络组件,event机制、全异步、高性能,还有简单易用,很是适合于框架和基础设施开发。CAT用Netty作长链接通信,吞吐量很是高,健康检测、故障转移和故障恢复能力都很是强。消息队列根本不适合这么底层的数据传输,它的overhead太大,不少feature CAT并不须要。

Q10:有没有实现内部服务调用链分析,若是有,能不能讲一下大概思路?

用CAT能够将在多台机器或多个进程的消息串起来,组成调用链。基本的思路是,在经常使用的场景中,客户端产生一个新的消息ID,连同本身的消息ID在调用时做为参数传递到服务端,而后在服务端的消息使用传过来的消息ID,来存储,并用客户端的消息ID做为向上的连接。这样客户端和服务器端就能够有双向的连接了。可是这须要在相关的框架中埋点。

Q11:若是网络断了,数据在本地能备份吗?

CAT客户端有一个queue,queue是固定大小了,CAT一台客户端会连向几个服务端,当一个服务端出问题,数据不会丢失。当全部服务端都挂掉,消息会存入queue,当queue满了,就丢弃了,没有作数据存储本地等工做。

Q12:传输数据是什么格式?有压缩吗?
  • 数据传输格式为普通文本,本身实现的序列化和反序列化,目前没有作压缩,压缩须要考虑到客户端和服务端的cpu压力。
  • 服务端存储数据是有压缩的,压缩比例大概为8:1
Q13:部署CAT,对监控的应用和服务器大概有多少影响? CAT服务挂掉,若是避免不影响业务?
  • 对于应用的服务基本影响很小,在作极端的压力测试下,加上CAT以及不加入CAT,峰值qps影响在10%之内,均值基本不变。
  • CAT客户端和服务端的通讯都是异步的,当服务所有宕机,客户端丢失消息便可。
Q14: 服务的调用链,怎么作到在中间件层面判断依赖关系?若是不是在中间件,分布式里面,怎么作设计的上下游依赖?

上下游调用,主要用到全局统一项目名,这是点评一套架构上的规范,能够理解为环境信息。RPC能在当前的运行环境下知道本身当前的项目名以及调用者的项目名。

Q15:是否有多语言client支持?

支持JAVA和 .Net。

Q16:CAT自身的健康状态监测?

当一个客户端不 work,client 会自动链接上 next server,因此有一个管理链接的线程,保持一个活动有效的链接,若是 server 所有挂了,消息就丢弃了。

Q17:如何检测到丢失的消息数?
全部的消息都是基于消息队列处理,若是队列满了,会有记录。

Q18:CAT有作字节码插桩么?

没有。

Q19: 对JVM的监控,是经过jstat脚原本收集数据的吗?数据是客户端上报,仍是服务端拉取,数据格式也是logview?

不是经过脚本,具体的收集能够参考源码 StatusInfoCollector,主要用到 MemoryMXBean, MemoryPoolMXBean等。
数据上报的格式也是logview,是客户端主动一分钟上报一次。

Q20: 客户端上报数据的话,服务端能够不用高可用吧?

服务端尽可能作到高可用吧。

Q21:手机客户端的监控是怎么作的,直接发到CAT仍是业务系统转发呢?

手机监控实际上是另一套系统,最后展现层在CAT。

Q20:咱们在用Nagios作系统和服务的监控,但对服务调用链的监控,基本上是空白。不知能不能有机会听一下中间件层面的服务调用是怎么监控的。

服务端会分析上报logview,埋点信息会有客户端和服务端的项目名信息,后端能够用此数据进行实时分析。

Q21: 这种数据用TCP长链接汇报的么?为何没考虑使用UDP?是为了可靠性么?仍是其余考量?

UDP在线下测试很不稳定,常常丢弃什么,TCP的比UDP多的开销其实对业务影响很小。
CAT系统最初的设计者吴其敏补充说:  若是系统的消息丢失率达到必定的比例,那么它的的可信度就会下降,因此保证足够多的消息可以被好好处理是很重要的。CAT设计成不可靠系统,但实际上咱们但愿系统足够可靠,只是不肯为承诺可靠而付出高额代价。 之前研究过Dapper,以为它的机制与CAT相差很远,监控的全面性不够。固然若是到了Google的量级,状况就很不同了。
TCP是有链接的,有拥塞控制;UDP无链接,通常状况下内网成功率仍是挺高的,极端状况下将很是糟糕。