分布式服務調用鏈路追蹤——Pinpoint


 

1. Pinpoint架構

官網地址:https://github.com/pinpoint-apm/pinpoint

從下圖來看,Pinpoint主要分成幾個部分:

  • Agent,負責從應用服務端收集數據,上傳到collector;
  • Collector,負責接收Agent上傳的數據,並存儲到Hbase中;
  • Web,負責展示性能監控數據;
  • Hbase,負責存儲性能監控數據;

 

2. 支持模塊

到pinpoint的github官方地址查看支持的模塊:

 

3. 版本兼容矩陣

從這里來看,collector和web目前仍然只支持JDK8,而Agent最高已經可以支持JDK14:

Hbase建議使用1.2.x或者1.4.x版本:

 

4. 安裝Hbase

版本:

  • HBase-2.0.0

Hbase支持集群或者單機部署,集群部署比較麻煩點,需要先部署zookeeper和hadoop集群,這也是很多人覺得 pinpoint的存儲過於笨重的原因,

但是其實我們可以采用單機部署,就可以簡單很多,因為普通壓力下, APM的監控數據,並不需要這么強大的存儲負載均衡能力。如需安裝集群HBase,請參考我的HBase集群安裝部署文章。

下載地址:https://archive.apache.org/dist/hbase/

解壓 tar
-xvzf hbase-2.0.0-bin.tar.gz 修改conf下的hbase-site.xml文件,指定數據的存儲位置。 添加 <configuration> <property> <name>hbase.rootdir</name> <value>file:///data/pinpoint/hbase</value> </property> </configuration> 修改conf下的hbase-env.sh文件 添加jdk,並且使用hbase自帶的zk: export JAVA_HOME=/usr/local/java/jdk1.8.0_191 export HBASE_MANAGES_ZK=true 啟動 ./bin/start-hbase.sh

啟動hbase后,訪問ip:16010/master-status后觀察Master和Region server是否顯示的是主機名即可。

初始化HBase表:

  Hbase安裝完畢后,我們先把pinpoint需要的hbase表創建出來,通過執行如下命令創建:

創建Hbase Schemas ,下載文件到hbase shell執行
https://github.com/pinpoint-apm/pinpoint/blob/master/hbase/scripts/hbase-create.hbase
bin/hbase shell hbase-create.hbase

注意:pinpoint默認的TTL存儲策略是存儲一年的,如果pinpoint監控的系統請求量是很大的,那么需要注意pinpoint所在服務器的存儲空間是否夠用。
解決方案:修改上述hbase建表腳本中的TTL值,比如:
create 'AgentInfo', { NAME => 'Info', TTL => 31536000(改為604800,存儲7天), DATA_BLOCK_ENCODING => 'PREFIX' }

一共是15張表。至此hbase就搭建完成了。

 

5. 編譯Pinpoint

版本:

  • JDK-1.6、JDK-1.7、JDK-1.8、JDK1.9
  • Pinpoint-2.2.2

問題現像:如果使用了hbase2.X作為Pinpoint的數據存儲,那么就會遇到搭建完畢之后,web上的數據有一些異常,特別是首頁上看不到應用的server map特別明顯,且右邊的Response Summary也不顯示請求統計。

解決方案:需要自己編譯源碼,替換掉Pinpoint默認帶的hbase client 1.X版本,變成2.X才可以。

