APM工具(Application Performance Management)

现在的APM工具,基本都是参考google的Dapper(大规模分布式系统的跟踪系统)实现的。

主要功能是通过对跟踪请求的处理,来观察请求链路,进行性能消耗跟踪。

特点

一般的APM工具需要满足以下几点

  1. 低消耗
    跟踪系统对在线服务的影响应该做到足够小。在一些高度优化过的服务,即使一点点损耗也会很容易察觉到,而且有可能迫使在线服务的部署团队不得不将跟踪系统关停。
  2. 应用级的透明
    对于应用的程序员来说,是不需要知道有跟踪系统这回事的。如果一个跟踪系统想生效,就必须需要依赖应用的开发者主动配合,那么这个跟踪系统也太脆弱了,往往由于跟踪系统在应用中植入代码的bug或疏忽导致应用出问题,这样才是无法满足对跟踪系统“无所不在的部署”这个需求。面对当下想Google这样的快节奏的开发环境来说,尤其重要。
  3. 延展性
    监控系统都应该能完全把控住大规模的集群和服务
比较著名的框架
  1. Pinpoint

github:naver/pinpoint

通过JavaAgent的机制来做字节码代码植入,实现加入traceid和抓取性能数据的目的。

  1. SkyWalking

github:apache/skywalking

国内开源

  1. Zipkin

github:openzipkin/zipkin

twitter开源出来的,也是参考Dapper的体系来做的

  1. CAT

github:dianping/cat

大众点评开源

原理浅析

在一个java http请求场景中,如果做到分布式系统的链路跟踪呢,可以通过以下方式实现

  1. 通过parentId和spanId,分别表示被调用的系统跟踪ID和自己系统的跟踪ID
  2. 对于每个http请求,通过拦截器,把parentId和spanId写入到http中,并记录在ThreadLocal
  3. 对于多线程的traceId传递方案,可以看看阿里开源的transmittable-thread-local

所以对于一个spring的框架,大致的原理如下

  1. 创建拦截器TraceFilter
  2. 拦截器创建TraceId,放入到ThreadLocal中,这样该现场可以读到traceId
  3. 可以把traceId放入到http请求中,这样可以传递给下一个服务

可以参考以下zipkin的原理图

elk和链路追踪有关系吗_分布式