延續前兩部分的 ITracer 介面與插裝技術,本部分引入基於 Spring 的組件模型管理監控服務。核心優勢:
Java 應用運行於底層硬體與 OS 之上,收集硬體/OS 層指標是全面監控基石。典型指標涵蓋:
代理模式:目標主機安裝專用軟體,本地聚合後推送/拉取。優點:採集能力強、效率高;缺點:部署維護成本高、代理故障導致監控盲區。
無代理模式:利用 OS 內建介面(SSH、WinRM、SNMP)遠端採集。優點:無額外部署;缺點:遠端採集多指標效率低、權限管理複雜。
最佳實踐:混合部署——本地代理負責高頻大量指標聚合,遠端監控器檢查主機存活與代理健康狀態。
Linux/UNIX 通過 /proc 虛擬檔案系統暴露核心效能數據(記憶體常駐、文本介面),配合 ps、sar、iostat、vmstat 等標準工具極易解析。採集器透過 Shell 執行命令並解析輸出,三種 Shell 存取方式:
java.lang.Process)
ssh-keygen -t dsa~/.ssh/authorized_keysknown_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 結合 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 等節點。

針對輸出格式複雜(如 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");

JSchRemoteShell 基於 Ant SSHEXEC,每命令建立新連線,效率低。折衷方案:單輪詢周期合併多命令或使用 sar -A 等聚合選項一次取回所有指標,再由 CommandSet 多段落解析。長連線 Session Shell 實現較複雜,需處理提示符解析與狀態維護。
Windows 無豐富命令列工具,標準介面為 Windows Performance Manager (WPM/PerfMon)。計數器命名規則:\PerformanceObject(Instance)\Counter(如 \Processor(_Total)\% Processor Time)。遠端存取 WPM 困難,主要方案:

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



DBA 工具與 APM 整合常被忽視,但資料庫性能與應用性能緊密相關,集中式 APM 倉庫關聯兩者指標價值極大。JDBCCollector 核心場景:
pg_stat_all_tables)查詢結果每行映射至追蹤命名空間:片段值可為字面常量或行標記 {columnIndex},指標名為字面值,指標值取自 valueColumn。支援多 QueryMap 從單查詢提取多指標。

利用 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 整合可用性檢查與性能採集於單一收集器。