解決方法:

  1. 因為打包的時候要依賴java1.6(建議使用1.6.0_45)、java1.7(建議使用1.7.0_80)、java1.8(建議使用jdk1.8.0_191)、java1.9(建議使用9.0.4)環境,所以這幾個版本的java都需要安裝及配置環境變量;
  2. 安裝及配置maven,版本這里建議使用3.5.x版本(本文使用3.5.4),使用3.6.1版本編譯會報錯;
  3. JAVA_HOME=/home/software/java/jdk1.8.0_191
    PATH=$JAVA_HOME/bin:$PATH
    CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    export JAVA_HOME
    export PATH
    export CLASSPATH
    
    export JAVA_6_HOME=/home/software/java/jdk1.6.0_45
    export JAVA_7_HOME=/home/software/java/jdk1.7.0_80
    export JAVA_8_HOME=/home/software/java/jdk1.8.0_191
    export JAVA_9_HOME=/home/software/java/jdk-9.0.4
    
    export MAVEN_HOME=/usr/local/apache-maven-3.5.4
    export PATH=${MAVEN_HOME}/bin:${PATH}
  4. 官網github下載pinpoint-2.2.2.tar.gz並解壓;
  5. 修改源碼中的pom.xml,把hbase.shaded.client.version值改成hbase的版本2.0.0
  6. 進入源碼的根目錄,執行以下命令進行編譯:

  7. ./mvnw clean install -P hbase2,release -DskipTests=true
  8. 編譯成功后,進入源碼的以下目錄,獲取相關包:
  9. ../pinpoint-2.2.2/collector/target/deploy/pinpoint-collector-boot-2.2.2.jar 收集端包
    ../pinpoint-2.2.2/web/target/deploy/pinpoint-web-boot-2.2.2.jar 頁面包
    ../pinpoint-2.2.2/agent/target/pinpoint-agent-2.2.2.tar.gz 探針包
    ../pinpoint-2.2.2/hbase/scripts/hbase-create.hbase 建表文件
  10. 檢查collector和web包下的hbase版本是否正確:

 

6. 部署Pinpoint-collector

啟動:nohup java -Dpinpoint.zookeeper.address=172.16.10.73:2181,172.16.10.76:2181,172.16.10.78:2181 -jar /home/software/pinpoint-hbase2/pinpoint-collector-boot-2.2.2.jar >./pinpoint-collector.log 2>&1 &

機器有啟用防火牆的,注意放開:TCP 9991~9994端口,UDP 9995~9996端口

 

7. 部署Pinpoint-web

啟動:nohup java -Dserver.port=8088 -Dpinpoint.zookeeper.address=172.16.10.73:2181,172.16.10.76:2181,172.16.10.78:2181 -jar /home/software/pinpoint-hbase2/pinpoint-web-boot-2.2.2.jar >./pinpoint-web.log 2>&1 &
其他同上

訪問端口:
http://172.16.208.79:8088/

 

8. 程序接入Pinpoint

上傳pinpoint-agent-2.0.1.tar.gz 包到服務器任意目錄,解壓:

tar -zxvf pinpoint-agent-2.2.2.tar.gz 
  • 1. 修改配置

修改文件/profiles/release/pinpoint.config,將collector的ip配置為監控收集服務pinpoint-collector的IP:

  • 2. 修改采集比例

默認只有5%,如果沒有改,會感覺好像采集不到監控數據:

  • 3. 應用日志中輸出transaction-id

修改agent/pinpoint.config

profiler.logback.logging.transactioninfo=true

logback通過%X{PtxId}輸出TransactionId%X{PspanId}輸出SpanId

<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
   <charset>UTF-8</charset>
   <layout class="ch.qos.logback.classic.PatternLayout">
      <pattern>
           %black(%d{ISO8601}) [%X{PtxId},%X{PspanId}] %highlight(${LOG_LEVEL_PATTERN:-%5p}) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
      </pattern>
  </layout>
</encoder>

  • 4. 應用集成pinpoint-agent

JAR file:

在啟動你的應用程序的命令行中添加 -javaagent 參數. 並確保在-jar參數之前添加它。

-javaagent:/home/perf/pinpoint/pinpoint-bootstrap-2.2.2.jar -Dpinpoint.agentId=serviceName -Dpinpoint.applicationName=applicationName

Tomcat:

修改 tomcat/bin/catalina.sh,在首行加入如下信息:

CATALINA_OPTS="$CATALINA_OPTS -javaagent:${pinpointPath}/pinpoint-bootstrap-2.2.2jar"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=masl01"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=masl"

參數說明:

    • -javaagent::指定PinPoint代理;
    • -Dpinpoint.agentId=:必須全局唯一,代表一個服務、應用實例,建議用hostname,部署多個jvm的話加前綴;
    • -Dpinpoint.applicationName=:指定服務、應用名稱。相同服務部署不同實例,applicationName相同,agentId不同;

Idea: 

-javaagent:D:\soft\pinpoint-hbase2\pinpoint-agent-2.2.2-masl\pinpoint-bootstrap-2.2.2.jar -Dpinpoint.agentId=localmasl -Dpinpoint.applicationName=masl -Dspring.profiles.active=release

 

