Prometheus 監控告警系統搭建(對接飛書告警)

Prometheus 是一套開源的系統監控報警框架,非常適合大規模集羣的監控。它也是第二個加入CNCF的項目,受歡迎度僅次於 Kubernetes 的項目。本文講解完整prometheus 監控和告警服務的搭建。
prometheus 監控是當下主流監控系統,它是多個服務組合使用的體系。整體架構預覽如下:

本篇教程監控系統搭建,包括的服務有:

  1. prometheus 監控的主體,負責數據彙總,保存,監控數據,產生告警信息
  2. exporter 監控的採集端,負責數據採集
  3. grafana 數據可視化,負責以豐富的頁面展示採集到的數據
  4. alertmanager 告警管理,負責告警信息處理,包括告警週期,消息優先級等
  5. prometheusAlert 告警的具體發送端,負責配置告警模板,發出告警信息

除了監控採集節點,其他服務均通過docker-compose部署。部署系統信息:

  1. 系統:ubuntu20.04
  2. 服務器IP:172.16.9.124
  3. docker版本:20.10.21
  4. docker-compose版本:1.29.2
  5. 配置文件路徑:/root/prometheus

部署prometheus

prometheus主要負責數據採集和存儲,提供PromQL查詢語言的支持。部署prometheus分爲兩個步驟:

  1. 準備配置文件
  2. 啓動prometheus

準備配置文件

整個體系的配置文件在/root/prometheus,首先新建prometheus服務的配置文件路徑 /root/prometheus/prometheus,並在這個目錄下新建:

  • config 用於放置服務主要配置文件 prometheus.yml
  • data 用於放置服務的數據庫文件
root@ubuntu-System-Product-Name:~/prometheus# tree . -L 3
.
├── docker-compose.yaml
└── prometheus
    ├── config
    │   └── prometheus.yml
    └── data

新建prometheus.yml,prometheus服務的主配置文件

global:
  scrape_interval:     30s # 每30s採集一次數據
  evaluation_interval: 30s # 每30s做一次告警檢測


scrape_configs:
  # 配置prometheus服務本身
  - job_name: prometheus
    static_configs:
      - targets: ['172.16.9.124:9090']
        labels:
          instance: prometheus

修改 data 目錄的文件權限,讓容器有權限在data目錄裏生成數據相關數據

chmod 777 data

創建 docker-compse.yml

version: '3'
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - /root/prometheus/prometheus/config:/etc/prometheus
      - /root/prometheus/prometheus/data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.enable-lifecycle'

參數說明:
command:

  • --config.file=/etc/prometheus/prometheus.yml 指定使用的配置文件
  • --storage.tsdb.path=/prometheus 指定時序數據庫的路徑
  • --web.enable-lifecycle 支持配置熱加載

volumes:

  • /root/prometheus/prometheus/config:/etc/prometheus 映射配置文件所在目錄
  • /root/prometheus/prometheus/data:/prometheus 映射數據庫路徑參數

啓動prometheus

啓動 docker-compse docker-compose up -d
查看日誌:

root@ubuntu-System-Product-Name:~/prometheus# docker ps
CONTAINER ID   IMAGE                                           COMMAND                  CREATED         STATUS                 PORTS                                                        NAMES
776772d69b20   prom/prometheus                                 "/bin/prometheus --c…"   5 minutes ago   Up 5 minutes           0.0.0.0:9090->9090/tcp, :::9090->9090/tcp                    prometheus

查看容器的日誌:
docker logs -f 776

