一、 CAT概要
1.CAT是什么?
CAT(Central Application Tracking)是基于Java开发的实时应用监控平台,提供了全面的监控服务和业务决策支持。
2.CAT作用
2.1. 故障快速发现:主要面向运维,让运维直观到生产环境出现的问题;
2.2. 系统问题分析:面向开发,让开发能了解自己系统实时运行状态、发现问题。
3.CAT报表展示消息类型
3.1. Transaction
适合记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控,Transaction用来记录一段代码的执行时间和次数。
3.2. Event
用来记录一件事发生的次数,比如记录系统异常,它和transaction相比缺少了时间的统计,开销比transaction要小。
3.3. Heartbeat
表示程序内定期产生的统计信息, 如CPU%, MEM%, 连接池状态, 系统负载等。
3.4. Metric
用于记录业务指标、指标可能包含对一个指标记录次数、记录平均值、记录总和,业务指标最低统计粒度为1分钟。
3.5. Trace
用于记录基本的trace信息,类似于log4j的info信息,这些信息仅用于查看一些相关信息。
4.CAT架构设计
追求简单、去中心化、分工协作,两层结构,除了依赖外部存储如HDFS和MySQL外,不依赖其他系统,CAT内部全面采用组件化设计和实现。CAT每天消息量巨大,一台机器是不能处理全部流量,必须分片处理,均衡负载。
业务应用目前使用CAT API进行埋点,后台异步线程采用TCP长连接方式,将消息源源不断地传输到后台服务器;CAT具有fail-over(故障切换)机制,在后台服务器不可用时会自动切换到另一台可用服务器。CAT目前使用native协议做序列化和反序列化,将来会考虑支持更多协议,比如thrift。
消息被送到后台,经反序列化后会被放入队列,实时消费调度器会将消息分发到所有消费者内部队列,每个消费者只需处理自己的消费队列,各消费者之间彼此相对独立,如果消费速度太慢,导致消费队列满,则新来的消息会被丢弃。典型消费者都采用实时增量计算的方式,流式处理消息,产生的报表会在当前小时结束后保存到中央数据库中。
日报表采用后台作业的形式,由24个小时报表合并得到。周报表则由7个日报表合并得到,以此类推。
CAT控制台,即UI层,负责接收用户请求,从后台存储中将报表信息取出显示。对于实时报表,直接通过HTTP请求分发到相应消费机,待结果返回后聚合展示;历史报表则直接取数据库并展示。
所有原始消息会先存储在本地文件系统,然后上传到HDFS中保存;而对于报表,因其远比原始日志小,则以K/V的方式保存在MySQL中。
5.消息处理
消息处理分五个阶段:收集、传输、分析、存储和展示。
收集阶段:负责业务应用日志的埋点和采集。CAT目前提供多种语言的客户端供业务应用程序调用,埋点结果以消息树的形式存入传输队列。如果队列满,则会自动丢弃当前消息。
传输阶段:CAT客户端负责将客户端消息传输到后端,CAT消费机负责接收消息。传输前CAT客户端会与CAT消费机建立TCP长连接,不断地从客户端队列中取出消息树,序列化后写入网络;CAT消费机则不断地从网络中取出数据,反序列化后放入消费队列。
分析阶段:负责报表生成。实时消费调度器会将消费队列消息取出,分发给每个消费者内部队列;报表分析器只会从自己的报表队列中取出消息树,逐个消费,更新报表模型。CAT以小时为单位形成报表,原始日志转储(raw log dump)是一个特殊的分析器,它不生产报表,而是将消息存入本地文件系统。
存储阶段:负责报表和原始日志的存储,目前报表会存在MySQL中,原始日志压缩后存在HDFS中长久保存。保留时长取决于存储容量的大小,一般报表会保存3个月以上,原始日志保存一个月。
展示阶段:负责数据的可视化。作为用户服务入口,负责报表和原始日志的输出显示。对于实时报表请求,会向各个消费机分发请求,并将结果聚合后输出HTML,在浏览器展示;历史报表会直接取自数据库。XML数据输出是另一种内置的数据展示方式,方便基于CAT开放外围工具。
6.CAT部署结构
在实际开发和部署中,Cat-consumer和Cat-home是部署在一个JVM内部,每个CAT服务端都可以作为consumer也可以作为home,这样既能减少整个层级结构,也可以增加系统稳定性。
说明:
路由中心是根据应用所在机房信息来决定客户端上报的CAT服务端地址;
每个机房内部都有独立的原始信息存储集群HDFS;
CAT-home可以部署在一个机房也可以部署在多个机房,在最后做展示的时候,home会从consumer中进行跨机房的调用,将所有的数据合并展示给用户;
实际过程中,consumer、home以及路由中心都是部署在一起的,每个服务端节点都可以充当任何一个角色。
7.Cat监控示例
Dubbo、Spring主流框架集成cat可通过过滤器(Filter)和AOP进行全局处理。针对不是主要的业务,有全局过滤器即可对其监控,针对单独的、特殊业务监控则需单独处理。
以dubbo应用为例:消费者向服务提供者发出请求,最终得到反馈数据。那么这个流程从发出请求到最终接收数据,经历了什么?消费者发出调用TestManager.timer请求,最终耗时1870ms
二、CAT服务端安装
1.环境准备
Maven3.2.5以上
Jdk1.6、jdk1.7(暂不支持jdk1.8以上)
Web容器(Tomcat8.0.28(服务端cat)、jetty)
Mysql5.1+
2.项目安装与部署
2.1下载与安装
从github上将CAT下载至本地:https://github.com/dianping/cat
2.2文件配置
进入这个项目的目录(eg:本地目录E:\cat\1.4.0),解压cat-master.zip
将E:\cat\1.4.0\cat-master\script\下的(client.xml、datasources.xml、server.xml)配置文件复制到与web容器同盘符的/data/appdatas/cat/下
Client.xml配置:
Mode默认为client不需要修改,需要修改servers标签内的server服务端属性,这里我的cat服务器地址是127.0.0.1,port端口固定为2280,还有一个http-port属性,默认是tomcat端口,没有需要可以不指定。
Datasource.xml配置:
这里的配置比较简单,主要就是url和账号密码的配置,根据实际情况配置即可,我这里是本地测试库,cat和app的数据库配置为同一个。配置完数据源后,我们需要将CAT的数据库结构在mysql中创建,在script目录下有个名为cat.sql的文件,创建一个名为cat的数据库然后执行cat.sql即可完成数据表的创建。
Server.xml配置:
Local-mode为本地模式,设置为false,否则将不会使用数据库和hdfs存储
Hdfs-machine是否启用hdfs存储,设为false,
Job-machine当前服务为报告工作机,当有多台服务器时,开启一台即可,
Alert-machine定义为报警机,同样开启一台即可,如没有一台开启,告警功能将不能够正常使用。 Storage定义数据存储相关信息,这里定义了本地目录/data/appdatas/cat/buket/为存储目录,本地报告及本地日志保存时间均为7天。Console控制台信息,定义默认的domain为Cat(每个cat应用要求都需要有一个domain,Cat本身的domain为Cat),并显示cat的domain,
Remote-servers定义http服务列表,我这里就一台机器
4、运行打包安装命令:mvn clean install -DskipTests(如下图)
2.3启动与运行
将E:\cat\1.4.0\cat-master\cat-home\target目录下的cat-alpha-1.4.0.war复制到web容器(eg:Tomcat的webapps目录)并重命名为cat.war,启动tomcat,浏览器中输入地址http://Ip:port/cat/ (http://127.0.0.1/cat)看到如下界面表示运行成功
Tomcat启动参数参考: tomcat启动参数参考:-Xms20288m -Xmx20288m -XX:PermSize=256m -XX:MaxPermSize=256m -XX:NewSize=10144m -XX:MaxNewSize=10144m -XX:SurvivorRatio=10
Tomcat必须设置encoding格式:URIEncoding=”UTF-8”
三、框架集成
3.1 SpringMVC集成
说明:与springmvc是通过拦截器的形式进行集成,若为查看业务调用明细,可结合Spring AOP来进行通用埋点。
集成示例:
3.1.1 引入cat 依赖包
Pom.xml中新增
3.1.2 spring-mvc.xml配置
3.1.3 CatInterceptor demo
注:spring的bean都是单例,所以要放在thredlocal中保存。这里做了两个Transaction:
tranLocal是统计请求被处理至页面模板渲染完成的时间
pageLocal是记录controller处理完成返回页面至页面渲染完成的时间。
3.1.4 domain信息配置
在src/main/resources目录下新建META-INF文件夹
1、META-INF目录下创建配置文件:app.properties 内容为:domain配置,如:app.name=webb-b
2、META-INF目录下创建/cat/client.xml配置文件(domain id和app.properties配置名一致)
Client.xml内容如下:
3.1.5 /data/appdatas/cat/目录下,新建一个client.xml文件
1、如果系统是windows环境,则在eclipse运行的盘,比如D盘,新建/data/appdatas/cat/目录,新建client.xml文件
2、项目文件中source中的client.xml,此文件代表了这个项目我是谁,比如项目的名字Cat。
3、/data/appdatas/cat/client.xml,此文件有OP控制,这里的Domain名字用来做开关,如果一台机器上部署了多个应用,可以指定把一个应用的监控关闭。
Eg:/data/appdatas/cat下的client.xml配置如下:
3.1.6 CAT的Log4j集成 【建议所有Log都打到CAT,这样才能更快发现问题】
注:业务程序的所有异常都通过记录到CAT中,方便看到业务程序的问题,建议在Root节点中添加次appendar
a)在Log4j的xml中,加入Cat的Appender>
b)在Root的节点中加入catAppender
c)有一些Log的是不继承root的,需要如下配置
3.1.7 AOP通用埋点
3.2 dubbo集成
3.2.1 CAT消息树原理
远程调用时如何将消息串联起来,在CAT中提供了消息树结构来组合消息,下面看一下CAT上下文接口中的定义:
追踪跨服务的消息时,通过根消息id和父级消息id及子消息id三个属性进行消息串联,组成消息树。
在CAT中首先要创建一个包含节点数据的上下文对象,这里使用的是Cat.logRemoteCallClient方法,下面看一下源码:
这个方法需要一个上下文对象,通过消息树对象来创建获取各节点消息的id,然后填充给上下文对象。
然后远程服务端接收这个上下文对象,并读取节点消息的id组建消息树,这是使用的是Cat.logRemoteCallServer方法:
3.2.2 如何传递消息
远程调用时会传递一些数据(调用信息和参数及状态信息),如果要使用消息树,应该将上下文对象一并传递过去。
首先因为CAT没有提供context的实现类,所以这里我们需要自己手动编写一个实现类:
实现类写完了,那么如何传递这个实现类呢,dubbo在进行远程调用时,允许携带一些附件过去,通过如下代码将节点消息存放至附件中:
当然在执行这段代码前,需要通过上面提到的方法先给context对象填充消息数据,否则传递过去的都是空值。
然后只需要调用Invocation对象的invoke方法,即可将消息传递至服务端。当然这些对象需要在dubbo的filter中获取,下面看一下具体实现。
3.2.3 dubbo集成示例
3.2.3.1 引入cat依赖包<同3.1.1>
3.2.3.2 编写一个filter类继承com.alibaba.dubbo.rpc.Filter接口
3.2.3.3 在src/main/resources/META-INF/dubbo目录下创建一个名为com.alibaba.dubbo.rpc.Filter的文件,文件的内容是纯文本,格式为xxx=com.xxx.xxxFilter,这里的xxx是随便取的名字,后面的是你filter路径
3.2.3.4 domain信息配置<同3.1.4>
3.2.3.5 /data/appdatas/cat/目录下,新建一个client.xml文件<同3.1.5>
3.2.3.6 CAT的log4j集成 <同3.1.6>
3.2.3.7 通用业务逻辑埋点,结合spring aop<同3.1.7>
Filter demo示例:
四、CAT监控模型介绍
这个API里面Transaction以及Event都有两层分类,为什么是两层分类,从实际的经验中两层分类可以解决大部分的问题,所以定义了两层。 当业务程序完成了API的情况,后面会产生CAT的原始监控请求,这里我们称之为Logview.
这个Logview是一个树的结构,根节点一般都是Transaction,Transaction可以嵌套子的Transaction,Event就是一个单个节点,不能嵌套。这个longview将应用程序的执行路径按照时间序列组成一个Logview。
它还有另外一种展现形式,它很直观看到整个调用路径中最慢的地方。
Web调用服务,服务再调用其他的服务,调用关系的跟踪很有必要.
Eg:
在点评Call表示一个远程访问,当遇到一个远程访问时候,会有一个show节点,点击show就能知道服务端对应这次Call的它的访问序列,如果这个服务还调用其他的服务,一样可以跟踪下去。比如如下请求是URL,调用了groupService的服务,groupService的服务还调用了userBaseService的服务
以上部分讲诉了整个CAT监控最核心的模型以及在此基础上产生的Logview,后续监控产生所有的原始数据都来自于Logview。
基于Logview肯定有一些实时分析的report,下面讲诉监控系统基于这些logview产生几个核心的report。
4.1 LogView
4.1.1 Transaction
A、 Tansaction元素包括开始时间、结束时间、类型(type)、名称(name)、状态、处理时间、以及记录的数据(data)
B、Transction成功状态默认不显示,下图就是失败状态,用红色表示,此状态一般记录为异常。
C、Transaction是有执行时间的,它里面可以嵌套其他的Transaction,Event。
4.1.2 Event
A、Event元素包括开始时间、类型(type)、名称(name)、状态以及数据(data)。
4.1.3 Heartbeat
Heartbeat元素包括开始时间、类型(type)、名称(name)、状态以及数据(data)。
4.2 Transaction
功能:监控一段代码运行情况:运行时间统计、次数、错误次数等等。系统默认的有URL、Cache、SQL、PigeonCall、PigeonService
Storage实时报表
一个小时内详细指标统计
1. Duration Distribution表示transaction的执行时间分布,这个图可以看出,大部分shopcheckin是在16-64毫秒完成,还有很少部分在512-1024毫秒完成。
2. HitOverTime、Averager Duration Over Time,Failures Over Time 纵轴都是以5分钟为单位,HitOverTime表示5分钟内的访问次数。
3. Averager Duration Over Time表示5分钟内的平均处理时间。
4. Failures Over Time表示5分钟内的Transaction失败次数。
Transaction历史统计报表
Transaction\Event月报表支持每天的趋势图,以天为单位,
Transaction\Event报表日报表、周报表支持同比、环比对比,时间精度为5分钟
4.3 Event
功能:记录程序中一个事件记录了多少次,错误了多少次。相比于Transaction,Event没有运行时间统计。
Event实时报表
Type统计页面
Name统计页面
一个小时内详细指标统计
1. HitOverTime、Failures Over Time 纵轴都是以5分钟为单位,HitOverTime表示5分钟内的访问次数。
2. Failures Over Time表示5分钟内的Transaction失败次数。
Event历史报表
Transaction\Event月报表支持每天的趋势图,以天为单位
Transaction\Event报表日报表、周报表支持同比、环比对比,时间精度为5分钟
4.4 Problem
记录整个项目在运行过程中出现的问题,包括一些错误、访问较长的行为,problem类型如下:
Problem实时报表
点击机器IP,进入某一台机器出现的具体问题,这个包括了All中出现的所有错误统计之外,还增加了以分钟和线程为单位的错误分布图,具体如下:
4.5 Heartbeat
是CAT客户端一分钟一次向服务器发送自身的状态信息。Heartbeat包括
4.6 cross
Cross实时报表
统计粒度支持项目、具体某一IP、具体的服务方法
统计参数包括:访问量,错误量,响应时间,QPS
客户端调用
服务端调用
五、目前环境(测试)部署设计
5.1 ip地址:
Service
10.88.22.53 —-cat-server01服务器
10.88.22.58 —-cat-server02服务器
10.88.22.59 —-cat-server03服务器
Mysql
10.88.13.15 —-cat-mysql-master
5.2 应用部署说明:
[三台cat-server里面(58,59)]两台目前是接收client端通过2280端口传过来的信息流,进行整合,计算,展示在(53)这台机器上面;
53这台机器作为backup服务器,在58、59不能访问的时间可以快速的切换,保证cat监控系统可以正常监控与展示;(注:cat服务器可水平扩展)
三台cat-server服务器之间通过2280及8080端口做数据整合
5.3 配置说明:
启动一台服务端10.88.22.53,修改服务端路由文件,url地址 http://10.88.22.53:8080/cat/s/config?op=routerConfigUpdate,需要用户名密码登陆,用默认账号catadmin/catadmin登陆。
在server.xml中将10.88.22.53 部署为提供内部访问,并设置job-machine=true,让这台机器作服务端,处理数据整合。【job-machine : 定义当前服务是否为报告工作机】
将10.88.22.58,10.88.22.59 处理全部监控请求,如果后续需要扩容,可以直接添加default-server的节点。
5.4:注意事项
5.4.1 监控应用服务器必须和cat服务器时间保持一致,否则会丢失数据(运维需将各台服务器时间统一)。
5.4.2 cat在配置产品线、业务监控配置等信息时,会出现保存不成功等情况,通常导致的原因有tomcat的encoding编码、cat bug问题导致(针对url encoding编码 设置tomcat的编码格式:URIEncoding=”UTF-8”,cat服务端建议使用tomca8.0.28)