链路追踪

文章40 |   阅读 30640 |   点赞0

来源:https://blog.csdn.net/weixin_42073629/category_9940428.html

CAT 极简入门(应用监控平台)

x33g5p2x  于2021-12-21 转载在 其他  
字(9.8k)|赞(0)|评价(0)|浏览(715)

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 微信告警。

相关文章