首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 運行時監控(三):應用生態系統的性能與可用性監控(上)

     編輯:Java 相關知識

基於 Spring 的收集器架構

延續前兩部分的 ITracer 介面與插裝技術,本部分引入基於 Spring 的組件模型管理監控服務。核心優勢:

  • XML 配置管理大量複雜收集器參數
  • 關注點分離:簡單組件透過依賴注入協作
  • Spring 生命週期(初始化/啟動/停止)與 JMX 管理介面整合,支援運行時控制與故障排查

主機與作業系統監控

Java 應用運行於底層硬體與 OS 之上,收集硬體/OS 層指標是全面監控基石。典型指標涵蓋:

  • CPU:整體與單核使用率(User/System/IOWait/Idle)、運行隊列長度、上下文切換
  • 記憶體:物理/虛擬記憶體使用率、分配與重分配率
  • 磁碟 I/O:空間使用率、讀寫速率
  • 網路:介面傳輸速率、錯誤率、TCP/IP 協議層統計
  • 進程/進程組:單一服務或進程群(如 Apache Worker 群)的資源消耗佔比

代理 vs 無代理監控

代理模式:目標主機安裝專用軟體,本地聚合後推送/拉取。優點:採集能力強、效率高;缺點:部署維護成本高、代理故障導致監控盲區。
無代理模式:利用 OS 內建介面(SSH、WinRM、SNMP)遠端採集。優點:無額外部署;缺點:遠端採集多指標效率低、權限管理複雜。
最佳實踐:混合部署——本地代理負責高頻大量指標聚合,遠端監控器檢查主機存活與代理健康狀態。

Linux/UNIX 主機監控:/proc 與 Shell 命令

Linux/UNIX 通過 /proc 虛擬檔案系統暴露核心效能數據(記憶體常駐、文本介面),配合 ps、sar、iostat、vmstat 等標準工具極易解析。採集器透過 Shell 執行命令並解析輸出,三種 Shell 存取方式:

  1. 本地 Shell(java.lang.Process)
  2. 遠端 Telnet/rsh(不安全,少用)
  3. SSH(主流,安全,跨平台支援)

本地與遠端 Shell 差異

SSH 金鑰對配置實戰

  1. 監控端生成 DSA 金鑰對:ssh-keygen -t dsa
  2. 公鑰追加至目標主機 ~/.ssh/authorized_keys
  3. 私鑰置於採集器可讀取的安全路徑
  4. 確保 known_hosts 包含目標主機公鑰指紋
whitehen@whitehen-desktop:~$ mkdir .ssh
whitehen@whitehen-desktop:~$ cd .ssh
whitehen@whitehen-desktop:~/.ssh$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/home/whitehen/.ssh/id_dsa): whitehen_dsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in whitehen_dsa.
Your public key has been saved in whitehen_dsa.pub.
whitehen@whitehen-desktop:~/.ssh$ cat whitehen_dsa.pub >> authorized_keys

ShellCollector 架構與 CommandSet 解析

ShellCollector 結合 IRemoteShell(如 JSchRemoteShell)與 CommandSet 實現通用採集。CommandSet 從 XML 載入,定義:目標平台、執行命令、輸出解析與映射規則。核心解析標籤:

  • <shellCommand>:實際命令
  • <paragraphSplitter>:多段落分割正則
  • <Extractors>/<CommandResultExtract>:解析映射規則
  • <paragraph>:目標段落索引與命名空間前綴
  • <columns>:行內欄位提取(entryName/values/offset)
  • <namemapping>:將簡略名稱映射為可讀指標名
  • <tracers>:指標類型(預設 SINT)
  • <filterLine>:過濾無效行
  • <lineSplit>:行分割正則

範例:sar -u 1 3 取 CPU 使用率,sar -n SOCK 1 取 Socket 統計。解析輸出映射至 APM 樹 Hosts/Linux/whitehen-desktop/CPU Utilization 等節點。

Ubuntu Desktop 監控 APM 樹

動態格式化:Groovy 預處理器

