《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 http://www.iocoder.cn/CAT/install/ 「芋道源码」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

1. 概述

偷懒提示:《CAT 官方文档 —— 简洁》已经写的很赞,这里艿艿直接 CV 大法好~

CAT Logo

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

CAT 作为服务端项目基础组件,提供了 Java, C/C++, Node.js, Python, Go 等多语言客户端,已经在美团点评的基础架构中间件框架(MVC框架,RPC框架,数据库框架,缓存框架等,消息队列,配置系统等)深度集成,为美团点评各业务线提供系统丰富的性能指标、健康状况、实时告警等。

CAT 很大的优势是它是一个实时系统,CAT 大部分系统是分钟级统计,但是从数据生成到服务端处理结束是秒级别,秒级定义是 48 分钟 40 秒,基本上看到 48 分钟 38 秒数据,整体报表的统计粒度是分钟级;

第二个优势,监控数据是全量统计,客户端预计算;链路数据是采样计算。

1.1 CAT 产品价值

  • 减少故障发现时间
  • 降低故障定位成本
  • 辅助应用程序优化

1.2 CAT 优势

  • 实时处理:信息的价值会随时间锐减,尤其是事故处理过程中
  • 全量数据:全量采集指标数据,便于深度分析故障案例
  • 高可用:故障的还原与问题定位,需要高可用监控来支撑
  • 故障容忍:故障不影响业务正常运转、对业务透明
  • 高吞吐:海量监控数据的收集,需要高吞吐能力做保证
  • 可扩展:支持分布式、跨 IDC 部署,横向扩展的监控系统

2. 单机部署

本小节,我们来参考《CAT 官方文档 —— 集群部署》文章,来最小化部署一个 CAT 服务,适合演示学习测试环境之用。

在单机部署时,我们无需部署 Hadoop 环境,直接使用磁盘存储 CAT 的监控数据即可。因此,还是比较简单的。下面,我们使用 CentOS 7.X 来部署 CAT 服务器。

  • Linux 2.6 以及之上(2.6 内核才可以支持 epoll),线上服务端部署请使用 Linux 环境,Mac 以及 Windows 环境可以作为开发环境,美团点评内部 CentOS 6.5。
  • Hadoop 环境可选,一般建议规模较小的公司直接使用磁盘模式,可以申请 CAT 服务端,500GB 磁盘或者更大磁盘,这个磁盘挂载在 /data/ 目录上。

注意,艿艿服务器的内网 IP 是 172.16.48.185,胖友注意替换成自己的服务器的内网 IP!!!

2.1 下载

CAT 官方已经提供了 CAT 服务器的 war 包,所以我们可以直接执行如下命令进行下载:

# 下载 war 包
$ wget http://unidal.org/nexus/service/local/repositories/releases/content/com/dianping/cat/cat-home/3.0.0/cat-home-3.0.0.war

# 重命名为 cat.war
$ mv cat-home-3.0.0.war cat.war

2.2 配置

在启动 CAT 服务器之前,我们需要做一定的配置。

① 将 CAT 提供的 script/CatApplication.sql 脚本,初始化到数据库中。导入完成后,数据表如下图所示:

数据表

② 创建 CAT 目录,并授予权限。执行如下命令:

# 创建 CAT 配置目录
$ mkdir -p /data/appdatas/cat

# 创建 CAT 日志目录
$ mkdir -p /data/applogs/cat

# 赋予权限
$ chmod 777 /data/appdatas/cat -R
$ chmod 777 /data/applogs/cat -R

③ 在 /data/appdatas/cat 目录,创建 CAT 客户端配置文件 client.xml。具体内容如下:

  • 此配置文件的作用是所有的客户端都需要一个地址指向 CAT 的服务端。
  • 此文件可以通过运维统一进行部署和维护,比如使用 puppet 等运维工具。
  • 不同环境这份文件不一样,比如区分 prod 环境以及 test 环境,在美团点评内部一共是 2 套环境的 CAT,一份是生产环境,一份是测试环境。
  • 注意:当路由错误,且该文件夹下存在 client_cache.xml,请删除 client_cache.xml,再重启服务。

