背景
程序的監控一直是程序員最頭痛的事情之一,現網程序有問題怎么辦?看進程看端口 top/free/df 三件套?網絡抓包?看日志?所以為了滿足這些初級需求很多公司都做了主機監控,進程端口監聽等功能,例如主機磁盤滿/只讀告警,端口不監聽告警。這些基礎的監控說到底都是黑盒監控,並沒有進入到程序內部的調用鏈里面,程序內部的運行情況完全是兩眼一抹黑,導致是該模塊本身有問題還是下游的依賴模塊出了問題,完全不知道,只能看一行行看日志慢慢確認。換言之,我們需要的是一個分布式調用鏈追蹤系統,能夠清楚的描述程序的調用關系,每一跳的耗時,以及請求數量的統計,很明顯,Pinpoint就是我們要找的工具。
Pinpoint
Pinpoint 是一個APM(Application performance management)工具,相對於其他APM工具(例如ZipKin)有一個強大的優勢,那就是應用程序無需修改一行代碼就能直接使用,例如Java程序直接使用Pinpoint提供的Java agent(jar包)就能使用。目前Pinpoint直接Java/PHP/Python三種語言,未來可能會支持更多語言,開源社區極其活躍,版本迭代比較快。
Pinpoint的優勢
除了上面談到的對用戶代碼無嵌入外,Pinpoint還有以下優勢:
1.強大的UI
UI會自動識別程序的調用關系並且繪制圖表,支持的組件多,例如Tomcat/Jetty/JBoss/Thrift/Kafka/Mysql等等。
2.調用鏈信息全
除了能看到調用關系及每一級耗時外,還能看到每一級的參數及SQL。
3.高性能
在JVM字節碼層做處理,程序的性能損耗小於3%。
Pinpoint架構
由Pinpoint官方給出的架構圖我們可以看出,Pinpoint Agent負責采集用戶程序的信息 通過 網絡將信息發給服務端 Pinpoint Collector,Pinpoint Collector將數據持久化到Hbase中,前端Web UI從Hbase中讀取數據展示給用戶。是一個標准的C/S分布式架構,選中Hbase的原因想必是為了支持海量數據。
安裝實驗
以下記錄比較流水,由於筆者實驗已經已經安裝JDK1.8所以沒有這塊的安裝說明。
安裝zookeeper
理論上不用安裝,hbase默認會拉起zookeeper,不過是單機的
https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.4.14/zookeeper-3.4.14.tar.gz
安裝步驟參考:https://blog.csdn.net/yuan_xw/article/details/47148401
安裝hbase
https://www.apache.org/dyn/closer.lua/hbase/1.4.13/hbase-1.4.13-bin.tar.gz
注意設置JAVA_HOME環境變量,修改/data/hbase-1.4.13/conf/hbase-env.sh
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.71-2.b15.el7_2.x86_64/jre/
cd /data/hbase-1.4.13/bin
./start-hbase.sh
創建hbase pinpoint相關表
https://github.com/naver/pinpoint/tree/master/hbase/scripts
$HBASE_HOME/bin/hbase shell hbase-create.hbase
$HBASE_HOME/bin/hbase shell hbase-create-snappy.hbase
安裝tomcat
參考:https://blog.csdn.net/lcyaiym/article/details/76696192
https://tomcat.apache.org/download-90.cgi 下載 apache-tomcat-9.0.37.tar.gz
mkdir /usr/local/tomcat
mv apache-tomcat-9.0.37/* /usr/local/tomcat
cd /usr/local/tomcat/bin
./startup.sh
安裝pinpoint collector
https://github.com/naver/pinpoint/releases/tag/v2.0.4
下載 pinpoint-collector-2.0.4.war
啟動
rm -rf /usr/local/tomcat/webapps/*
unzip pinpoint-collector-2.0.4.war -d /usr/local/tomcat/webapps/ROOT
/usr/local/tomcat/webapps/ROOT/WEB-INF/classes/profiles/release
配置中有關zookeeper的配置都改成localhost
根據 /usr/local/tomcat/logs/catalina.out 的報錯信息進行排查。
注意修改主機名,collector注冊zookeeper節點用的是主機名供其他服務發現,所以要確保DNS能正確解析。
安裝pinpoint web
https://github.com/naver/pinpoint/releases/tag/v2.0.4
下載 pinpoint-web-2.0.4.war
rm -rf /usr/local/tomcat/webapps/*
unzip pinpoint-web-2.0.4.war -d /usr/local/tomcat/webapps/ROOT
把 /usr/local/tomcat/webapps/ROOT/WEB-INF/classes/jdbc.properties 文件清空。
安裝測試pinpoint agent
https://github.com/naver/pinpoint/releases/tag/v2.0.4
下載 pinpoint-agent-2.0.4.tar.gz
mkdir /usr/local/tomcat
mv apache-tomcat-9.0.37/* /usr/local/tomcat
rm -rf /usr/local/tomcat/webapps/*
unzip test.war -d /usr/local/tomcat/webapps/ROOT
/usr/local/tomcat/bin/catalina.sh 中加入以下三項配置:
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/data/pinpoint/pinpoint-agent-2.0.4/pinpoint-bootstrap-2.0.4.jar"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=pp20200906"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=JustTestPP"
配置說明:
agentId 表示該實例的唯一標識,是全局唯一的ID。
applicationName 表示同一服務。
例如有一個購買服務,但是有兩個實例,那么就可以這樣定義:
agentId=buy1
applicationName=buysercie
agentId=buy2
applicationName=buysercie
問題定位
只有開始的兩條記錄能被統計到,之后的記錄無法統計
解決方法:
修改
/data/pinpoint/pinpoint-agent-2.0.4/pinpoint.config
/data/pinpoint/pinpoint-agent-2.0.4/profiles/release/pinpoint-env.config
/data/pinpoint/pinpoint-agent-2.0.4/profiles/local/pinpoint-env.config
中 profiler.sampling.rate 值改為1,表示每一條記錄都采集。默認是20,表示每20條采集一條。
問題定位參考官方的FAQ http://naver.github.io/pinpoint/faq.html
github issue記錄 https://github.com/naver/pinpoint/issues
參考
http://naver.github.io/pinpoint/installation.html
http://naver.github.io/pinpoint/videos.html
https://www.cnblogs.com/yyhh/p/6106472.html
http://naver.github.io/pinpoint/overview.html