========================
消息的基本属性
========================
消息的几个属性:
type: 定义消息的 category, 比如 SQL 或 RPC 或 HTTP
name: 代表一个动作 action, 详细的内容应该记录到 data 属性中, 而不是 name 属性, 比如:
         对于 SQL type 来讲, name 应该是一个 SQL 模板, 如 select <?> from user where id = <?>
         对于 RPC type 来讲, name 应该是一个远程函数的签名, 如 QueryOrderByUserId(string, int)
         对于 HTTP type 来讲, name 应该是一个 base url, 比如 /api/v8/{int}/orders
status:
         status <>0, 该消息会被认为是一个 problem, 而且该消息不会被聚合, 它会显示在 Web UI 的 problemed logview 中的.
data:
         记录消息的详细内容, 比如:
         If the type is SQL, the data could be id=75442432
         If the type is RPC, the data could be userType=dianping&userId=9987
         If the type is HTTP, the data could be orderId=75442432
timestamp:
         代表消息的创建时刻.
duration:
         duration 只出现在 tranaction 类的消息中, 单位是毫秒
durationStart:
         durationStart 只出现在 tranaction 类的消息中, 它代表 tranaction 开始时刻.

========================
环境准备
========================
参考: https://github.com/dianping/cat/blob/master/integration/springMVC-AOP/CAT%E9%83%A8%E7%BD%B2.txt

1. 配置客户端文件, 拷贝 client.xml 文件
Linux\Mac 到 /data/appdatas/cat 下.
Windows 到项目程序运行盘的根目录 /data/appdatas/cat 下.

/data/appdatas/cat/client.xml 客户端配置文件的主要内容:
* servers : 定义多个服务端信息;
* server : 定义某个服务端信息;
* ip : 配置服务端(cat-home)对外 IP 地址;
* port : 配置服务端(cat-home)对外 TCP 协议开启端口, 固定值为 2280;
* http-port : 配置服务端(cat-home)对外 HTTP 协议开启端口, 如: tomcat 端口, 若未指定, 默认为 8080 端口;

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <config mode="client" xmlns:xsi="http://www.w3.org/2001/XMLSchema" xsi:noNamespaceSchemaLocation="config.xsd">
  3. <servers>
  4. <server ip="10.1.5.87" port="2280" http-port="8080" />
  5. <server ip="10.1.5.88" port="2280" http-port="8080" />
  6. </servers>
  7. </config>

2. cat 管理页面上增加一个新的项目名.

3. 在 Spring 程序中配置 app.properties 文件
  在 src/main/resources/META-INF/app.properties 文件中设定项目名.
  应用的名称(可以根据此名称在 CAT 的管理控制台查找对应的信息), 应用的名称不要太长, 每个消息的前缀都是应用名.
  内容如: app.name=${appName}

========================
pom.xml
========================
3.0 服务器应该需要和 3.0 客户端搭配使用, 2.0 服务器应该是用 2.0 客户端. 这里使用了 3.0 版.
文档和源码见: https://github.com/dianping/cat/tree/master/lib/java

cat-client 3.0.0 jar 包并没有加到 maven 主 repository 中, 需要另加一个 repository 库.

  1. <dependency>
  2. <groupId>com.dianping.cat</groupId>
  3. <artifactId>cat-client</artifactId>
  4. <version>3.0.0</version>
  5. </dependency>
  6.  
  7. <repository>
  8. <id>unidal.nexus</id>
  9. <url>http://unidal.org/nexus/content/repositories/releases/</url>
  10. </repository>

========================
程序集成方式
========================
在我们的业务代码中, 不应该加入很多和 cat 监控相关的代码, 监控代码应该在基础架构中实现, 除非是一些和业务指标相关的监控. 集成 cat 监控的方式有:
方式 1. 直接调用 cat api 实现基本监控.
方式 2. Url 请求监控, 通过注册 CatFilter 实现.
方式 3. 日志类监控, 通过 cat 的 logback 插件实现.
方式 4. SQL 监控, 通过 cat 的 Mybatis Plugin 实现.
方式 5. 直接调用 cat api 实现调用链监控.
方式 6. 使用调用链的 CatCrossHttpClient 和 HttpCatCrossFilter

