排程監控與告警系統
針對 DB 與 Log 的條件監控,自動發送 Email 與簡訊通知
針對 DB 與 Log 兩種資料源,依可設定的監控規則排程檢查,條件成立時自動通知指定人員。每條規則的資料源、時間範圍、門檻與告警人員都能獨立調整,同一位人員在同一個通知管道上設有抑制時間,避免重複打擾,並以分散式 lock 避免同一規則被重複執行。
- 角色
- Senior Engineer(需求分析、架構設計、開發、測試)
- 使用技術
- JavaSpring BootPostgreSQLOpenSearchDistributed LockSchedulerEmailSMS
要解決的問題
系統出現異常時,如果只靠人工查詢資料庫或翻找 Log,很容易延遲發現。
這個系統把「查什麼、查哪裡、多久內超過幾筆、要通知誰」變成可設定的規則,由排程自動檢查,條件成立時立刻通知相關人員。
另一個問題是告警過度打擾:條件持續成立時,如果每一輪排程都通知,同一批人會不斷收到重複的通知。因此系統提供抑制機制,讓同一人、同一通知管道在抑制時間內不會被重複通知。
運作流程
- 01
排程觸發
依各規則的排程時間,逐條觸發檢查。
- 02
取得 Lock
先取得該規則的分散式 lock,確保同一時間只有一個執行者處理這條規則。
- 03
載入規則
讀取規則設定:資料源、查詢條件、時間範圍、門檻與告警人員。
- 04
查詢資料源
DB 規則查詢 PostgreSQL;Log 規則透過 OpenSearch 查詢。
- 05
判斷條件
統計時間範圍內的筆數,判斷是否超過門檻。
- 06
檢查抑制時間
針對每位告警人員與每個通知管道,檢查抑制時間內是否已通知過,已通知過就跳過。
- 07
發送通知
條件成立時,依規則設定寄送 Email 或簡訊給尚未被抑制的告警人員,並記錄通知時間。
- 08
釋放 Lock
處理完成後釋放 lock。
彈性的監控規則
每條規則都是一份獨立的設定,不同規則可以有不同的資料源、時間範圍、門檻與告警人員。
- 資料源
- DB 或 Log
- 查詢條件
- 要統計哪些資料或哪些 Log
- 時間範圍
- 例如最近 3 天、最近 7 天
- 門檻
- 例如超過 5 筆
- 告警人員
- 每位人員各自的姓名、Email 與電話
- 通知方式
- Email、簡訊
- 是否啟用抑制
- 可選擇要不要啟用抑制機制
- 抑制時間
- 同一人、同一管道通知後,多久內不再通知
調整規則的例子
- 今天三天內的資料超過 5 筆,就通知。
- 明天改為七天內的資料超過 5 筆,才通知。
規則設定範例
{
"ruleId": "timeout-errors-3d",
"source": "LOG",
"query": "level:ERROR AND message:timeout",
"window": { "unit": "DAY", "value": 3 },
"threshold": { "operator": ">", "count": 5 },
"recipients": [
{ "name": "Alice", "email": "alice@example.com", "phone": "0900-000-001" },
{ "name": "Bob", "email": "bob@example.com", "phone": "0900-000-002" }
],
"channels": ["EMAIL", "SMS"],
"suppression": { "enabled": true, "unit": "MINUTE", "value": 60 }
}示意用的設定概念,姓名、Email 與電話皆為假資料。
抑制重複通知
條件持續成立時,每一輪排程都會判斷為異常。如果每一輪都通知,告警人員會不斷被重複打擾。因此每條規則可以設定抑制時間。
- >每條規則可以設定是否啟用抑制;沒有啟用時,不會做抑制判斷。
- >啟用後,以「同一位告警人員+同一個通知管道」為單位判斷。
- >在抑制時間內已經通知過,就不會再通知,直到抑制時間結束。
- >同一個人的 Email 與簡訊分開計算,不會互相影響。
多執行緒與分散式 Lock
排程可能同時在多個執行緒、多個節點上被觸發。如果同一條規則被同時執行,同一個異常就會被重複檢查、重複通知。
- >以規則為單位取得分散式 lock,同一時間只有一個執行者能處理該規則。
- >沒有取得 lock 的執行者不會執行該規則,因此不會重複發送通知。
- >不同規則之間互不影響,仍然可以平行執行。