事前准备
参考:https://zhuanlan.zhihu.com/p/146921939
下载与安装
Windows
参考:
https://blog.csdn.net/u013075337/article/details/131621362
https://www.jianshu.com/p/2137c5d8ab0c
环境情况:
Windows 11
jdk 8 就是1.8
maven 3.6.3
MySQL 5.7
tomcat 9.0.17
实际操作过程:
1. git网址下载cat相关内容;
https://github.com/dianping/cat
下载cat-3.0.0.war包 和 Source code (zip)
2. docker 容器中部署cat服务所需mysql数据库
docer ps // 显示正在运行的contains
docker cp D:\..\cat\script\CatAppliaction.sql mysql1:CatApplication.sql // 拷贝sql脚本文件到容器
docker exec -it 容器名 /bin/bash // 进入该容器
mysql -u用户名 -p密码 // 登录数据库
show databases; // 查看现有数据库
create database xxx; // 创建xxx数据库
select database(); // 查看当前所在数据库是哪个
source CatApplication.sql // 执行sql脚本
3. cat服务配置
cat.war包放入tomcat的webapps文件夹中,即D:\xxx\tomcat\apache-tomcat-9.0.17\apache-tomcat-9.0.17\webapps
在tomcat所在根目录下创建两个文件夹即 D:\data\appdatas\cat 和 D:\data\applogs\cat
在D:\data\appdatas\cat 中创建client.xml 和 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>
🍇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>jdbc:mysql://127.0.0.1:3306/cat </url> <!-- 请替换为个人当前的数据库ip:port -->
<user>root</user> <!-- 请替换为真实数据库用户名 -->
<password>root</password> <!-- 请替换为真实数据库密码 -->
<connectionProperties><![CDATA[useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&socketTimeout=120000]]></connectionProperties>
</properties>
</data-source>
</data-sources>
4. 访问测试:
http://127.0.0.1:8080/cat/r/
5. CAT环境变量配置
CAT_HOME
D:\data\appdatas\cat
windows11系统,我的电脑-右键-属性-高级系统设置-环境变量-系统变量;
6. cat服务端配置:
http://127.0.0.1:8080/cat/s/conconfig?op=serverConfigUpdate
用户-密码为:admin-admin
修改全局配置--》服务器端配置;
如果说:应用程序和服务都运行在同一台机器上,并且它们之间通过localhost进行通信,那么没有必要修改这个地址。
如果说:应用程序和服务分别运行在主机与虚拟机/容器之间或者两个不同的虚拟机/容器内,那么你需要确保它们能够互相通信。如果应用程序尝试连接到127.0.0.1,但实际上服务运行在一个不同的网络实体(如虚拟机)上,那么你需要将这个地址更改为实际的服务提供者的IP地址。
7. cat客户端路由配置:
http://27.0.0.1:8080/cat/s/config?op=routerConfigUpdate
修改全局配置--》客户端路由配置;
作用:实现服务器的分组,如果服务器上配置多个节点,就需要配置;
Linux
服务器要求:
Linux 2.6以上,推荐使用CentOS 6.5
jdk 7
maven 3以上
MySQL 5.6 或 5.7 更高版本的不推荐
tomcat使用7.* 或者 8.* 都可以
Sources zip文件
cat-client
客户端,上报监控数据;
自己写的代码都需要集成这个部分;
cat-consumer
服务端,手机监控数据进行统计分析,构建丰富的统计报表;
cat-alarm
实时报警,提供报表指标的监控告警;
告警生成;
cat-hadoop
数据存储,logview存储至Hdfs;
cat-home
管理端,报表展示、配置管理等;
cat-core
通用的依赖,核心的源码都在这里;
项目配置cat
需求:
在项目固定路径下创建app.properties
src/main/resources_xxx/META-INF/app.properties
src/main/resource_xxx/config/client.xml
app.properties文件:
app.name=xxx // 表示该项目在cat中显示的项目名
client.xml文件--基础:
<config mode="client">
<servers>
<server ip="ip" port="port" http-port="8080"/>
// 配置Cat服务所在的服务器的ip地址;
</servers>
</config>
client.xml文件--域名类型:
<config mode="client">
<servers>
<server host="域名" port="port" http-port="8080"/>
// 配置Cat服务所在的服务器的域名;
</servers>
</config>
框架概述
调用链监控
单体应用架构和微服务架构区别:
单体微服务,请求到达服务器,经过处理后会直接返回结果数据;
微服务架构,请求达到服务器a,经过处理可能会达到服务器b,经过多个服务器处理才能最终返回结果。当请求出现问题,需要进行定位时,就需要使用调用链监控。
需求:
线上服务,查看各服务运行状态;
用户调用失败,问题定位,以及修复时间;
用户反馈系统很慢,问题定位;
原理:
10年,google使用的调用链监控Dapper;
结合Trace和Span实现链路追踪;
Trace = 一次请求调用的链路过程,trace id是指这次请求调用的id;一次请求中,会在网络的最开始生成一个全局唯一的用于标识此请求的trace id,该请求调用过程中无论经过多少个节点都会保持不变,并随着每一层的调用不停的传递;
Span = 一个模块的调用过程,用Span id来标识;在一次请求的过程中会调用不同的节点模块/服务,每一次调用都会生成一个新的span id来记录。即,可以通过span id来定位当前请求在整个系统调用链中所处的位置,以及它的上下游节点分别是什么。
产品类型:
CAT;
PinPoint,韩国开发,基于JavaAgent实现,支持插件,且不具有代码侵入性;
SkyWalking,国内开发,apache,基于JavaAgent实现,支持插件,且不具有代码侵入性,支持主流框架,如springboot、spring cloud、RPC Dubbo、motan等;
Zipkin,轻量级、部署简单;基于Google Dapper论文实现。
Cat说明文档:
https://www.bookstack.cn/read/dianping-cat/posts-ch3-config-project.md
CAT概述
视频参考:https://www.bilibili.com/video/BV1m64y127f3/?spm_id_from=333.337.search-card.all.click&vd_source=c901ae3ff497a02016ba7bada52b2e3b
定义:
CAT是大众点评开源的一款调用链实时监控系统,后端是基于java开发的;
客户端支持语言包括:java、C、C++、Python、Go、Node.js;
已经在中间件框架(MVC框架、RPC框架、数据库框架、缓存框架中)得到广泛应用;
版本说明:
最早的12年的0.2.5版本,目前18年版本是3.0.0,
特点:
国内开发;
缺点:集成具有侵入性,需要修改代码;目前已经停止更新迭代;
整体架构:
分为三个模块:CAT-client、CAT-consumer、CAT-home。
Cat-client 提供给业务以及中间层埋点的底层SDK。
Cat-consumer 用于实时分析从客户端提供的数据。
Cat-home 给用户提供展示的控制端。
通常consumer、home以及路由中心都是部署在一起的,每个服务端节点都可以充当任何一个角色。
CAT客户端原理
客户端设计
🍎 客户端设计
设计思考:
客户端设计是CAT系统设计中最为核心的一个环节,源于业务的旁路环节,要求做到API简单、高可靠性,且不能影响业务性能。
架构设计核心:
采用ThreadLocal,是线程局部变量(线程本地变量、线程本地存储);
为每一个使用该变量的线程都提供一个变量值的副本,属于java中一种较为特殊的线程绑定机制,每一个线程都可以独立地改变自己的副本,不会和其它线程的副本冲突。
设计流程:
业务线程产生消息,交给消息Producer,将消息存放在业务线程栈ThreadContext;
业务线程通知Producer结束时,根据线程栈产生消息树,并放在同步消息队列中;
消息上报线程监听消息队列,根据消息树产生最终的消息报文上报CAT服务器;
🍎 API设计
提供四类监控对象:
Transaction、Event、Heartbeat、Metric;
🍎 序列化与通信
自定义序列化协议,相较于通用协议更高效;
基于Netty来实现NIO(非阻塞IO)的数据传输;
核心类分析
核心接口:message;
核心实现类:AbstractMessage;
指标接口:Heartbeat、Transaction、Event、Metric;
指标实现类:DefaultHearbeat、DefaultTransaction、DefaultEvent、DefaultMetric;
CAT服务端原理
单机
🍎 单consumer处理:
代码中编写业务埋点代码,运行项目,触发监控消息异步发送;
Receiver线程组接收异步消息,并将其放入内存队列;
根据不同的业务类型,再分发到不同的队列;
消费结束后,会将消息落入本地文件中存储一份(并非长期存储),会通过异步线程转存到HDFS中;
Analyzer数据聚合生成统计报表,并将其存储到MySQL中;
🍎 CAT消息的Message-ID格式:
ShopWeb-0a010680-375030-2
xxx-应用名
xxx-当前机器的ip的16进制
xxx-系统当前时间除以小时得到整点数
xxx 表示当前这个客户端再当前小时的顺序递增号
🍎 CAT服务类:
com.dianping.cat.message.internal.MessageId
🍎 数据存储-压缩
索引检索,32bit+16bit 块地址+偏移地址;
写数据,由Index文件、Data文件构成;
集群
CAT的server.xml配置文件
<?xml version="1.0" encoding="utf-8"?>
// 声明这是一个 XML 文件,并指定其版本为 1.0,编码为 UTF-8
<config local-mode="false" hdfs-machine="false" job-machine="false" alert-machine="false">
// config标签 定义 CAT 的全局配置
// local-mode="false":是否启用本地模式。 false=所有数据都上传到远程服务器。
// hdfs-machine="false":是否启用 HDFS 存储功能;false=监控数据不存储到HDFS。
// job-machine="false":是否启用任务调度功能。false = 不启用任务调度功能。
// alert-machine="false":是否启用告警功能。false = 不启用告警功能。
// send-machine="false": 是否将性能数据发送到远程服务器;false = 不将性能数据发送到远程服务器。
<storage local-base-dir="/data/appdatas/cat/bucket/" max-hdfs-storage-time="15" local-report-storage-time="7" local-logivew-storage-time="7">
// 定义 CAT 的存储配置
// local-base-dir="/data/appdatas/cat/bucket/":本地存储的基础目录
// max-hdfs-storage-time="15":数据在 HDFS 中的最大存储时间(单位:天)。
// local-report-storage-time="7":本地报表数据的最大存储时间(单位:天)。
// local-logivew-storage-time="7":本地日志视图数据的最大存储时间(单位:天)。
</storage>
<console default-domain="Cat" show-cat-domain="true">
// 定义 CAT 的控制台配置
// default-domain="Cat":默认的监控域名称。
// show-cat-domain="true":是否显示 CAT 自身的监控域。
<remote-servers>192.168.126.101:8080,192.168.126.102:8080,192.168.126.103:8080</remote-servers>
// 定义远程服务器地址列表,列出了多个远程服务器的 IP 地址和端口号,用逗号分隔。
</console>
</config>
🍎 整理:
全局配置 :通过 <config> 标签定义系统的运行模式(如本地模式、HDFS 存储等)。
存储配置 :通过 <storage> 标签定义数据的存储路径和生命周期。
控制台配置 :通过 <console> 标签定义控制台的行为和默认设置。
远程服务器地址 :通过 <remote-servers> 标签指定远程服务器的地址列表。
<config>
<storage>
</storage>
<console>
</console>
<remote-servers>
</remote-servers>
</config>
🍎 /data/appdatas/cat/server.xml 配置文件 和 CAT控制台中的服务端配置界面 是什么关系
CAT报表-案例
定义:
CAT的报表功能,是监控和分析系统性能的核心部分之一;
通过报表可以获得关于应用程序运行状况的详细信息,从而快速定位问题并进行优化;
报表分类:
Transaction = 一段代码的运行时间、次数,比如URL/cache/sql执行次数、响应时间
Event = 一段代码运行次数,如出现一次异常,即在Transaction上进行的业务或者错误上的统计
Problem = 根据Transaction/Even数据分析出系统可能出现的一次慢程序
Hearbeat = JVM状态信息
Business = 业务指标等,用户可以自己控制
Transaction
使用场景:
适用于监控一段代码运行情况,比如:运行次数、QPS、错误次数、失败率、响应时间统计(平均影响时间、Tp 分位值)等场景。
点击样例链路,进入链路图中,也会得到一小时内的分布统计;
链路图可以知道:
调用对象 url 和 dubbo
调用关系 url --》 dubbo
执行时间 url-4300us,dubbo-4200us
Event
🍇 使用场景:
适用于监控一段代码运行次数,比如记录程序中一个事件记录了多少次,错误了多少次。Event 报表的整体结构与 Transaction 报表几乎一样,只缺少响应时间的统计。
🍇 表格排序情况:
默认显示是按照埋点打点显示顺序展示;
点击type:则按照字母表顺序展示信息;
点击total:则按照总量的降序排列;
通过手动添加ip的方式实现,得到具体出现异常的ip地址;
Problem
使用场景:
Problem 记录整个项目在运行过程中出现的问题,包括一些异常、错误、访问较长的行为。若有人反馈你的接口报 500 错误了,你进 Cat 后就直接可以去 Problem 报表了,错误信息就在 Problem 中。
点击SampleLinks下的内容,就会跳转到链路图,就可以看到具体的错误信息;
Heartbeat
使用场景:
Heartbeat 报表是 CAT 客户端,以一分钟为周期,定期向服务端汇报当前运行时候的一些状态。系统指标有系统的负载信息,内存使用情况,磁盘使用情况以及JVM等,其中JVM 指标有 GC 、线程相关信息。
Business
使用情况:
Business 报表对应着业务指标,比如订单指标。与 Transaction、Event、Problem 不同,Business 更偏向于宏观上的指标,另外三者偏向于微观代码的执行情况。
趋势图每个点都代表一分钟的值。也就是可能会存在小数的情况;
可以手动指定一些业务指标;有两类指标:总量和平均值;
CAT埋点实现
基础信息
定义:
埋点是指在代码中插入特定的代码片段,用于记录应用程序的运行时数据,如请求响应时间、错误率、调用次数等。
数据类型:
事务(Transaction):记录一个完整的业务流程,通常用于跟踪整个请求的生命周期。
事件(Event):记录一些特定的事件,例如某个操作的执行次数、耗时等。
心跳(Heartbeat):定期报告系统的健康状况,例如每分钟报告一次。
日志(Log):记录系统运行时的日志信息,包括错误日志和普通日志。
埋点实现流程
1. 引入CAT依赖,写入pom.xml文件
<dependency>
<groupId>com.dianping.cat</groupId>
<artifactId>cat-client</artifactId>
<version>3.0.1</version>
</dependency>
2. 配置CAT信息
项目目录resources/MEIA-INF/app.properties文件,app.name=xxx
项目目录resources/config/client.xml文件,编写Cat服务的ip、port、http-port
编写配置类CatFilterConfigure
3. 启动CAT客户端
将CAT相关文件放入tomcat中,启动tomcat服务;
D:\xxx\tomcat\apache-tomcat-9.0.17\apache-tomcat-9.0.17\bin\startup.bat
4. 插入埋点代码
需要监控的代码中插入CAT埋点代码,记录所需的性能数据;
5. 启动项目
启动Springboot项目;
事务埋点Transaction
🍇实现
Transcation t = Cat.newTransaction(type,name);
// 开启一个transcation,type = 类别 name = 名称
try{
t.setStatus(Transaction.SUCCESS);
// 成功执行Transaction
}catch(Exception e){
t.setStatus(e);
// 失败,设置异常
}finally{
t.complete();
// 结束该transaction
}
🍇 通过AOP+注解的方式实现
import com.dianping.cat.Cat;
import com.dianping.cat.message.Transaction;
import com.unicom.opn.api.core.annotation.CatTransaction;
import com.unicom.opn.api.core.dto.base.ResponseDto;
import com.unicom.opn.api.core.dto.base.ResultDto;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.lang.reflect.Method;
@Component // 将该类标记为 Spring 的组件类,使其能够被 Spring 容器扫描并管理。
@Aspect // 声明这是一个切面(Aspect)类。
@Order(1) // 指定切面的执行顺序;值越小,优先级越高。
public class CatTransactionAop {
@Around(value = "@annotation(com.unicom.opn.api.core.annotation.CatTransaction)")
// 一个环绕通知(Around Advice),并指定切入点表达式;
// 切点位置是 value部分,表示使用@CatTransaction注解时;
// @annotation = Java 中一种强大的元数据标记机制,用于向代码元素附加信息
public Object aroundMethod(ProceedingJoinPoint pjp) throws Throwable {
// 定义一个环绕通知方法;
// ProceedingJoinPoint pjp:表示当前连接点(Join Point),即被拦截的目标方法。
Object o = null;
// 初始化一个变量 o,用于存储目标方法的返回值
MethodSignature joinPointObject = (MethodSignature) pjp.getSignature();
// 获取当前连接点的签名信息,并将其转换为 MethodSignature 类型,
// 该类型对象,提供了访问方法相关信息(如方法名、参数等)的能力。
Method method = joinPointObject.getMethod();
// 从签名信息中提取目标方法的 Method 对象。
CatTransaction catTransaction = method.getAnnotation(CatTransaction.class);
// 从目标方法中获取 @CatTransaction 注解。
if (catTransaction == null) {
// 如果没有该注解,直接执行原有方法
o = pjp.proceed();
// 直接执行目标方法并返回其结果
return o;
}
// 如果有注解,则执行下述方法
String type = catTransaction.type();
// 从catTransaction注解中获取type属性
String name = catTransaction.name();
// 从catTransaction注解中获取name属性
if (StringUtils.isEmpty(type)) {
type = "method";
}
// 如果type为空,则设置为method
if (StringUtils.isEmpty(name)) {
name = method.getName();
}
// 如果name为空,则设置为目标方法的名字
Transaction t = Cat.newTransaction(type, name);
// 创建一个新的事务对象 t,并指定事务的类型和名称。 应该就是ThreadLocal
try {
o = pjp.proceed();
//继续执行方法
if(o instanceof ResultDto){
//记录错误码
ResultDto rd = (ResultDto) o;
if(rd.getCode() == 0){
// 结果成功,设置事务状态为成功
t.setStatus(Transaction.SUCCESS);
}else{
// 结果失败,设置事务状态为方法错误码
t.setStatus(rd.getStatus()+"");
}
}if(o instanceof ResponseDto){
//记录错误码
ResponseDto rd = (ResponseDto) o;
if("100".equals(rd.getCode())){
// 结果成功,设置事务状态为成功
t.setStatus(Transaction.SUCCESS);
}else{
// 结果失败,设置事务状态为方法错误码
t.setStatus(rd.getCode()+"");
}
}else{
t.setStatus(Transaction.SUCCESS);
}
} catch (Throwable e) {
// 在捕获异常时,将事务状态设置为异常信息
t.setStatus(e);
// 记录异常日志
Cat.logError(e);
} finally {
// 完成事务,释放资源;
t.complete();
}
return o;
}
}
🍇扩展API
修改Transaction的数据;
addData,添加额外的数据显示
setStatus,设置状态,成功可以设置SUCCESS,失败可以设置异常
setDurationlnMillis ,设置执行耗时(毫秒)
setTimestamp,设置执行时间
complete,结束Transaction
事件埋点Event
定义:
用来记录一件事发生的次数,比如记录系统异常;
它和transaction相比缺少了时间的统计,开销比transaction要小。
常用方法:
Cat.logEvent:记录一个事件;
参数:一一对应;type=类型 name=名称 status=状态 nameValuePairs=打印的信息字符串
Cat.1ogEvent("URL.server", "serverIp", Event.SUCCESS, "ip=${serverIp}");
Cat.logError:记录一个带有错误堆栈信息的Error;
Cat.logError("error(x):=exception(X)",e); // 向错误堆栈的顶部添加个人的错误信息
展示位置:
Event
Business-Metric
定义:
用于记录业务指标、指标可能包含对一个指标记录次数、记录平均值、记录总和,业务指标最低统计粒度为1分钟。
常用方法:
Cat.logMetricForCount("",);//Counter 累加 一分钟内的统计个数
// 参数1=名称,参数2=累加个数,不写为1
// 参数1 = 用于唯一标识一个特定的度量或事件。
Cat.logMetricForDuration("",);//Duration 平均
// 参数1=名称,参数2=求具体的值
展示位置:
Business
🍇通用方式
1. 定义通用类封装logMetricForxxx方法;
public class CatMetricUtil {
public static void logMetricForCount(String metricName, int count) {
Cat.logMetricForCount(metricName, count);
}
public static void logMetricForCount(String metricName) {
Cat.logMetricForCount(metricName);
}
}
2. 正式代码中使用该方法
CatMetricUtil.logMetricForCount(metricName);
CAT告警
告警方式:
短信、邮件、微信等方式;
配置:
配置服务端告警,才能执行告警逻辑;配置为发送服务器的机器,才能发送告警;
配置告警规则;
告警学习:
https://www.bookstack.cn/read/dianping-cat/posts-ch3-config-alarm.md
服务端配置
Cat服务端配置文件:
<property name="send-machine" value="false"/> // 发送告警信息的配置
<property name="alarm-machine" value="false"/> // 产生告警信息的配置
告警策略配置:
type:告警的类型,可选:Transaction、Event、Business、Heartbeat
group:id属性: 可以为default,代表默认,即所有项目;也可以为项目名,代表某个项目的策略,此时default策略不会生效;
level:id属性: 错误级别,分为warning代表警告、error代表错误;
send属性:告警渠道,分为mail-邮箱、weixin-微信、sms-短信;
suspendMinute属性:连续告警的暂停时间
告警人配置:
虽然可以直接配置,但是仍旧需要自定义编写具体实现来达到邮件、短信、微信告警通知;
需要调用回调地址,访问具体的服务;
告警回调服务配置:
自定义url、请求类型port、是否支持批量发送batchSend;
告警规则概述
🍎告警规则五要素:
告警时间段。同一项业务指标在每天不同的时段可能有不同的趋势。设定该项,可让CAT在每天不同的时间段执行不同的监控规则。注意:告警时间段,不是监控数据的时间段,只是告警从这一刻开始进行检查数据。
规则组合。在一个时间段中,可能指标触发了多个监控规则中的一个规则就要发出警报,也有可能指标要同时触发了多个监控规则才需要发出警报。
监控规则类型。通过以下六种类型对指标进行监控:最大值、最小值、波动上升百分比、波动下降百分比、总和最大值、总和最小值
监控最近分钟数。设定时间后(单位为分钟),当指标在设定的最近的时间长度内连续触发了监控规则,才会发出警报。比如最近分钟数为3,表明连续三分钟的数组都满足条件才告警。如果分钟数为1,表示最近的一分钟满足条件就告警
规则与被监控指标的匹配。监控规则可以按照名称、正则表达式与监控的对象(指标)进行匹配。
🍎告警规则类型:
最大值、最小值、波动上升百分比、波动下降百分比、总和最大值、总和最小值;
告警配置:
Transaction告警与 Event告警类似;
心跳告警一般不采用CAT,仅作为备选;
告警规则练习
系统告警规则:
总和最大值(当前值)、总和最小值(当前值)、最大值(当前值)、最小值(当前值)、波动上升百分比(当前值)、波动下降百分比(当前值);
告警响应配置
接口响应
执行步骤:
全局配置文件-->告警服务器-->选择告警方式,配置url、参数;配置内容见下图;
url = 接口的请求地址;to = receiver ; value = title 或者 content;
编写接口;
接口服务编写:
public class xxxController{
@RequestMapping("alert/msg")
public String sendAlert(@RequestParam String to,@RequestParam String value){
System.out.println("告警 接收人:"+ to +";告警内容:"+value);
// 需要传参 to 和 value;
// 会实现CAT页面配置参数传递到该接口;
return "200";
}
}
发送邮件:
使用Springboot的spring-boot-starter-mail依赖实现;
钉钉响应
CAT监控界面
Dashboard
DashBoard仪表盘显示了每分钟出现错误的系统及其错误的次数和时间;
点击右上角的时间按钮可以切换不同的展示时间,-7d代表7天前,-1h代表1小时前,now定位到当前时间;
上方的时间轴按照分钟进行排布,点击之后可以看到该时间到结束的异常情况下方标识了出错的系统和出错的时间、次数,点击系统名称可以跳转到Problem报表。
Transaction
Transaction报表用来监控一段代码运行情况: 运行次数、QPS、错误次数、失败率、响应时间统计(平均影响时间、Tp分位值)等等。
应用启动后默认会打点的部分:
System = 上报监控数据的打点信息
URL = URL访问的打点信息
上图理解:
xxline表示分位线,表示有百分之xx的请求耗时为xxxms(毫秒);
std 均方根值,它的波动;
QPS 每秒的查询数量
🍇Log View信息:
t14:33:02.184URL/fetch/keys
E14:33:02.184URLURL.Server IPS=127.0.0.1&VirtualIP=127.0.0.1&Server=localhost&Referer=null&Agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36 Hutool
// IPS = 表示客户端的 IP 地址
// VirtualIP = 表示虚拟 IP 地址
// Server = 表示服务器的主机名或 IP 地址
// Referer = 表示请求的来源页面 URL,为null可能是直接输入的 URL 或者通过其他方式发起的请求。
// Agent = 表示用户代理(User-Agent)字符串
// Mozilla/5.0 = 标准的 User-Agent 开头,表示这是一个兼容 Mozilla 的浏览器。
// (Windows NT 10.0; Win64; x64) = 表示操作系统是 Windows 10,64 位版本
// AppleWebKit/537.36 = 表示使用了 Apple 的 WebKit 渲染引擎。
// (KHTML, like Gecko) = 表示渲染引擎类似于 KHTML 和 Gecko。
// Chrome/75.0.3770.142 = 表示浏览器是 Google Chrome,版本 75.0.3770.142
// Safari/537.36 = 表示浏览器内核是 Safari
// Hutool = 表示使用了 Hutool 工具库
E14:33:02.184URLURL.Method HTTP/GET /fetch/keys?请求参数
T14:33:02.189URL/fetch/keys 5.42ms
Event
Event报表监控一段代码运行次数;
例如记录程序中一个事件记录了多少次,错误了多少次。Event报表的整体结构与Transaction报表几乎一样,只缺少响应时间的统计。
Problem
Problem记录整个项目在运行过程中出现的问题,包括一些异常、错误、访问较长的行为。
Problem报表是由logview存在的特征整合而成,方便用户定位问题。来源:
1.业务代码显示调用Cat.logError(e) API进行埋点,具体埋点说明可査看埋点文档。
2.与LOG框架集成,会捕获log日志中有异常堆栈的exception日志。
3.long-url,表示Transaction打点URL的慢请求
4.long-sql,表示Transaction打点SQL的慢请求
5.long-service,表示Transaction打点Service或者PigeonService的慢请求
6.long-call,表示Transaction打点Call或者PigeonCall的慢请求
7.long-cache,表示Transaction打点Cache.开头的慢请求
heartbeat
Heartbeat报表是CAT客户端,以一分钟为周期,定期向服务端汇报当前运行时候的一些状态。
Business
Business报表对应着业务指标,比如订单指标。
与Transaction、Event、Problem不同,Business更偏向于宏观上的指标,另外三者偏向于微观代码的执行情况。
State
显示与Cat相关的信息;
CAT应用监控配置
业务标签配置
🍎 概述
定义:
业务指标是由 logMetric() 方法上报给CAT的,它对应于 logMetric(String name, Map<String, String> tags) 方法中的 name 参数。
在依赖包cat-client:3.1.0中,logMetric已经被废弃了;
合理推断同等替换成logMetricForXxx()方法;
🍎 实操
<?xml version="1.0" encoding="utf-8"?>
<business-tag-config>
<tag id="自定义标签名"> // tag 模型:代表一个业务标签配置
// id : 代表 tag 的 id,与上报时的 tag id 一致;
<business-item domain="项目名" item-id="business中标签名"/> // business-item 模型: 代表tag对应的项目及指标
// domain : 代表 tag 对应的项目;
// item-id : 代表 tag 对应的指标
</tag>
</business-tag-config>
<tag id="">
<business-item domain="" item-id=""/>
</tag>
上述配置之后,在config中显示如下:
要想实现在business界面显示自定义配置的内容,需要将上述图片中标题的位置,改成所想设置的内容。