========================
方式 1. 直接调用 cat api 实现基本监控
========================

  1. //------------------------
  2. // transaction 类型的监控
  3. //------------------------
  4. Transaction t = Cat.newTransaction("some_type", "some_name"); //传入 type 和 name
  5. try {
  6. // do something here
  7. double a=1/0;
  8. t.addData("some detail");
  9. t.setStatus(Transaction.SUCCESS);
  10. } catch (Exception e) {
  11. Cat.logError(e);
  12. t.setStatus(e);
  13. } finally {
  14. t.complete();
  15. }
  1. //------------------------
  2. // event 类型的监控
  3. //------------------------
  4. //Log an event, 并自动加上 success status and empty data.
  5. Cat.logEvent("URL.Server", "serverIp");
  6.  
  7. //Log an event with given status and given data
  8. //第三个参数为 status, "0"为正常, 其他为失败, 可以传入 error code 字符串
  9. //第四个参数为 nameValuePairs, 可以按照 url 的 query string 形式传入 kv 清单.
  10. Cat.logEvent("URL.Server", "serverIp", "failed", "ip=${serverIp}");
  11.  
  12. //Log exception
  13. Cat.logError(e);
  14. Cat.logError("error(X) := exception(X)", e);
  15. Cat.logErrorWithCategory("custom-category", e);
  1. //------------------------
  2. // Metric 的上报
  3. //------------------------
  4. Cat.logMetricForCount("Order", 100); //还有 logMetricForDuration()

//------------------------

// 组合消息树
//------------------------
如果是直接使用 Cat 静态方法调用多次 LogEvent() 方法, 这些 Event 并没有组合到一个消息树, 每个 Event 都是单独一个消息树. 要想将这些 Event 组成一个消息树, 应该使用 MessageProducer 实例的方法, 而不是 Cat 静态方法. 一个消息树以 transaciton 创建为开始, 以 transaction 的 complete() 方法结束.
甚至, 可以在一个消息树中嵌套另一个消息树, 调用链监控就是基于父子消息树嵌套实现的.

  1. //单个消息树
  2. @RequestMapping("/mix")
  3. public String mix() {
  4. MessageProducer cat=Cat.getProducer(); // 获取一个 MessageProducer 实例
  5. Transaction t = cat.newTransaction("URL", "helloEtl"); //传入 type 和 name
  6. cat.logEvent("EventType", "EventName");
  7. cat.logMetric("aaaa", "bbb", "200");
  8. try {
  9. // do something here
  10. double a=1/0;
  11. t.addData("some detail");
  12. t.setStatus(Transaction.SUCCESS);
  13. } catch (Exception e) {
  14. t.setStatus(e);
  15. } finally {
  16. t.complete();
  17. }
  18. return "mix";
  19. }
  1. //父子消息树
  2. @RequestMapping("/mix2")
  3. public String mix2() {
  4. MessageProducer cat=Cat.getProducer();
  5. Transaction t = cat.newTransaction("URL", "helloEtl"); //传入 type 和 name
  6. cat.logEvent("EventType", "EventName");
  7. cat.logMetric("aaaa", "bbb", "200");
  8.  
  9. //cat2 为内嵌消息树, 在一个transaction内部, 每新建一个新的transaction, 就采用push stack机制内嵌一个transaction.
  10. MessageProducer cat2=Cat.getProducer();
  11. Transaction t2 = cat2.newTransaction("URL", "helloEtl222"); //传入 type 和 name
  12. cat2.logEvent("EventType", "EventName");
  13. t2.complete();
  14.  
  15. try {
  16. // do something here
  17. double a=1/0;
  18. t.addData("some detail");
  19. t.setStatus(Transaction.SUCCESS);
  20. } catch (Exception e) {
  21. t.setStatus(e);
  22. } finally {
  23. t.complete();
  24. }
  25. return "mix2";
  26. }

========================
方式 2. Url 请求监控, 通过注册 CatFilter 实现.
========================
监控 Url 访问非常简单, 直接注册一个 CatFilter 即可.
对于 SpringBoot 程序, 参考: https://github.com/dianping/cat/blob/master/integration/spring-boot/CatFilterConfigure.java
对于 Spring MVC 程序, 参考 https://github.com/dianping/cat/blob/master/integration/springMVC-AOP

  1. @Configuration
  2. public class CatFilterConfigure {
  3. @Bean
  4. public FilterRegistrationBean catFilter() {
  5. FilterRegistrationBean registration = new FilterRegistrationBean();
  6. CatFilter filter = new CatFilter();
  7. registration.setFilter(filter);
  8. registration.addUrlPatterns("/*");
  9. registration.setName("cat-filter");
  10. registration.setOrder(1);
  11. return registration;
  12. }
  13. }

========================
方式 3. 日志类监控, 通过 cat 的 logback 插件实现.
========================
参考: https://github.com/dianping/cat/tree/master/integration/logback
如果需要使用 Cat 自定义的 Appender, 需要在 logback.xml 中添加如下配置:

  1. <appender name="CatAppender" class="com.dianping.cat.logback.CatLogbackAppender"></appender>
  2.  
  3. <root level="info">
  4. <appender-ref ref="CatAppender" />
  5. </root>

