一、背景
隨着項目微服務的進行,微服務數量逐漸增加,服務間的調用也越來越復雜,我們急切需要一個APM工具幫我們監控各個服務的性能及對服務間的調用進行跟蹤,而通過調研多個開源APM工具后,最終我們選擇了pintpoint。
二、簡介
Pinpoint是一個開源的 APM (Application Performance Management/應用性能管理)工具,用於基於java的大規模分布式系統。在使用上力圖簡單高效,通過在啟動時安裝agent,不需要修改哪怕一行代碼,最小化性能損失(3%).
中文參考文檔: http://skyao.github.io/leaning-pinpoint/index.html
開源源碼地址: https://github.com/naver/pinpoint
三、為什么選擇Pinpoint?
#1.pinpoint是基於java開發的,利於項目后期對源代碼的修改
#2.集成pinpoint不需要修改一行代碼
#3.pinpoint有非常直觀的UI,符合項目的當前需求
#4.pinpoint的社區還是挺活躍,一般提問題第二天就有項目的committer回復
四、Pinpoint特點
#1.分布式事務跟蹤,跟蹤跨分布式應用的消息;
#2.自動檢測應用拓撲,幫助你搞清楚應用的架構;
#5.水平擴展以便支持大規模服務器集群;
#6.提供代碼級別的可見性以便輕松定位失敗點和瓶頸;
#7.使用字節碼增強技術,添加新功能而無需修改代碼。
五、Pinpoint架構圖

架構圖對應說明:
- Pinpoint-Collector:收集各種性能數據
- Pinpoint-Agent:探針與應用服務器(例如tomcat)關聯,部署到同一台服務器上
- Pinpoint-Web:將收集到的數據層現在web展示
- HBase Storage:收集到數據存到HBase中
六、Pinpoint的數據結構
Pinpoint 消息的數據結構主要包含三種類型 Span,Trace 和 TraceId。
#1.Span 是最基本的調用追蹤單元
當遠程調用到達的時候,Span 指代處理該調用的作業,並且攜帶追蹤數據。為了實現代碼級別的可見性,Span 下面還包含一層 SpanEvent 的數據結構。每個 Span 都包含一個 SpanId。
#2.Trace 是一組相互關聯的 Span 集合
同一個 Trace 下的 Span 共享一個 TransactionId,而且會按照 SpanId 和 ParentSpanId 排列成一棵有層級關系的樹形結構。
#3.TraceId 是 TransactionId、SpanId 和 ParentSpanId 的組合
TransactionId(TxId)是一個交易下的橫跨整個分布式系統收發消息的 ID,其必須在整個服務器組中是全局唯一的。也就是說 TransactionId 識別了整個調用鏈;SpanId(SpanId)是處理遠程調用作業的 ID,當一個調用到達一個節點的時候隨即產生;ParentSpanId(pSpanId)顧名思義,就是產生當前 Span 的調用方 Span 的 ID。如果一個節點是交易的最初發起方,其 ParentSpanId 是 -1,以標志其是整個交易的根 Span。下圖能夠比較直觀的說明這些 ID 結構之間的關系。
七、Pinpoint的代碼注入
Pinpoint 對代碼注入的封裝非常類似 AOP,當一個類被加載的時候會通過 Interceptor 向指定的方法前后注入 before 和 after 邏輯,在這些邏輯中可以獲取系統運行的狀態,並通過 TraceContext 創建 Trace 消息,並發送給 Pinpoint 服務器。但與 AOP 不同的是,Pinpoint 在封裝的時候考慮到了更多與目標代碼的交互能力,因此用 Pinpoint 提供的 API 來編寫代碼會比 AOP 更加容易和專業。
八、Pinpoint運行方式
1.方式一:配置文件啟動
#1.修改tomat目錄下bin/catalina.sh,在Control Script for the CATALINA Server加入以下三行代碼:
# pinpoint-bootstrap-1.6.2.jar的位置
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/home/webapps/service/pp-agent/pinpoint-bootstrap-1.6.2.jar"
# agentId必須唯一,標志一個jvm
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=pp32tomcattest"
# applicationName表示同一種應用:同一個應用的不同實例應該使用不同的agentId,相同的applicationName
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=32tomcat"
2.方式二:SpringBoot啟動
java -javaagent:/home/webapps/pp-agent/pinpoint-bootstrap-1.6.2.jar -Dpinpoint.agentId=pp32tomcattest -Dpinpoint.applicationName=32tomcat -jar 32tomcat-0.0.1-SNAPSHOT.jar
九、總結
PinPoint從宏觀上看:總體鏈路、服務總體狀態(cpu、內存等等信息),符合【測試角度場景】性能測試調優監控的宏觀;