<?xml version="1.0" encoding="utf-8"?>
<config mode="client">
<servers>
<!-- 当前服务器内网 IP -->
<server ip="172.16.48.185" port="2280" http-port="8080"/>
<!-- 集群时添加其他服务器 -->
<!-- <server ip="其他机子内网ip" port="2280" http-port="8080"/> -->
</servers>
</config>

  • 2280 是默认的 CAT 服务端接受数据的端口,不允许修改。
  • http-port 是 Tomcat 启动的端口,默认是 8080,建议使用默认端口。

这里我们单机部署,所以不存在集群的其它服务器。

④ 在 /data/appdatas/cat 目录,创建 CAT 服务端配置文件 server.xml。具体内容如下:

<?xml version="1.0" encoding="utf-8"?>
<!-- Configuration for development environment-->
<config local-mode="false" hdfs-machine="false" job-machine="true" alert-machine="true">
<storage local-base-dir="/data/appdatas/cat/bucket/" max-hdfs-storage-time="15" local-report-storage-time="7" local-logivew-storage-time="7">
</storage>
<console default-domain="Cat" show-cat-domain="true">
<!-- 所有 CAT 服务器的内网 IP -->
<remote-servers>172.16.48.185:8080</remote-servers>
</console>
</config>

😈 友情提示:如下 server 和 storage 模型的介绍,有点冗长,可以直接暂时先忽略~

**server 模型:代表一台机器的配置。**如果 iddefault,代表默认配置;如果 id 为 IP,代表该台服务器的配置。

  • property local-mode : 定义服务是否为本地模式(开发模式)。在生产环境时,设置为 false,启动远程监听模式。默认为 false
  • property hdfs-machine : 定义是否启用 HDFS 存储方式,默认为 false
  • property job-machine : 定义当前服务是否为报告工作机(开启生成汇总报告和统计报告的任务,只需要一台服务机开启此功能),默认为 false
  • property alarm-machine : 定义当前服务是否为报警机(开启各类报警监听,只需要一台服务机开启此功能),默认为 false
  • property send-machine : 定义当前服务告警是否发送(当时为了解决测试环境开启告警线程,但是最后告警不通知,此配置后续会逐步去除,建议 alarm-machine 开启为 true 的时候,这个同步为 true)。

storage 模型: 定义数据存储配置信息

  • property local-report-storage-time : 定义本地报告存放时长,单位为(天)。
  • property local-logivew-storage-time : 定义本地日志存放时长,单位为(天)。
  • property local-base-dir : 定义本地数据存储目录,此目录为上传到HDFS时所查找的源文件路径。
  • property hdfs : 定义HDFS配置信息,便于直接登录系统。
  • property server-uri : 定义 HDFS 服务地址,支持配置HDFS Nameservice。
  • property console : 定义服务控制台信息。
  • property remote-servers : 定义 HTTP 服务列表,(远程监听端同步更新服务端信息即取此值)。
  • ldap : 定义 LDAP 配置信息(这个可以忽略)。
  • ldapUrl : 定义 LDAP 服务地址(这个可以忽略)。

这里我们单机部署,所以只需要填写当前 CAT 服务器的内网 IP 即可。

⑤ 在 /data/appdatas/cat 目录,创建 CAT 数据库配置文件 datasources.xml。具体内容如下:

<?xml version="1.0" encoding="utf-8"?>
<data-sources>
<data-source id="cat">
<maximum-pool-size>3</maximum-pool-size>
<connection-timeout>1s</connection-timeout>
<idle-timeout>10m</idle-timeout>
<statement-cache-size>1000</statement-cache-size>
<properties>
<driver>com.mysql.jdbc.Driver</driver>
<!-- 数据库地址 -->
<url><![CDATA[jdbc:mysql://rm-uf60u8c6vnfx2q4m4.mysql.rds.aliyuncs.com:3306/demo_cat]]></url>
<!-- 数据库账号 -->
<user>demo_cat</user>
<!-- 数据库密码 -->
<password>Wwb626583</password>
<connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000]]></connectionProperties>
</properties>
</data-source>
</data-sources>

