iT邦幫忙

2025 iThome 鐵人賽

DAY 26
0

在過去的幾天裡,我們已經深入了解了日誌 (Loki) 和追蹤 (Tempo)。今天,我們將補全可觀測性 (Observability) 的最後一塊拼圖:指標 (Metrics)。我們將學習 Grafana Mimir,一個由 Grafana Labs 開發的、可無限擴展的開源指標後端。


1. 什麼是指標 (Metrics)?

在我們深入 Mimir 之前,讓我們先搞清楚什麼是「指標」。

  • 日誌 (Logs): 記錄了「發生了什麼」的離散事件。例如:User A logged in
  • 追蹤 (Traces): 記錄了「一個請求如何流經系統」的完整路徑。
  • 指標 (Metrics): 記錄了「系統在某個時間點的狀態」的數字測量。例如:cpu_usage = 80%, http_requests_total = 1024

指標是高度聚合的數據,非常適合用來製作儀表板、設定告警,以及觀察系統的長期趨勢。Prometheus 是目前收集指標最主流的開源工具。


2. 為什麼需要 Mimir?Prometheus 不夠嗎?

Prometheus 非常優秀,但它本身是一個單體的應用程式。當你的系統規模擴大,需要監控的服務越來越多時,單一的 Prometheus 實例會遇到瓶頸:

  • 儲存限制: 單一伺服器的磁碟空間有限。
  • 查詢效能: 當數據量巨大時,查詢會變慢。
  • 高可用性: 如果 Prometheus 伺服器掛了,你就失去了監控能力。
  • 多叢集管理: 如何從多個數據中心的 Prometheus 收集數據並進行統一查詢?

Grafana Mimir 就是為了解決這些問題而生的。

Mimir 是一個水平擴展的指標後端。你可以將它看作一個「超級 Prometheus」。它完全相容 Prometheus 的 API,你可以將來自多個 Prometheus 實例的指標數據集中儲存到 Mimir,然後透過單一的查詢端點進行全局查詢。

核心優勢:

  • 水平擴展: 可以透過增加節點來無限擴展儲存和查詢能力。
  • 高可用性: 透過多副本機制確保服務不中斷。
  • 全局視圖: 將分散在各地的 Prometheus 指標匯集一處。
  • 長期儲存: 可以對接 S3、GCS 等廉價的對象儲存,實現指標的長期保存。

3. 今天的架構

今天我們將建立一個如下的迷你架構:

+------------+     (Scrapes)     +-----------------+     (Remote Write)     +-------+
| Prometheus |------------------>|  Your App (mock)  |---------------------->| Mimir |
+------------+                   +-----------------+                        +-------+
      ^                                                                         ^
      | (Data Source)                                                           | (Data Source)
      |                                                                         |
+-----v-----+
|  Grafana  |
+-----------+
  1. Prometheus: 負責從目標 (例如它自己和 Mimir) 抓取指標。
  2. Mimir: 接收來自 Prometheus 的 remote_write 數據流,並將其儲存起來。
  3. Grafana: 同時將 Prometheus 和 Mimir 設定為資料來源,讓我們可以比較兩者的數據。

4. 實作步驟

我們已經為您準備好了所有設定檔。

a. Mimir 設定 (mimir-config.yaml)

這個設定檔告訴 Mimir 如何運行。為了簡單起見,我們使用 inmemory 作為協調儲存 (kvstore),並使用本地檔案系統 (filesystem) 作為指標的塊儲存 (blocks_storage)。在生產環境中,這裡通常會換成 etcdS3

target: all
auth_enabled: false

server:
  http_listen_port: 9009
  grpc_listen_port: 9095

distributor:
  ring:
    instance_addr: 127.0.0.1
    kvstore:
      store: inmemory

ingester:
  ring:
    instance_addr: 127.0.0.1
    kvstore:
      store: inmemory
    replication_factor: 1
  lifecycler:
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  # Disable chunk transfer, which is not supported with inmemory store
  max_transfer_retries: 0

ruler:
  alertmanager_url: http://localhost # Does not have to be a real alertmanager
  ring:
    kvstore:
      store: inmemory

# S3, GCS, Azure, etc. are supported.
# For the sake of simplicity, we use the local filesystem.
blocks_storage:
  backend: filesystem
  filesystem:
    dir: /data/mimir/blocks

compactor:
  data_dir: /data/mimir/compactor
  sharding_ring:
    kvstore:
      store: inmemory

store_gateway:
  sharding_ring:
    kvstore:
      store: inmemory

b. Prometheus 設定 (prometheus.yml)

這個設定檔有兩個重點:

  • scrape_configs: 設定 Prometheus 要抓取哪些目標的指標,這裡我們設定了 prometheus 自己和 mimir
  • remote_write: 這是最重要的部分。它告訴 Prometheus 將所有收集到的指標數據,透過 HTTP push 的方式,發送到 Mimir 的 /api/v1/push 端點。
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
      - targets: ['localhost:9090']

  - job_name: 'mimir'
    static_configs:
      - targets: ['mimir:9009']

# This is the most important part.
# It tells Prometheus to send all its collected metrics to Mimir.
remote_write:
  - url: "http://mimir:9009/api/v1/push"

c. Docker Compose (docker-compose.yml)

這個檔案整合了我們需要的所有服務:loki, grafana, mimir, prometheus

version: '3.8'

services:
  loki:
    image: grafana/loki:2.9.0
    ports:
      - "3100:3100"
    volumes:
      - ./loki-config.yaml:/etc/loki/local-config.yaml
    command: -config.file=/etc/loki/local-config.yaml

  grafana:
    image: grafana/grafana:10.0.3
    ports:
      - "3000:3000"
    volumes:
      - ./grafana-provisioning/datasources:/etc/grafana/provisioning/datasources

  mimir:
    image: grafana/mimir:2.9.0
    ports:
      - "9009:9009"
    volumes:
      - ./mimir-config.yaml:/etc/mimir.yaml
      - mimir-data:/data/mimir
    command: -config.file=/etc/mimir.yaml

  prometheus:
    image: prom/prometheus:v2.47.0
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
    command: --config.file=/etc/prometheus/prometheus.yml

volumes:
  mimir-data:

d. 啟動服務

day26 目錄下,執行以下命令:

docker-compose up -d

5. 在 Grafana 中驗證

  1. 開啟 Grafana: 瀏覽器訪問 http://localhost:3000

  2. 設定資料來源:

    • 進入 Configuration > Data Sources
    • 點擊 Add data source,選擇 Prometheus
    • Name: Prometheus
    • URL: http://prometheus:9090
    • 點擊 Save & test
    • 再次點擊 Add data source,選擇 Prometheus
    • Name: Mimir
    • URL: http://mimir:9009/prometheus (注意 Mimir 的查詢路徑)
    • 點擊 Save & test
  3. 查詢驗證:

    • 進入 Explore 頁面。
    • 在左上角的資料來源選擇 Prometheus,輸入查詢 up,你應該能看到 Prometheus 從自己和 Mimir 抓取到的 up 指標。
    • 現在,將資料來源切換到 Mimir,再次輸入查詢 up。你應該能看到完全相同的結果!

這證明了 Prometheus 已經成功地將它抓取到的所有指標都遠端寫入到了 Mimir 中。


總結

今天我們學習了指標系統 Mimir 的基本概念和用途,並成功地搭建了一個 Prometheus + Mimir 的整合環境。我們理解了 Mimir 作為一個集中式、可擴展的指標後端,如何解決單體 Prometheus 的擴展性問題。

有了 Mimir,我們就擁有了處理大規模指標數據的能力。明天,我們將把日誌、追蹤和指標這三者結合起來,在 Grafana 中建立一個真正融會貫通的儀表板!


上一篇
Day25 - 從追蹤到日誌:實現 Tempo 與 Loki 的無縫整合
下一篇
Day27 - 融會貫通:建立整合 Logs, Traces 與 Metrics 的 Grafana 儀表板
系列文
Vibe Coding 後的挑戰:Locust x Loki 負載及監控27
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言