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才可以。
解決方法:
- 因為打包的時候要依賴java1.6(建議使用1.6.0_45)、java1.7(建議使用1.7.0_80)、java1.8(建議使用jdk1.8.0_191)、java1.9(建議使用9.0.4)環境,所以這幾個版本的java都需要安裝及配置環境變量;
- 安裝及配置maven,版本這里建議使用3.5.x版本(本文使用3.5.4),使用3.6.1版本編譯會報錯;
-
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}
- 官網github下載pinpoint-2.2.2.tar.gz並解壓;
- 修改源碼中的pom.xml,把hbase.shaded.client.version值改成hbase的版本2.0.0
-
進入源碼的根目錄,執行以下命令進行編譯:
-
./mvnw clean install -P hbase2,release -DskipTests=true
- 編譯成功后,進入源碼的以下目錄,獲取相關包:
-
../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 建表文件 - 檢查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. 功能介紹
圖片標注注釋:
- 項目名稱(可以上下拉動選擇不同項目)
- 入站和出站(可以根據不同出入數生成不同的map圖)
- 時間選擇,左至右順序,日歷,5秒,20秒,1小時,3小時,6小時,12小時,1天,2天
- 根據2生成的鏈路圖,相關聯的程序之間的走向
- 動態實時走勢圖,一個請求算是一個點,紅點是請求失敗,y軸表示請求時間
- 程序資源使用情況,包括使用的cpu,內存,mysql的並發等。
- 根據請求時間對數量進行統計(一段時間內,請求耗時1秒鍾的數量,3秒鍾的數量,5秒鍾的數量,慢請求,錯誤)
- 一段時間的請求使用柱狀圖展示,下面的顏色進行區分
特別注意事項5:
上圖5中是請求的url統計,可以使用鼠標右鍵選擇部分請求,松開鼠標跳到下面這個頁面
標注注釋:
1、是請求的url,所在服務器的IP,pinpoint客戶端定義的server名稱以及時間。 如果有錯誤的請求,在Exception欄有一個標志
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的信息:
引用: