服务监控CAT的使用

什么是CAT

CAT是由大众点评开源的一款调用链监控系统,基于Java开发的。
优点:聚合报表丰富,中文支持好,国内案例多。
缺点:具有代码侵入性

CAT报表介绍

报表名称报表内容
Transaction报表一段代码的运行时间、次数、比如URL/cache/sql执行次数相应时间
Event报表一段代码运行次数,比如出现一次异常
Problem报表根据Transaction/Event数据分析出系统可能出现的一次慢程序
HeartbeatJVM状态信息
Business报表业务指标等,用户可以自己定制

下载和发布服务

下载地址:https://github.com/dianping/cat.git

代码模块介绍

模块介绍
cat-client客户端,上报监控数据,代码集成的就是此模块
cat-consumer服务端,收集监控数据进行统计分析,构建丰富的统计报表
cat-alerm实时告警,提供报表指标的监控告警
cat-hadoop数据存储,logview存储至Hdfs
cat-home管理端,报表展示,配置管理等
cat-core核心代码块,其他模块的通用依赖

Linux系统搭建CAT服务

前提

  1. 程序对于/data/目录具有读写权限,此目录会存储一些CAT必要的配置文件以及运行时的数据存储目录, CAT支持CAT_HOME环境变量,可以通过JVM参数修改默认的路径。使用命令mkdir /data ; chmod -R 777 /data
  2. 创建客户端和数据源配置文件,client.xml和datasources.xml配置文件,此两个配置文件在下载下来的代码与模块同级别的docker目录中有,只需要修改地址,使用命令
mkdir -p /data/appdatas/cat
cd /data/appdatas/cat/
vi client.xml
vi datasources.xml

client.xml配置文件讲解

<?xml version="1.0" encoding="utf-8"?>
<config mode="client">
    <servers>
        <server ip="127.0.0.1" port="2280" http-port="8080"/>
    </servers>
</config>

配置说明:

  • mode : 定义配置模式,固定值为client;–暂未使用
  • servers : 定义多个服务端信息;
  • server : 定义某个服务端信息;
  • ip : 配置服务端(cat-home)对外IP地址
  • port : 配置服务端(cat-home)对外TCP协议开启端口,固定值为2280;
  • http-port : 配置服务端(cat-home)对外HTTP协议开启端口, 如:tomcat默认是8080端口,若未指定,默认为8080端口;
  1. 创建数据库,并执行script目录下的SQL文件,
  2. 用maven打包,如果test报错,需要打包时忽略test,需要把cat-home打包为cat.war的包名,否则启动后访问不到
  3. 修改服务端的配置文件通过http://ip:port/cat/s/config?op=serverConfigUpdate 账号密码都为admin,
    需要将属性为remote-servers的节点value值改为服务器的ip,还有server节点的id属性的值改为服务器的ip。
    修改路由http://ip:port/cat/s/config?op=routerConfigUpdate
    如果此配置文件配置错误导致的问题: 客户端的缓存文件client_cache.xml的ip是此配置文件的配置backup-server
    配置说明:
    在这里插入图片描述
    • 把backup-server设置为当前服务器对外IP地址,端口固定为2280;
    • default-server定义可跳转的路由地址,可以设置多个。default-server的id属性配置可路由的cat-home服务IP地址,端口固定为2280;若需要禁用路由地址,可把enable设置为false。
    • 点击“提交”按钮,保存修改的路由配置

其他配置修改可参考项目中CAT部署.txt文件

springboot集成CAT客户端

依赖

<dependency>
   <groupId>com.dianping.cat</groupId>
   <artifactId>cat-client</artifactId>
   <version>3.0.0</version>
</dependency>
  1. 配置app.properties文件
    在resources资源文件META-INF下新建app.properties,注意是src/main/resources/META-INF/文件夹。
    内容如:app.name=${appName};appName表示项目名
  2. 配置客户端文件,拷贝client.xml文件
    A、Linux\Mac 到/data/appdatas/cat下
    B、Windows 到系统运行盘的根目录/data/appdatas/cat
    打开/data/appdatas/cat/client.xml客户端配置文件
<?xml version="1.0" encoding="utf-8"?>
<config mode="client" xmlns:xsi="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="config.xsd">
  <servers>
    <!-- Local mode for development -->
    <server ip="10.1.5.87" port="2280" http-port="8999" />
    <!-- If under production environment, put actual server address as list. -->
    <!-- 
    <server ip="192.168.7.71" port="2280" /> 
    <server ip="192.168.7.72" port="2280" /> 
    -->
  </servers>
</config>

配置说明:

  • servers : 定义多个服务端信息;
  • server : 定义某个服务端信息;
  • ip : 配置服务端(cat-home)对外IP地址
  • port : 配置服务端(cat-home)对外TCP协议开启端口,固定值为2280;
  • http-port : 配置服务端(cat-home)对外HTTP协议开启端口, 如:tomcat默认是8080端口,若未指定,默认为8080端口;

测试代码

package cat.client;

import com.dianping.cat.Cat;
import com.dianping.cat.message.Event;
import com.dianping.cat.message.Transaction;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class CatTestController {

    @RequestMapping("/test")
    public String test() {
        Transaction transaction = Cat.newTransaction("URL", "pageName");
        try {
            Cat.logEvent("URL.Server","serverIp", Event.SUCCESS,"ip=192.168.1.4");
            Cat.logMetricForCount("metric.key");
            Cat.logMetricForDuration("metric.key",5);
            int i = 1 / 0;
            transaction.setStatus(Transaction.SUCCESS);
        } catch (Exception e) {
            System.out.println(e);
            transaction.setStatus(e);
            Cat.logError(e);
        } finally {
            transaction.complete();
        }

        return "hello cat";
    }
}

