业界在实践链路调用工具时,思路基本都来源于Google 2010年发表的一篇Dapper的论文,论文发表后Twitter就开发了一款Zipkin的链路调用工具,后续陆续又有多款链路调用工具开源出来。尽管这些分布式追踪系统有着相似的API语法,但各种语言的开发人员依然很难将他们各自的系统(使用不同的语言和技术)和特定的分布式追踪系统进行整合。故后来又出现了一个组织Open Tracing,OpenTracing通过提供平台无关、厂商无关的API,使得开发人员能够方便的添加或更换追踪系统的实现。OpenTracing提供了用于运营支撑系统的和针对特定平台的辅助程序库。程序库的具体信息请参考详细的规范。在学习链路调用工具前,需要先理解一些链路追踪的术语定义:

Trace:一次分布式调用的链路追踪
Span:一个方法(局部或远程)调用踪迹
Annotation:附着在Span上的日志信息
Sampling:采样率

如下图所示,每一次链路调用会生成一个tid(traceId),不同的服务间,会生成新的sid(spanId),上一个服务调用的sid是下一个服务的pid(parentId).

在众多链路追踪工具中,大部分是来源于Google Dapper的思路,例如Zipkin,Skywaking等,也有些工具并不是采用Google Dapper的思路,例如CAT,CAT实际是借鉴了eBay CAL的思路。CAT 是基于Java开发的实时应用监控平台,为美团点评提供了全面的实时监控告警服务。下面是对其中使用比较广泛的链路追踪工具的简单比较,红色字体是该工具的优势点。

此篇博客重点介绍CAT的使用,上面介绍了链路追踪的一些基本概念,接下来将重点介绍如何使用CAT完成链路追踪。要使用CAT首先需要部署CAT服务,部署CAT服务可以通过拉取源代码构建war包,也可以直接通过官网下载war包。CAT服务端部署步骤官网有详细的步骤,需要注意两个点,第一:官网提醒需要使用mysql5.6或者5.7,亲测过如果Mysql不使用5.x版本,CAT服务无法正常启动起来,本人在部署CAT服务时,使用的JDK是1.8,Mysql5.7,Tomcat8.x。另外,需要注意一个点,有些操作系统对根目录只有只读权限,在部署CAT服务端时,可以通过环境变量的方式修改CAT_HOME地址。在启动tomcat服务前,先执行如下脚本

export CAT_HOME=/data/appdatas/cat/
CATALINA_OPTS="$CATALINA_OPTS -server -DCAT_HOME=$CAT_HOME

自定义的CAT_HOME目录如下所示,该目录下存放client.xml,datasource.xml,server.xml文件。

client.xml文件中server ip填入本机IP地址,因为CAT服务部署是单机本地部署,非集群部署,故填写本机一个IP地址即可。

DataSource.xml中修改成本机安装的Mysql的用户名和密码即可,Server.xml文件内容如下所示:

通过tomcat下启动服务时,可以观察自定义CAT_HOME目录是否生效,这个会影响CAT服务是否能成功启动。如下所示,可以看到自定义目录生效。

启动过程日志存放在tomcat目录下logs目录。访问http://localhost:8080,如果出现tomcat的猫说明tomcat自身已经启动成功。