========================
方式 4. SQL 监控, 通过 cat 的 Mybatis Plugin 实现.
========================
也很简单, 配置 mybatis 配置插件即可.
参考 https://github.com/dianping/cat/tree/master/integration/mybatis

========================
方式 5. 直接调用 cat api 实现调用链监控.
========================
参考 https://www.cnblogs.com/xing901022/p/6237874.html
在微服务环境中, 如果要检查调用链上每个服务的性能, 不是一件很容的事情, 幸好 cat 支持. 在 cat 中仍然可使用 transaction 来将调用次序构成一个链路, 和普通 transaction 不同的是, 它需要提供一个调用的 context, 该 context 主要包含三个 id:
1. RootId, 用于标识唯一一个调用链
2. ParentId, 父 Id 是谁, 谁在调用我.
3. ChildId, 我在调用谁?
另外, 需要服务端和调用端应用程序同属于一个 domain.

Cat 的 Context 是一个接口, 需要我们实现, 由于这个 context 需要跨网络传输, 如果使用 RMI 方式, 实现类要能够序列化; 如果 rest 风格的 http 请求方式, 需要我们将在服务请求时把 context 放到 Http-Header 传到服务提供方.

  1. //Cat Context 接口
  2. public interface Context {
  3. String ROOT = "_catRootMessageId";
  4. String PARENT = "_catParentMessageId";
  5. String CHILD = "_catChildMessageId";
  6.  
  7. void addProperty(String var1, String var2);
  8.  
  9. String getProperty(String var1);
  10. }
  11.  
  12. //Context 的实现类:
  13. public class MyContext implements Cat.Context,Serializable{
  14.  
  15. private static final long serialVersionUID = 7426007315111778513L;
  16.  
  17. private Map<String,String> properties = new HashMap<String,String>();
  18.  
  19. @Override
  20. public void addProperty(String s, String s1) {
  21. properties.put(s,s1);
  22. }
  23.  
  24. @Override
  25. public String getProperty(String s) {
  26. return properties.get(s);
  27. }
  28. }

如何初始化和使用一个 context 呢? Cat 已经提供了两个方法, 分别是:
1. logRemoteCallClient(), 该方法用在微服务的调用端, 用来初始化 context.
2. logRemoteCallServer(), 该方法用在微服务的服务端, 将 context 传递给服务端的 threadLocal 变量, 形成消息树的结构.

========================
方式 6. 使用调用链的 CatCrossHttpClient 和 HttpCatCrossFilter
========================
通过上面的 API 方式实现调用链监控, 比较复杂, 最好做一些封装.
rest 风格的 http 请求方式, 调用时在服务请求方把消息 id 信息放到 Http-Header 中; 在服务提供方, 用 filter 拦截, 并获得 http-header 中的消息 id, 这样通过埋点, 串联起消息树.

下面的博客, 提供一个服务器端实现了一个 HttpCatCrossFilter,主调端采用 CatCrossHttpClient, 可以大大简化代码.
https://www.cnblogs.com/yeahwell/p/cat.html

下面博客也是一个思路:
https://my.oschina.net/u/129971/blog/688371
https://github.com/summerpotato/cat-monitor/blob/master/src/main/java/net/tomjerry/catmonitor/filter/HttpCatCrossFliter.java

======================
参考
======================
深入详解美团点评 CAT 跨语言服务监控(三)CAT 客户端原理
https://blog.csdn.net/caohao0591/article/details/80207806
美团 CAT 集群的搭建与集成
https://kefeng.wang/2018/07/06/tracing-cat/
大众点评 CAT 开源监控系统剖析
https://www.cnblogs.com/yeahwell/p/cat.html
CAT 使用小结 -- 调用链
https://my.oschina.net/u/129971/blog/688371
基于 Cat 的分布式调用追踪
http://www.cnblogs.com/xing901022/p/6237874.html
和 Spring-boot/logback 等集成
https://github.com/dianping/cat/tree/master/integration/
Cat 统一监控平台简单使用
https://my.oschina.net/fuxingCoder/blog/750639
http://fanlychie.github.io/post/springmvc-dubbo-mybatis-with-cat.html
官网客户端
https://github.com/dianping/cat/tree/master/lib
携程开源的 .Net 客户端
https://github.com/ctripcorp/cat.net

