iT邦幫忙

2026 iThome 鐵人賽

DAY 27
0
Build on Google AI

給藥袋裝一張嘴:30 天用 Android 與 Google VLM 實作高齡語音用藥助手系列 第 27 篇

Day 27|即時告警防線!實作 Grafana Alerting 系統異常告警與 LINE 即時通知推播

  • 分享至 

  • xImage
  •  

✏️【本日實作紀錄:Grafana Alerting 規則與 LINE Webhook 告警連動】

在 Day 26 完成 Prometheus 指標採集與 Grafana 視覺化監控儀表板 後,PrescriptionVLM 系統已具備健康數據可視化能力。

然而,運營團隊無法 24 小時盯著 Grafana 儀表板。當系統突發 5xx 伺服器內部錯誤、Gemini VLM API 延遲過高,或是 CPU/記憶體使用率異常時,系統必須主動推播 即時告警訊息 至開發團隊的 LINE 頻道,以便在長輩發現服務異常前進行處理。

今天我們將為 PrescriptionVLM 系統建立 Grafana Alerting 系統異常告警與 LINE 即時通知機制。完成項目包含:

  • Grafana Alert Rule 告警規則配置 — 設定高 HTTP 5xx 錯誤率與高延遲觸發條件。
  • LINE Webhook Alert Contact Point 整合 — 建立 Grafana 與 LINE Messaging API 之告警轉發管道。
  • 自訂告警卡片 — 包含異常等級、發生時間與相關資訊的推播訊息。

一、系統主動告警架構

在生產環境的可觀測性中,告警機制是確保服務品質的重要部分:

  • 被動監控轉主動通知:將 Prometheus 收集的時序指標進行即時算式評估,滿足條件時自動觸發通知。
  • 告警狀態管理:防止因瞬時抖動造成告警洗版,只有異常持續超過設定時間才會發出告警,並在恢復後自動推播復原通知。
  • LINE 整合:讓運營工程師與客服團隊能在手機端接獲警報,加速處理機制。

二、建立 Flask 告警轉發端點(app.py)

由於 Grafana Alerting 的預設 Webhook payload 格式較複雜,我們在 app.py 中新增一個專用的告警接收端點 /api/alerts/line,自動解析 Grafana 告警 JSON 並呼叫 LINE Push API:

@app.route("/api/alerts/line", methods=["POST"])
def handle_grafana_alert():
    """接收 Grafana Webhook 告警並轉發至 LINE"""
    alert_data = request.get_json()
    if not alert_data:
        return jsonify({"status": "invalid payload"}), 400

    status = alert_data.get("status", "unknown") # firing 或 resolved
    alerts = alert_data.get("alerts", [])

    for alert in alerts:
        labels = alert.get("labels", {})
        annotations = alert.get("annotations", {})
        
        alert_name = labels.get("alertname", "系統異常告警")
        severity = labels.get("severity", "warning")
        summary = annotations.get("summary", "檢測到系統數據異常")
        description = annotations.get("description", "無詳細說明")

        # 根據告警狀態選擇圖示與顏色提示
        status_icon = "🚨 [FIRING]" if status == "firing" else "✅ [RESOLVED]"
        
        message_text = (
            f"{status_icon} PrescriptionVLM 系統告警\n"
            f"━━━━━━━━━━━━━━━\n"
            f"📌 告警名稱: {alert_name}\n"
            f"⚠️ 嚴重程度: {severity.upper()}\n"
            f"📝 概要說明: {summary}\n"
            f"🔍 詳細資訊: {description}\n"
            f"⏰ 觸發時間: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
        )

        # 呼叫現有 LINE 推播機制
        if line_bot_api and line_user_id:
            try:
                line_bot_api.push_message(
                    PushMessageRequest(
                        to=line_user_id,
                        messages=[TextMessage(text=message_text)]
                    )
                )
                logger.info(f"告警訊息已成功轉發至 LINE: {alert_name}")
            except Exception as e:
                logger.error(f"轉發告警至 LINE 失敗: {str(e)}")

    return jsonify({"status": "success"}), 200

三、配置 Grafana Contact Point 與 Alert Rules

在 Grafana 管理介面中完成告警規則設定:

1. 設定 Contact Point (告警聯絡點)

  1. 登入 Grafana (http://localhost:3000) ➔ 進入 Alerting ➔ Contact points。

  2. 點擊 Add contact point:

    • Name: LINE-Webhook-Alert
    • Integration: Webhook
    • URL: http://web:5000/api/alerts/line
  3. 點擊 Test 測試連線,並點擊 Save contact point。

2. 設定 Notification Policy (通知策略)

  • 在 Notification policies 中,將 Default policy 的 Contact point 改為 LINE-Webhook-Alert。

3. 建立 Alert Rule (告警規則範例)

進入 Alert rules ➔ New alert rule,建立兩組核心防禦規則:

  • 規則 A:HTTP 5xx 伺服器錯誤過高

    • PromQL 算式:sum(rate(flask_http_request_total{status=~"5.."}[2m])) > 0
    • Pending 時間:1 分鐘
    • Labels:severity = critical
    • Summary:PrescriptionVLM 發生 5xx 內部伺服器錯誤
  • 規則 B:Gemini VLM API 延遲過高

    • PromQL 算式:histogram_quantile(0.95, sum(rate(flask_http_request_duration_seconds_bucket[5m])) by (le)) > 5
    • Pending 時間:2 分鐘
    • Labels:severity = warning
    • Summary:API 95% 回應時間超過 5 秒

四、測試與成果驗證

1. 模擬系統異常觸發告警

發送故意引發錯誤的測試請求:

# 手動向 API 發送無效請求以產生異常
curl -X POST http://127.0.0.1:5000/analyze-prescription -F "invalid_field=1"

2. 觀察 Grafana 與 LINE 推播

  1. 觀察 Grafana Alert rules 狀態,會從 Normal 轉為 Pending,持續 1 分鐘後進入 Firing 狀態。
  2. LINE 視窗預期成果:LINE 聊天室即時收到標記有 🚨 [FIRING] PrescriptionVLM 系統告警 的結構化通知訊息。
  3. 當服務恢復正常後,LINE 視窗會再度收到 ✅ [RESOLVED] 復原通知。

五、版本控制與提交 GitHub

測試通過後,將 Day 27 的修改提交至 GitHub:

git add app.py
git commit -m "保留雙引號 改填寫自己要記錄的標記 ex.鐵人賽第二十七天"
git push

六、本日小結與明日預告

今天我們完成了 PrescriptionVLM 的主動告警機制,透過 Grafana Alerting 與 LINE Webhook 的整合,實現了系統異常檢測與即時推播通知的能力。

明天(Day 28),我們將進入專案的終極整合與架構優化,實作 多模態 VLM 提示詞工程終極調優與邊緣異常防衛,進一步提升藥袋識別的精準度與抗干擾能力!


上一篇
Day 26|營運數據看得見!實作 Prometheus 數據指標與 Grafana 系統監控儀表板
下一篇
Day 28|準確度與防禦力升級!多模態 VLM 提示詞工程調優與邊緣異常防衛
系列文
給藥袋裝一張嘴:30 天用 Android 與 Google VLM 實作高齡語音用藥助手 共 30 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言