在这里插入图片描述
在这里插入图片描述

API介绍

Transaction

Transaction适合记录系统跨越边界的程序访问行为,比如远程调用、数据库调用,也适合执行时间较长的业务逻辑监控,也可用来记录一段代码的执行时间和次数。

  • addData 添加额外的数据显示
  • setStatus 设置装填,成功可以设置Transaction.SUCCESS,异常可以把异常对象设置
  • setDurationInMillis 设置执行耗时(毫秒)
  • complete 结束Transaction,在finally里设置

Event

Event用来记录一件事发生的次数,比如记录系统异常,它和Transaction相比缺少了时间的统计,开销比Transaction要小
Cat.logEvent

// 参数1:type类型, 参数2:名称, 参数3:状态, 参数4:打印字符串
Cat.logEvent("URL.Server","serverIp", Event.SUCCESS,"ip=192.168.1.4");

Metric

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

// 每秒会聚合Metric,举例来说,如果你在同一秒调用count三次(相同的name),累加他们的值,并且一次性上报给服务端,有两个参数的调用,第二个参数为count累加的基数,如果不写默认为1,
Cat.logMetricForCount("metric.key");

服务端页面的介绍

在这里插入图片描述

  • 图中1是上报日志类型栏
  • 2是应用栏,选择2才能到此界面
  • 3是选择时间栏,因为日志是根据时间分的,选择哪段时间可以查询哪段的,左侧为显示的查询时间
  • 4为分钟,要查看的日志分钟
  • 5为上报日志的应用

Transaction栏

在这里插入图片描述
监控代码运行情况:运行次数、QPS、错误次数、失败率、响应时间统计等,
如果看客户端的监控信息,需要看Type为URL的信息

Event栏

监控一段代码运行次数:例如记录程序中一个事件记录了多少次,错误了多少次。基本和Transaction栏一样,只是缺少了时间统计

Problem栏

Problem记录整个项目在运行过程中出现的问题,包括一些异常、错误、访问较长的行为。Problem报表是由logView存在的特征整合而成,方便用户定位问题。
所有错误汇总报表第一层分类,代表错误类型(称为type),比如error、long-url等,第二级分类(称为status),对应具体的错误,比如一个异常类名等

Heartbeat

Heartbeat报表是CAT客户端,以一分钟为周期,定期向服务端汇报当前运行时候的一些状态,包括JVM数据

Business

Business报表是可以查看业务的消耗时间

State

State报表显示了与CAT相关的信息

框架集成

在下载的代码中有可以用到的插件在integration目录,里面有框架集成CAT所需要的依赖和代码等相关信息

mybatis集成CAT

需要引入下载代码中的CatMybatisPlugin类,并配置mybatis的配置文件中,且此配置文件加载到springboot中,在application.yml中配置mybatis.config-location: classpath:mybatis/mybatis-config.xml
mybatis-config.xml

<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <plugins>
        <plugin interceptor="com.cat.plugin.CatMybatisPlugin"></plugin>
    </plugins>
</configuration>

日志整合(推荐)

测试时用的3.0.0版本,但是CatLogbackAppender类中使用Cat.logTrace(type, name, “0”, data);提示Cat没有logTrace方法,而且即使走另一步logError,此错误必须在日志中记录日志的时候第二个参数为异常对象才能记录异常信息,否则只是log.error(“进入了testLog方法”);的话不会上报异常信息
需要把代码CatLogbackAppender.java类添加到项目中,在logback配置文件中添加此插件

<appender name="CatLog" class="com.cat.plugin.CatLogbackAppender"></appender>
<root level="info">
    <appender-ref ref="CatLog" />
</root>

此配置就可以自动记录异常的日志,但是不能记录非异常的日志,如果想记录info级别的需要在代码中添加Cat.getManager().setTraceMode(true);,因为从CatLogbackAppender源码中发现会判断此配置是否为true,如果为true才会记录日志信息,然而本人的logTrace方法的Cat.logTrace(type, name, “0”, data);报红,提示没有Cat没有logTrace方法,不知道是不是版本的问题
在这里插入图片描述

springboot整合CAT(不推荐,会拦截所有请求并且不会上报日志)

只需要添加CAT的过滤器,添加后可以在Transaction栏的type为URL的查看日志信息

package com.cat.plugin;

import com.dianping.cat.servlet.CatFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class CatFileterConfig {

    @Bean
    public FilterRegistrationBean catFilter(){
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        CatFilter catFilter = new CatFilter();
        filterRegistrationBean.setFilter(catFilter);
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.setName("cat-filter");
        filterRegistrationBean.setOrder(1);
        return filterRegistrationBean;
    }
}

Spring AOP整合(不推荐,如果异常被捕获则无法记录异常信息)

将CatAnnotation类和CatAopService类添加到项目中,CatAopService还需要添加@Component注解,在需要统计的方法上添加CatAnnotation注解即可

springMVC整合

和springboot整合一样,添加过滤器

CAT日志

服务端和客户端的CAT日志都保存在/data/applogs/cat目录下,如果配置完成后没达到想要的效果可以查看日志是否有错误信息,如客户端的日志可以看到连接的服务端的ip和端口是否正确。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值