CAT 是大众点评开源的实时监控系统,它侧重于 Java 应用监控,可与各种流行的中间件框架集成(MVC框架、RPC框架、数据库框架、缓存框架等),实现应用各层级系统的运行状况监控。本文总结了 CAT 服务器集群的搭建、Java 应用的集成、以其控制台的使用。

作者:王克锋
出处:https://kefeng.wang/2018/07/06/tracing-cat/
版权:自由转载-非商用-非衍生-保持署名,转载请标明作者和出处。

1 概述

官网: https://github.com/dianping/cat/

1.1 概述

CAT(Central Application Tracking) 是大众点评开源的一套基于 Java 的实时应用监控平台,主要应用于服务中间件框架(MVC 框架、RPC 框架、持久层框架、分布式缓存框架)的监控(服务端、移动端、前端),为开发和运维提供各项性能指标、健康检查、自动报警等可视化服务。

1.2 依赖环境

本文只实现了本地磁盘文件存储(非大数据)方式。所用环境:

2 准备数据库

只需部署一个 MySQL 实例,CAT 集群中各节点共用。

2.1 配置数据库

增大 MySQL 最大允许的 SQL 字节数(默认为 4M)。

### sudo vim /etc/my.cnf
### 修改后重启: sudo systemctl restart mysqld
[mysqld]
max_allowed_packet=64M

2.2 创建数据库

DROP DATABASE IF EXISTS cat;
CREATE DATABASE cat CHARACTER SET utf8;
GRANT ALL ON cat.* TO cat_user@'192.168.%' IDENTIFIED BY 'MySQL5.7';
FLUSH PRIVILEGES;

2.3 创建数据表

执行 CAT 脚本: /opt/cat/script/Cat.sql

3 部署 CAT 集群


假设要部署三台: 192.168.126.101/102/103,以 192.168.126.101 为例来说明。

3.1 下载并构建

sudo rm -rf /opt/cat
## sudo git clone https://github.com/dianping/cat.git /opt/cat
sudo git clone https://github.com/kefeng-wang/cat.git /opt/cat
sudo chown -R admin:admin /opt/cat
cd /opt/cat
mvn clean install -DskipTests
## 如果遇到“找不到 jar 包”的报错,可从本地仓库删除相应目录,再重试

3.2 准备目录

sudo mkdir -p /data/{appdatas,applogs}/cat
## sudo mkdir -p /data/appdatas/cat/bucket ## 会自动创建(本地数据目录)
sudo chown admin:admin /data/{appdatas,applogs}/cat
cp /opt/cat/script/*.xml /data/appdatas/cat/

3.3 配置 datasources.xml

文件 /data/appdatas/cat/datasources.xml,替换中的参数:

  • ${jdbc.url}: 数据库地址。形如 jdbc:mysql://localhost:3306,不要加额外选项
  • ${jdbc.user}: 数据库用户。比如 cat_user
  • ${jdbc.password}: 数据库用户密码。比如 MySQL5.7

3.4 配置 server.xml

3.4.1 节点的职责
  • 控制台 - 提供给业务人员进行数据查看【默认所有的cat节点都可以作为控制台,不可配置】
  • 消费机 - 实时接收业务数据,实时处理,提供实时分析报表【默认所有的cat节点都可以作为消费机,不可配置】
  • 任务机(job-machine) - 做一些离线的任务,合并天、周、月等报表 【可以配置】
  • 告警端(alert-machine) - 启动告警线程,进行规则匹配,发送告警(目前仅支持单点部署)【可以配置】
3.4.2 配置文件

文件 /data/appdatas/cat/server.xml

<?xml version="1.0" encoding="utf-8"?>
<config local-mode="false" hdfs-machine="false" job-machine="false" alert-machine="false">
    <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">
        <remote-servers>192.168.126.101:8080,192.168.126.102:8080,192.168.126.103:8080</remote-servers>
    </console>
</config>

一台(192.168.126.101) 部署“控制台、告警端、任务机”,可绑定域名以便外部访问: 指定 job-machine=”true” alert-machine=”true”;
两台(192.168.126.102/103),部署为“消费机”: 指定 job-machine=”false” alert-machine=”false”。

3.4.3 参数详解
  • local-mode: 建议在开发环境以及生产环境时,都设置为false
  • hdfs-machine: 定义是否启用 HDFS 存储方式,默认为 false
  • job-machine: 定义当前服务是否为报告工作机(开启生成汇总报告和统计报告的任务,只需要一台服务机开启此功能),默认为 false
  • alert-machine: 定义当前服务是否为报警机(开启各类报警监听,只需要一台服务机开启此功能),默认为 false;
  • storage: 定义数据存储配置信息
  • local-report-storage-time: 定义本地报告文件存放时长,单位为(天)
  • local-logivew-storage-time: 定义本地日志文件存放时长,单位为(天)
  • local-base-dir: 定义本地数据存储目录,建议直接使用/data/appdatas/cat/bucket目录
  • hdfs: 定义HDFS配置信息
  • server-uri: 定义HDFS服务地址
  • console: 定义服务控制台信息
  • remote-servers: 定义HTTP服务列表,(远程监听端同步更新服务端信息即取此值)

3.5 配置 client.xml

文件 /data/appdatas/cat/client.xml,用于指定 CAT 各服务器节点的信息:

  • server.ip: CAT 服务端的 IP;
  • server.port: CAT服务端接受数据的端口(不要修改);
  • server.http-port: Tomcat启动的端口(建议默认)。
<servers>
    <server ip="192.168.126.101" port="2280" http-port="8080" />
    <server ip="192.168.126.102" port="2280" http-port="8080" />
    <server ip="192.168.126.103" port="2280" http-port="8080" />
</servers>

3.6 启动

sudo cp -f /opt/cat/cat-home/target/cat-alpha-2.0.0.war $CATALINA_HOME/webapps/cat.war
sudo systemctl restart tomcat

3.7 防火墙放行

### sudo vim /etc/sysconfig/iptables
-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT
### 重启生效: sudo systemctl restart iptables

3.8 源码的远程调试

如果运行过程中遇到问题,可采用远程调试来跟踪:

  • 项目导入 IDEA:本机下载源码,IDEA 中打开 cat 源码根目录,即可;
  • 远程调试的设置:参考 IDEA 远程调试

4 Java 应用的集成

CAT 技术入门总结-0.1.0.doc

4.1 本机全局指定 Maven 仓库

由于 cat-client 等开发包并未加入 Maven 官方仓库(repo1.maven.org),所以需要指定 cat 专用的远程仓库。

<!-- %MAVEN_HOME%\conf\settings.xml -->

<profiles>
    <profile>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <repositories>
            <repository>
                <id>central</id>
                <layout>default</layout>
                <url>http://repo1.maven.org/maven2</url>
            </repository>
            <repository>
                <id>unidal.nexus</id>
                <url>http://unidal.org/nexus/content/repositories/releases/</url>
            </repository>
        </repositories>
        <properties>
            <maven.compiler.source>1.8</maven.compiler.source>
            <maven.compiler.target>1.8</maven.compiler.target>
        </properties>
    </profile>
</profiles>

4.2 加入依赖(pom.xml)

<dependencies>
    <dependency>
        <groupId>com.dianping.cat</groupId>
        <artifactId>cat-client</artifactId>
        <version>2.0.0</version>
    </dependency>
</dependencies>

4.3 添加过滤器 CatFilter

SpringMVC 和 SpringBoot 项目,都是加入过滤器 com.dianping.cat.servlet.CatFilter,具体形式有差别。

4.3.1 SpringMVC 项目(web.xml)
<filter>
    <filter-name>cat-filter</filter-name>
    <filter-class>com.dianping.cat.servlet.CatFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>cat-filter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>
4.3.2 SpringBoot 项目(CatFilterConfigure.java)
/**
 * @author: kefeng.wang
 * @date: 2018-07-06 14:00
 * @description: 添加过滤器 CatFilter
 **/
@Configuration
public class CatFilterConfigure {
    @Bean
    public FilterRegistrationBean catFilter() {
        FilterRegistrationBean registration = new FilterRegistrationBean();
        registration.setFilter(new CatFilter());
        registration.addUrlPatterns("/*");
        registration.setName("cat-filter");
        registration.setOrder(1);
        return registration;
    }
}

4.4 添加注解

@CatCacheTransaction
public void test() {
}

@ResponseBody
@RequestMapping("/hello")
@CatHttpRequestTransaction(type = "URL", name = "/hello")
public String hello() {
    return "hello!";
}

5 更多集成


CAT 框架埋点方案集成

5.1 集成 MyBatis

SpringBoot 集成 Mybatis
参考文档:CAT 集成 MyBatis

5.2 集成 Dubbo

参考文档:CAT 集成 Dubbo,只需在 pom.xml 中添加依赖。

<dependency>
    <groupId>net.dubboclub</groupId>
    <artifactId>cat-monitor</artifactId>
    <version>0.0.6</version>
</dependency>

5.3 集成 Logback

参考文档:CAT 集成 Logback,logback.xml 中添加配置:

<appender name="CatAppender" class="com.dianping.cat.logback.CatLogbackAppender"></appender>

<root level="info">
    <appender-ref ref="CatAppender" />
</root>

6 管理平台的使用

6.1 控制台

http://192.168.126.101:8080/cat
帐号/密码: catadmin/catadmin

6.2 项目配置

http://192.168.126.101:8080/cat/s/config?op=projects

6.3 相关文档

部署文档: http://192.168.126.101:8080/cat/r/home?op=view&docName=deploy
用户文档:http://192.168.126.101:8080/cat/r/home?op=view&docName=user
告警文档:http://192.168.126.101:8080/cat/r/home?op=view&docName=alert
集成文档:http://192.168.126.101:8080/cat/r/home?op=view&docName=integration
开发文档:http://192.168.126.101:8080/cat/r/home?op=view&docName=develop
设计文档:http://192.168.126.101:8080/cat/r/home?op=view&docName=design
常见问题:http://192.168.126.101:8080/cat/r/home?op=view&docName=problem

6.4 实时查看

http://192.168.126.101:8080/cat/r/t

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