Prometheus 提供了靈活的標籤管理機制,可以重新標記目標和指標,方便管理和查詢。Node Exporter 和 cAdvisor 分別收集主機和容器的指標,配合 PromQL 可以分析 CPU、記憶體、磁碟等資源的使用狀況。瞭解 predict_linear 函式可以預測磁碟空間耗盡時間,而 node_systemd_unit_stateup 指標則可用於監控服務狀態和目標可用性。

透過 relabel_configsmetric_relabel_configs,我們可以修改、新增或刪除標籤,例如使用正規表示式過濾或替換標籤值。這對於統一標籤格式、移除敏感資訊或簡化指標名稱非常有用。理解標籤的唯一性約束對於避免時間序列衝突至關重要。Prometheus 網頁介面提供目標列表,可以檢視重新標記前後的標籤狀態,方便除錯和驗證。除了 CPU 使用率,記憶體和磁碟的使用狀況也需要監控。使用 PromQL 可以計算記憶體使用率、磁碟使用率以及記憶體分頁速率等指標,並根據這些指標設定警示,及時發現資源瓶頸。

監控節點與容器:重新標記的藝術

在監控的世界裡,標籤(labels)是個非常有用的工具,但有時候我們需要對它們進行重新標記(relabeling)。為什麼呢?簡單來說,就是為了控制。尤其是在一個集中化、複雜的監控環境中,我們往往無法控制所有被監控的資源及其暴露的監控資料。重新標記允許我們控制、管理,甚至標準化環境中的指標。

為什麼需要重新標記?

  • 丟棄不必要的指標:有些指標可能對我們的監控目標沒有幫助,丟棄它們可以節省儲存空間。
  • 移除敏感或不想要的標籤:有些標籤可能包含敏感資訊,或者我們根本不需要它們。
  • 新增、編輯或修改標籤值或格式:有時候,我們需要統一標籤的格式,或者根據現有的標籤建立新的標籤。

重新標記的兩個階段

  1. 在服務發現後重新標記目標:這通常在 relabel_configs 區塊中完成,允許我們將服務發現中的後設資料標籤應用到指標上。
  2. 在抓取(scrape)後、儲存前重新標記指標:這在 metric_relabel_configs 區塊中完成,讓我們決定哪些指標要儲存、哪些要丟棄,以及它們最終的樣子。

實際操作:丟棄指標

- job_name: 'docker'
  static_configs:
  - targets: ['138.197.26.39:8080', '138.197.30.147:8080', '138.197.30.163:8080']
  metric_relabel_configs:
  - source_labels: [__name__]
    regex: '(container_tasks_state|container_memory_failures_total)'
    action: drop

內容解密:

  1. source_labels: [__name__]:指定要操作的標籤,這裡使用的是 __name__,也就是指標的名稱。
  2. regex: '(container_tasks_state|container_memory_failures_total)':使用正規表示式比對要丟棄的指標名稱。
  3. action: drop:執行丟棄操作,將比對到的指標丟棄,不儲存。

指定新的分隔符

metric_relabel_configs:
- source_labels: [__name__]
  separator: ','
  regex: '(container_tasks_state|container_memory_failures_total)'
  action: drop

內容解密:

  • separator: ',':指定多個標籤值之間的分隔符為逗號。

取代標籤值

metric_relabel_configs:
- source_labels: [id]
  regex: '/docker/([a-z0-9]+)'
  replacement: '$1'
  target_label: container_id

內容解密:

  1. source_labels: [id]:指定來源標籤為 id
  2. regex: '/docker/([a-z0-9]+)':使用正規表示式捕捉容器ID。
  3. replacement: '$1':指定新的值為捕捉的容器ID。
  4. target_label: container_id:將捕捉的值儲存到新的標籤 container_id 中。

丟棄標籤

metric_relabel_configs:
- regex: 'kernelVersion'
  action: labeldrop

內容解密:

  1. regex: 'kernelVersion':比對要丟棄的標籤名稱。
  2. action: labeldrop:執行丟棄標籤的操作。

監控節點與容器

在前面的章節中,我們介紹了Prometheus的基本架構和元件,本章將探討如何使用Prometheus監控節點和容器。我們將介紹Node Exporter和cAdvisor這兩個重要的元件,並使用PromQL查詢和分析資料。

Relabelling和Label管理

在抓取目標的過程中,Prometheus允許我們透過relabel_config進行標籤(Label)的重新標記。這對於過濾和轉換標籤非常有用。例如,我們可以使用labeldrop動作刪除比對正規表示式的所有標籤,而labelkeep則保留比對的標籤並丟棄其他標籤。

警告:請記住,標籤是時間序列的唯一性約束。如果丟棄標籤導致重複的時間序列,將會出現問題!

在Prometheus的網頁介面中,我們可以檢視目標列表(http://localhost:9090/targets),並透過將滑鼠懸停在例項標籤上來檢視重新標記之前的標籤狀態。

Node Exporter和cAdvisor指標

現在,我們正在從四個不同的主機收集七組獨立的指標:

  • Prometheus伺服器的自身指標。
  • 三個主機上的Node Exporter指標。
  • 三個主機上的cAdvisor指標。

提示:您可以透過存取Prometheus網頁介面(http://localhost:9090/targets)檢視每個目標的抓取狀態。

讓我們跳過Prometheus伺服器的自身指標,重點關注Node Exporter和cAdvisor指標。我們將使用這些指標來探索Prometheus的功能,並確保我們的主機被正確監控。

USE方法和CPU利用率

我們將使用USE方法(利用率、飽和度和錯誤)來進行效能診斷。USE方法建議收集和關注利用率、飽和度和錯誤指標,以幫助效能分析。讓我們開始檢視CPU指標。

CPU利用率

要獲得CPU利用率,我們使用Node Exporter收集的node_cpu指標。這個指標按模式分解了主機CPU的使用情況,以秒為單位。讓我們在Prometheus網頁介面中查詢這個指標。

node_cpu{cpu="cpu0",instance="138.197.26.39:9100",job="node",mode="user"}

這個查詢傳回了一系列按CPU和模式分解的指標。要計算每個例項上的CPU使用百分比,我們需要使用PromQL進行一些計算。

首先,使用irate函式計算每個CPU模式的每秒速率:

irate(node_cpu{job="node"}[5m])

然後,使用avg聚合函式按例項聚合結果:

avg(irate(node_cpu{job="node"}[5m])) by (instance)

接下來,查詢每個例項的空閒使用率,並乘以100轉換為百分比:

avg(irate(node_cpu{job="node",mode="idle"}[5m])) by (instance) * 100

最後,計算CPU使用百分比:

100 - avg(irate(node_cpu{job="node",mode="idle"}[5m])) by (instance) * 100

內容解密:

  1. irate(node_cpu{job="node"}[5m]):計算過去5分鐘內node_cpu指標的每秒瞬時增長率,反映CPU在不同模式下的使用率變化速率。
  2. avg(...) by (instance):對結果按例項進行平均聚合,得到每個例項上的平均CPU使用率。
  3. mode="idle":篩選出CPU空閒模式下的資料,用於計算空閒率。
  4. 100 - (...) * 100:將空閒率轉換為使用率,最終得到每個例項上的平均CPU使用百分比。

圖表呈現

點選Graph標籤,我們可以看到這些指標以圖表形式呈現,直觀地展示了每個主機上的CPU使用情況。

  graph LR;
    A[CPU利用率查詢] --> B[irate計算];
    B --> C[avg聚合];
    C --> D[空閒率計算];
    D --> E[使用率計算];
    E --> F[圖表呈現];

此圖示展示了從CPU利用率查詢到最終圖表呈現的整個過程。透過這樣的步驟,我們可以清晰地瞭解如何使用PromQL分析和視覺化CPU利用率資料。

監控節點與容器:深入理解 CPU、記憶體與磁碟使用狀況

在監控節點和容器時,瞭解 CPU、記憶體和磁碟的使用狀況至關重要。本章節將探討如何利用 Prometheus 和 Node Exporter 來監控這些關鍵資源。

CPU 飽和度監控

監控 CPU 飽和度的一種方法是追蹤主機的負載平均值(load average),它代表一段時間內的平均執行佇列長度,同時考慮到主機的 CPU 數量。負載平均值小於 CPU 數量通常是正常的;如果長時間超過 CPU 數量,則表示 CPU 飽和。

檢視主機負載平均值

可以使用 node_load* 指標來檢視主機的負載平均值。這些指標顯示了一分鐘、五分鐘和十五分鐘的負載平均值。我們將使用一分鐘的負載平均值指標 node_load1

node_load1

計算主機 CPU 數量

可以使用 count 聚合函式來計算主機的 CPU 數量,如下所示:

count by (instance)(node_cpu{mode="idle"})

這裡,我們計算了 node_cpu 時間序列中 modeidle 的數量,並使用 by 子句保留了 instance 標籤,從而得到每個主機的 CPU 數量。

結合負載平均值和 CPU 數量

可以結合 node_load1 指標和 CPU 數量來判斷 CPU 是否飽和:

node_load1 > on (instance) 2 * count by (instance)(node_cpu{mode="idle"})

這裡,我們檢查一分鐘的負載平均值是否超過 CPU 數量的兩倍。

記憶體使用率監控

Node Exporter 的記憶體指標按記憶體型別和使用情況進行了分類別,可以在以 node_memory 為字首的指標列表中找到。

計算記憶體使用率

可以使用以下指標來計算每個主機的記憶體使用率:

  • node_memory_MemTotal:主機的總記憶體。
  • node_memory_MemFree:主機的空閒記憶體。
  • node_memory_Buffers:緩衝區快取中的記憶體。
  • node_memory_Cached:頁面快取中的記憶體。

這些指標都以位元組為單位。計算記憶體使用率的查詢如下:

(node_memory_MemTotal - (node_memory_MemFree + node_memory_Cached + node_memory_Buffers)) / node_memory_MemTotal * 100

這個查詢首先計算出空閒記憶體的總量(包括 MemFreeCachedBuffers),然後從總記憶體中減去這個值,得到已使用的記憶體量。最後,將已使用的記憶體量除以總記憶體,並乘以 100,轉換為百分比。

記憶體飽和度監控

可以透過檢查分頁(paging)的速率來監控記憶體飽和度。Node Exporter 從 /proc/vmstat 中收集了與分頁相關的資料,並暴露在以下兩個指標中:

  • node_vmstat_pswpin:系統每秒從磁碟分頁進來的千位元組數。
  • node_vmstat_pswpout:系統每秒分頁到磁碟的千位元組數。

這兩個指標都是自上次啟動以來累積的總量。要計算記憶體飽和度指標,可以生成每分鐘的速率,將兩個速率相加,然後乘以 1024,轉換為位元組。查詢如下:

1024 * sum by (instance) (
    rate(node_vmstat_pgpgin[1m])
    + rate(node_vmstat_pgpgout[1m])
)

程式碼解析:

  1. 1024 * sum by (instance):將結果按 instance 分組,並將最終結果乘以 1024 以轉換為位元組。
  2. rate(node_vmstat_pgpgin[1m]):計算過去一分鐘內每秒的分頁讀取速率。
  3. rate(node_vmstat_pgpgout[1m]):計算過去一分鐘內每秒的分頁寫入速率。
  4. sum by (instance):對每個 instance 的速率進行求和,得到該 instance 的總分頁速率。

這個查詢能夠有效地識別出哪些主機上的應用程式存在異常的記憶體使用行為。

磁碟使用率監控

對於磁碟,我們主要監控磁碟使用率,而不是利用率、飽和度或錯誤。Node Exporter 的磁碟使用率指標以字首 node_filesystem 開頭。

計算磁碟使用率

可以使用以下查詢來計算每個主機上特設定檔案系統掛載點的磁碟使用率:

(node_filesystem_size{mountpoint="/"} - node_filesystem_free{mountpoint="/"}) / node_filesystem_size{mountpoint="/"} * 100

這個查詢計算了掛載點 / 的磁碟使用率。如果需要監控其他掛載點,可以修改 mountpoint 標籤的值或使用正規表示式比對多個掛載點。

程式碼解析:

  1. node_filesystem_size{mountpoint="/"}:取得掛載點 / 的總磁碟大小。
  2. node_filesystem_free{mountpoint="/"}:取得掛載點 / 的空閒磁碟空間。
  3. -/ 運算:計算已使用的磁碟空間並除以總大小,得到使用率。
  4. * 100:將結果轉換為百分比。

透過這些查詢,可以有效地監控節點和容器的 CPU、記憶體和磁碟使用狀況,及時發現潛在問題並進行處理。

監控節點與容器

磁碟使用率監控的進階方法

在監控系統中,磁碟使用率是一個重要的指標。傳統的監控方式是檢查檔案系統的使用百分比,但這種方法有其侷限性。例如,一個使用率為80%的1GB檔案系統,如果其增長率為每年1%,可能並不構成立即的威脅。相反,一個使用率為10%的1TB檔案系統,如果其增長率為每10分鐘10%,則可能很快就會耗盡空間。因此,瞭解磁碟使用率的趨勢和變化率比單純的使用率更為重要。

Prometheus 提供了一個名為 predict_linear 的函式,可以用來預測檔案系統何時會耗盡空間。這個函式使用簡單的線性迴歸來根據過去的增長趨勢預測未來的數值。例如:

predict_linear(node_filesystem_free{mountpoint="/"}[1h], 4*3600) < 0

這個查詢抓取了根檔案系統的剩餘空間,並根據過去一小時的資料預測四小時後的剩餘空間。如果預測結果小於0,表示檔案系統可能會在四小時內耗盡空間。我們可以根據這個查詢結果觸發警示。

內容解密:

  1. node_filesystem_free{mountpoint="/"}:選取根檔案系統的剩餘空間指標。
  2. [1h]:指定過去一小時的資料作為預測的基礎。
  3. 4*3600:表示預測四小時後的數值(單位為秒)。
  4. predict_linear:根據線性迴歸模型進行預測。
  5. < 0:篩選出預測結果小於0的情況,即預測檔案系統會耗盡空間。

服務狀態監控

node_systemd_unit_state 這個指標提供了系統服務的狀態資訊,包括服務是否正在執行、是否失敗等。我們可以透過查詢這個指標來監控特定服務的狀態。例如:

node_systemd_unit_state{name="docker.service",state="active"}

這個查詢傳回 Docker 服務是否處於活躍狀態。如果服務正在執行,這個指標的值將為1。

內容解密:

  1. node_systemd_unit_state:服務狀態指標。
  2. {name="docker.service"}:指定要查詢的服務名稱為 Docker 服務。
  3. {state="active"}:指定要查詢的服務狀態為活躍狀態。

可用性和 up 指標

up 指標用於監控目標例項的健康狀態。如果 Prometheus 成功抓取到目標例項的資料,則 up 指標的值為1,否則為0。我們可以透過查詢 up 指標來檢查主機或服務的可用性。

up{job="node"}

這個查詢傳回所有名為 node 的作業下的例項的 up 指標值。

內容解密:

  1. up:例項健康狀態指標。
  2. {job="node"}:指定要查詢的作業名稱為 node

透過結合這些監控指標和方法,我們可以更好地瞭解系統的執行狀態,並及時發現潛在的問題,從而提高系統的可靠性和可用性。