客户端
项目接入CAT监控:
maven依赖
com.dianping.cat
cat-client
3.0.01
2
3
4
5
项目中创建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; }
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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; }
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
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(); }
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 ""; } }
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
logback.xml加入如下代码
1
2
3
4
如何使用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();
}1
2
3
4
5
6
7
8
9
10
自定义上报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();
}1
2
3
4
5
6
7
8
9
10
文章来源: blog.csdn.net,作者:Victor_An,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/Victor_An/article/details/109647976