在信息技術和系統管理領域,使用 Application Performance Management(應用程序性能管理)來監控和管理應用程序的性能和可用性。APM 致力于檢測和診斷復雜的應用程序性能問題,以保持預期的服務級別,將 IT 指標轉化為業務價值。
Pinpoint 是一個開源的、主流的 APM 實現,靈感來自 Google Dapper,使用 Java、PHP、Python 開發。全球有數百萬用戶使用它分析架構以及跨分布式應用程序組件之間的互聯。
本文將通過以下主題,介紹 Pinpoint 的自動化部署,以及如何配置它監控應用:
- Pinpoint 介紹
- 自動化部署 Pinpoint
- 訪問 Pinpoint Web UI
- 配置監控
- 總結
39.1 PinPoint 介紹
本節主要從兩方面討論 Pinpoint。
39.1.1 Pinpoint 架構
Pinpoint 架構如下:
圖39.1, PinPoint 架構圖,圖片來自 PinPoint 官網
從圖中可以看到四個主要組件:
- Pinpoint Collector:Web 應用程序,收集應用數據
- HBase Storage:開源的非關系數據庫,存儲 Pinpoint 數據
- Pinpoint Web UI:Pinpoint 前端
- Pinpoint Agent:將應用程序的數據發送到 Pinpoint Collector
39.1.2 Pinpoint 特性
以下是 Pinpoint 的相關特性,也是它為什么在眾多 APM 中脫穎而出的原因:
- 提供云和主機監控;
- 分布式事務跟蹤,用于跨分布式應用程序跟蹤;
- 應用程序拓撲概覽,跟蹤所有組件之間的事務,以識別潛在的問題;
- 輕量級,對系統性能影響較小;
- 提供代碼級可見性,輕松識別故障點和瓶頸;
- 事務代碼級可見性,響應模式和請求計數;
- 提供字節碼檢測技術,使用中無需修改應用程序代碼;
- 自動檢測應用程序拓撲,幫助技術人員了解應用程序配置;
- 實時監控,實時觀察活動線程;
- 水平可擴展,支持大規模服務器組。
39.2 自動化部署 Pinpoint
本節演示如何使用 Ansible 與 Docker,完成 Pinpoint 的自動化部署。
文中使用的代碼已提交至 GitHub,可以在對應目錄中查詢。
39.2.1 要求
Ansible 主機可通過具有 sudo 權限的用戶免密登錄 Pinpoint 主機。
有關 sudo 及免密的配置,可以參考之前的文章,或在 GitHub 代碼中查看。
39.2.2 克隆代碼到 Ansible 節點
在 Ansible 節點上執行以下命令,將自動化代碼克隆到本地:
$ git clone https://github.com/weiwendi/automate.git
進入 automate/playbook/
目錄,里面包含了很多組件的自動化部署。在本篇文章中,主要用到了 docker
和 pinpoint
兩個目錄。
39.2.3 安裝 Docker
進入 docker/
目錄,修改 hosts
文件,指定 Pinpoint 主機名或 IP。例如我的 Pinpoint 主機 IP 為 10.211.55.69、主機名為 common.server.aiops.red,hosts 文件內容如下:
[nodes]
common.server.aiops.red
需要根據實際的 IP 或主機名稱替換 'common.server.aiops.red'。
安裝 Docker:
ansible-playbook -i hosts playbook.yaml
39.2.4 安裝 Pinpoint
切換到 pinpoint
目錄:
cd ../pinpoint/
首先修改 hosts
文件,就像安裝 Docker 時那樣,將 Pinpoint 主機的 IP 或主機名寫入該文件。
然后執行 possibleReboot.yaml
文件,它的作用是:
- 關閉 Selinux
- 關閉 Firewalld
- 更新軟件包
關閉 Selinux 和更新軟件包的過程,都可能會重啟服務器,因此把這個文件獨立出來,用于初次部署時執行。
執行 possibleReboot.yaml
文件:
ansible-playbook -i hosts possibleReboot.yaml
最后,執行以下命令安裝 Pinpoint:
ansible-playbook -i hosts playbook.yaml
該命令執行時間比較長,執行過程中可能會遇到報錯。報錯很可能是從 GitHub 下載 pinpoint-docker 項目時的網絡原因導致。
注意:
要想在自動化過程中避免下載 GitHub 代碼的網絡超時引發的錯誤,可以提前手動將 pinpoint-docker 項目的代碼克隆到 Pinpoin 主機指定的目錄下,然后注釋 ../../roles/pinpoint/tasks/main.yml
文件中以下內容:
- name: clone pinpoint-docker project task
ansible.builtin.git:
repo: 'https://github.com/pinpoint-apm/pinpoint-docker.git'
dest: "{{ deployDir }}"
single_branch: true
version: "{{ version }}"
在 ../../roles/pinpoint/defaults/main.yml
文件中定義了兩個變量:
---
# defaults file for pinpoint
#
deployDir: /software/repos/pinpoint-docker
version: 2.5.2
- deployDir:存放 pinpoint-docker 項目的目錄
- version:Pinpoint 版本
39.3 訪問 Pinpoint Web UI
在瀏覽器中輸入 Pinpoint 主機 IP:8080 訪問 Pinpoint Web UI。如果能正常打開頁面,說明部署順利完成。如果打不開頁面,需要通過 docker ps -a 命令和 docker logs 等命令查看 Pinpoint 容器的運行情況,以及檢查網絡連通性。
此時 Pinpoint 并沒有監控數據,需要通過 Pinpoint Agent,收集監控對象的數據。下一節我會通過三個示例演示如何監控 Java 程序。
39.4 配置監控
本節通過演示配置 Pinpoint APM 監控 Zookeeper、Kafka 和 Tomcat,來介紹 Pinpoin 如何使用、以及它的易用性。
39.4.1 下載 Pinpoint Agent
在 GitHub pinpoint-apm 中下載對應版本的 Agent。
示例中解壓到了被監控組件主機的 /opt/pagent252/
。
修改 /opt/pagent252/profiles/release/pinpoint.config
文件,把文件中所有 127.0.0.1 的地址,修改為 Pinpoint 主機的 IP 地址。
39.4.2 監控 Zookeeper
修改 Zookeeper 的啟動文件,進入 Zookeeper 主目錄,編輯 bin/zkServer.sh
,增加以下內容:
start)
echo -n "Starting zookeeper ... "
if [ -f "$ZOOPIDFILE" ]; then
if kill -0 `cat "$ZOOPIDFILE"` > /dev/null 2 >&1; then
echo $command already running as process `cat "$ZOOPIDFILE"`.
exit 1
fi
fi
nohup "$JAVA" $ZOO_DATADIR_AUTOCREATE "-Dzookeeper.log.dir=${ZOO_LOG_DIR}"
"-Dzookeeper.log.file=${ZOO_LOG_FILE}" "-Dzookeeper.root.logger=${ZOO_LOG4J_PROP}"
-javaagent:/opt/pagent252/pinpoint-bootstrap-2.5.2.jar # 新增內容
-Dpinpoint.agentId=zk01 # 新增內容
-Dpinpoint.applicationName=zk # 新增內容
-XX:+HeapDumpOnOutOfMemoryError -XX:OnOutOfMemoryError='kill -9 %p'
-cp "$CLASSPATH" $JVMFLAGS $ZOOMAIN "$ZOOCFG" > "$_ZOO_DAEMON_OUT" 2 >&1 < /dev/null &
...
- -javaagent :指定 Pinpoint Agent 包路徑;
- -Dpinpoint.agentId :全局唯一 ID,可以與 applicationName 關聯定位應用;
- -Dpinpoint.applicationName :應用名稱,對于多副本部署的應用,該名稱應設置為相同的值,通過 -Dpinpoint.agentId 的不同進行區分。
重啟 Zookeeper 服務,使配置生效。
查看 Pinpoint Web UI,可以看到類似以下界面:
圖39.2, 監控 zk
39.4.3 監控 Kafka
在 Kafka 主機上準備好 Pinpoint Agent。修改 Kafka 的啟動文件,通常位于 Kafka 目錄的 bin/kafka-run-class.sh
。修改以下內容:
if [ "x$DAEMON_MODE" = "xtrue" ]; then
nohup "$JAVA" $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_JMX_OPTS -javaagent:/opt/pagent252/pinpoint-bootstrap-2.5.2.jar -Dpin
point.agentId=kafka2 -Dpinpoint.applicationName=kafka $KAFKA_LOG4J_OPTS -cp "$CLASSPATH" $KAFKA_OPTS "$@" > "$CONSOLE_OUTPUT_FILE" 2 >&1 < /dev/null &
else
exec "$JAVA" $KAFKA_HEAP_OPTS $KAFKA_JVM_PERFORMANCE_OPTS $KAFKA_GC_LOG_OPTS $KAFKA_JMX_OPTS -javaagent:/opt/pagent252/pinpoint-bootstrap-2.5.2.jar -Dpinp
oint.agentId=kafka2 -Dpinpoint.applicationName=kafka $KAFKA_LOG4J_OPTS -cp "$CLASSPATH" $KAFKA_OPTS "$@"
fi
-javaagent:/opt/pagent252/pinpoint-bootstrap-2.5.2.jar -Dpin point.agentId=kafka2 -Dpinpoint.applicationName=kafka
為新增內容。
重啟 Kafka 服務,使配置生效。再次查看 Web UI:
圖39.3, 監控 Kafka
39.4.4 監控 Tomcat
在 Tomcat 節點上,準備好 Pinpoint Agent。
修改 Tomcat bin/catalina.sh
文件,在文件開始部分增加以下內容:
#!/bin/sh
# 新增內容
CATALINA_OPTS="$CATALINA_OPTS -javaagent:/opt/pagent252/pinpoint-bootstrap-2.5.2.jar"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.agentId=tomcat1"
CATALINA_OPTS="$CATALINA_OPTS -Dpinpoint.applicationName=tomcat"
保存并重啟 Tomcat 服務,然后查看 Web UI:
圖39.4 監控 Tomcat 內存堆棧等使用
再來看看 Tomcat 調用鏈路拓撲及接口響應信息:
圖39.5, 鏈路追蹤與自動生成拓撲
39.5 總結
Pinpoint APM 是常用的鏈路跟蹤及監控工具,本教程演示了 Pinpoint APM 的自動化部署,以及如何配置 Pinpoint 監控 Java 程序。教程同樣適用于其他基于 RPM 的 Linux 發行版。
-
Linux
+關注
關注
87文章
11465瀏覽量
212805 -
開源
+關注
關注
3文章
3612瀏覽量
43488 -
應用程序
+關注
關注
38文章
3322瀏覽量
58739 -
APM
+關注
關注
1文章
72瀏覽量
13314
發布評論請先 登錄
工控儀器自動化
招聘自動化、電氣自動化、自動化控制工程師
實現工業自動化的市場阻礙
七個步驟實現自動化測試
基于IAR EW編譯工具實現Linux系統上自動化構建
風河Linux平臺構建新型家庭自動化網關
云平臺的自動化部署設計與實現

數據中心如何實現自動化部署
5G承載網絡建設向自動化部署的方向邁出堅實的步伐
部署Linux的最佳實踐探索
Jenkins 與 SonarQube 集成部署,自動化代碼質量監控

基于 Docker 與 Jenkins 實現自動化部署

評論