在 Kubernetes 環境中佈署應用程式時,監控是確保系統穩定性和效能的關鍵環節。本文以 Tornado 框架為例,詳細介紹如何利用 Prometheus 和 Grafana 建立完善的監控體系。首先,我們會使用 Sidecar 模式佈署 Prometheus 客戶端,收集 Tornado 應用程式的關鍵指標,例如請求延遲、錯誤率和可用性。接著,我們將示範如何組態 Prometheus 來抓取這些指標,並在 Grafana 中建立儀錶板來視覺化資料。最後,我們將設定 Alertmanager,以便在指標異常時傳送警示通知,確保及時應對潛在問題。
監控應用程式堆積疊:Tornado 案例分析
在前面的章節中,我們已經探討瞭如何使用 Prometheus 和 Grafana 來監控 Kubernetes 叢集。本章節將重點介紹如何監控執行在 Kubernetes 上的應用程式堆積疊,以 Tornado 為例進行詳細說明。
使用 Sidecar 模式進行監控
Sidecar 模式是一種常見的容器設計模式,用於在 Kubernetes Pod 中佈署輔助容器,以擴充套件或增強主容器的功能。在監控場景中,我們可以使用 Sidecar 容器來收集應用程式的指標資料,並將其暴露給 Prometheus。
Tornado API 的監控範例
對於 Tornado API,我們可以建立一個 Sidecar 容器來收集其效能指標,例如請求延遲、錯誤率等。這些指標將透過 Prometheus 的客戶端函式庫暴露出來,供 Prometheus 伺服器抓取。
apiVersion: apps/v1
kind: Deployment
metadata:
name: tornado-api
spec:
replicas: 3
selector:
matchLabels:
app: tornado-api
template:
metadata:
labels:
app: tornado-api
spec:
containers:
- name: tornado-api
image: tornado-api:latest
ports:
- containerPort: 80
- name: prometheus-sidecar
image: prometheus-sidecar:latest
ports:
- containerPort: 9090
設定 Prometheus 指標
在 Tornado API 的程式碼中,我們需要使用 Prometheus 的客戶端函式庫來定義和收集指標。例如,我們可以定義一個 Histogram 型別的指標來追蹤請求延遲:
from prometheus_client import Histogram
REQUEST_LATENCY = Histogram(
'request_latency_seconds',
'Request latency in seconds',
['method', 'endpoint']
)
def handle_request(request):
start_time = time.time()
# 處理請求...
latency = time.time() - start_time
REQUEST_LATENCY.labels(request.method, request.path).observe(latency)
建立警示規則
有了指標資料後,我們可以建立警示規則來通知維運團隊潛在的問題。例如,我們可以設定一個警示,當 Tornado API 的請求延遲超過某個閾值時觸發:
groups:
- name: tornado-alerts
rules:
- alert: HighRequestLatency
expr: histogram_quantile(0.99, rate(request_latency_seconds_bucket[5m])) > 0.5
for: 10m
labels:
severity: warning
annotations:
summary: High request latency detected
Tornado API 可用性監控
除了效能指標外,我們還可以監控 Tornado API 的可用性。這可以透過定義一個名為 tornado_up 的 Gauge 指標來實作,該指標的值表示 API 是否正常執行:
from prometheus_client import Gauge
TORNADO_UP = Gauge('tornado_up', 'Tornado API availability')
def check_availability():
try:
# 檢查 API 是否可用...
TORNADO_UP.set(1)
except Exception:
TORNADO_UP.set(0)
根據 tornado_up 指標,我們可以建立警示規則,當 API 不可用時通知維運團隊:
- alert: TornadoAPIServerDown
expr: tornado_up{kubernetes_name="tornado-api"} != 1
for: 10m
labels:
severity: critical
annotations:
summary: API Server {{ $labels.instance }} is down!
本章重點回顧:
- Sidecar模式:使用輔助容器擴充套件主容器的功能,特別是在監控場景中。
- Prometheus指標:定義和收集應用程式的效能指標,如請求延遲和錯誤率。
- 警示規則:根據指標資料建立警示規則,以便及時發現和處理問題。
透過這些技術的綜合運用,我們能夠有效地監控和管理複雜的應用程式堆積疊,確保其高效穩定執行。
Prometheus 監控系統中的 Alertmanager 與資料收集
Prometheus 是一種流行的監控系統與時間序列資料函式庫,廣泛應用於雲端運算和微服務架構中。其核心功能包括資料收集、告警管理等。本文將重點介紹 Prometheus 中的 Alertmanager 元件以及資料收集的相關技術。
Alertmanager 的功能與組態
Alertmanager 是 Prometheus 生態系統中的一個關鍵元件,主要負責處理由 Prometheus 伺服器傳送的告警通知。它支援多種通知方式,包括電子郵件、Slack、PagerDuty 等。
Alertmanager 的路由組態
Alertmanager 的路由組態允許根據不同的告警規則將通知傳送給不同的接收者。以下是一個簡單的路由組態範例:
route:
receiver: 'team-a'
group_by: ['alertname']
routes:
- receiver: 'team-b'
match:
team: 'b'
內容解密:
- route:定義了告警的路由規則。
- receiver:指定了接收告警通知的物件。
- group_by:根據特定的標籤對告警進行分組。
- routes:定義了子路由,用於進一步比對特定的告警。
資料收集與 Exporter
Prometheus 透過 Exporter 收集各種系統和應用的指標資料。常見的 Exporter 包括 Node Exporter 和 cAdvisor。
Node Exporter 的使用
Node Exporter 用於收集主機層面的指標,如 CPU 使用率、記憶體使用率等。以下是啟動 Node Exporter 的範例:
./node_exporter --web.listen-address=:9100
內容解密:
- node_exporter:Node Exporter 的執行檔。
- –web.listen-address=:9100:指定 Node Exporter 監聽的埠。
Prometheus 的資料查詢與分析
Prometheus 提供了一種強大的查詢語言 PromQL,用於查詢和分析時間序列資料。以下是一個簡單的 PromQL 查詢範例:
rate(node_cpu_seconds_total[5m])
內容解密:
- rate:計算指定時間範圍內的平均變化率。
- node_cpu_seconds_total:CPU 使用時間的總計指標。
- [5m]:指定計算的時間範圍為 5 分鐘。
Prometheus 與 Grafana 安裝及設定
Prometheus 和 Grafana 是現代監控系統中的兩大核心工具,前者負責資料收集與報警,後者則專注於資料視覺化與儀錶板展示。本章節將探討如何安裝與設定這兩大元件,以建立穩定的監控架構。
Grafana 安裝流程
Grafana 支援多種作業系統,包括 Linux、Windows 和 macOS。以下將針對不同平台的安裝步驟進行詳細說明。
在 Ubuntu 上安裝 Grafana
首先,需要取得 PackageCloud 的公鑰以確保軟體來源的安全性。執行以下指令:
curl -s https://packagecloud.io/grafana/stable/gpgkey | sudo apt-key add -
接著,將 Grafana 的套件來源新增至系統組態:
sudo add-apt-repository "deb https://packagecloud.io/grafana/stable/ubuntu/ $(lsb_release -cs) main"
更新套件列表並安裝 Grafana:
sudo apt-get update
sudo apt-get install grafana
在 Red Hat 上安裝 Grafana
在 Red Hat 系統上,首先需要新增 Grafana 的 Yum 倉函式庫組態:
[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
儲存該組態後,執行安裝指令:
sudo yum install grafana
在 Windows 上安裝 Grafana
下載 Grafana 的 Windows 安裝包並解壓至指定目錄,例如 C:\grafana。接著,設定環境變數以便於執行 Grafana 服務。
在 macOS 上安裝 Grafana
使用 Homebrew 工具可以輕鬆完成 Grafana 的安裝:
brew install grafana
啟動 Grafana 服務
完成安裝後,需要啟動 Grafana 服務。不同平台的啟動指令如下:
- Linux:
sudo systemctl start grafana-server - macOS (使用 Homebrew):
brew services start grafana - Windows: 手動執行
grafana-server.exe或將其註冊為系統服務
Prometheus Alertmanager 設定
Alertmanager 是 Prometheus 生態系統中的報警管理元件,用於處理來自 Prometheus 的報警通知。以下是其基本設定流程。
安裝 Alertmanager
下載並解壓 Alertmanager:
wget https://github.com/prometheus/alertmanager/releases/download/v0.23.0/alertmanager-0.23.0.linux-amd64.tar.gz
tar xvf alertmanager-0.23.0.linux-amd64.tar.gz
將解壓後的二進位制檔案移動至適當位置,例如 /usr/local/bin。
設定 Alertmanager
建立 alertmanager.yml 組態檔案,定義報警路由和接收者:
global:
smtp_smarthost: 'smtp.example.com:587'
smtp_from: '[email protected]'
smtp_auth_username: '[email protected]'
smtp_auth_password: 'password'
route:
receiver: 'team-pager'
group_by: ['alertname']
routes:
- receiver: 'team-pager'
match:
severity: 'page'
receivers:
- name: 'team-pager'
email_configs:
- to: '[email protected]'
啟動 Alertmanager
執行以下指令啟動 Alertmanager:
./alertmanager --config.file=alertmanager.yml
結合 Prometheus 與 Alertmanager
在 Prometheus 組態檔案中,新增 Alertmanager 的目標地址:
alerting:
alertmanagers:
- static_configs:
- targets: ["localhost:9093"]
這樣,Prometheus 將能夠將報警通知傳送至 Alertmanager 進行處理。
Prometheus 與 Alertmanager 的進階組態與應用
在現代的監控系統中,Prometheus 和 Alertmanager 是兩個非常重要的工具。Prometheus 負責收集和儲存監控資料,而 Alertmanager 則負責處理和傳送警示。本篇文章將探討 Prometheus 和 Alertmanager 的進階組態與應用,幫助讀者更好地理解和使用這兩個工具。
Alertmanager 的路由組態
Alertmanager 的路由組態是其核心功能之一,它允許使用者根據不同的警示條件將警示傳送到不同的接收者。下面是一個簡單的路由組態範例:
route:
receiver: 'team-a'
group_by: ['alertname']
routes:
- receiver: 'team-b'
match:
team: 'b'
內容解密:
route是 Alertmanager 組態中的根路由。receiver指定了預設的接收者為 ’team-a’。group_by指定了按照alertname進行分組。routes下的子路由允許根據特定的比對條件將警示傳送到不同的接收者。- 在這個範例中,如果警示的
team標籤值為 ‘b’,則警示將被傳送到 ’team-b’ 接收者。
Prometheus 的服務發現
Prometheus 的服務發現功能允許它動態地發現和監控目標。下面是一個使用檔案服務發現的範例:
scrape_configs:
- job_name: 'rails-servers'
file_sd_configs:
- files:
- /etc/prometheus/rails-servers.yml
內容解密:
scrape_configs定義了 Prometheus 的抓取組態。job_name指定了作業的名稱為 ‘rails-servers’。file_sd_configs使用檔案服務發現來動態地發現目標。files指定了包含目標列表的檔案路徑。
使用 mtail 進行日誌監控
mtail 是一個用於從應用程式日誌中提取指標的工具。下面是一個簡單的 mtail 程式範例:
counter line_count by path
/$/ {
line_count[$path]++
}
內容解密:
counter line_count by path定義了一個名為line_count的計數器,並按path進行標籤化。- 正規表示式
/$/比對每一行日誌。 - 在比對的區塊中,
line_count[$path]++對對應的path增加計數。