ts=2023-12-25T10:21:17.560Z caller=main.go:478 level=info msg="No time or size retention was set so using the default time retention" duration=15d
ts=2023-12-25T10:21:17.560Z caller=main.go:515 level=info msg="Starting prometheus" version="(version=2.32.1, branch=HEAD, revision=41f1a8125e664985dd30674e5bdf6b683eff5d32)"
ts=2023-12-25T10:21:17.561Z caller=main.go:520 level=info build_context="(go=go1.17.5, user=root@54b6dbd48b97, date=20211217-22:08:06)"
ts=2023-12-25T10:21:17.561Z caller=main.go:521 level=info host_details="(Linux 5.15.0-56-generic #62~20.04.1-Ubuntu SMP Tue Nov 22 21:24:20 UTC 2022 x86_64 776772d69b20 (none))"
ts=2023-12-25T10:21:17.561Z caller=main.go:522 level=info fd_limits="(soft=1048576, hard=1048576)"
ts=2023-12-25T10:21:17.561Z caller=main.go:523 level=info vm_limits="(soft=unlimited, hard=unlimited)"
ts=2023-12-25T10:21:17.562Z caller=web.go:570 level=info component=web msg="Start listening for connections" address=0.0.0.0:9090
ts=2023-12-25T10:21:17.562Z caller=main.go:924 level=info msg="Starting TSDB ..."
ts=2023-12-25T10:21:17.562Z caller=tls_config.go:195 level=info component=web msg="TLS is disabled." http2=false
ts=2023-12-25T10:21:17.564Z caller=head.go:488 level=info component=tsdb msg="Replaying on-disk memory mappable chunks if any"
ts=2023-12-25T10:21:17.564Z caller=head.go:522 level=info component=tsdb msg="On-disk memory mappable chunks replay completed" duration=1.305µs
ts=2023-12-25T10:21:17.564Z caller=head.go:528 level=info component=tsdb msg="Replaying WAL, this may take a while"
ts=2023-12-25T10:21:17.564Z caller=head.go:599 level=info component=tsdb msg="WAL segment loaded" segment=0 maxSegment=1
ts=2023-12-25T10:21:17.564Z caller=head.go:599 level=info component=tsdb msg="WAL segment loaded" segment=1 maxSegment=1
ts=2023-12-25T10:21:17.564Z caller=head.go:605 level=info component=tsdb msg="WAL replay completed" checkpoint_replay_duration=14.305µs wal_replay_duration=301.534µs total_replay_duration=327.342µs
ts=2023-12-25T10:21:17.565Z caller=main.go:945 level=info fs_type=EXT4_SUPER_MAGIC
ts=2023-12-25T10:21:17.565Z caller=main.go:948 level=info msg="TSDB started"
ts=2023-12-25T10:21:17.565Z caller=main.go:1129 level=info msg="Loading configuration file" filename=/etc/prometheus/prometheus.yml
ts=2023-12-25T10:21:17.565Z caller=main.go:1166 level=info msg="Completed loading of configuration file" filename=/etc/prometheus/prometheus.yml totalDuration=217.62µs db_storage=555ns remote_storage=860ns web_handler=182ns query_engine=371ns scrape=90.382µs scrape_sd=10.238µs notify=450ns notify_sd=788ns rules=737ns
ts=2023-12-25T10:21:17.565Z caller=main.go:897 level=info msg="Server is ready to receive web requests."

日誌很重要!日誌很重要!日誌很重要!😬 整個監控告警體系服務較多,環節較長,想要順利完成一定要學會看日誌排查問題。比如日誌中報錯容器沒有權限創建文件,所以需要修改目錄的權限。

查看web頁面

登錄prometheus的web頁面 172.16.9.124:9090,查看監控的目標端點信息

可以看到只有一個服務,就是prometheus自身,已經是up的狀態。

部署exporter

部署了prometheus主服務之後,下一步部署exporter。可以在這裏找到常用的exporter,

本篇以最常用的服務器監控node-exporter爲例,通過docker部署(最好使用安裝包部署,這裏主要爲了方便快捷)。

啓動node-exporter

root@ubuntu-System-Product-Name:~/prometheus# docker run -d --restart=always -p 9100:9100 prom/node-exporter
Unable to find image 'prom/node-exporter:latest' locally
latest: Pulling from prom/node-exporter
aa2a8d90b84c: Pull complete 
b45d31ee2d7f: Pull complete 
b5db1e299295: Pull complete 
Digest: sha256:f2269e73124dd0f60a7d19a2ce1264d33d08a985aed0ee6b0b89d0be470592cd
Status: Downloaded newer image for prom/node-exporter:latest
fa3754932320ed9936d340cb4bb753db38086fa18fd0e99a8cb2ec556ed7f4bd

查看exporter狀態

root@ubuntu-System-Product-Name:~/prometheus#docker ps | grep node
CONTAINER ID   IMAGE                                           COMMAND                  CREATED          STATUS                 PORTS                                                        NAMES
fa3754932320   prom/node-exporter                              "/bin/node_exporter"     43 seconds ago   Up 42 seconds          0.0.0.0:9100->9100/tcp, :::9100->9100/tcp                    eager_lehmann

所有的exporter都實現了一個查詢的接口,通過訪問exporter的端點可以訪問其採集到的資源,如node-exporter的接口172.16.9.124:9100

相同步驟,部署了兩個node-exporter,分別是node01: 172.16.9.124、node02: 192.168.123.62

更新prometheus

部署好exporter之後,需要配置prometheus定時從exporter採集資源。更新prometheus.yml

global:
  scrape_interval:     30s # 每30s採集一次數據
  evaluation_interval: 30s # 每30s做一次告警檢測


scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ['172.16.9.124:9090']
        labels:
          instance: prometheus
      
  - job_name: node01   
    static_configs:
      - targets: ['172.16.9.124:9100']
        labels:
          instance: node01
  
  - job_name: node02
    static_configs:
      - targets: ['192.168.123.62:9100']
        labels:
          instance: node02

node01 和 node02是啓動的兩個node-exporter,如果有更多客戶端也添加到這裏。

重新加載配置文件
讓prometheus配置文件生效有兩種方法,重新啓動prometheus和熱加載。因爲在部署prometheus時已經配置了其可以熱加載,所以通過如下命令即可快速重新加載配置文件。

curl -X POST http://172.16.9.124:9090/-/reload

刷新prometheus頁面,查看已經配置的節點的狀態,可以看到新加的兩個採集節點已經處於up狀態,配置生效。

部署grafana

prometheus自帶的頁面比較簡單,通常使用grafana來查看prometheus採集的監控數據。grafana是一個可以展示和分析數據的平臺,支持多種數據源和儀表盤的展示方式。下面部署grafana服務。

準備配置文件

新建目錄 /root/prometheus/grfana作爲grafana服務的主要目錄,新建data目錄將grafa配置文件映射出來,這樣重啓不會丟失配置。

root@ubuntu-System-Product-Name:~# tree prometheus/
prometheus/
├── docker-compose.yaml
├── grafana
│   └── data
└── prometheus
    ├── config
    │   └── prometheus.yml
    └── data
        ├── chunks_head
        ├── lock
        ├── queries.active
        └── wal
            ├── 00000000
            └── 00000001

修改grafana目錄的讀寫權限

chmod 777 -R grafana/

啓動grafana服務

在docker-compose.yml中新增grafana服務

version: '3'
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - /root/prometheus/prometheus/config:/etc/prometheus
      - /root/prometheus/prometheus/data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.enable-lifecycle'
  
  grafana:
    image: grafana/grafana
    container_name: grafana
    restart: always
    ports:
      - "3000:3000"
    volumes:
      - /root/prometheus/grafana/data:/var/lib/grafana

重新啓動docker-compose.yml

root@ubuntu-System-Product-Name:~/prometheus# docker-compose down
Stopping prometheus ... done
Removing prometheus ... done
Removing network prometheus_default
root@ubuntu-System-Product-Name:~/prometheus# docker-compose up -d
Creating network "prometheus_default" with the default driver
Pulling grafana (grafana/grafana:)...
latest: Pulling from grafana/grafana
97518928ae5f: Pull complete
5b58818b7f48: Pull complete
d9a64d9fd162: Pull complete
4e368e1b924c: Pull complete
867f7fdd92d9: Pull complete
387c55415012: Pull complete
07f94c8f51cd: Pull complete
ce8cf00ff6aa: Pull complete
e44858b5f948: Pull complete
4000fdbdd2a3: Pull complete
Digest: sha256:18d94ae734accd66bccf22daed7bdb20c6b99aa0f2c687eea3ce4275fe275062
Status: Downloaded newer image for grafana/grafana:latest
Creating grafana    ... done
Creating prometheus ... done

查看容器狀態

root@ubuntu-System-Product-Name:~/prometheus# docker-compose ps
   Name                 Command               State                    Ports                  
----------------------------------------------------------------------------------------------
grafana      /run.sh                          Up      0.0.0.0:3000->3000/tcp,:::3000->3000/tcp
prometheus   /bin/prometheus --config.f ...   Up      0.0.0.0:9090->9090/tcp,:::9090->9090/tcp

查看grafana日誌
docker logs -f grafana

t=2023-12-25T10:51:21+0000 lvl=info msg="Executing migration" logger=migrator id="add index builtin_role.org_id"
t=2023-12-25T10:51:21+0000 lvl=info msg="Executing migration" logger=migrator id="add unique index builtin_role_org_id_role_id_role"
t=2023-12-25T10:51:21+0000 lvl=info msg="Executing migration" logger=migrator id="Remove unique index role_org_id_uid"
t=2023-12-25T10:51:21+0000 lvl=info msg="Executing migration" logger=migrator id="add unique index role.uid"
t=2023-12-25T10:51:21+0000 lvl=info msg="Executing migration" logger=migrator id="create seed assignment table"
t=2023-12-25T10:51:21+0000 lvl=info msg="Executing migration" logger=migrator id="add unique index builtin_role_role_name"
t=2023-12-25T10:51:21+0000 lvl=info msg="migrations completed" logger=migrator performed=381 skipped=0 duration=1.361595517s
t=2023-12-25T10:51:21+0000 lvl=info msg="Created default admin" logger=sqlstore user=admin
t=2023-12-25T10:51:21+0000 lvl=info msg="Created default organization" logger=sqlstore
t=2023-12-25T10:51:21+0000 lvl=info msg="Initialising plugins" logger=plugin.manager
t=2023-12-25T10:51:21+0000 lvl=info msg="Plugin registered" logger=plugin.manager pluginId=input
t=2023-12-25T10:51:21+0000 lvl=info msg="Live Push Gateway initialization" logger=live.push_http
t=2023-12-25T10:51:21+0000 lvl=info msg="warming cache for startup" logger=ngalert
t=2023-12-25T10:51:21+0000 lvl=info msg="HTTP Server Listen" logger=http.server address=[::]:3000 protocol=http subUrl= socket=
t=2023-12-25T10:51:21+0000 lvl=info msg="starting MultiOrg Alertmanager" logger=ngalert.multiorg.alertmanager
t=2023-12-25T10:52:41+0000 lvl=info msg="Request Completed" logger=context userId=0 orgId=0 uname= method=GET path=/ status=302 remote_addr=192.168.123.62 time_ms=1 size=29 referer=

配置grafana

grafana服務啓動之後,配置展示的數據來源、展示的模板等。操作步驟:

  1. 配置展示數據來源爲prometheus服務
  2. 選擇合適的展示模板

登錄grafana 172.16.9.124:9100 默認密碼是 admin / admin

配置grafana展示數據的來源是 prometheus

URL中填寫 prometheus 的IP:端口號,http://172.16.9.124:9000

保存配置信息

到這裏數據來源就配置好了,下面配置展示的模板。
添加展示模板

image

有三種添加模板的方法,分別是上傳json文件、load 模板ID、粘貼json字符串。最方便的方法當然是load模板ID,因此選用這種方法。可以在模板商城選擇模板 https://grafana.com/grafana/dashboards/

這裏我們選擇node-exporter配套的展示模板8919

配置完成

相同步驟導入單個服務器展示模板 12633

展示監控頁面

  1. 服務器列表展示 ID:8919

  1. 單個服務器展示 ID:12633

到這裏我們就擁有一個可以採集資源,查看資源的監控平臺了。如果不需要告警消息就可以完工了,需要告警配置的請大步向前邁🏃‍➡️。

部署alertmanager

採集的數據除了展示之後,更重要的是數據集異常告警。prometheus體系中告警是alertmanager服務。
部署步驟:

  1. 準備配置文件
  2. 更新prometheus
  3. 啓動alertmanager服務
  4. 告警測試

準備配置文件

新建告警服務配置目錄 /root/prometheus/alertmanager

root@ubuntu-System-Product-Name:~/prometheus# tree . -L 2
.
├── alertmanager
│   └── alertmanager.yml
├── docker-compose.yaml
├── grafana
│   └── data
└── prometheus
    ├── config
    └── data

創建alertmanager服務配置文件 alertmanager.yaml

global:
  resolve_timeout: 5m  
route:   
  group_by: ['instance']   
  group_wait: 30s  
  group_interval: 60s  
  repeat_interval: 5m  
  receiver: 'web.hook.prometheusalert'  
receivers:
- name: 'web.hook.prometheusalert'
  webhook_configs:
  - url: 'http://172.16.9.124:9093'

參數解釋:

參數 解釋
resolve_timeout: 5m 持續5分鐘沒收到告警信息後認爲問題已解決
route 定義告警路由規則,可以定義多個receiver和group實現告警分組
group_by: ['instance'] 分組,處於同一組的告警會被合併爲同一個通知。這裏設置的是instance相同的告警會被合併爲同一個通知
group_wait: 30s 30秒是個時間窗口,這個窗口內,同一個分組的所有消息會被合併爲同一個通知
group_interval: 60s 同一個分組發送一次合併消息之後,每隔1分鐘檢查一次告警,判斷是否要繼續對此告警做操作
repeat_interval: 5m 發送報警間隔,如果指定時間內沒有修復,則重新發送報警
receiver: 'web.hook.prometheusalert' 告警接受者,具體信息將在receivers區域中配置

注意:這裏receiver配置了一個無效的webhook,所以alertmanager可以收到告警,但是暫時發送不出去。

更新prometheus

將alertmanager集成到prometheus中,分爲兩步走:

  1. 新建告警規則文件rules.yml
  2. 更新prometheus.yml新增alertmanager相關配置

/root/prometheus/ptometheus/config 目錄下新增告警規則文件 rules.yml,用於給prometheus服務觸發告警的規則。
rules.yaml

groups:
- name: 實例存活報警
  rules:
  - alert: 服務器宕機報警
    expr: up == 0
    for: 30s
    labels:
      severity: emergency
      level: critical 
    annotations:
      description: '服務器 {{ $labels.instance }}宕機'

該規則用於測試,當一個實例up狀態爲0超過30s就產生一個告警,告警的內容就是annotations中的description, 例如:服務器node01宕機。更多告警規則自行選擇。

修改prometheus.yml相關的配置,新增告警服務和告警規則文件

global:
  scrape_interval:     30s # 每30s採集一次數據
  evaluation_interval: 30s # 每30s做一次告警檢測


# 告警服務
alerting:
  alertmanagers:
  - static_configs:
    - targets: ["172.16.9.124:9093"]

# 告警規則文件
rule_files:
  - "rules.yml"

scrape_configs:
  - job_name: prometheus
    static_configs:
      - targets: ['172.16.9.124:9090']
        labels:
          instance: prometheus
      
  - job_name: node01   
    static_configs:
      - targets: ['172.16.9.124:9100']
        labels:
          instance: node01
  
  - job_name: node02
    static_configs:
      - targets: ['192.168.123.62:9100']
        labels:
          instance: node02

