集成美团cat监控
集成美團cat監控
點關注不迷路,歡迎再來!精簡博客內容,盡量已專業術語來分享。
努力做到對每一位認可自己的讀者負責。
幫助別人的同時更是豐富自己的良機。
最近研究spring集成美團cat監控,關于美團cat環境搭建在上篇博客已介紹,集成美團cat在對代碼異常,接口請求調用次數與調用時間,sql執行時間和異常,url訪問調用時間和次數進行統計,使代碼可以有效的管理,在代碼與sql查錯和排除優化上有顯著的效果,可以提升開發和運維的工作效率。有需要的朋友可以了解下。直接步入主題:
CAT支持的監控消息類型包括:
? Transaction 適合記錄跨越系統邊界的程序訪問行為,比如遠程調用,數據庫調用,也適合執行時間較長的業務邏輯監控,Transaction用來記錄一段代碼的執行時間和次數。
? Event 用來記錄一件事發生的次數,比如記錄系統異常,它和transaction相比缺少了時間的統計,開銷比transaction要小。
? Heartbeat 表示程序內定期產生的統計信息, 如CPU%, MEM%, 連接池狀態, 系統負載等。
? Metric 用于記錄業務指標、指標可能包含對一個指標記錄次數、記錄平均值、記錄總和,業務指標最低統計粒度為1分鐘。
一.引入cat-client 的meven依賴
<dependency><groupId>com.dianping.cat</groupId><artifactId>cat-client</artifactId><version>3.0.0</version></dependency>二.springMVC集成url監控埋點
在web項目的web.xml配置文件中加入如下配置即可:
三.springboot集成url監控埋點
因為springboot項目沒有web.xml ,所以需要創建cat核心攔截器。
四.集成Mybatis監控埋點
/** *<p> *description: *</p> * @author andy * @since 2018年5月6日 * @see * mybatis攔截器注入到sqlSessionFactory */ @Configuration @ConditionalOnClass({ EnableTransactionManagement.class, EntityManager.class }) @AutoConfigureAfter({ HikariCPConfig.class }) @MapperScan(basePackages = { "com.axatp.cloud.dao" }) public class MybatisConfig {private static Log logger = LogFactory.getLog(MybatisConfig.class);@Resourceprivate DataSource dataSource;@Bean@ConditionalOnMissingBeanpublic SqlSessionFactory sqlSessionFactory() {try {SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();sessionFactory.setDataSource(dataSource);sessionFactory.setTypeAliasesPackage("com.axatp.cloud.model");sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:/com/axatp/cloud/mapper/*.xml"));sessionFactory.setPlugins(new Interceptor[]{new CatMybatisInterceptor()}); //MyBatis插件return sessionFactory.getObject();} catch (Exception e) {throw new RuntimeException(e);}}@Bean@ConditionalOnMissingBeanpublic DataSourceTransactionManager transactionManager() {return new DataSourceTransactionManager(dataSource);}} /** * 對MyBatis進行攔截,添加Cat監控 * */ @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 {@Overridepublic Object intercept(Invocation invocation) {MappedStatement statement = (MappedStatement) invocation.getArgs()[0];Configuration configuration = statement.getConfiguration();HikariDataSource dataSource = (HikariDataSource) configuration.getEnvironment().getDataSource();//記錄sql執行處理的時間Transaction transaction = Cat.newTransaction(Constants.SQL, statement.getId());//記錄事件Cat.logEvent(Constants.SQL_TYPE, statement.getSqlCommandType().name());Cat.logEvent(Constants.SQL_URL, dataSource.getJdbcUrl());//得到sql語句if (invocation.getArgs().length > 1) {Object obj = invocation.getArgs()[1];BoundSql boundSql = statement.getBoundSql(obj);Cat.logEvent(Constants.SQL_DETAILS, showSql(configuration, boundSql));}return doFinish(invocation, transaction);}@Overridepublic Object plugin(Object o) {if (o instanceof Executor) {return Plugin.wrap(o, this);}return o;}@Overridepublic void setProperties(Properties properties) {}private Object doFinish(Invocation invocation, Transaction transaction) {Object object = null;try {object = invocation.proceed();transaction.setStatus(Transaction.SUCCESS);} catch (Exception e) {Cat.getProducer().logError(e);}return object;}/*** 解析sql語句** @param configuration Configuration* @param boundSql BoundSql* @return String*/private static String showSql(Configuration configuration, BoundSql boundSql) {Object parameterObject = boundSql.getParameterObject();List<ParameterMapping> parameterMappings = boundSql.getParameterMappings();String sql = boundSql.getSql().replaceAll("[\\s]+", " ");if (parameterMappings.size() > 0 && parameterObject != null) {TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry();if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) {sql = sql.replaceFirst("\\?", 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);sql = sql.replaceFirst("\\?", getParameterValue(obj));} else if (boundSql.hasAdditionalParameter(propertyName)) {Object obj = boundSql.getAdditionalParameter(propertyName);sql = sql.replaceFirst("\\?", getParameterValue(obj));}}}}return sql;}/*** 獲取 sql 參數值,參數解析** @param obj value* @return parameter value*/private static String getParameterValue(Object obj) {String value;if (obj instanceof String) {value = "'" + obj.toString() + "'";} else if (obj instanceof Date) {DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA);value = "'" + formatter.format(new Date()) + "'";} else {if (obj != null) {value = obj.toString();} else {value = "";}}return value;} }五. 配置監控的項目名
在需要接入CAT監控平臺的項目中新建屬性配置文件src/main/resources/META-INF/app.properties。其內容如下:
六. 客戶端配置
你需要在此項目所在的盤符(即這里的D盤)創建data\appdatas\cat目錄,并將client.xml配置文件存放在這個路徑中。如作者的客戶端配置文件D:\data\appdatas\cat\client.xml:
七. cat監控平臺效果圖
八. 筆記總結
本次博客寫的筆記匆忙,有些地方集成寫的可能不是很詳細,不足之處歡迎指導,本人也會在后續持續更新。
總結
- 上一篇: 为什么 MySQL 不建议执行超过 3
- 下一篇: 全媒体时代的速度与激情:香港凤凰卫视云端