返回專案列表

排程監控與告警系統

針對 DB 與 Log 的條件監控,自動發送 Email 與簡訊通知

針對 DB 與 Log 兩種資料源,依可設定的監控規則排程檢查,條件成立時自動通知指定人員。每條規則的資料源、時間範圍、門檻與告警人員都能獨立調整,同一位人員在同一個通知管道上設有抑制時間,避免重複打擾,並以分散式 lock 避免同一規則被重複執行。

角色
Senior Engineer(需求分析、架構設計、開發、測試)
使用技術
JavaSpring BootPostgreSQLOpenSearchDistributed LockSchedulerEmailSMS
01.

要解決的問題

系統出現異常時,如果只靠人工查詢資料庫或翻找 Log,很容易延遲發現。

這個系統把「查什麼、查哪裡、多久內超過幾筆、要通知誰」變成可設定的規則,由排程自動檢查,條件成立時立刻通知相關人員。

另一個問題是告警過度打擾:條件持續成立時,如果每一輪排程都通知,同一批人會不斷收到重複的通知。因此系統提供抑制機制,讓同一人、同一通知管道在抑制時間內不會被重複通知。

02.

運作流程

  1. 01

    排程觸發

    依各規則的排程時間,逐條觸發檢查。

  2. 02

    取得 Lock

    先取得該規則的分散式 lock,確保同一時間只有一個執行者處理這條規則。

  3. 03

    載入規則

    讀取規則設定:資料源、查詢條件、時間範圍、門檻與告警人員。

  4. 04

    查詢資料源

    DB 規則查詢 PostgreSQL;Log 規則透過 OpenSearch 查詢。

  5. 05

    判斷條件

    統計時間範圍內的筆數,判斷是否超過門檻。

  6. 06

    檢查抑制時間

    針對每位告警人員與每個通知管道,檢查抑制時間內是否已通知過,已通知過就跳過。

  7. 07

    發送通知

    條件成立時,依規則設定寄送 Email 或簡訊給尚未被抑制的告警人員,並記錄通知時間。

  8. 08

    釋放 Lock

    處理完成後釋放 lock。

03.

彈性的監控規則

每條規則都是一份獨立的設定,不同規則可以有不同的資料源、時間範圍、門檻與告警人員。

資料源
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 與電話皆為假資料。

04.

抑制重複通知

條件持續成立時,每一輪排程都會判斷為異常。如果每一輪都通知,告警人員會不斷被重複打擾。因此每條規則可以設定抑制時間。

  • >每條規則可以設定是否啟用抑制;沒有啟用時,不會做抑制判斷。
  • >啟用後,以「同一位告警人員+同一個通知管道」為單位判斷。
  • >在抑制時間內已經通知過,就不會再通知,直到抑制時間結束。
  • >同一個人的 Email 與簡訊分開計算,不會互相影響。
05.

多執行緒與分散式 Lock

排程可能同時在多個執行緒、多個節點上被觸發。如果同一條規則被同時執行,同一個異常就會被重複檢查、重複通知。

執行者 A:取得 lock,執行規則
執行者 B:未取得 lock,不執行
  • >以規則為單位取得分散式 lock,同一時間只有一個執行者能處理該規則。
  • >沒有取得 lock 的執行者不會執行該規則,因此不會重複發送通知。
  • >不同規則之間互不影響,仍然可以平行執行。