Prometheus 與 Alertmanager 的整合是建構健全監控系統的關鍵。Alertmanager 負責處理 Prometheus 傳送的警示,透過分組、抑制和路由機制,避免警示轟炸,確保警示訊息精準送達。本文詳細說明如何在 Linux 和 Windows 環境下安裝和設定 Alertmanager,包含組態 SMTP 以傳送郵件通知,並解說 Alertmanager 的路由機制,讓不同警示能根據規則傳送到對應的團隊。此外,文章也涵蓋了 Alertmanager 的服務發現設定,讓 Prometheus 能夠自動發現 Alertmanager 例項,以及如何監控 Alertmanager 本身和建立 CPU 警示規則,確保整個監控系統的穩定性和可靠性。
第6章:警示與Alertmanager
警示機制
警示機制能夠通知我們環境中的某些狀態已經發生變化,通常是向壞的方向發展。一個好的警示關鍵在於在適當的時間、以適當的頻率傳送,並包含有用的資訊。
最常見的警示反模式是傳送過多的警示。過多的警示相當於「狼來了」的故事,會讓接收者對警示麻木,並忽略重要的警示。常見的過多警示原因包括:
- 警示不具可執行性,只是資訊性質的。應該關閉這些警示,或將其轉換為計算速率的計數器,而不是對症狀發出警示。
- 上游主機或服務故障會觸發下游所有相關警示。應該確保警示系統能夠識別和抑制這些重複或相鄰的警示。
- 對原因而非症狀發出警示。症狀是應用程式停止運作的跡象,可能有多種原因。高延遲是API或網站的症狀,可能由多種問題引起,例如高資料函式庫使用率、記憶體問題、磁碟效能等。對症狀發出警示能夠識別真實問題,而對原因發出警示可能會導致錯過更重要的問題。
第二種常見的反模式是錯誤分類別警示。有時,這意味著重要的警示被埋在其他警示中;有時,警示被傳送到錯誤的地方,或具有錯誤的緊急程度。
第三種常見的反模式是傳送無用的警示,尤其是當接收者是疲憊的工程師,在夜間已經收到多次警示時。例如,一個典型的Nagios警示可能只提供有限的資訊,如磁碟空間使用率,但沒有提供足夠的背景資訊,如使用率是否突然增加或逐漸增長。
一個好的警示機制應該具備以下特點:
- 適當的警示數量,專注於症狀而非原因。
- 正確的警示優先順序,如果警示緊急,應快速路由到負責回應的團隊。
- 警示應包含足夠的背景資訊,以便立即採取行動。
Alertmanager的工作原理
Alertmanager負責處理客戶端(通常是Prometheus伺服器)傳送的警示。它能夠對警示告進行重複資料刪除、分組和路由,並將其傳送到電子郵件、簡訊或其他SaaS服務(如PagerDuty)。我們還可以使用Alertmanager進行維護管理。
在Prometheus伺服器上,我們會編寫警示規則,這些規則使用我們收集的指標並根據指定的閾值或條件觸發。當閾值或條件滿足時,會生成一個警示並推播到Alertmanager。Alertmanager根據警示的標籤進行處理和路由,將其傳送到外部目的地,如電子郵件或簡訊。
Alertmanager架構圖
graph LR A[Prometheus Server] -->|alerts|> B[Alertmanager] B -->|routes|> C[Email] B -->|routes|> D[SMS] B -->|routes|> E[PagerDuty]
此圖示展示了Alertmanager的基本架構。
安裝Alertmanager
Alertmanager是一個獨立的Go二進位制檔案,可以從Prometheus.io下載頁面下載特定平台的二進位制檔案。目前,Alertmanager支援多個平台,包括Linux、Mac OS X、FreeBSD、OpenBSD、NetBSD、Microsoft Windows和DragonFly。
在Linux上安裝Alertmanager
要在64位元Linux主機上安裝Alertmanager,可以下載壓縮的tarball檔案。使用wget或curl從下載網站取得檔案。
$ cd /tmp
$ wget https://github.com/prometheus/alertmanager/releases/download/v0.15.0-rc.2/alertmanager-0.15.0-rc.2.linux-amd64.tar.gz
解壓縮tarball檔案,將Alertmanager二進位制檔案複製到適當的位置,並更改其所有權為root使用者。
$ tar -xzf alertmanager-0.15.0-rc.2.linux-amd64.tar.gz
$ sudo cp alertmanager-0.15.0-rc.2.linux-amd64/alertmanager /usr/local/bin/
同時,將amtool二進位制檔案複製到PATH中。amtool用於幫助管理Alertmanager和從命令列排程維護視窗。
$ sudo cp alertmanager-0.15.0-rc.2.linux-amd64/amtool /usr/local/bin
現在,可以透過檢查版本來測試Alertmanager是否已安裝並在PATH中。
內容解密:
- 下載Alertmanager:首先,我們需要從官方網站下載適合我們作業系統的Alertmanager版本。在這個例子中,我們下載了適用於64位元Linux的版本。
- 解壓縮檔案:使用
tar
命令解壓縮下載的tarball檔案。 - 安裝Alertmanager和amtool:將解壓縮後的Alertmanager和amtool二進位制檔案複製到系統的二進位制目錄中,通常是
/usr/local/bin/
,以便可以直接從命令列執行它們。 - 驗證安裝:透過執行Alertmanager並檢查其版本來驗證安裝是否成功。
這些步驟確保了Alertmanager正確安裝在系統上,並準備好接收和處理來自Prometheus伺服器的警示。
第6章:警示與Alertmanager
在Linux上檢查Alertmanager版本
$ alertmanager --version
alertmanager, version 0.15.0-rc.2 (branch: HEAD, revision: 30dd0426c08b6479d9a26259ea5efd63bc1ee273)
build user: root@3e103e3fc918
build date: 20171116-17:45:26
go version: go1.9.2
內容解密:
- 此命令用於檢查Alertmanager的版本資訊。
- 版本號為
0.15.0-rc.2
,表示這是一個候選版本。 build user
和build date
提供了編譯Alertmanager的使用者和時間。go version
表示用於編譯Alertmanager的Go語言版本。
在Microsoft Windows上安裝Alertmanager
首先,在Windows上建立一個目錄來存放Alertmanager的可執行檔。
C:\> MKDIR alertmanager
C:\> CD alertmanager
內容解密:
- 使用
MKDIR
命令建立名為alertmanager
的目錄。 - 使用
CD
命令切換到剛建立的目錄。
然後,從GitHub下載Alertmanager的可執行檔到C:\alertmanager
目錄。
https://github.com/prometheus/alertmanager/releases/download/v0.15.0-rc.2/alertmanager-0.15.0-rc.2.windows-amd64.tar.gz
內容解密:
- 這是下載Alertmanager Windows版本的連結。
- 需要使用像是7-Zip的工具來解壓縮下載的檔案。
將C:\alertmanager
目錄加入到系統路徑中,以便Windows能夠找到可執行檔。
$env:Path += ";C:\alertmanager"
內容解密:
- 此命令將
C:\alertmanager
目錄新增到環境變數Path
中。 - 這樣就可以在任意位置執行
alertmanager.exe
。
檢查Alertmanager版本以確認安裝成功。
C:\> alertmanager.exe --version
alertmanager, version 0.15.0-rc.2 (branch: HEAD, revision: 30dd0426c08b6479d9a26259ea5efd63bc1ee273)
build user: root@3e103e3fc918
build date: 20171116-17:45:26
go version: go1.9.2
內容解密:
- 與Linux上的命令相同,用於檢查Alertmanager的版本。
組態Alertmanager
Alertmanager使用YAML格式的組態檔案。建立一個新的組態檔案並新增基本組態,以便透過電子郵件傳送警示。
global:
smtp_smarthost: 'localhost:25'
smtp_from: 'alertmanager@example.com'
smtp_require_tls: false
templates:
- '/etc/alertmanager/template/*.tmpl'
route:
receiver: email
receivers:
- name: 'email'
email_configs:
- to: 'alerts@example.com'
內容解密:
global
區塊包含了全域性組態,如SMTP伺服器設定和發件人地址。templates
區塊指定了存放警示範本的目錄。route
區塊定義了警示的路由規則,將警示傳送到指定的接收者。receivers
區塊定義了接收者的組態,這裡使用電子郵件接收者。
啟動Alertmanager
使用以下命令啟動Alertmanager,指定剛才建立的組態檔案。
$ alertmanager --config.file alertmanager.yml
內容解密:
--config.file
引數指定了組態檔案的路徑。- Alertmanager預設在9093埠上執行,並提供了一個網頁介面:
http://localhost:9093/
。
Alertmanager路由說明
路由(route)區塊定義瞭如何處理接收到的警示。可以根據不同的條件將警示路由到不同的接收者。
graph LR; A[開始] --> B{路由規則}; B -->|比對規則1|> C[接收者1]; B -->|比對規則2|> D[接收者2]; B -->|預設|> E[預設接收者];
此圖示展示了Alertmanager的路由邏輯。警示首先進入根路由,然後根據比對規則被路由到不同的接收者。
內容解密:
- 路由規則允許根據不同的條件對警示進行分類別處理。
- 每個路由節點可以定義不同的接收者和處理邏輯。
第6章:警示和Alertmanager
Alertmanager網頁介面
Alertmanager提供了一個網頁介面,可以用來檢視目前的警示和管理維護視窗的警示抑制(在Prometheus術語中稱為“silences”)。
提示
Alertmanager還提供了一個名為amtool
的命令列工具,可以用來查詢警示、管理silences和與Alertmanager伺服器互動。
組態Prometheus以使用Alertmanager
現在,讓我們組態Prometheus來找到我們的Alertmanager。在第3章中,我們看到了prometheus.yml
組態檔案中的預設Alertmanager組態。Alertmanager的組態包含在alerting
區塊中。讓我們來看看預設的區塊。
Alertmanager組態區塊
alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
alerting
區塊包含允許Prometheus識別一個或多個Alertmanager的組態。為此,Prometheus重用了相同的發現機制來找到要抓取的目標。在預設組態中,這是static_configs
。就像監控作業一樣,這指定了一個目標列表,這裡以主機名alertmanager
和埠9093(Alertmanager預設埠)的形式出現。
提示
您還可以在Prometheus網頁介面的狀態頁面(http://localhost:9090/status)上看到任何已組態的Alertmanager。
Alertmanager服務發現
由於我們可以使用服務發現機制,因此我們也可以使用其中之一來識別一個或多個Alertmanager。讓我們新增一個DNS SRV記錄,允許Prometheus發現我們的Alertmanager。
Alertmanager SRV記錄
_alertmanager._tcp.example.com. 300 IN SRV 10 1 9093 alertmanager1.example.com.
在這裡,我們指定了一個名為_alertmanager
的TCP服務,以SRV記錄的形式出現。我們的記錄傳回主機名alertmanager1.example.com
和埠號9093,Prometheus將在那裡找到一個正在執行的Alertmanager。讓我們組態Prometheus伺服器來搜尋那裡。
發現Alertmanager
alerting:
alertmanagers:
- dns_sd_configs:
- names: [ '_alertmanager._tcp.example.com' ]
在這裡,Prometheus將查詢_alertmanager._tcp.example.com
SRV記錄以傳回我們的Alertmanager的主機名。我們可以使用其他服務發現機制來識別Alertmanager給Prometheus。
提示
您需要重新載入或重啟Prometheus以啟用Alertmanager組態。
監控Alertmanager
像Prometheus一樣,Alertmanager暴露了關於自身的指標。讓我們建立一個Prometheus作業來監控我們的Alertmanager。
Alertmanager Prometheus作業
- job_name: 'alertmanager'
static_configs:
- targets: ['localhost:9093']
這將從http://localhost:9093/metrics收集指標,並抓取一系列以alertmanager_
為字首的時間序列。這些包括按狀態劃分的警示計數,以及按接收者劃分的成功和失敗通知的計數(例如,所有傳送到電子郵件接收者的失敗通知)。它還包含叢集狀態指標,我們可以在第7章中檢視Alertmanager叢集時使用。
新增警示規則
現在我們已經設定了Alertmanager,讓我們新增第一個警示規則。我們將根據第4章中開發的節點查詢建立警示,以及一些使用up
指標的基本可用性警示。
像記錄規則一樣,警示規則被定義為YAML陳述式,在Prometheus伺服器組態中載入的規則檔案中。讓我們建立一個新的檔案node_alerts.yml
,在我們的規則目錄中儲存我們的節點警示規則。
建立警示規則檔案
$ cd rules
$ touch node_alerts.yml
讓我們使用globbing來載入所有以_rules.yml
或_alerts.yml
結尾的檔案,而不是將此檔案新增到prometheus.yml
組態檔案中的rule_files
區塊。
新增globbing rule_files區塊
rule_files:
- "rules/*_rules.yml"
- "rules/*_alerts.yml"
您可以看到,我們增加了組態,以載入所有具有正確命名約定的檔案。我們需要重啟Prometheus伺服器來載入這個新的警示規則檔案。
新增第一個警示規則
讓我們新增第一個規則:一個CPU警示規則。我們將建立一個警示,如果CPU查詢(我們建立的平均節點CPU五分鐘速率)超過80%,並且至少持續60分鐘,就會觸發。
第一個警示規則
groups:
- name: node_alerts
rules:
- alert: HighNodeCPU
expr: instance:node_cpu:avg_rate5m > 80
for: 60m
labels:
severity: warning
annotations:
summary: High Node CPU for 1 hour
console: You might want to check the Node Dashboard at http://grafana.example.com/dashboard/db/node-dashboard
像我們的記錄規則一樣,警示規則被分組在一起。我們指定了一個組名:node_alerts
。此組中的規則包含在rules
區塊中。每個規則都有一個名稱,在alert
子句中指定。我們的名稱是HighNodeCPU
。在每個警示組中,警示名稱需要是唯一的。
詳細解說:
alert: HighNodeCPU
:定義了警示的名稱為HighNodeCPU。expr: instance:node_cpu:avg_rate5m > 80
:定義了觸發警示的條件,即當節點的平均CPU使用率在過去5分鐘內超過80%。for: 60m
:指定了條件需要持續滿足的時間,即60分鐘。labels:
和annotations:
:提供了額外的資訊,如嚴重性和摘要,以幫助管理和理解警示。
這些設定將有助於監控節點CPU使用率,並在必要時發出警示,以便進行及時處理。