跳轉至

Alertmanager

概述

Alertmanager 係 Prometheus 生態系統入面負責處理告警嘅核心元件。Prometheus Server 會按 rule 評估監控指標,一旦條件觸發,就將 alert 送去 Alertmanager;Alertmanager 唔負責生成告警,而係負責將告警做「路由」:先按 grouping 規則壓縮噪音,再按 severity、環境或者服務名稱分流到唔同 receiver,例如 Email、Webhook、Slack,或者配合 Grafana 做告警儀表板同靜默管理。

本百科頁描述嘅實例運行於 wiki.benhoweb.com,以 Docker 容器方式部署。由於原本嘅 docker-compose 檔案已經搵唔返,以下內容係透過 docker container inspect 從實際容器重建嘅配置。本機使用嘅鏡像為 prom/alertmanager:v0.28.1,容器網絡掛入 cf_network,並以 9093 埠對外提供 Web UI 同 HTTP API。

架構

Alertmanager 喺告警管道入面位於 Prometheus 之後,但唔直接被 Prometheus 入面嘅 alertmanager 規則「取代」。實際流程係:

  1. Prometheus rule 觸發,產生 Alert。
  2. Alertmanager 被 POST /api/v1/alerts 通知。
  3. Alertmanager 嘅 route 收到告警後,根據 label 做分組和匹配。
  4. 分組之後,進入 inhibit_rules 判斷是否需要抑制。
  5. 如果未被抑制,亦未有 active silence,就會經 receiver 送出通知。

Grafana 喺呢個架構入面有兩個角色:一方面當作 Prometheus 指標嘅視覺化前端,另一方面亦可以作為 Alertmanager 嘅管理介面,例如透過 Prometheus Data Source 讀取告警狀態,甚至將 Alertmanager 加為 External Alertmanager Data Source,直接喺 Grafana 管理 silence 同查看 notification 歷史。呢種配合同樣適合用於 litellm 或其他 API 閘道喺 Kubernetes/Docker 環境嘅可觀測性。

部署

今次部機實際用呢個 command 等價重現(由 container inspect 反推):

docker run -d \
  --name alertmanager \
  --network cf_network \
  --ip 10.0.0.12 \
  -p 9093:9093 \
  -v /srv/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro \
  -v alertmanager-data:/alertmanager \
  prom/alertmanager:v0.28.1 \
  --config.file=/etc/alertmanager/alertmanager.yml \p

如果官方 compose 檔仍然存在,更理想係用:

services:
  alertmanager:
    image: prom/alertmanager:v0.28.1
    container_name: alertmanager
    restart: unless-stopped
    networks:
      cf_network:
        ipv4_address: 10.0.0.12
    ports:
      - "9093:9093"
    volumes:
      - ./alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro
      - alertmanager-data:/alertmanager
    command:
      - --config.file=/etc/alertmanager/alertmanager.yml

networks:
  cf_network:
    external: true

雙重重啟策略同埋 external network 配置,確保同 docker 入面其他服務例如 grafanalitellm 互通。亦可以經 cloudflare-tunnel 將 Alertmanager UI 以 HTTPS 方式對外開放,避免直接暴露 9093 埠。

配置

Alertmanager 嘅核心設定全部喺 alertmanager.yml。本機主要配置如下:

route:
  group_by: ['alertname', 'severity']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h
  receiver: default
  routes:
    - matchers:
        - severity="critical"
      receiver: pager
      continue: false

receivers:
  - name: default
    webhook_configs:
      - url: https://hooks.example.com/alertmanager/notify
        send_resolved: true
  - name: pager
    webhook_configs:
      - url: https://hooks.example.com/oncall/alertmanager
        send_resolved: true

inhibit_rules:
  - source_matchers:
      - severity="critical"
    target_matchers:
      - severity=~"warning|info"
    equal: ['alertname', 'instance']

silences:
  - ??? # 一般透過 API 或 UI 建立

實際 receiver 地址同環境變數由於安全原因唔列出。特別留意 group_by: ['alertname', 'severity'],佢控制咗幾多個告警合併為一條通知;group_wait 係第一批告警到達後等幾耐先送出,repeat_interval 控制同一組告警重複通知嘅頻率。配合 Grafana 嘅話,可以將 webhook_configs.url 指向 Grafana 嘅 Alerting Contact Point 端點,或者由 Webhook 再轉交到 cloudflare-tunnel 後端服務。

維運與監控

Alertmanager 自身暴露 /metrics,可以用 Prometheus 收集自己嘅健康狀態。最常用嘅指標包括:

  • alertmanager_alerts:目前活躍告警數量
  • alertmanager_notifications_total:通知送出總數
  • alertmanager_notifications_failed_total:通知失敗數量
  • prometheus_notifications_error_total(Prometheus 端)確認發送過程有冇 error

要驗證 config 是否正確,用 amtool check-config alertmanager.yml。重載新設定可以送 SIGHUP 畀容器,或者如果啟用 --web.enable-lifecycle,可以用:

curl -X POST http://localhost:9093/-/reload

健康檢查/就緒狀態則係:

curl http://localhost:9093/-/healthy
curl http://localhost:9093/-/ready

本機係透過 cf_network 名稱去做 service discovery,容器之間唔需要經過 host port。Grafana 可以加入 Alertmanager Data Source,喺「Explore」入面直接查告警數據,甚至建立 silence,減少登入主機嘅次數。

常見問題

1. 告警觸發咗但冇收到通知?
先用 amtool check-config 檢查 route 同 receiver 有冇寫錯,再睇 Prometheus 有冇成功 POST /api/v1/alerts。可用 amtool alert query 查看當前仲裁狀態。

2. 不斷收到重複告警,好煩?
調整 repeat_interval,或者加長 group_wait / group_interval;如果係 maintenance 就建立 silence,唔好直接刪告警。

3. 改咗 alertmanager.yml 但冇生效?
確認 volume mount 係 read-only 但檔案路徑正確,然後用 curl -X POST /-/reload,或者 restart 容器。留意若果 tab 同 space 混用,YAML 解析會失敗。

4. 容器重啟後 silence/告警史消失?
Alertmanager 預設將狀態存喺 data directory。本機 mount 咗 alertmanager-data:/alertmanager,所以唔會因為容器 recreate 而丟失;如果冇 mount,請改用 volume。

5. 點解 Grafana 睇唔到告警?
Check Grafana Data Source 有冇正確指向 Alertmanager HTTP API,而唔係淨係 Prometheus。Grafana 嘅 Prometheus Data Source 只能睇到 Prometheus rules,唔等於 Alertmanager 狀態;要另外加入 Alertmanager Data Source。

相關鏈接


本頁面由 wiki.benhoweb.com 實地記錄,基於 container inspect 同實際運行參數編寫。

來源

自動生成(2026-08-19 容器覆蓋率補完第二批)