APM(Application Performance Management & Monitoring)即应用性能管理和监控,主要通过对程序的性能指标进行分析和监控,来帮助开发、测试、运维人员来掌握程序的性能和运行情况。
APM原理与简介
APM通过汇聚业务系统各个处理环节的实时数据,分析业务系统各事务处理的路径和处理时间,实现对应用的全链路性能监测。
APM工具与传统的性能监控工具的区别在于,它不仅仅提供一些零散的资源监控点和指标,而是关注于系统内部执行和系统间调用的性能瓶颈分析。
目前市面的APM系统基本都是参考Google的大规模分布式系统的跟踪系统Dapper的论文(中文翻译)来实现的。
APM的核心思想
在应用服务各节点相互调用的时候,记录并传递一个应用级别的标记,用来关联整个调用链路。如何传递这些标记,与应用节点之间使用的通信协议有关。如使用http协议的话,标记会被加入到http头中。
分布式跟踪系统要做的是记录每次发送和接受动作的标识符和时间戳,将一次请求涉及的所有服务串联起来。其中涉及一些概念如下:
trace
表示对一次请求完整调用链的跟踪,一般是一个树形结构,由多个span组成,所有span使用一个全局的traceId。如下图所示:
图中描述了一个完整的跟踪(Trace),记录了Trace上的每个span的id和父id。如果一个span没有父id,则被成为root span。所有span共用一个跟踪id(图中未标出)。
span
跟踪的基本单元,一个span表示一个rpc调用,多个span组成一个trace。
APM的组成
一个APM涉及的基本模块包括:
- 数据收集,在广度和效率上进行数据归并——Agent。
- 数据加工,对数据进行整理,传输和存储——Collector。
- 数据存储,将计算出来的指标和聚合链路信息实时保存起来——Storage。
- 数据展示,高颜值,多功能展示——UI。
市面上的APM工具
近年来随着APM技术和市场的快速发展,相关产品也如雨后春笋般大量的涌了出来。
商业产品有国外的Dynatrace、Appdynamics、New Relic等,国内的RichAPM、OneAPM、阿里的业务实时监控服务ARMS和百度MTC等。
当然,开源产品也得到了迅速发展。主要的APM开源工具有Pinpoint,SkyWalking,Zipkin和CAT。
Pinpoint
这是一个韩国团队开源出来的,通过JavaAgent的机制,在字节码层面做植入,实现加入traceid和抓取性能数据的目的。由于是在字节码层面植入的,对业务代码的侵入性为零,使用较为广泛。
Pinpoint的基本架构图如下:
- Pinpoint collect:用于收集各种性能数据。
- Pinpoint Agent:探针,与应用服务器(如tomcat)关联,部署到同一台服务器上,用字节码增强来实现对应用代码的无侵入。
- Pinpoint Web UI:数据展示层
- Pinpoint Storage:数据存储层,将收集到的数据存储到Hbase中。
在Pinpoint中,核心数据结构由Span,Trace和TraceId组成。Span和Trace在上文中介绍过,TraceId是由TransactionId,SpanId和ParentSpanId组成的key的集合。TransactionId指明消息id,必须在整个服务器集中做到全局唯一。
SkyWalking
SkyWalking是国内的一个叫吴晟的人开源出来的,目前已经贡献给了Apache基金会,成为了Apache的顶级项目。
SkyWaling通过探针自动收集性能指标,并进行分布式跟踪,对业务代码的侵入性低。
Zipkin
该系统是twitter开源出来的。特点是轻量,使用部署简单。通过在Java程序中引入客户端,可隐式拦截http,thrift等形式的服务调用。
Cat
Cat是大众点评开源出来的,其实现跟踪的手段主要是在代码里硬编码,通过埋点的方式来做数据收集,侵入性较大。
开源APM比较
维度 | Cat | ZipKin | PinPoint | SkyWalking |
---|---|---|---|---|
实现方式 | 代码埋点 | 拦截请求,发送数据至ZipKin服务 | Java探针,字节码增强 | Java探针,字节码增强 |
接入方式 | 代码侵入 | 引入配置 | 字节码植入,无侵入 | 字节码植入,无侵入 |
数据存储 | Mysql,hdfs | ES,mysql,Cassandra | Hbase,mysql | ES,H2,Mysql,Tidb |
分析粒度 | 代码级,全局调用统计,报警,JVM监控 | 接口级 | 方法级,全局调用统计,报警 | 方法级,全局调用统计 |
报表 | 丰富 | 少 | 中 | 中 |
埋点方式 | 侵入 | 侵入 | 无侵入 | 无侵入 |
客户端支持 | Java、C/C++、Node.js、Python | Java、go、JavaScript、Ruby、scala、php(除官方支持外,社区还支持其他各种语言客户端) | Java、Php | Java、C#、Php、Node.js、Go |
除了上述的apm工具之外,还有elasticsearch APM。
Elastic stack在6.3版本开始推出了APM功能。ElasticAPM是基于Elastic Stack构建的应用程序性能监视系统,它可以嵌入应用进程内部,实时采集各种运行指标并传输到elasticsearch平台进行聚合统计,通过kibana界面端展示应用系统性能处理能力。
下文将介绍Elastic APM的安装和使用。
参考资料
[1]. https://www.jianshu.com/p/d2d912cc982a
[2]. https://www.jianshu.com/p/07a00d66e703
[3]. https://cloud.tencent.com/developer/article/1501891