日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

集成美团cat监控

發布時間:2024/1/8 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 集成美团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配置文件中加入如下配置即可:

<filter><filter-name>cat-filter</filter-name><filter-class>com.dianping.cat.servlet.CatFilter</filter-class> </filter> <filter-mapping><filter-name>cat-filter</filter-name><url-pattern>/*</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher> </filter-mapping>

三.springboot集成url監控埋點
因為springboot項目沒有web.xml ,所以需要創建cat核心攔截器。

/** * cat核心攔截器 */ @Configuration public class CatConfig {//將攔截器注冊到容器中@Beanpublic 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監控埋點

/** *<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。其內容如下:

################## CAT會自動加載此文件 ################## 應用的名稱(可以根據此名稱在CAT的管理控制臺查找對應的信息)app.name=service

六. 客戶端配置
你需要在此項目所在的盤符(即這里的D盤)創建data\appdatas\cat目錄,并將client.xml配置文件存放在這個路徑中。如作者的客戶端配置文件D:\data\appdatas\cat\client.xml:

<?xml version="1.0" encoding="utf-8"?> <config mode="client" xmlns:xsi="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="config.xsd"> <servers><server ip="192.1168.23.1" port="2280" http-port="8080" /> </servers> </config>

七. cat監控平臺效果圖

八. 筆記總結
本次博客寫的筆記匆忙,有些地方集成寫的可能不是很詳細,不足之處歡迎指導,本人也會在后續持續更新。

總結

以上是生活随笔為你收集整理的集成美团cat监控的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。