客户端

项目接入CAT监控:

maven依赖

com.dianping.cat

cat-client

3.0.0

项目中创建src/main/resources/META-INF/app.properties写入:

app.name={appName}

appName (a-z, A-Z) (0-9) (_) (-)

spring boot接入

CatFilterConfigure.java

@Configuration

public class CatFilterConfigure {

@Bean

public FilterRegistrationBean catFilter() {

FilterRegistrationBean registration = new FilterRegistrationBean();

CatFilter filter = new CatFilter();

registration.setFilter(filter);

registration.addUrlPatterns("/*");

registration.setName("cat-filter");

registration.setOrder(1);

return registration;

}

}

Mybatis接入

CatMybatisInterceptor.java

@Intercepts({

@Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}),

@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class,

RowBounds.class, ResultHandler.class}),

@Signature(type = Executor.class, method = "query",

args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class, CacheKey.

class, BoundSql.class}

)})

public class CatMybatisInterceptor implements Interceptor {

private Properties properties;

private String datasourceUrl;

public CatMybatisInterceptor(String datasourceUrl) {

this.datasourceUrl = datasourceUrl;

}

@Override

public Object intercept(Invocation invocation) throws Throwable {

//begin cat transaction

MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];

String methodName = this.getMethodName(mappedStatement);

Transaction t = Cat.newTransaction("SQL", methodName);

Cat.logEvent("SQL.Database", datasourceUrl);

Cat.logEvent("SQL.Method", mappedStatement.getSqlCommandType().name().toLowerCase(), Message.SUCCESS,

getSql(invocation, mappedStatement));

try {

Object returnValue = invocation.proceed();

t.setStatus(Transaction.SUCCESS);

return returnValue;

} catch (Throwable e) {

Cat.logError(e);

t.setStatus(e);

throw e;

} finally {

t.complete();

}

}

private String getMethodName(MappedStatement mappedStatement) {

String[] strArr = mappedStatement.getId().split("\\.");

return strArr[strArr.length - 2] + "." + strArr[strArr.length - 1];

}

private String getSql(Invocation invocation, MappedStatement mappedStatement) {

Object parameter = null;

if (invocation.getArgs().length > 1) {

parameter = invocation.getArgs()[1];

}

BoundSql boundSql = mappedStatement.getBoundSql(parameter);

Configuration configuration = mappedStatement.getConfiguration();

return showSql(configuration, boundSql);

}

private static String getParameterValue(Object obj) {

StringBuilder retStringBuilder = new StringBuilder();

if (obj instanceof String) {

retStringBuilder.append("'").append(obj).append("'");

} else if (obj instanceof Date) {

DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT,

Locale.CHINA);

retStringBuilder.append("'").append(formatter.format(new Date())).append("'");

} else {

retStringBuilder.append("'").append(obj == null ? "" : obj).append("'");

}

return retStringBuilder.toString();

}

public static String showSql(Configuration configuration, BoundSql boundSql) {

Object parameterObject = boundSql.getParameterObject();

List parameterMappings = boundSql.getParameterMappings();

String sql = boundSql.getSql().replaceAll("[\\s]+", " ");

StringBuilder sqlBuilder = new StringBuilder(sql);

if (parameterMappings.size() > 0 && parameterObject != null) {

int start = sqlBuilder.indexOf("?");

int end = start + 1;

TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();

if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {

sqlBuilder.replace(start, end, getParameterValue(parameterObject));

} else {

MetaObject metaObject = configuration.newMetaObject(parameterObject);

for (ParameterMapping parameterMapping : parameterMappings) {

String propertyName = parameterMapping.getProperty();

if (metaObject.hasGetter(propertyName)) {

Object obj = metaObject.getValue(propertyName);

sqlBuilder.replace(start, end, getParameterValue(obj));

} else if (boundSql.hasAdditionalParameter(propertyName)) {

Object obj = boundSql.getAdditionalParameter(propertyName);

sqlBuilder.replace(start, end, getParameterValue(obj));

}

start = sqlBuilder.indexOf("?");

end = start + 1;

}

}

}

return sqlBuilder.toString();

}

@Override

public Object plugin(Object target) {

return Plugin.wrap(target, this);

}