tomcat启动成功后,访问CAT服务(http://localhost:8080/cat),如果CAT服务启动出现问题,可查看CAT_HOME/data/appdatas/cat 目录,会有相应的启动日志,可通过日志排查原因。如果在Dashboard中显示服务正常文字,说明CAT服务部署成功,如下图所示:

进入CAT服务后,点击Config菜单,可以进行相关配置,如果是本机部署,客户端路由配置中将IP地址相关的地方修改成本机的IP地址,并提交。

官网给出的服务端部署文档写的非常详细,对于本机单机部署而言,还是比较简单的,总结步骤如下所示:

  • 安装的软件清单:JDK7或者JDK8,Mysql5.6或者Mysql5.7,Tomcat8.x
  • 拉取源码生成war包或者从官网直接下载war包,下载3.1.0版本及以上的war包,war包放到tomcat的webapps目录下
  • 创建/data/appdatas/cat目录,并修改datasource.xml,client.xml,server.xml,将文件放入目录
  • 创建cat database,并初始化数据库数据,初始化脚本在源码中:script/CatApplication.sql
  • 启动tomcat,登陆cat服务,查看cat服务是否成功启动
  • 提交新的客户端路由信息

上面介绍了服务端的部署,接下来看看客户端如何接入。客户端接入非常简单,首先是在客户端的pom.xml文件中添加cat-client的依赖。

<dependency><groupId>com.dianping.cat</groupId><artifactId>cat-client</artifactId><version>${cat.version}</version>
</dependency>

接着在源代码的resources/META-INF/cat目录下放入client.xml文件,该文件中server ip修改成部署CAT服务的机器的IP,对于本机部署而言就是本机IP。resources/META-INF目录下放入app.properties文件,文件内容“app.name=应用名称”,client.xml文件内容如下所示:

另外,需要注意一点,如果是自定义CAT_HOME目录,只在服务端部署时生效,客户端的日志目录(/data/applogs/cat)是写死的,除非修改客户端源代码,再生成新的jar包,引入到项目中。所以如果对操作系统根目录只有只读权限,那么可以通过添加软链接的方式。否则,可能影响生成链路信息。以下是Mac创建软链接的过程

1.sudo vi /etc/synthetic.conf
2.进行文件映射 or 软连接,如:中间用Tab键隔开
data    Users/taoli/data/applogs/cat
3.重启电脑
4.查看系统根目录就能看到data目录了

客户端集成的Demo地址,该Demo编写了四个服务,模拟服务间调用。依次启动服务,并访问最外层的UI服务,连续访问几次后,在CAT服务上查看生成的链路调用信息,服务调用关系如下:

在CAT服务上查看Transaction信息,可以查看服务调用的响应时间,QPS等信息,点击Log View,可以看服务间的详细调用关系以及不同阶段的耗时信息。

Log View里面的链路信息如下所示,可以查看到服务之间调用关系以及每一步调用的耗时。

Problem报表可以查看发生异常的信息,例如错误的接口URL,错误量等信息。

点击Lg(SampleLinks)还可以查看到详细的报错信息,如下图所示:

更多关于报表的使用可以查看官网信息,除了监控信息查看,CAT还可以配置告警。CAT的一大优势也是支持丰富的报表信息。上面演示了CAT进行链路监控的效果,接下来分析Demo代码,从代码层面理解Java客户端如何与CAT集成。客户端集成都是以new transaction的方式完成,如下所示

 Demo代码中先分析"acme-financial-ui"这个服务,这个服务中编写了CatServletFilter,这个Filter中把请求中的头信息读取出来,存放到catContext中,便于后面传递到下一个服务,这里编写Filter是假设还有其他服务会调用UI服务。

除此之外还编写了CatRestInterceptor,这个Interceptor的作用是从catContext中读取存放的信息,放到请求的header中,传递到下一个服务。因为acme-financial-ui这个服务调用Back-office这个服务是通过RestTemplate完成的,因为添加了CatRestInterceptor,那么所有的RestTemplate调用都会有添加的header信息,这样服务间的链路标识信息就传递下去了。

下面是创建配置类,让CatServletFilter生效的代码。

下面是把CatRestInterceptor设置到RestTemplate对象上的代码。

back-office服务的代码和UI服务的代码相同,Account服务和Customer服务因为没有再调用其他服务,即没有用restTemplate调用其他服务,故这两个服务中只添加CatServletFilter即可,无需添加CatRestInterceptor即可,如下图所示。总结而言:埋点需要完成的核心实际就是把服务间的调用信息传递下去,传递方式是:通过servletFilter读取发送过来的请求的header信息,存入CatContext,调用下一个服务时,再从CatContext中读取信息存入request的header中传递下去。

为了更清晰的理解传递的链路信息,这里把Filter拦截存储的信息打印出来,整理如下。例如通过postman调用接口“http://localhost:8081/start”,也就是从UI这个服务发起服务调用。可以看到,因为UI服务没有被其他任何服务调用,所以Filter拦截到的信息都是null。另外,服务是由UI这个服务发起的,所以catContextRoot都是acme-financial-ui-c0a83209-461821-2015,对于back-office服务而言,Parent信息也是acme-financial-ui-c0a83209-461821-2015,并生成了child信息,传递给后面的Account和Customer服务,是Account和Customer服务的Parent信息。

再回到前面的TraceId和SpanId的概念,这里acme-financial-ui-c0a83209-461821-2015就是traceId,各个服务新生成的Id就是spanId,同时上一个服务的childId是下一个服务的parentId。再发起一个新的接口调用,会生成新的TraceId信息。

以上就是对CAT链路工具的学习和理解。

调用链监控工具之CAT相关推荐

  1. SpringCloud第12讲:调用链监控工具Sleuth+Zipkin

    Sleuth是一个SpringCloud的分布式跟踪解决方案 一.术语 Span(跨度):Sleuth的基本工作单元,他用一个64位的id唯一标识.除ID外,span还包含其他数据,例如:描述.时间戳 ...

  2. 调用链监控 - Tracing - APM

    调用链监控 - Tracing - APM 调用链监控原理和相关概念 调用在分布式系统中的流程简述实例 相关概念 CAT vs Zipkin vs Skywalking 埋点方式简述 APM功能简述 ...

  3. SpringBoot实战(十六):集成Skywalking调用链监控系统

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan [前言] Skywalking做为生产级的调用链监控工具,不仅提供了丰富的监控系统,而且通过字节 ...

  4. 微服务调用链的原理和选型

    原文:https://juejin.im/post/5cde874e6fb9a07f091b713c 微服务是一个分布式非常复杂系统,如果没有一套调用链监控,如果服务之间依赖出现问题就很难进行调位 下 ...

  5. Skywalking调用链监控系统 及 日志采集

    Skywalking做为生产级的调用链监控工具,不仅提供了丰富的监控系统,而且通过字节码拦截形式集成系统,对系统没有任何侵入性:最近研究一下调用链项目,在此与大家共享: github 地址  http ...

  6. amp 调用链_调用链选型之Zipkin,Pinpoint,SkyWalking,CAT

    简介 Zipkin是Twitter开源的调用链分析工具,目前基于springcloud sleuth得到了广泛的使用,特点是轻量,使用部署简单. Pinpoint是韩国人开源的基于字节码注入的调用链分 ...

  7. CAT调用链系统设计

    基于Cat的分布式调用追踪 Cat是美团点评出的一款APM工具,同类的产品也有不少,知名的开源产品如zipkin和pinpoint:国内收费的产品如oneapm.考虑到Cat在互联网公司的应用比较广, ...

  8. CAT中实现异步请求的调用链查看

    CAT简介 CAT(Central Application Tracking),是美团点评基于 Java 开发的一套开源的分布式实时监控系统.美团点评基础架构部希望在基础存储.高性能通信.大规模在线访 ...

  9. 微服务调用链监控开源工具CAT

    1 监控在微服务架构的地位 2 为何需要调用链监控? 在初期的单体应用,应用都打在一个包中,无分布式概念,监控也只需对一些埋点监控. 但是微服务时代下,很多服务在各自的包,一旦出现问题,没有调用链监控 ...

最新文章

  1. java封装插件,基于面向对象思想封装一个水球插件
  2. linux-Tcp IP协议栈源码阅读笔记
  3. 图像语义分割:FCN全卷积网络概述
  4. SDNU 1167.花生采摘(排序)
  5. ARM中断分析之三:WinCE驱动的中断分析
  6. 深入研究 C++中的 STL Deque 容器
  7. 信息学奥赛一本通 2042:【例5.10】稀疏矩阵
  8. pmp培训机构哪个好?各pmp培训机构排名如何?
  9. 四川师范大学大学计算机基础,大学计算机基础课程教学改革探索——以四川师范大学为例...
  10. 免费作图软件draw.io 软件输入数学公式和文本
  11. 网络领域 ——《Adaptable Switch: A Heterogeneous Switch Architecture for Network-Centric Computing》
  12. 计算机教室云教学反思,《云》音乐教学反思
  13. rstudio线性回归_R语言线性回归
  14. C/C++语言中的声明
  15. SAP中物料报废无法确定账户问题处理实例
  16. 搭建vue前端脚手架
  17. 21天学通Java学习笔记-Day02
  18. 【系统架构设计师】软考高级职称,一次通过,倾尽所有,2018年下半年系统架构设计师考试论文真题( 论面向服务架构设计及其应用)
  19. xp无法搜索计算机名,雨林木风xp系统无法搜索到工作组计算机怎么办
  20. Flash相册加载图片完毕等比缩放的类

热门文章

  1. html文字段落设置,css中怎么设置段落样式?
  2. Android 10 根文件系统和编译系统(十八):Android.bp语法
  3. OpenCV 计算运行时间(us,ms,s)
  4. 台式计算机c盘怎么清理空间,电脑C盘空间空间清理方法
  5. 锐角三角函数怎么用计算机算,锐角三角函数:运用计算器
  6. 三角函数之角度与弧度
  7. 电脑软件:推荐八款图片处理工具,值得收藏
  8. UDS诊断系列之三 ISO14229协议介绍(下)
  9. malloc申请内存空间失败
  10. 自动获取verycd feed中的下载链接