点评cat系列-应用集成的更多相关文章

  1. 点评cat系列-服务器开发环境部署

    我们有三种部署方式:1. docker 部署2. 采用官方的 war 包部署. 3. 源码部署 很显然 docker 部署是最简单的, 我尝试了多次, 都在 cat docker 容器镜像的编译过程失 ...

  2. 点评cat系列-简介

    面上有很多优秀的 OS 级监控系统 (比如 falcon), 这些监控系统主要聚焦在 CPU/IO/Mem/Disk 和应用端口, falcon 甚至可以监控到 JVM. 但对于应用系统内部的一些监控 ...

  3. 深入详解美团点评CAT跨语言服务监控(二) CAT服务端初始化

    Cat模块 Cat-client : cat客户端,编译后生成 cat-client-2.0.0.jar ,用户可以通过它来向cat-home上报统一格式的日志信息,可以集成到 mybatis.spr ...

  4. 深入详解美团点评CAT跨语言服务监控(一) CAT简介与部署

    前言: CAT是一个实时和接近全量的监控系统,它侧重于对Java应用的监控,除了与点评RPC组件融合的很好之外,他将会能与Spring.MyBatis.Dubbo 等框架以及Log4j 等结合,支持P ...

  5. 美团点评CAT监控平台研究

    1. 美团点评CAT监控平台研究 1.1. 前言 此文根据我对官方文档阅读并记录整理所得,中间可能会穿插一些自己的思考和遇坑 1.2. 简介 CAT 是基于 Java 开发的实时应用监控平台,为美团点 ...

  6. 【转】点评cat高可用实时监控系统

    CAT总体介绍CAT(Central Application Tracking)是由吴其敏(前大众点评首席架构师,现携程架构负责人)主导设计基于Java开发打造的实时应用监控平台,为大众点评网提供了全 ...

  7. 深入详解美团点评CAT跨语言服务监控(六)消息分析器与报表(一)

    大众点评CAT微服务监控架构对于消息的具体处理,是由消息分析器完成的,消息分析器会轮训读取PeriodTask中队列的消息来处理,一共有12类消息分析器,处理后的结果就是生成各类报表. 消息分析器的构 ...

  8. 深入详解美团点评CAT跨语言服务监控(四)服务端消息分发

    这边首先介绍下大众点评CAT消息分发大概的架构如下: 图4 消息分发架构图 分析管理器的初始化 我们在第一章讲到服务器将接收到的消息交给解码器(MessageDecoder)去做解码最后交给具体的消费 ...

  9. 深入详解美团点评CAT跨语言服务监控(三)CAT客户端原理

    cat客户端部分核心类 message目录下面有消息相关的部分接口 internal目录包含主要的CAT客户端内部实现类: io目录包含建立服务端连接.重连.消息队列监听.上报等io实现类: spi目 ...

随机推荐

  1. 英语口语练习系列-C02-抱怨

    连接到英语口语系列总分类 连接到上一章棒棒的 竹石 郑燮 zhèng xiè 竹石 作者:郑燮 咬定青山不放松,立根原在破岩中. 千磨万击还坚劲,任尔东西南北风. Our team sucks. 我们 ...

  2. Windows Service 学习系列(一):建立简单的Windows service

    参考:https://www.cnblogs.com/cncc/p/7170951.html 一.开发环境 操作系统:Windows 7 X64 开发环境:VS2017 编程语言:C# .NET版本: ...

  3. duilib

    https://www.cnblogs.com/lin1270/p/4109305.html

  4. vue_ui使用

    cnpm install -g @vue/cli 下载 vue -V 查看版本 vue ui 运行vue ui 这样在浏览器上就能看到vue图形界面 根据需求设置

  5. MYSQL primary key use btree 是什么含义了解一下

    CREATE TABLE `sth_definition` ( `id` int(11) NOT NULL AUTO_INCREMENT, `analyseId` bigint(20) DEFAULT ...

  6. 移动端无限滚动 TScroll.vue组件

    // 先看使用TScroll.vue的几个demo 1.https://sorrowx.github.io/TScroll/#/ 2. https://sorrowx.github.io/TScrol ...

  7. IDEA远程调试监控端口

    大家知道,线上环境定位问题不是那么简单的,如果有非常完善的日志以及监控系统是不必担心的,但是应对这些并不完善的场景下,IDEA提供了一种远程调试的功能,remote集成了可以远程调试的功能,只需要在你 ...

  8. AngularJS 1.x系列:AngularJS过滤器(4)

    1. AngularJS过滤器(Filter)使用方法 AngularJS中过滤器(Filter)主要功能是格式化数据. AngularJS过滤器使用方法有3种: ◊ 在表达式{{}}中使用 ◊ 在指 ...

  9. git 的简单实用

    一. 安装 Git(git_for_windows.xp510.com.rar) 二. 使用 a) 进入到 git bash(命令行工具) b) 初始化user.name,user.email $ g ...

  10. 【数学建模】灰色系统理论II-Verhulst建模-GM(1,N)-GM(2,1)建模

    灰色系统理论中,GM(1,1)建模很常用,但他是有一定适应范围的. GM(1,1)适合于指数规律较强的序列,只能描述单调变化过程.对于具有一定随机波动性的序列,我们考虑使用Verhulst预测模型,或 ...