返回文章列表

Tornado 應用程式監控實戰案例

本文以 Tornado 應用程式為例,探討如何在 Kubernetes 環境下使用 Prometheus 和 Grafana 進行監控。涵蓋 Sidecar 模式、指標設定、警示規則建立以及可用性監控等關鍵技術,提供實用的程式碼範例和組態說明,幫助開發者快速上手應用程式監控。

Web 開發 監控

在 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!
本章重點回顧:
  1. Sidecar模式:使用輔助容器擴充套件主容器的功能,特別是在監控場景中。
  2. Prometheus指標:定義和收集應用程式的效能指標,如請求延遲和錯誤率。
  3. 警示規則:根據指標資料建立警示規則,以便及時發現和處理問題。

透過這些技術的綜合運用,我們能夠有效地監控和管理複雜的應用程式堆積疊,確保其高效穩定執行。

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'

內容解密:

  1. route:定義了告警的路由規則。
  2. receiver:指定了接收告警通知的物件。
  3. group_by:根據特定的標籤對告警進行分組。
  4. routes:定義了子路由,用於進一步比對特定的告警。

資料收集與 Exporter

Prometheus 透過 Exporter 收集各種系統和應用的指標資料。常見的 Exporter 包括 Node Exporter 和 cAdvisor。

Node Exporter 的使用

Node Exporter 用於收集主機層面的指標,如 CPU 使用率、記憶體使用率等。以下是啟動 Node Exporter 的範例:

./node_exporter --web.listen-address=:9100

內容解密:

  1. node_exporter:Node Exporter 的執行檔。
  2. –web.listen-address=:9100:指定 Node Exporter 監聽的埠。

Prometheus 的資料查詢與分析

Prometheus 提供了一種強大的查詢語言 PromQL,用於查詢和分析時間序列資料。以下是一個簡單的 PromQL 查詢範例:

rate(node_cpu_seconds_total[5m])

內容解密:

  1. rate:計算指定時間範圍內的平均變化率。
  2. node_cpu_seconds_total:CPU 使用時間的總計指標。
  3. [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'

內容解密:

  1. route 是 Alertmanager 組態中的根路由。
  2. receiver 指定了預設的接收者為 ’team-a’。
  3. group_by 指定了按照 alertname 進行分組。
  4. routes 下的子路由允許根據特定的比對條件將警示傳送到不同的接收者。
  5. 在這個範例中,如果警示的 team 標籤值為 ‘b’,則警示將被傳送到 ’team-b’ 接收者。

Prometheus 的服務發現

Prometheus 的服務發現功能允許它動態地發現和監控目標。下面是一個使用檔案服務發現的範例:

scrape_configs:
  - job_name: 'rails-servers'
    file_sd_configs:
      - files:
          - /etc/prometheus/rails-servers.yml

內容解密:

  1. scrape_configs 定義了 Prometheus 的抓取組態。
  2. job_name 指定了作業的名稱為 ‘rails-servers’。
  3. file_sd_configs 使用檔案服務發現來動態地發現目標。
  4. files 指定了包含目標列表的檔案路徑。

使用 mtail 進行日誌監控

mtail 是一個用於從應用程式日誌中提取指標的工具。下面是一個簡單的 mtail 程式範例:

counter line_count by path
/$/ {
  line_count[$path]++
}

內容解密:

  1. counter line_count by path 定義了一個名為 line_count 的計數器,並按 path 進行標籤化。
  2. 正規表示式 /$/ 比對每一行日誌。
  3. 在比對的區塊中,line_count[$path]++ 對對應的 path 增加計數。