跟我学SpringCloud-第十六篇微服务利剑之APM平台二Pinpoint

32次阅读

共计 6241 个字符,预计需要花费 16 分钟才能阅读完成。

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

  1. 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。

  1. Collector 和 Web UI 部署

出于简单方便考虑,不推荐初学者自行编译代码进行部署,可以直接使用官方提供的发行版本进行部署。

浏览器访问链接:https://github.com/naver/pinp…,直接下载当前最新 Release 版本即可,笔者现在看到的最新版本是 1.8.4,如图,需要下载的内容有 pinpoint-agent-1.8.4.tar.gzpinpoint-collector-1.8.4.warpinpoint-web-1.8.4.war

首先需要准备两个 tomcat,笔者这里下载的 tomcat8,解压两份后并重命名为 apache-tomcat-pinpoint-collectorapache-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,初次访问如图:

  1. 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. 小结

这里总结一下整个案例的启动顺序:

  1. 启动 HBase
  2. 启动 collector
  3. 启动 Web-UI
  4. 启动 Agent(Eureka、provider、consumer、zuul)
  5. 应用调用
  6. 访问 Web-UI 查看统计信息

同 Skywalking 一样,以上启动顺序供各位读者参考,请各位读者最好按照以上顺序启动,因为不同的组件之前其实是有相互依赖关系的,如果随意更改启动顺序可能会造成某些未知问题。至此,Spring Cloud 和 APM 的相关操作就告一段落了。APM 可以很好的帮我们理解系统行为,也是分析系统性能的工具,更是发生问题故障的时候利器,可以帮我们快速的定位查找问题。

正文完
 0