本篇介紹如何在 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 網頁介面 Graph 頁面中,可以透過 PromQL 語法查詢資料庫中的監控資訊,例如輸入 node_load1
就可以查詢受監控機器的一分鐘的負載量,以下是 node_load1{instance="localhost:9100",job="node"}
的圖形:
安裝 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」。
Step 2
在 Grafana 新增資料來源的頁面中,選擇「Prometheus」。
設定 Prometheus 資料來源,在 URL 欄位填入 Prometheus 伺服器的位址,Prometheus 伺服器預設的連接埠是
9090
,例如 http://localhost:9090/
。
Step 4
接著選擇「Import」功能,匯入儀表板(dashboard)。
Step 5
在「Import via grafana.com」欄位中,填入 1860
,匯入 Node Exporter Full 儀表板。
Step 6
選擇 Prometheus 資料來源,點選「Import」。
Step 7
選擇 Grafana 的儀表板,就可以看到各種監控資料了。
Prometheus 告警
Prometheus 可以自訂告警的規則,在前面的 /etc/prometheus/prometheus.yml
設定檔中,我們有設定載入 first_rules.yml
與 second_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 頁面中查詢目前設定的告警規則:
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 也會同時發送告警的 Email 通知信給我們設定的收件者。