9. 驗證測試

訪問相關業務請求,然后刷新Pinpoint,主界面如下圖所示:

應用、中間件、DB之間的調用關系鏈路清晰:

jvm、cpu、gc信息簡單明了:

 

10. 其它

Hbase修改TTL存儲策略

{hbase_home}/bin/hbase shell  --進入shell命令行

desc 'AgentInfo'
修改1天后過期
disable 'AgentInfo'
alter 'AgentInfo',NAME=>'Info',TTL=>'43200'
enable 'AgentInfo'

desc 'AgentStatV2'
修改1天后過期
disable 'AgentStatV2'
alter 'AgentStatV2',NAME=>'S',TTL=>'86400'
enable 'AgentStatV2'

Hbase刪除或者刷新表

# 創建表
https://github.com/pinpoint-apm/pinpoint/blob/master/hbase/scripts/hbase-create.hbase
{hbase_home}/bin/hbase shell hbase-create.hbase

# 刪除表
https://github.com/pinpoint-apm/pinpoint/blob/master/hbase/scripts/hbase-drop.hbase
{hbase_home}/bin/hbase shell hbase-drop.hbase

# 刷新表(清空數據)
https://github.com/pinpoint-apm/pinpoint/blob/master/hbase/scripts/hbase-flush-table.hbase
{hbase_home}/bin/hbase shell hbase-flush-table.hbase

 

11. 功能介紹

圖片標注注釋:

  1. 項目名稱(可以上下拉動選擇不同項目)
  2. 入站和出站(可以根據不同出入數生成不同的map圖)
  3. 時間選擇,左至右順序,日歷,5秒,20秒,1小時,3小時,6小時,12小時,1天,2天
  4. 根據2生成的鏈路圖,相關聯的程序之間的走向
  5. 動態實時走勢圖,一個請求算是一個點,紅點是請求失敗,y軸表示請求時間
  6. 程序資源使用情況,包括使用的cpu,內存,mysql的並發等。
  7. 根據請求時間對數量進行統計(一段時間內,請求耗時1秒鍾的數量,3秒鍾的數量,5秒鍾的數量,慢請求,錯誤)
  8. 一段時間的請求使用柱狀圖展示,下面的顏色進行區分

特別注意事項5:

上圖5中是請求的url統計,可以使用鼠標右鍵選擇部分請求,松開鼠標跳到下面這個頁面

 

標注注釋:

1、是請求的url,所在服務器的IP,pinpoint客戶端定義的server名稱以及時間。  如果有錯誤的請求,在Exception欄有一個pinpoint使用說明標志

2、是請求的url的相信信息,請求調用的函數,函數中查詢的數據庫語句,在這里有幾個關鍵詞,分別是Gap(ms),Exec(ms),Exec(ms),self(ms),看一下這幾個關鍵詞的意思:

Gap -- Elapsed time between the start of the previous method and the entry of this method(從上一個方法的開始到該方法的輸入之間經過的時間)

Exec -- Duration of the method call from entry to exit(方法調用從入口到出口的持續時間)

Exec(%) --  ⬤   The execution time of the method call as a percentage of the total execution time of the transaction(方法調用的執行時間占事務總執行時間的百分比)

–-   ⬤    A percentage of the self execution time(自執行時間的百分比)

Self -- Duration of the method call from entry to exit, excluding time consumed in nested methods call(方法調用從入口到出口的持續時間,不包括嵌套方法調用中消耗的時間)

特別注意事項6

在首頁的標注6里有兩個選項,分別是VIEW SERVERS和Inspector。VIEW SERVERS展示的是在一個項目中運行在兩台服務器上處理的請求對比。

如上圖,在Servers List中有兩台服務器運行同一個服務,pinpoint使用agent_id用來區分,服務共接收到18個請求,分別在26237和5635上各處理了9個請求,這就是負載均衡。

Inspector展示的就相對比較多了,不但有服務的信息,還有服務所耗時的CPU,Memory,以及連接mysql的信息等,如下圖:

這里展示的是服務的信息,和服務所消耗的資源信息。下面看一下mysql的信息:

 

 

引用:


免責聲明!

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



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