跟我學SpringCloud | 第十六篇:微服務利劍之APM平臺(二)Pinpoint
目錄
- SpringCloud系列教程 | 第十六篇:微服務利劍之APM平臺(二)Pinpoint
- 1. Pinpoint概述
- 2. Pinpoint主要特性
- 3. Pinpoint優勢
- 4. Pinpoint架構簡介
- 5. Pinpoint資料結構簡介
- 6. Pinpoint版本依賴
- 7. Spring Cloud與Pinpoint實戰
- 8. 小結
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
- 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。
- Collector和Web UI部署
出於簡單方便考慮,不推薦初學者自行編譯程式碼進行部署,可以直接使用官方提供的發行版本進行部署。
瀏覽器訪問連結:https://github.com/naver/pinpoint/releases/ ,直接下載當前最新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/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. 小結
這裡總結一下整個案例的啟動順序:
- 啟動HBase
- 啟動collector
- 啟動Web-UI
- 啟動Agent(Eureka、provider、consumer、zuul)
- 應用呼叫
- 訪問Web-UI檢視統計資訊
同Skywalking一樣,以上啟動順序供各位讀者參考,請各位讀者最好按照以上順序啟動,因為不同的元件之前其實是有相互依賴關係的,如果隨意更改啟動順序可能會造成某些未知問題。至此,Spring Cloud和APM的相關操作就告一段落了。APM可以很好的幫我們理解系統行為,也是分析系統性能的工具,更是發生問題故障的時候利器,可以幫我們快速的定位查詢問題。