@Override

public void setProperties(Properties properties) {

this.properties = properties;

}

public String getDatasourceUrl() {

return datasourceUrl;

}

public void setDatasourceUrl(String datasourceUrl) {

this.datasourceUrl = datasourceUrl;

}

}

CatMybatisConfigure

@Configuration

public class CatMybatisConfigure {

@Value("${spring.datasource.url}")

private String jdbcUrl;

@Value("${mybatis.mapper-locations}")

private String mapperLocations;

@Bean

public SqlSessionFactory mysqlSessionFactory(DataSource mysqlDataSource) throws Exception {

SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();

sqlSessionFactoryBean.setDataSource(mysqlDataSource);

PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();

sqlSessionFactoryBean.setMapperLocations(resolver.getResources(mapperLocations));

sqlSessionFactoryBean.setPlugins(new Interceptor[]{new CatMybatisInterceptor(jdbcUrl)});

return sqlSessionFactoryBean.getObject();

}

}

Logback接入

CatLogbackAppender

public class CatLogbackAppender extends AppenderBase {

@Override

protected void append(ILoggingEvent event) {

try {

boolean isTraceMode = Cat.getManager().isTraceMode();

Level level = event.getLevel();

if (level.isGreaterOrEqual(Level.ERROR)) {

logError(event);

} else if (isTraceMode) {

logTrace(event);

}

} catch (Exception ex) {

throw new LogbackException(event.getFormattedMessage(), ex);

}

}

private void logError(ILoggingEvent event) {

ThrowableProxy info = (ThrowableProxy) event.getThrowableProxy();

if (info != null) {

Throwable exception = info.getThrowable();

Object message = event.getFormattedMessage();

if (message != null) {

Cat.logError(String.valueOf(message), exception);

} else {

Cat.logError(exception);

}

}

}

private void logTrace(ILoggingEvent event) {

String type = "Logback";

String name = event.getLevel().toString();

Object message = event.getFormattedMessage();

String data;

if (message instanceof Throwable) {

data = buildExceptionStack((Throwable) message);

} else {

data = event.getFormattedMessage().toString();

}

ThrowableProxy info = (ThrowableProxy) event.getThrowableProxy();

if (info != null) {

data = data + '\n' + buildExceptionStack(info.getThrowable());

}

Cat.logEvent(type, name, "0", data);

}

private String buildExceptionStack(Throwable exception) {

if (exception != null) {

StringWriter writer = new StringWriter(2048);

exception.printStackTrace(new PrintWriter(writer));

return writer.toString();

} else {

return "";

}

}

}

logback.xml加入如下代码

如何使用cat

替换appName

直接进入cat,地址:http://192.168.1.120:8080/cat/r/h?domain=appName&ip=All&date=2020111216&reportType=day&op=view

选择项目

查看Transaction报表

查看Event报表

自定义上报Transaction

Transaction用来监控一段代码运行情况:QPSTp

上报Transaction

Transaction t = Cat.newTransaction("URL", "pageName");

try {

//

t.setStatus(Transaction.SUCCESS);

} catch (Exception e) {

t.setStatus(e);

Cat.logError(e);

} finally {

t.complete();

}

自定义上报event

event用来监控一段代码运行次数:。Event报表的整体结构与Transaction报表几乎一样,只缺少响应时间的统计

上报event

Event event = Cat.newEvent("Event", "event1");

try {

//

event.setSuccessStatus();

} catch (Exception e) {

event.setStatus("False");

Cat.logError(e);

} finally {

event.complete();

}

本文地址:https://blog.csdn.net/Victor_An/article/details/109647976

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

