java cat 监控_分布式监控CAT客户端的SpringBoot集成

客户端

项目接入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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值