SpringCloud 系列教程 | 第十六篇:微服务利剑之 APM 平台(二)Pinpoint
Springboot: 2.1.7.RELEASE
SpringCloud: Greenwich.SR2
[TOC]
1. Pinpoint 概述
Pinpoint 是一个由韩国人编写的为大型分布式系统服务的链路跟踪平台,并提供大量链路跟踪数据分析汇总解决方案。自 2012 年 7 月开始开发,与 2015 年 1 月做为一个开源项目推出。
2. Pinpoint 主要特性
- 分布式事务跟踪,跟踪跨分布式应用的消息。
- 自动检测应用拓扑,帮助你搞清楚应用的架构。
- 水平扩展以便支持大规模服务器集群。
- 提供代码级别的可见性以便轻松定位失败点和瓶颈。
- 使用字节码增强技术,添加新功能而无需修改代码。
3. Pinpoint 优势
- 无入侵:采用字节码增强技术,新增功能无需修改代码。
- 性能高:对性能的影响非常小(资源使用量最小仅增加 3%),异步数据传输,采用 UDP 协议让出网络连接优先级。
4. Pinpoint 架构简介
先看一下官方提供的架构图,如图:
Pinpoint 主要包含了 4 个组件:
- Pinpoint Agent:探针,附加到用于分析的 Java 服务
- Pinpoint Collector:数据收集组件,部署在 Web 容器上
- Pinpoint Web UI:数据展示组件,部署在 Web 容器上
- HBase Storage:数据存储组件
架构图从上往下看,首先是通过 Agent 组件收集需要的数据,通过 UPD/TCP 的方式将数据发送给 Collector,由 Collector 将数据分析整理过后存入 HBase,通过 Web UI 组件将分析好的数据从 HBase 中读出,展示在现代化的 UI 界面上。
5. Pinpoint 数据结构简介
Pinpoint 中,核心数据结构由 Span, Trace, 和 TraceId 组成。
- Span: RPC (远程过程调用 /remote procedure call)跟踪的基本单元; 当一个 RPC 调用到达时指示工作已经处理完成并包含跟踪数据。为了确保代码级别的可见性,Span 拥有带 SpanEvent 标签的子结构作为数据结构。每个 Span 包含一个 TraceId。
- Trace: 多个 Span 的集合; 由关联的 RPC (Spans)组成. 在同一个 trace 中的 span 共享相同的 TransactionId。Trace 通过 SpanId 和 ParentSpanId 整理为继承树结构.
-
TraceId: 由 TransactionId, SpanId, 和 ParentSpanId 组成的 key 的集合. TransactionId 指明消息 ID,而 SpanId 和 ParentSpanId 表示 RPC 的父 - 子关系。
- TransactionId (TxId): 在分布式系统间单个事务发送 / 接收的消息的 ID; 必须跨整个服务器集群做到全局唯一.
- SpanId: 当收到 RPC 消息时处理的工作的 ID; 在 RPC 请求到达节点时生成。
- ParentSpanId (pSpanId): 发起 RPC 调用的父 span 的 SpanId. 如果节点是事务的起点,这里将没有父 span – 对于这种情况,使用值 - 1 来表示这个 span 是事务的根 span。
6. Pinpoint 版本依赖
- Pinpoint 所需要的 Java 版本兼容:
Pinpoint Version | Agent | Collector | Web |
---|---|---|---|
1.0.x | 6-8 | 6-8 | 6-8 |
1.1.x | 6-8 | 7-8 | 7-8 |
1.5.x | 6-8 | 7-8 | 7-8 |
1.6.x | 6-8 | 7-8 | 7-8 |
1.7.x | 6-8 | 8 | 8 |
1.8.0 | 6-10 | 8 | 8 |
1.8.1+ | 6-11 | 8 | 8 |
- HBase 所需要的版本兼容
Pinpoint Version | HBase 0.94.x | HBase 0.98.x | HBase 1.0.x | HBase 1.2.x | HBase 2.0.x |
---|---|---|---|---|---|
1.0.x | yes | no | no | no | no |
1.1.x | no | not tested | yes | not tested | no |
1.5.x | no | not tested | yes | not tested | no |
1.6.x | no | not tested | not tested | yes | no |
1.7.x | no | not tested | not tested | yes | no |
1.8.x | no | not tested | not tested | yes | no |
Pinpoint Version | HBase 0.94.x | HBase 0.98.x | HBase 1.0.x | HBase 1.2.x | HBase 2.0.x |
- Agent – Collector 所需要的版本兼容
Agent Version | Collector 1.0.x | Collector 1.1.x | Collector 1.5.x | Collector 1.6.x | Collector 1.7.x | Collector 1.8.x |
---|---|---|---|---|---|---|
1.0.x | yes | yes | yes | yes | yes | yes |
1.1.x | not tested | yes | yes | yes | yes | yes |
1.5.x | no | no | yes | yes | yes | yes |
1.6.x | no | no | not tested | yes | yes | yes |
1.7.x | no | no | no | no | yes | yes |
1.8.x | no | no | no | no | no | yes |
Agent Version | Collector 1.0.x | Collector 1.1.x | Collector 1.5.x | Collector 1.6.x | Collector 1.7.x | Collector 1.8.x |
- Flink 所需要的版本兼容
Pinpoint Version | flink 1.3.X | flink 1.4.X | flink 1.5.X | flink 1.6.X | flink 1.7.X | Pinpoint Version |
---|---|---|---|---|---|---|
1.7.x | yes | yes | no | no | no | 1.7.x |
1.8.x | yes | yes | no | no | no | 1.8.x |
1.9.x | yes | yes | yes | yes | yes | 1.9.x |
Pinpoint Version | flink 1.3.X | flink 1.4.X | flink 1.5.X | flink 1.6.X | flink 1.7.X | Pinpoint Version |
1.7.x | yes | yes | no | no | no | 1.7.x |
1.8.x | yes | yes | no | no | no | 1.8.x |
1.9.x | yes | yes | yes | yes | yes | 1.9.x |
7. Spring Cloud 与 Pinpoint 实战
在介绍实战之前,我们先介绍一下 Pinpoint 部署构建。
笔者构建的一些前置条件:
java:1.8
CentOS:7.6
- HBase 部署
存储方式需要使用 HBase1.2.x 的版本,笔者这里选择的是 HBase1.2.6,下载地址为 Apache 官网,推荐使用有端点续传功能的下载器下载(实在是有点慢),HBase 全版本下载地址:http://archive.apache.org/dis…,各位读者选择自己喜欢的版本下载。
下载完成后,将 HBase1.2.6 放入 CentOS 的 opt 目录中,执行如下命令:
tar -xvzf hbase-1.2.6-bin.tar.gz
mv hbase-1.2.6/ /data/service/hbase/
修改 hbase 中 config 目录中的 JAVA_HOME,将这里的 JAVA_HOME 修改为自己本地的路径,笔者这里修改如下:
export JAVA_HOME=/opt/jdk1.8.0_221
修改完成后就可以进入 hbase 的 bin 目录,启动 hbase 了,执行如下语句:
./start-hbase.sh
启动成功后,可以执行 jps,如果看到有 HMaster,可有证明启动成功,如下:
19263 HMaster
也可以打开浏览器访问:http://ip:16010/master-status,结果如图:
接下来我们先把 Pinpoint 的 HBase 的构建脚本导入,进入 HBase 的 bin 目录下执行如下语句:
./hbase shell /opt/hbase-create.hbase
数据导入成功我们在 HBase 的 UI 界面上可以看到,如图:
后面的目录是笔者用来存放 HBase 初始化脚本的路径,各位读者可根据情况自行替换,至此,HBase 环境准备完成,接下来开始部署 Collector 和 Web UI。
- Collector 和 Web UI 部署
出于简单方便考虑,不推荐初学者自行编译代码进行部署,可以直接使用官方提供的发行版本进行部署。
浏览器访问链接:https://github.com/naver/pinp…,直接下载当前最新 Release 版本即可,笔者现在看到的最新版本是 1.8.4,如图,需要下载的内容有 pinpoint-agent-1.8.4.tar.gz
、pinpoint-collector-1.8.4.war
和pinpoint-web-1.8.4.war
。
首先需要准备两个 tomcat,笔者这里下载的 tomcat8,解压两份后并重命名为 apache-tomcat-pinpoint-collector
和apache-tomcat-pinpoint-web
。
将 apache-tomcat-pinpoint-collector
中的 config 中的 server.xml 进行修改。
将 8005 改成 18005,8080 改成 18080,8443 改为 18443,8009 改为 18009。
同样也将 apache-tomcat-pinpoint-web
中的 config 中的 server.xml 进行修改。
将 8005 改成 28005,8080 改成 28080,8443 改为 28443,8009 改为 28009。
将 apache-tomcat-pinpoint-collector
中的 webapp/ROOT
清空,将 pinpoint-collector-1.8.4.war
放入并解压。解压完成后就可以进入 bin 目录使用 ./startup.sh
启动 tomcat 了,并且使用命令 tail -f ../logs/catalina.out
观察启动日志是否启动成功。
同样,将 apache-tomcat-pinpoint-web
中的 webapp/ROOT
清空,将 pinpoint-web-1.8.4.war
放入并解压。解压完成后就可以进入 bin 目录使用 ./startup.sh
启动 tomcat 了,并且使用命令 tail -f ../logs/catalina.out
观察启动日志是否启动成功。
当 Collector 和 Web UI 都启动成功后,就可以使用打开浏览器访问:http://ip:28080/#/main,初次访问如图:
- Agent 启用
实战案例,本实战案例和上一篇实战案例保持一致,同样是 4 个服务,包括 Zuul-Service、Eureka-Service、Consumer-Service 和 Provider-Service。具体实现代码本章不再列出,各位读者可以参考上一篇或者 Github 仓库(https://github.com/meteor1993…),下面我们介绍 Spring Cloud 是如何与 Pinpoint 整合使用的。
接入方式和上一篇的 Skywalking 是一致的,都是使用探针技术接入应用程序,java -jar 的方式来加载 Agent 探针。
首先在工程的跟目录中执行 mvn install
,而后在 CentOS 的 opt 中新建 4 个目录,分别存放 4 个打好包的工程。笔者这里创建的 4 个目录分别为/opt/project/consumer_service
,/opt/project/eureka_service
,/opt/project/provider_service
和/opt/project/zuul_service
,将 4 个 jar 包分别放入对应的目录中,并解压刚才我们下载好的 pinpoint-agent-1.8.4.tar.gz
探针,我们将解压后的探针放在 /opt 的目录中,接下来,我们使用如下命令,顺次启动 4 个 jar 包:
java -javaagent:/opt/pinpoint-bootstrap-1.8.4.jar -Dpinpoint.agentId=consumer-service -Dpinpoint.applicationName=consumer-server -jar /opt/project/consumer_service/consumer-0.0.1-SNAPSHOT.jar
java -javaagent:/opt/pinpoint-bootstrap-1.8.4.jar -Dpinpoint.agentId=eureka-service -Dpinpoint.applicationName=eureka-server -jar /opt/project/eureka_service/eureka-0.0.1-SNAPSHOT.jar
java -javaagent:/opt/pinpoint-bootstrap-1.8.4.jar -Dpinpoint.agentId=provider-service -Dpinpoint.applicationName=provider-server -jar /opt/project/provider_service/provider-0.0.1-SNAPSHOT.jar
java -javaagent:/opt/pinpoint-bootstrap-1.8.4.jar -Dpinpoint.agentId=zuul-service -Dpinpoint.applicationName=zuul-server -jar /opt/project/zuul_service/zuul-0.0.1-SNAPSHOT.jar
上述命令执行完成之后,再打开 Web UI 查看显示情况。
首先打开浏览器访问:http://192.168.44.129:8080/client/hello?name=spring,页面正常显示 Hello, name is spring,查看 Pinpoint 的 Web UI,如图:
图清楚的显示了我们当前系统的拓扑结构,横线上面的数字代表了调用次数,右边部分,最上面显示的是成功和失败的情况,中间部分显示的是响应时间,下面显示的是加载所使用的时间。
检查器(Inspector):这里已 Zuul-Service 为例,Timeline 显示的是请求的时间段,Information 显示的是节点的一些当前信息,包含 Application Name、Agent Id、Agent 版本、JVM 信息、开始时间等。
Heap 信息的使用情况,如图:
系统 CPU、活动线程、响应时间等信息如图:
更多 Pinpoint 的信息,读者可以通过官方 Demo(http://125.209.240.10:10123/#/main)或者自行构建试验来查看结果,这里不再一一赘述。至此,Spring Cloud 和 Pinpoint 的使用介绍也就完成了。更多有关 Pinpoint 的信息各位读者可以前往 Github 的官网进行查阅,地址为:https://github.com/naver/pinp…。
8. 小结
这里总结一下整个案例的启动顺序:
- 启动 HBase
- 启动 collector
- 启动 Web-UI
- 启动 Agent(Eureka、provider、consumer、zuul)
- 应用调用
- 访问 Web-UI 查看统计信息
同 Skywalking 一样,以上启动顺序供各位读者参考,请各位读者最好按照以上顺序启动,因为不同的组件之前其实是有相互依赖关系的,如果随意更改启动顺序可能会造成某些未知问题。至此,Spring Cloud 和 APM 的相关操作就告一段落了。APM 可以很好的帮我们理解系统行为,也是分析系统性能的工具,更是发生问题故障的时候利器,可以帮我们快速的定位查找问题。