針對輸出格式複雜(如 Cisco CSS Telnet show service summary),引入 GroovyScriptManager 預處理原始輸出:重命名重複欄位、過濾標題行、重組結構,再交由標準提取器解析。Groovy 腳本熱載入、效能佳、解析能力強。

String[] lines = formatTarget.toString().split("\r\r\n");
StringBuffer buff = new StringBuffer();
lines.each() {
  if(!(it.contains("Load Transitions") || it.contains("show service summary") || it.trim().length() < 1)) {
    buff.append(it).append('\n');
  }
}
return buff.toString()
  .replaceFirst("State", "Status")
  .replaceFirst("Service Name", "ServiceName")
  .replace("State", "Transitions");

CSS 監控 APM 樹

SSH 連線效能優化

JSchRemoteShell 基於 Ant SSHEXEC,每命令建立新連線,效率低。折衷方案:單輪詢周期合併多命令或使用 sar -A 等聚合選項一次取回所有指標,再由 CommandSet 多段落解析。長連線 Session Shell 實現較複雜,需處理提示符解析與狀態維護。

Windows 主機監控:WPM 與 winsar

Windows 無豐富命令列工具,標準介面為 Windows Performance Manager (WPM/PerfMon)。計數器命名規則:\PerformanceObject(Instance)\Counter(如 \Processor(_Total)\% Processor Time)。遠端存取 WPM 困難,主要方案:

  • 日誌檔/資料庫記錄後讀取
  • Win32 API 客戶端(.NET/C++)
  • 自定義代理轉發
  • SNMP 代理
  • WinRM (WS-Management),Win2008+ 內建,跨平台友善

Windows Performance Manager

winsar 原型:命令列存取 WPM

C# 實現 winsar.exe Category Counter Raw Instance 模擬 Linux sar 行為,輸出可由 ShellCollector 解析。為解決 .NET CLR 重複啟動開銷,實作 -service 模式:常駐進程讀配置、透過 JMS 監聽請求、回應至公共主題。Spring 端以 DelegatingShellCollector + RemoteJMSShell 發送請求、接收回應解析。JMS 發布/訂閱模式天然支援多主機代理部署,中央排程器統一觸發採集,可檢測代理無響應觸發告警。

委托收集器架構

JMS 發布訂閱監控

Windows 與 Linux 服務器 APM 樹

JDBC 資料庫系統監控

DBA 工具與 APM 整合常被忽視,但資料庫性能與應用性能緊密相關,集中式 APM 倉庫關聯兩者指標價值極大。JDBCCollector 核心場景:

  1. 可用性與響應時間:定期連線執行簡單查詢,追蹤耗時與連線失敗
  2. 上下文數據:週期性採樣業務表(如近 5 秒訂單數),關聯應用負載
  3. 資料庫性能視圖:透過 JDBC 讀取內部統計表(如 PostgreSQL pg_stat_all_tables)

JDBCCollector 映射機制

查詢結果每行映射至追蹤命名空間:片段值可為字面常量或行標記 {columnIndex},指標名為字面值,指標值取自 valueColumn。支援多 QueryMap 從單查詢提取多指標。

JDBCCollector 映射示意

上下文追蹤:訂單履約率

利用 RelativeTimeStampProvider 提供綁定變量(當前時間 -5 秒、當前時間 +10ms),查詢 sales_order 近 5 秒插入筆數,指標類型 SINT(sticky int)。採集頻率與時間窗需權衡 DB 負載,收集器自動追蹤查詢耗時供調優參考。

銷售訂單速率監控

資料庫性能監控:表/索引活動

查詢 pg_stat_all_tables 取最忙 5 張表的順序掃描/索引掃描計數與元組讀取數,指標類型 SDLONG(sticky delta long)。四個 QueryMap 分別映射 SequentialScans、SequentialTupleReads、IndexScans、IndexTupleReads,片段含 schema 與表名 {0},{1}。命名空間含 {beanName} 動態標記收集器實例。

此部分配置展示了 availabilityNameSpace 整合可用性檢查與性能採集於單一收集器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved