Categories: Linux

Linux 使用 Prometheus 與 Grafana 監控伺服器狀態、發送告警 Email 簡訊教學與範例

本篇介紹如何在 Ubuntu Linux 中安裝與設定 Prometheus 與 Grafana,用來監控伺服器狀態、發送告警 Email 簡訊。

安裝 Prometheus 伺服器

在管理者用來監控系統狀態的伺服器上,安裝 prometheus 套件:

# 安裝 prometheus 套件
sudo apt install prometheus

Prometheus 伺服器本身的設定檔位於 /etc/default/prometheus,在這個設定檔中可以調整 Prometheus 伺服器傾聽的網路介面與連接埠、資料保存時間、記錄檔層級等系統面的設定,也就是啟動 Prometheus 伺服器時傳遞給 Prometheus 伺服器的指令參數。以下是一個簡單的設定範例:

# 指定 Prometheus 伺服器傾聽 0.0.0.0:9090,資料保存時間為 15 天
ARGS="--web.listen-address='0.0.0.0:9090' --storage.tsdb.retention=15d"

詳細的參數與說明可以參考設定檔中的註解說明。

Prometheus 伺服器可以使用 systemctl 指令來操控:

# 查詢 Prometheus 伺服器狀態
systemctl status prometheus

# 啟動 Prometheus 伺服器
sudo systemctl start prometheus

# 重新啟動 Prometheus 伺服器
sudo systemctl restart prometheus

# 停止 Prometheus 伺服器
sudo systemctl stop prometheus

# 重新載入 Prometheus 伺服器
sudo systemctl reload prometheus

安裝 Alertmanager 伺服器

在負責發送告警的伺服器上,安裝 prometheus-alertmanager 套件:

# 安裝 prometheus 與 prometheus-alertmanager
sudo apt install prometheus-alertmanager

Alertmanager 伺服器通常可以跟 Prometheus 伺服器放在同一台機器上。

Alertmanager 伺服器的設定檔位於 /etc/default/prometheus-alertmanager,雖然可調整的參數不同,但設定方式跟 Prometheus 伺服器的設定檔類似,都是設定啟動伺服器時的指令參數。

Alertmanager 伺服器可以使用 systemctl 指令來操控:

# 查詢 Alertmanager 伺服器狀態
systemctl status prometheus-alertmanager

# 啟動 Alertmanager 伺服器
sudo systemctl start prometheus-alertmanager

# 重新啟動 Alertmanager 伺服器
sudo systemctl restart prometheus-alertmanager

# 停止 Alertmanager 伺服器
sudo systemctl stop prometheus-alertmanager

# 重新載入 Alertmanager 伺服器
sudo systemctl reload prometheus-alertmanager

安裝 Node Exporter

在受監控的機器上安裝 prometheus-node-exporter 套件:

# 安裝 prometheus-node-exporter 套件
sudo apt install prometheus-node-exporter

Node Exporter 本身也是一個伺服器,其設定檔位於 /etc/default/prometheus-node-exporter,設定方式也都類似,在這個設定檔中可以調整 Node Exporter 要收集的系統資訊。

Node Exporter 伺服器可以使用 systemctl 指令來操控:

# 查詢 Node Exporter 伺服器狀態
systemctl status prometheus-node-exporter

# 啟動 Node Exporter 伺服器
sudo systemctl start prometheus-node-exporter

# 重新啟動 Node Exporter 伺服器
sudo systemctl restart prometheus-node-exporter

# 停止 Node Exporter 伺服器
sudo systemctl stop prometheus-node-exporter

# 重新載入 Node Exporter 伺服器
sudo systemctl reload prometheus-node-exporter

設定 Prometheus 伺服器

Prometheus 伺服器的預設設定檔路徑是 /etc/prometheus/prometheus.yml,在這個檔案中可以調整 Prometheus 伺服器的各種設定,此設定檔的語法採用 YAML,參數設定方式與說明可參考 Prometheus 官方網頁的說明或是官方的設定檔範例。以下是一個最簡單的設定檔範例:

# 預設參數
global:
  scrape_interval:     15s # 抓取監控資訊的間隔時間
  evaluation_interval: 15s # 評判告警規則的間隔時間

  # 將資料或告警轉送外部系統時附加的標籤資訊
  external_labels:
      monitor: 'example'

# Alertmanager 設定
alerting:
  alertmanagers:
  - static_configs:
    - targets: ['localhost:9093'] # Alertmanager 伺服器位址

# 載入告警規則,依據 evaluation_interval 設定的間隔時間定期評判告警
rule_files:
  - "first_rules.yml"
  - "second_rules.yml"
  - "my_rules/*.yml"    # 載入目錄下所有 YAML 檔案