2.3 启动

① 因为 CAT 服务器提供的是 war 包,所以我们需要下载 Tomcat。这里我们采用 Tomcat 9.X 版本。执行命令如下:

# 下载
$ wget http://mirror.cc.columbia.edu/pub/software/apache/tomcat/tomcat-9/v9.0.35/bin/apache-tomcat-9.0.35.tar.gz

# 解压
$ tar -zxvf apache-tomcat-9.0.35.tar.gz

J2EE 容器建议使用 Tomcat,建议使用推荐版本 7.X.X 或 8.0。

② 将 CAT 服务器提供的是 war 包,拷贝到 Tomcat 的 webapps 目录下。执行命令如下:

$ cp cat.war apache-tomcat-9.0.35/webapps/

③ 修改 Tomcat 的服务器配置文件 server.xml 的编码为 UTF-8,避免乱码的问题。修改内容部分如下:

$ vi apache-tomcat-9.0.35/conf/server.xml

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="utf-8" /> <!-- 新增部分 -->

④ 安装 OpenJDK 1.8 版本,通过执行 yum install java-1.8.0-openjdk 命令即可。

Java 6,7,8,服务端推荐使用 jdk7 的版本。

客户端 jdk6、7、8 都支持。

⑤ 启动 Tomcat 服务器,通过执行 sh apache-tomcat-9.0.35/bin/startup.sh 命令。

2.4 二次配置

① 启动完成后,访问 http://172.16.48.185:8080/cat 地址,进入 CAT 控制台的登录页。CAT 内置管理员账号为「admin/admin」,进入 CAT 控制台的首页

友情提示:可能 CAT 启动会比较慢,所以胖友可以不断刷新~

CAT 控制台 - 首页

此时,我们看到页面报“出问题CAT的服务端:[127.0.0.1]”错误,需要进行解决。

② 点击上方「Configs」菜单,后选择左边「全局系统配置 -> 客户端路由」菜单,修改内容如下图所示,并点击「提交」按钮:

CAT 控制台 - 客户端路由

<?xml version="1.0" encoding="utf-8"?>
<router-config backup-server="172.16.48.185" backup-server-port="2280">
<default-server id="172.16.48.185" weight="1.0" port="2280" enable="true"/>
<network-policy id="default" title="默认" block="false" server-group="default_group">
</network-policy>
<server-group id="default_group" title="default-group">
<group-server id="172.16.48.185"/>
</server-group>
<domain id="cat">
<group id="default">
<server id="172.16.48.185" port="2280" weight="1.0"/>
</group>
</domain>
</router-config>

③ 继续点击左边「全局系统配置 -> 服务端配置」菜单,修改内容如下图所示,并点击「提交」按钮:

CAT 控制台 - 客户端路由

<?xml version="1.0" encoding="utf-8"?>
<server-config>
<server id="default">
<properties>
<property name="local-mode" value="false"/>
<property name="job-machine" value="false"/>
<property name="send-machine" value="false"/>
<property name="alarm-machine" value="false"/>
<property name="hdfs-enabled" value="false"/>
<property name="remote-servers" value="172.16.48.185:8080"/>
</properties>
<storage local-base-dir="/data/appdatas/cat/bucket/" max-hdfs-storage-time="15" local-report-storage-time="2" local-logivew-storage-time="1" har-mode="true" upload-thread="5">
<hdfs id="dump" max-size="128M" server-uri="hdfs://127.0.0.1/" base-dir="/user/cat/dump"/>
<harfs id="dump" max-size="128M" server-uri="har://127.0.0.1/" base-dir="/user/cat/dump"/>
<properties>
<property name="hadoop.security.authentication" value="false"/>
<property name="dfs.namenode.kerberos.principal" value="hadoop/dev80.hadoop@testserver.com"/>
<property name="dfs.cat.kerberos.principal" value="cat@testserver.com"/>
<property name="dfs.cat.keytab.file" value="/data/appdatas/cat/cat.keytab"/>
<property name="java.security.krb5.realm" value="value1"/>
<property name="java.security.krb5.kdc" value="value2"/>
</properties>
</storage>
<consumer>
<long-config default-url-threshold="1000" default-sql-threshold="100" default-service-threshold="50">
<domain name="cat" url-threshold="500" sql-threshold="500"/>
<domain name="OpenPlatformWeb" url-threshold="100" sql-threshold="500"/>
</long-config>
</consumer>
</server>
<server id="172.16.48.185">
<properties>
<property name="job-machine" value="true"/>
<property name="send-machine" value="true"/>
<property name="alarm-machine" value="true"/>
</properties>
</server>
</server-config>