啓動alertmanager服務

在docker-compose.yaml中新增alertmanager服務

version: '3'
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - /root/prometheus/prometheus/config:/etc/prometheus
      - /root/prometheus/prometheus/data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.enable-lifecycle'
  
  grafana:
    image: grafana/grafana
    container_name: grafana
    restart: always
    ports:
      - "3000:3000"
    volumes:
      - /root/prometheus/grafana/data:/var/lib/grafana
  
  alertmanager:
    image: prom/alertmanager
    container_name: alertmanager
    restart: always
    ports:
      - "9093:9093"
    volumes:
      - /root/prometheus/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml

重啓docker-compose

docker-compose down
docker-compose up -d 

登錄 172.16.9.124:9093 可以看到告警服務正常啓動

登錄prometheus web頁面,點擊菜單Alerts,可以看到所有的告警規則以及觸發狀態。當前告警處於非active的狀態。

告警測試

觸發一個告警規則,當一個node-exporter 停止30s就是觸發告警規則。關閉node01 的 node-exporter

root@ubuntu-System-Product-Name:~/prometheus/prometheus/config# docker ps | grep node
fa3754932320   prom/node-exporter                              "/bin/node_exporter"     24 hours ago    Up 24 hours             0.0.0.0:9100->9100/tcp, :::9100->9100/tcp                    eager_lehmann
root@ubuntu-System-Product-Name:~/prometheus/prometheus/config# docker stop fa3
fa3
root@ubuntu-System-Product-Name:~/prometheus/prometheus/config# 

查看prometheus服務的頁面,30s之後報警處於等待狀態

60s之後報警處於激活狀態

到這裏告警就部署完成了,因爲沒有給告警receiver配置可用的webhook,所以告警消息能收到但不能發送出去。下一步就部署能將告警消息發送到各個終端的服務 prometheusAlert。

部署prometheusAlert

alertmanager 是告警處理模塊,但是告警消息的發送方法並不豐富。如果需要將告警接入飛書,釘釘,微信等,還需要有相應的SDK適配。prometheusAlert就是這樣的SDK,可以將告警消息發送到各種終端上。

prometheus Alert 是開源的運維告警中心消息轉發系統,支持主流的監控系統 prometheus,日誌系統 Graylog 和數據可視化系統 Grafana 發出的預警消息。通知渠道支持釘釘、微信、華爲雲短信、騰訊雲短信、騰訊雲電話、阿里雲短信、阿里雲電話等。

部署prometheusAlert相關步驟:

  1. 創建飛書機器人
  2. 準備配置文件
  3. 啓動 prometheusAlert服務
  4. 對接告警服務
  5. 調試告警模板

創建飛書機器人

創建飛書機器人步驟比較簡單

添加自定義關鍵詞,後續在發送的告警消息中一定要包含該關鍵字,如果沒有飛書機器人會丟掉消息。

拿到最重要的webhook地址,後面作爲告警地址使用
https://open.feishu.cn/open-apis/bot/v2/hook/b56175a-eb8e-4498-b5a-0b712c0a3d4f
不要嘗試使用這個webhook,當你能看到的時候,該webhook已經失效了😌。

準備配置文件

新建目錄 /root/prometheus/prometheus-alert/db用於保存prometheusAlert的數據庫文件,當服務重新部署時不會丟失配置信息。

prometheus
├── alertmanager
│   └── alertmanager.yml
├── docker-compose.yaml
├── grafana
│   └── data
│       ├── alerting
│       ├── csv
│       ├── grafana.db
│       ├── plugins
│       └── png
├── prometheus
│   ├── config
│   │   ├── prometheus.yml
│   │   └── rules.yml
│   └── data
│       ├── 01HJHKAFY3SB9XYD71NECDARSV
│       ├── chunks_head
│       ├── lock
│       ├── queries.active
│       └── wal
└── prometheus-alert
    └── db

