1. 概述
偷懒提示:《CAT 官方文档 —— 简洁》已经写的很赞,这里艿艿直接 CV 大法好~
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 模型:代表一台机器的配置。如果
id
为default
,代表默认配置;如果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的服务端:[127.0.0.1]”错误,需要进行解决。
② 点击上方「Configs」菜单,后选择左边「全局系统配置 -> 客户端路由」菜单,修改内容如下图所示,并点击「提交」按钮:
<?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>
③ 继续点击左边「全局系统配置 -> 服务端配置」菜单,修改内容如下图所示,并点击「提交」按钮:
<?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 启动会比较慢,所以胖友可以不断刷新~
3. 集群部署
参见如下文章,完成 CAT 集群部署:
这里先暂时偷懒下,艿艿想把重点放在 CAT 客户端的接入!
4. 模型设计
在开始在应用中接入 CAT 客户端之前,我们需要看看《CAT 官方文档 —— 模型设计》文章,了解下 CAT 的四种监控模型:Transaction、Event、Heartbeat、Metric。
4.1 模型一:Transaction
适合记录跨越系统边界的程序访问行为,比如远程调用,数据库调用,也适合执行时间较长的业务逻辑监控。
Transaction 用来记录一段代码的执行时间和次数。
进一步了解,可见《CAT 官方文档 —— Transaction 报表》。
4.2 模型二:Event
用来记录一件事发生的次数,比如记录系统异常。
它和 Transaction 相比缺少了时间的统计,开销比 Transaction 要小。
进一步了解,可见《CAT 官方文档 —— Event 报表》。
另外,CAT 基于 Transaction 和 Event 产生了 《CAT 文档 —— Problem 报表》,胖友可以看看哈~
4.3 模型三:Heartbeat
表示程序内定期产生的统计信息, 如CPU利用率、内存利用率、连接池状态、系统负载等。
进一步了解,可见《CAT 官方文档 —— Heartbeat 报表》。
4.4 模型四:Metric
用于记录业务指标、指标可能包含对一个指标记录次数、记录平均值、记录总和,业务指标最低统计粒度为 1 分钟。
进一步了解,可见《CAT 官方文档 —— Business 报表》。
4.5 消息树
CAT监控系统将每次 URL、Service 的请求内部执行情况都封装为一个完整的消息树。消息树可能包括 Transaction、Event、Heartbeat、Metric 等信息。
① 完整的消息树
② 可视化消息树
③ 分布式消息树【一台机器调用另外一台机器】
5. 应用接入
参考《Spring Boot 监控平台 CAT 入门》文章,将 CAT 客户端接入应用,实现监控的功能。
6. 告警
参考《CAT 官方文档 —— 告警配置》文章,实现 CAT 的告警功能。
同时可以参考 cat-alert
集成方式,实现 CAT 微信告警。