④ 修改完成后,重新启动 Tomcat 服务器,使新的 CAT 服务器的配置生效。重启完成后,访问 http://172.16.48.185:8080/cat 地址,就不会看到 CAT 控制台的不报错啦。

友情提示:可能 CAT 启动会比较慢,所以胖友可以不断刷新~

CAT 控制台 - 首页

3. 集群部署

参见如下文章,完成 CAT 集群部署:

这里先暂时偷懒下,艿艿想把重点放在 CAT 客户端的接入!

4. 模型设计

在开始在应用中接入 CAT 客户端之前,我们需要看看《CAT 官方文档 —— 模型设计》文章,了解下 CAT 的四种监控模型:Transaction、Event、Heartbeat、Metric。

4.1 模型一:Transaction

适合记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控。

Transaction 用来记录一段代码的执行时间次数

模型一:Transaction

进一步了解,可见《CAT 官方文档 —— Transaction 报表》

4.2 模型二:Event

用来记录一件事发生的次数,比如记录系统异常。

它和 Transaction 相比缺少了时间的统计,开销比 Transaction 要小。

模型二:Event

进一步了解,可见《CAT 官方文档 —— Event 报表》

另外,CAT 基于 Transaction 和 Event 产生了 《CAT 文档 —— Problem 报表》,胖友可以看看哈~

4.3 模型三:Heartbeat

表示程序内定期产生的统计信息, 如CPU利用率、内存利用率、连接池状态、系统负载等。

模型三:Heartbeat

进一步了解,可见《CAT 官方文档 —— Heartbeat 报表》

4.4 模型四:Metric

用于记录业务指标、指标可能包含对一个指标记录次数、记录平均值、记录总和,业务指标最低统计粒度为 1 分钟。

模型四:Metric

进一步了解,可见《CAT 官方文档 —— Business 报表》

4.5 消息树

CAT监控系统将每次 URL、Service 的请求内部执行情况都封装为一个完整的消息树。消息树可能包括 Transaction、Event、Heartbeat、Metric 等信息。

① 完整的消息树

② 可视化消息树

③ 分布式消息树【一台机器调用另外一台机器】

5. 应用接入

参考《芋道 Spring Boot 监控平台 CAT 入门》文章,将 CAT 客户端接入应用,实现监控的功能。

6. 告警

参考《CAT 官方文档 —— 告警配置》文章,实现 CAT 的告警功能。

同时可以参考 cat-alert 集成方式,实现 CAT 微信告警。

666. 彩蛋

暂无彩蛋~

本文写于对 CAT 进行技术选型,后续在补充一些内容,嘿嘿~

文章目录
  1. 1. 1. 概述
    1. 1.1. 1.1 CAT 产品价值
    2. 1.2. 1.2 CAT 优势
  2. 2. 2. 单机部署
    1. 2.1. 2.1 下载
    2. 2.2. 2.2 配置
    3. 2.3. 2.3 启动
    4. 2.4. 2.4 二次配置
  3. 3. 3. 集群部署
  4. 4. 4. 模型设计
    1. 4.1. 4.1 模型一:Transaction
    2. 4.2. 4.2 模型二:Event
    3. 4.3. 4.3 模型三:Heartbeat
    4. 4.4. 4.4 模型四:Metric
    5. 4.5. 4.5 消息树
  5. 5. 5. 应用接入
  6. 6. 6. 告警
  7. 7. 666. 彩蛋