啓動prometheusAlert服務

docker-compose.yml 中新增prometheus-alert服務

version: '3'
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - /root/prometheus/prometheus/config:/etc/prometheus
      - /root/prometheus/prometheus/data:/prometheus
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus'
      - '--web.enable-lifecycle'
  
  grafana:
    image: grafana/grafana
    container_name: grafana
    restart: always
    ports:
      - "3000:3000"
    volumes:
      - /root/prometheus/grafana/data:/var/lib/grafana
  
  alertmanager:
    image: prom/alertmanager
    container_name: alertmanager
    restart: always
    ports:
      - "9093:9093"
    volumes:
      - /root/prometheus/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml
  
  prometheus-alert:
    image: feiyu563/prometheus-alert:latest
    container_name: prometheus-alert
    restart: always
    ports:
      - "9094:8080"
    volumes:
      - /root/prometheus/prometheus-alert/db:/app/db
    environment:
      - PA_LOGIN_USER=alertuser
      - PA_LOGIN_PASSWORD=123456
      - PA_TITLE=prometheusAlert
      - PA_OPEN_FEISHU=1
      - PA_OPEN_DINGDING=0
      - PA_OPEN_WEIXIN=1

參數解釋:

  • PA_LOGIN_USER=alertuser 登錄賬號
  • PA_LOGIN_PASSWORD=123456 登錄密碼
  • PA_TITLE=prometheusAlert 系統title
  • PA_OPEN_FEISHU=1 開啓飛書支持
  • PA_OPEN_DINGDING=0 開啓釘釘支持
  • PA_OPEN_WEIXIN=1 開啓微信支持
  • /root/prometheus/prometheus-alert/db 將數據庫映射出來

重啓服務

docker-compose down
docker-compose up -d

查看服務啓動狀態

root@ubuntu-System-Product-Name:~/prometheus# docker-compose ps
      Name                    Command                  State                        Ports                  
-----------------------------------------------------------------------------------------------------------
alertmanager       /bin/alertmanager --config ...   Up             0.0.0.0:9093->9093/tcp,:::9093->9093/tcp
grafana            /run.sh                          Up             0.0.0.0:3000->3000/tcp,:::3000->3000/tcp
prometheus         /bin/prometheus --config.f ...   Up             0.0.0.0:9090->9090/tcp,:::9090->9090/tcp
prometheus-alert   /bin/sh /app/docker-entryp ...   Up (healthy)   0.0.0.0:9094->8080/tcp,:::9094->8080/tcp

查看日誌
docker logs -f 5ec

登錄web頁面

prometheusAlert到這了就部署完成了,目前只是部署好該服務,還沒有將服務器接入到告警消息流中。

對接告警服務

prometheusAlert是用於將告警服務alertmanager產生的消息發送給終端,也就是將消息格式化,適配不同的終端,如郵件,短信,微信,釘釘,飛書等不同的接口。

將alertmanager告警消息的接受者指定爲prometheus-alert提供的url。修改告警規則rules.yml,添加webhook_configs中url配置。
rules.py

global:
  resolve_timeout: 5m
route:
  group_by: ['instance']
  group_wait: 10m
  group_interval: 10s
  repeat_interval: 10m
  receiver: 'web.hook.prometheusalert'
receivers:
- name: 'web.hook.prometheusalert'
  webhook_configs:
  - url: 'http://172.16.9.124:9094/prometheusalert?type=fs&tpl=prometheus-fs&fsurl=https://open.feishu.cn/open-apis/bot/v2/hook/5f4b9c9b-9fed-4bb9-af26-3e1ce174d145'

http://172.16.9.124:9094/prometheusalert?type=fs&tpl=prometheus-fs&fsurl=xxx
是prometheus-alert提供的固定格式,

  • type=fs表示爲飛書
  • tpl=prometheus-fs 表示是prometheus消息
  • fsurl 爲飛書機器人的webhook,就是創建飛書機器人拿到的webhook

這些參數非常關鍵,通過type和tpl可以匹配到prometheus-alert上的模板,以上參數匹配到就是飛書的模板。當消息到來的時候,會自動適配到飛書模板,發送給飛書機器人。

重啓alertmanager讓配置生效

docker-compose start alermanager

重啓之後飛書應該就能收到告警消息了

如果不能收到告警消息,排查三個地方,查看告警信息的流向:
一、prometheus 觸發的告警。
是否產生了告警消息

二、prometheusAlert 接收到的告警msg。
當prometheusAlert對接alertmanager之後,告警消息就能發送過來,從日誌中可以看到prometheusAlert接收到的錯誤信息。

三、prometheusAlert web端顯示發送的告警。
查看prometheusAlert的消息統計信息,是否有消息發送進來和出去。如果從日誌中看到有消息進來,但是統計頁面沒有消息出去,那就是服務模板配置有問題,有問題——看日誌。
image.png

調試告警模板

默認告警模板很難滿足所有人的審美,如果要選擇更多模板,可以使用prometheusAlert提供的模板功能完成。默認的模板如下:

進入模板編輯頁面

紅框內容都是必填內容,分別是模板的內容,日誌中json格式的告警消息,飛書機器人的地址。

其中模板可以從這裏去找:https://github.com/feiyu563/prometheusAlert/issues/30,比如說我個人喜歡這個

填寫相應的信息

點擊測試,能夠發送該模板的消息到飛書機器人

當告警恢復了之後,還會發送一個恢復的消息

爲了方便測試,把模板和告警日誌也搬過來
模板

{{ range $k,$v:=.alerts }}{{if eq $v.status "resolved"}}<font color="green">**告警恢復信息**</font>
事件: **{{$v.labels.alertname}}**
告警類型:{{$v.status}}
告警級別: {{$v.labels.level}}
開始時間: {{GetCSTtime $v.startsAt}}
結束時間: {{GetCSTtime $v.endsAt}}
主機: {{$v.labels.instance}}
<font color="green">**事件詳情: {{$v.annotations.description}}**</font>
{{else}}**告警信息**
事件: **{{$v.labels.alertname}}**
告警類型:{{$v.status}}
告警級別: {{$v.labels.level}}
開始時間: {{GetCSTtime $v.startsAt}}
主機: {{$v.labels.instance}}
<font color="red">**事件詳情: {{$v.annotations.description}}**</font>
{{end}}
{{ end }}

日誌

{"msg_type":"interactive","email":"[email protected]","card":{"config":{"wide_screen_mode":true,"enable_forward":true},"elements":[{"tag":"div","text":{"content":"\r\n\r\n**[prometheus告警信息](http://b616a9009165:9090/graph?g0.expr=up+%3D%3D+0\u0026g0.tab=1)**\r\n*[服務器宕機報警](http://054ff0c0b9ab:9093)*\r\n告警級別:critical\r\n開始時間:2023-12-28 01:38:28\r\n結束時間:0001-01-01 00:00:00\r\n故障主機IP:node01\r\n**服務器 node01宕機**\r\n\r\n","tag":"lark_md"},"content":"","elements":null},{"tag":"hr","text":{"content":"","tag":""},"content":"","elements":null},{"tag":"note","text":{"content":"","tag":""},"content":"","elements":[{"tag":"lark_md","text":{"content":"","tag":""},"content":"prometheusAlert","elements":null}]}],"header":{"title":{"content":"prometheusAlert","tag":"plain_text"},"template":"red"}}}

ok,到此爲止prometheus的搭建就完成了,撒花🎉🎉🎉

整個過程步驟較多,即使是我第二次搭建也出現了很多問題。有問題也不要慌,多看日誌,搜索報錯記錄,分析可能的報錯原因,問題終會解決👌。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章