# 抓取監控資訊
scrape_configs:

  # 抓取 Prometheus 伺服器本身的資訊
  - job_name: 'prometheus'

    # 覆蓋預設的設定值
    scrape_interval: 5s # 抓取監控資訊的間隔時間
    scrape_timeout: 5s  # 評判告警規則的間隔時間

    metrics_path: '/metrics' # metrics 路徑,預設為 '/metrics'
    scheme: 'http'           # 傳輸協定,預設為 'http'

    static_configs:
      - targets: ['localhost:9090'] # 受監控機器的位址

  # 抓取 Node Exporter 的資訊
  - job_name: 'node'
    static_configs:
      - targets: ['localhost:9100'] # 受監控機器的位址

global 區塊中,可以設定各種參數的預設值,在後續的區塊中若沒有明確指定參數值,就會採用 global 中的設定值。

alerting 區塊則是連接 Alertmanager 的設定,這裡只有簡單指定 Alertmanager 伺服器位址而已。

rule_files 區塊可以引入自己定義的告警規則,讓 Prometheus 根據 evaluation_interval 參數所設定的間隔時間來定期評估告警規則,產生對應的告警訊息。告警規則我們會在後面的內容介紹如何撰寫,這裡在測試時可以暫時先將這幾行設定拿掉。

scrape_configs 區塊則是定義各個被監控的機器資訊,在 Prometheus 中每一個可被監控的個體稱為 instance,而多個相同功能的 instance 可以組成一個 job,而 job 與 instance 的資訊都寫在 scrape_configs 區塊中。這裡我們設定的監控資訊來源有兩個,一個是 Prometheus 伺服器本身的資訊,另一個則是自行安裝 Node Exporter 節點。

在設定 job 與 instance 的時候,若遇到連線相關的問題,可以使用 curl 等指令工具先測試各 instance 本身是否能正常提供 metrics:

# 測試 Prometheus 伺服器的 metrics
curl http://localhost:9090/metrics

# 測試 Node Exporter 伺服器的 metrics
curl http://localhost:9100/metrics

正常來說各個 instance 的 metrics_path 路徑都要能正常傳回所有監控的資訊。

更改完 Prometheus 伺服器的設定之後,要重新載入 Prometheus 伺服器,讓設定生效:

# 重新載入 Prometheus 伺服器
sudo systemctl reload prometheus

重新載入設定之後,正常來說以瀏覽器開啟 Prometheus 伺服器的 http://localhost:9090/ 就可以看到 Prometheus 伺服器的網頁操作介面,首先在主選單的「Status」中選擇「Targets」,查看目前 Prometheus 所設定好的監控資訊接收來源。

Prometheus 網頁介面

在 Prometheus 網頁介面 Graph 頁面中,可以透過 PromQL 語法查詢資料庫中的監控資訊,例如輸入 node_load1 就可以查詢受監控機器的一分鐘的負載量,以下是 node_load1{instance="localhost:9100",job="node"} 的圖形:

Prometheus 網頁介面

安裝 Grafana 伺服器

Grafana 是一個儀錶板工具,可用於顯示 Prometheus 所收集的各種監測資料,在 Ubuntu Linux 中可以透過 apt 來安裝 Grafana:

# 匯入開發者金鑰
wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -

# 加入 Grafana 套件庫
echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list

# 安裝 Grafana
sudo apt-get update
sudo apt-get install grafana

# 啟用 Grafana 服務
sudo systemctl daemon-reload
sudo systemctl enable grafana-server

Grafana 伺服器同樣可以使用系統的 systemctl 指令來操控:

# 查詢 Grafana 伺服器狀態
systemctl status grafana-server

# 啟動 Grafana 伺服器
sudo systemctl start grafana-server

# 重新啟動 Grafana 伺服器
sudo systemctl restart grafana-server

# 停止 Grafana 伺服器
sudo systemctl stop grafana-server

# 重新載入 Grafana 伺服器
sudo systemctl reload grafana-server

安裝好 Grafana 之後,以瀏覽器開啟 http://localhost:3000/,預設的帳號為 admin,預設密碼也是 admin,登入之後會立即重新設定密碼。

登入 Grafana 之後,就可以看到 Grafana 的網頁介面,接著依據以下步驟設定 Prometheus 的資料來源與儀表板。
Step 1
新增資料來源(data source),點選「Add your first data source」。

Grafana 網頁介面

Step 2
在 Grafana 新增資料來源的頁面中,選擇「Prometheus」。

Grafana 新增資料來源

Step 3
設定 Prometheus 資料來源,在 URL 欄位填入 Prometheus 伺服器的位址,Prometheus 伺服器預設的連接埠是 9090,例如 http://localhost:9090/

設定 Prometheus 資料來源

Step 4
接著選擇「Import」功能,匯入儀表板(dashboard)。

選擇「Import」功能

Step 5
在「Import via grafana.com」欄位中,填入 1860,匯入 Node Exporter Full 儀表板

匯入 Node Exporter Full 儀表板

Step 6
選擇 Prometheus 資料來源,點選「Import」。

匯入 Node Exporter Full 儀表板

Step 7
選擇 Grafana 的儀表板,就可以看到各種監控資料了。

Node Exporter Full 儀表板

Prometheus 告警

Prometheus 可以自訂告警的規則,在前面的 /etc/prometheus/prometheus.yml 設定檔中,我們有設定載入 first_rules.ymlsecond_rules.yml 兩個 YAML 設定檔,以及 my_rules 目錄下所有 YAML 檔案,在這些 YAML 檔案中都可以撰寫自己定義的告警規則。

新增告警規則

假設我們要新增一個 CPU 高負載的告警規則,可以在 my_rules 目錄下新增一個 cpu.yml 檔案,設定 CPU 負載量超過 80% 的時候產生告警,設定檔內容如下:

groups:
  - name: example_node
    rules:
      - alert: HostHighCpuLoad
        expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m])) * 100) > 80
        for: 0m
        labels:
          severity: warning
        annotations:
          summary: Host high CPU load (instance {{ $labels.instance }})
          description: "CPU load is > 80%\n  VALUE = {{ $value }}\n  LABELS = {{ $labels }}"

Awesome Prometheus alerts 中有非常多常用的告警規則範例,建議可以從中選擇需要的設定,複製後再自行調整。

撰寫好告警規則檔之後,可以使用 promtool 工具來檢查語法是否正確:

# 檢查告警規則語法
promtool check rules cpu.yml
Checking cpu.yml
  SUCCESS: 1 rules found

設定好告警規則之後,重新啟動 Prometheus 伺服器:

# 重新啟動 Prometheus 伺服器
sudo systemctl restart prometheus

此時我們可以在 Prometheus 的 Rules 頁面中查詢目前設定的告警規則:

Prometheus 的 Rules 頁面

Alertmanager 告警訊息遞送設定

編輯 /etc/prometheus/alertmanager.yml 設定檔,參考 Prometheus 官方的文件說明,依據自己的需求設定告警訊息的遞送方式,最常見的就是透過 Email 發送告警訊息:

# 預設參數
global:
  # 郵件伺服器相關設定
  smtp_smarthost: 'localhost:25'
  smtp_from: 'alertmanager@localhost'
  # smtp_auth_username: 'alertmanager'
  # smtp_auth_password: 'password'
  smtp_require_tls: false

# 告警通知路由設定
route:
  # 告警通知的群組設定,合併相同的 alertname, cluster 與 service
  group_by: ['alertname', 'cluster', 'service']

  # 告警群組訊息建立後的等待時間
  group_wait: 30s

  # 相同群組,發送新告警訊息的間隔時間
  group_interval: 5m

  # 重新發送相同告警訊息的間隔時間
  repeat_interval: 3h

  # 預設收件者
  receiver: admin-mails

# 收件者設定
receivers:
- name: 'admin-mails'
  email_configs:
  - to: 'root@localhost'

這裡的 smtp_require_tls 可以設定是否要使用 TLS 加密的 SMTP 連線,在初期開發與測試的階段,可以先設定為 false 會比較方便,在正式環境中再加入 TLS 加密功能。

更新 Alertmanager 的設定之後,重新啟動 Alertmanager 伺服器:

# 重新啟動 Alertmanager 伺服器
sudo systemctl restart prometheus-alertmanager

測試告警規則

我們可以使用以下指令讓系統的 CPU 處於滿載的狀態,測試告警訊息是否會發送。

# 讓 CPU 處於滿載狀態
cat /dev/zero > /dev/null

若要測試更多的系統負載,可以參考 Linux 使用 Stress-ng 測試 CPU、記憶體、磁碟 I/O 滿載情況教學與範例

當 CPU 負載量超過 80% 之後,就會出現告警,我們可以在 Prometheus 的 Alerts 頁面查詢目前出現的告警:

Prometheus 的 Alerts 頁面

這時候 Prometheus 也會同時發送告警的 Email 通知信給我們設定的收件者。

參考資料

Share
Published by
Office Guide

Recent Posts

Python 使用 PyAutoGUI 自動操作滑鼠與鍵盤

本篇介紹如何在 Python ...

1 年 ago

Ubuntu Linux 以 WireGuard 架設 VPN 伺服器教學與範例

本篇介紹如何在 Ubuntu ...

1 年 ago

Linux 網路設定 ip 指令用法教學與範例

本篇介紹如何在 Linux 系...

1 年 ago

Linux 以 Cryptsetup、LUKS 加密 USB 隨身碟教學與範例

介紹如何在 Linux 系統中...

1 年 ago