cat 监控 java,分布式监控CAT客户端的SpringBoot集成相关推荐

  1. 监控软件自动发现功能和监控软件分布式监控配置

    监控软件自动发现功能 新添加了一台web02主机 被监控主机上,需要安装好zabbix-agent程序 编辑zabbix-agent配置文件 [root@web02 yum.repos.d]# gre ...

  2. cat全链路监控_CAT分布式监控系统(一):CAT功能介绍 CAT监控系统是什么、能做什么?...

    CAT分布式监控系统(一):CAT监控系统功能介绍 本文概要: 1.CAT监控系统是什么. 2.CAT监控系统能做什么,能监控些什么. 下面有些截图是CAT 2.0版本的,但和3.0版本没什么区别的. ...

  3. Zabbix监控——proxy 分布式监控配置

    proxy分布式监控 Zabbix proxy是在大规模分布式监控场景中,采用的一种用以分担server端压力的分层结构, proxy可以代替zabbix server检索客户端的数据,然后把数据汇报 ...

  4. java cpu监控,java系统监控CPU 磁盘

    java系统监控CPU 磁盘 import java.io.*; /** * linux 下cpu 内存 磁盘 jvm的使用监控 * @author avery_leo * */ public cla ...

  5. 7搭建zabbix_监控03分布式监控Zabbix

    监控03-分布式监控Zabbix 一.Zabbix概述 Zabbix是一个基于Web界面的分布式系统监控与网络设备监控系统,能够监控各种网络参数,并提供灵活的通知机制,以使管理员能快速定位故障并解决. ...

  6. java quartz 动态执行,浅谈SpringBoot集成Quartz动态定时任务

    SpringBoot自带schedule 沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 注意在程序启动的时候加上@EnableScheduling @Schedule ...

  7. cacti监控java,Cacti监控tomcat的方法

    [环境:Tomcat5.5.jdk61.先配Tomcat的启动语句,window下tomcat的bin/catalina.bat(linux为catalina.sh),在头上注释部分(.bat为rem ...

  8. pinpoint 监控mysql_pinpoint分布式监控的基本使用 | 吴老二

    前面已经说了源码安装和编译安装pinpoint的方式,但是安装知道了,如何使用呢?不要急,下面会根据pinpoint的各种监控信息,所一个信息的解释. 首页信息 我们先看一下监控的画面. 上面是pin ...

  9. pinpoint 监控mysql_pinpoint 分布式监控

    阅读目录 1. 环境配置 1.1 获取需要的依赖包 1.2 配置jdk1.7 2. 安装Hbase 2.1 解压Hbase 2.2 修改Hbase的配置 2.3 启动Hbase 3. 安装pinpoi ...

  10. java分布式会话redis_详解springboot中redis的使用和分布式session共享问题

    对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomca ...

最新文章

  1. Symfony 使用 hwi/oauth-bundle 实现第三方登录
  2. 05移动端布局基础之flex弹性布局项目实战(携程移动端首页)
  3. 如何判断UIViewController的视图是否可见
  4. hibernate 多对多(many-to-many)
  5. Hyper-V 虚拟机快照:常见问题
  6. [C++11]统一的数据初始化方式 - 初始化列表
  7. delay 芯片时序output_【第二章 STA概念 上】静态时序分析圣经翻译计划
  8. 3D溜溜网站用的是php吗_三大免费开源的php语言cms系统 用好它们让你一天建好一个网站...
  9. Jconsole工具和Java VisualVM
  10. Source Insight下载及注册码
  11. Netty in action—Netty传输服务
  12. NekoHtml 解析内容时需要注意的地方
  13. 小白文件管理器android,小白文件管理器手机版
  14. 卷积编码--维特比译码
  15. Theano学习二:内存、变量、函数、自动微分、循环、scan以及分析调试等基础知识
  16. jwt怎么获取当前登录用户_获取jwt(json web token)中存储的用户信息
  17. O3DF执行董事Royal O’Brien:开源没有边界,所有共享的声音都会变成实际方向
  18. 文件大小单位换算(B-GB)
  19. 手机页面h5的简单demo
  20. 如何使用MacVim呢?

热门文章

  1. springMVC常见问题
  2. spring AOP 切在方法上可以改变方法的返回值
  3. win7台式机系统调节显示屏亮度
  4. mvc:annotation-driven/与mvc:default-servlet-handler/之间的一个问题
  5. Eclipse修改XML默认打开方式
  6. Java制作证书的工具keytool用法总结
  7. 了解HTML CSS选择器操作和特性
  8. linux下挂载ntfs分区错误解决方法
  9. 李阳疯狂英语900句 331-545
  10. GARFIELD@09-20-2004