跟我學SpringCloud | 第十六篇:微服務利劍之APM平台(二)Pinpoint


SpringCloud系列教程 | 第十六篇:微服務利劍之APM平台(二)Pinpoint

Springboot: 2.1.7.RELEASE

SpringCloud: Greenwich.SR2

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/dist/hbase/ ,各位讀者選擇自己喜歡的版本下載。

下載完成后,將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/pinpoint/releases/ ,直接下載當前最新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/SpringCloudLearning/tree/master/chapter15),下面我們介紹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/pinpoint

8. 小結

這里總結一下整個案例的啟動順序:

  1. 啟動HBase
  2. 啟動collector
  3. 啟動Web-UI
  4. 啟動Agent(Eureka、provider、consumer、zuul)
  5. 應用調用
  6. 訪問Web-UI查看統計信息

同Skywalking一樣,以上啟動順序供各位讀者參考,請各位讀者最好按照以上順序啟動,因為不同的組件之前其實是有相互依賴關系的,如果隨意更改啟動順序可能會造成某些未知問題。至此,Spring Cloud和APM的相關操作就告一段落了。APM可以很好的幫我們理解系統行為,也是分析系統性能的工具,更是發生問題故障的時候利器,可以幫我們快速的定位查找問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM