iT邦幫忙

2026 iThome 鐵人賽

DAY 22
0
Software Development

30天打造一套企業PLM系列 第 22

Day 22:監控維運——讓系統自己說話

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20260908/20161290SoTlzy6wqf.jpg

系列:30 天打造企業級 PLM|面向:後端

問題場景

上線後的日常:「系統怪怪的。」沒有監控,每次都要遠端連上主機,在幾 GB 的 log 裡大海撈針。企業內網環境往往裝不了雲端 APM,Mini-PLM 的選擇是把監控做進系統本體:錯誤自動收集去重、效能樣本自動記錄、一頁 Monitor 看全部。

Monitor 頁實機畫面:

https://ithelp.ithome.com.tw/upload/images/20260908/20161290N2OSQxN2Pj.png

商業邏輯設計

  • 資料保存年限是政策不是技術。效能樣本留 7 天(診斷用,過期無值),選單使用事件留 365 天(年度功能盤點用)。retention 是儲存成本與分析需求的平衡,每類資料各自談
  • 使用洞察有實際的業務用途:哪些功能沒人用(該下架或該教育訓練)、哪些選單最熱(優化優先序)。有了數字,「要不要做這個功能」從吵架變成看數據
  • 監控頁本身 ADMIN only,錯誤訊息可能含內部路徑與資料片段

技術選型與取捨:自建輕量監控 vs 引入 APM

架構演進:從 WebLogic 巨型日誌與 JMX 到內建結構化指紋監控

以前在 Oracle Agile PLM 的維運體系中,排查問題往往令人崩潰:

  1. 日誌巨石陣:錯誤訊息以純文字重複傾倒在 WebLogic 的 ManagedServer.outAgile.log 中。同一個 bug 在一小時內噴出數萬行重複的 Stack Trace,硬碟常被塞爆,搜尋錯誤有如大海撈針;
  2. JMX 監控繁瑣:雖然 WebLogic 提供 JMX MBeans,但監控指標高度偏向伺服器底層容器,無法直接反映「哪種類型的變更單最常失敗」或「哪支 API 耗時最長」等業務層面的痛點。

Mini-PLM 選擇在系統內建輕量級結構化 Monitor 模組:自動對錯誤進行 SHA-256 指紋去重與計數累加,並即時收集 API 效能樣本與 Top 慢查詢,讓管理員直接在一頁 UI 掌控全局。

Prometheus 加 Grafana 加 ELK 是標準答案,但內網部署的現實是多三套要維運的系統、跨系統關聯要自己建,而我們要回答的問題其實很收斂:哪支 API 慢、哪個錯誤爆量。取捨結果是監控進系統本體、資料存主資料庫、UI 就是系統的一頁。代價是監控與系統同生共死,系統倒了監控也倒,緩解靠外部的 /actuator/health 探測。規模換簡單的又一例,等到多節點分散式(Day 30 roadmap),再引入獨立監控棧不遲。

核心內容

錯誤收集:去重指紋 + 累加計數

同一個 bug 在生產環境不會只發生一次,它會發生一萬次。逐筆存等於自己 DDoS 自己的資料庫。解法兩段(實碼註解):

// 錯誤日誌記錄實體
/**
 * 指紋 = SHA-256(exceptionClass + message 前 200 字 + logger) 十六進位前 64 字
 */

// 錯誤日誌寫入器
/**
 * 去重節流:先對「去重時間窗內同指紋」的列做 UPDATE(累加 OCCURRENCE_COUNT),
 * ...
 */

指紋的配方是重點:exceptionClass 加 message 前 200 字加 logger。message 只取前 200 字,因為訊息尾巴常帶變動值(ID、時間戳),全文進指紋會讓同一個 bug 產生一萬個不同指紋,去重直接失效。寫入端則是時間窗內同指紋 UPDATE 累加、否則 INSERT。一萬次發生變成一列加計數 10000,爆量錯誤反而看得更清楚。

規則式解讀:把診斷知識沉澱成資料

錯誤列表不只給 stack trace,還配解讀規則:常見錯誤 pattern 對應「這通常是什麼問題、先檢查什麼」。例如 CLIENT_REQUEST 類等於使用者端網路中斷,不用緊張。值班的人不需要是寫程式的人,診斷知識從資深工程師的腦子搬進規則表。這也是 Day 30「AI for Maintain」的地基:規則式解讀先把格式與流程鋪好,之後換 AI 當解讀器是水到渠成。

效能樣本與 ZIP 匯出

每個 API 請求記效能樣本(路徑、耗時、時間戳),保留 7 天。分析走離線匯出:Monitor 頁一鍵匯出 ZIP(樣本時序、Top SQL、錯誤彙總,預設近 24h),資料拿回本機用趁手的工具慢慢分析,不在生產系統上跑重查詢。Day 21 壓測的監控快照收集,接的就是這套樣本體系。

Release Notes 自動化

Release Notes 產生腳本在 git commit 後產生版本說明 JSON({timestamp}-{shortHash}.json),前端配 version.json 偵測新版、彈 What's New。維運的最後一哩:使用者知道系統更新了什麼,支援電話就少一半。

踩坑記錄

  • /actuator/health 被 LDAP 拖死。health 預設聚合所有依賴的健康檢查,LDAP 或 Mail 連不到時整個 /health 跟著 timeout,外部探測以為系統掛了。修法是停用 LDAP/Mail 健康指標。health endpoint 回答「我能不能服務」,不是「全世界都好嗎」,外部依賴的失敗有自己的降級路徑,不該讓探測誤判
  • 監控自己也會出錯。錯誤收集管線的錯誤不能再進收集管線,不然就是遞迴自爆。collector 的例外只走檔案 log,把這個環斷掉
  • 效能樣本表沒設 retention 前曾無限長大。任何自動累積的表,建表當天就要決定刪除策略

小結

指紋去重讓爆量變計數,規則式解讀讓知識資料化,樣本加離線匯出讓分析不擾生產,health 只答自己。品質週到此結束,明日起進入 Migration 篇。Day 23:怎麼把十幾年的舊系統資料撈出來。


上一篇
Day 21:壓測與效能調校
下一篇
Day 23:遷移策略與資料考古——把舊系統的資料撈出來(上)
系列文
30天打造一套企業PLM28
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言