Prometheus的數據模型
在討論Prometheus relabeling機制之前,我們需要先了解Prometheus的基本數據模型。
Prometheus將所有數據存儲為時間序列,它本質上是一種相同度量和帶相同標記維度集的時間戳數據流。這個簡潔和健壯的數據模型支持強大的查詢,并使Prometheus能夠處理高基數和多維度場景的數據。具體地,Prometheus數據模型涉及下列幾個部分:
Targets: Targets是一個可以抓取指標的實體。它實際上歸結為一個要抓取的URL。targets可以是服務、API、服務器或任何其他提供metrics的實體。在現代分布式系統中,我們通常使用某種服務發現機制來發現targets。Prometheus為Kubernetes等通用平臺提供了一系列服務發現能力。
Metrics: Metrics通過其名稱來標識,并幫助描述特定系統的屬性。例如,度量http_requests_total可用于跟蹤服務器接收到的HTTP請求總數。
Metrics Labels: 這些鍵值對為度量提供了更多的上下文和維度。例如,可以將標簽方法="GET"附加到http_requests_total度量,以專門跟蹤GET請求的數量。標簽使Prometheus數據成為一個多維時間序列數據模型。
Time Series: 度量及其標簽的每個唯一組合表示一個單獨的時間序列。時間序列由度量名稱和一組標簽(鍵值對)標識。例如,http_requests_total{method="GET",url="/api/books/19", handler="/api/books"}和http_requests_total{method="POST",url="/api/books/19" handler="/api/books"}將是兩個不同的時間序列。
為什么需要relabeling機制?
簡而言之,使用relabelings的目的主要是為了對指標進行編輯和調整。這些編輯操作包括但不限于刪除不必要的指標、修改指標中的標簽、以及添加或修改指標的標簽值或格式。
Prometheus有兩種relabeling的方式,分別是relabel_config與metric_relabel_configs,它們的區別是:relabel_configs主要用于在抓取指標前修改目標的標簽,而metric_relabel_configs則在抓取后對指標的標簽進行修改。
如何使用relabel_configs?
relabel_configs 在 Prometheus 中是一個非常有用的功能,它允許用戶在數據抓取并存儲之前對指標進行重新標記和編輯,下面是幾個常見的使用示例。
1. 修改指標中的標簽
當 Prometheus 用于監控 Kubernetes 時,可能會遇到不同 job_name 中的指標標簽命名不一致的情況。例如,pod 的名稱可能使用 "pod" 或 "pod_name" 兩個不同的標簽記錄。為了統一不同數據源中相同含義標簽的名稱,可以在 Prometheus 拉取數據后、保存數據前,通過 metric_relabel_configs 重寫標簽名稱。配置示例:
metric_relabel_configs:
- source_labels: [pod]
separator: ;
regex: (.+)
target_label: pod_name
replacement: $1
action: replace
- source_labels: [container]
separator: ;
regex: (.+)
target_label: container_name
replacement: $1
action: replace
2. 刪除不需要的指標
如果你有一些指標,比如 node_netstat_Icmp_OutMsgs,認為它們對監控沒有太大意義,可以配置 Prometheus 直接丟棄這些指標,減少存儲空間的浪費。配置示例如下:
metric_relabel_configs:
- source_labels: [ __name__ ]
regex: 'node_netstat_Icmp_OutMsgs'
action: drop
這樣配置后,所有名為 node_netstat_Icmp_OutMsgs 的指標都會被 Prometheus 忽略,不會存儲其數據。
3. 刪除標簽
刪除標簽通常用于隱藏敏感信息或簡化時間序列。例如,如果你想要刪除所有包含 "kernelVersion" 的標簽,可以使用以下配置:
metric_relabel_configs:
- regex: 'kernelVersion'
action: labeldrop
這個配置將刪除所有匹配 "kernelVersion" 的標簽。
4. 合并標簽:
假設我們有兩個標簽 __region_id__ 和 __zone__,我們想要將這兩個標簽合并為一個新的標簽 region_zone。以下是如何使用 relabel_configs 來實現的配置示例:
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: "node"
file_sd_configs:
- refresh_interval: 1m
files:
- "/usr/local/prometheus/prometheus/conf/node*.yml"
relabel_configs:
- source_labels: ["__region_id__", "__availability_zone__"]
separator: "-"
regex: "(.*)"
target_label: "region_zone"
action: replace
replacement: "$1"
在這個例子中,我們使用 separator 來指定連接標簽的分隔符,regex 來匹配標簽值,target_label 指定新標簽的名稱,action 指定動作為 replace,replacement 使用正則表達式捕獲組的值。
5. 過濾采集目標:
使用 relabel_configs 可以根據標簽的值來過濾采集的目標。例如,我們只想采集特定數據中心 dc1 中的 node_exporter 實例,可以使用以下配置:
scrape_configs:
- job_name: node_exporter
consul_sd_configs:
- server: localhost:8500
services:
- node_exporter
relabel_configs:
- source_labels: ["__meta_consul_dc"]
regex: "dc1"
action: keep
在這個配置中,action: keep 表示只保留標簽值匹配 dc1 的目標實例。如果將 action 改為 drop,則會丟棄匹配 dc1 的實例,采集其他的實例。
如何使用metric_relabel_configs?
metric_relabel_configs 在 Prometheus 中用于在數據存儲到時序數據庫之前,對抓取到的指標進行最后的處理和過濾。以下是幾個典型的例子。
1. 刪除不需要的指標:
如果 Prometheus 抓取了一些不需要存儲的指標,如 node_netstat_Icmp_OutMsgs,可以使用 metric_relabel_configs 來刪除這些指標,減少存儲空間的浪費。配置示例如下:
metric_relabel_configs:
- source_labels: [__name__]
regex: 'node_netstat_Icmp_OutMsgs'
action: drop
2. 增加指定標簽:
當需要為所有指標添加新的標簽,如 new_label1,并賦予特定的值 label_value1,可以使用以下配置:
metric_relabel_configs:
- regex: (.*)
target_label: new_label1
replacement: 'label_value1'
action: replace
3. 刪除不需要的標簽
如果需要從所有指標中刪除帶有前綴 pre1_ 的標簽,可以使用 labeldrop 動作:
metric_relabel_configs:
- regex: 'pre1_.*'
action: labeldrop
4. 修改指標中的標簽:
當 Prometheus 用于監控 Kubernetes 時,可能會遇到標簽命名不一致的問題。例如,將不同 job_name 中的 pod 標簽統一重寫為 pod_name:
metric_relabel_configs:
- source_labels: [pod]
separator: ;
regex: (.*)
target_label: pod_name
replacement: '$1'
action: replace
5. 過濾采集目標:
使用 metric_relabel_configs 可以根據指標的標簽值來過濾采集的目標。
例如,只采集指標名稱中包含 node_cpu 的指標:
metric_relabel_configs:
- source_labels: [__name__]
regex: 'node_cpu'
action: keep
總結
Prometheus中的relabel_configs和metric_relabel_configs是兩個強大的功能,它們可以在數據抓取和存儲的不同階段對標簽進行處理。在項目中使用這兩種relabel時通常有一些注意事項和選取原則。
1. 注意事項
relabel_configs:
- 在抓取階段之前使用,當需要根據標簽值選擇性抓取目標時使用。
- 支持動態修改目標的地址、HTTP參數等。
- 用于動態發現目標和調整標簽格式,根據發現的服務動態地設置標簽或過濾服務實例。
metric_relabel_configs:
- 當需要在存儲前對數據進行最終優化,如刪除高基數標簽或不必要的指標時使用。
- 刪除不需要的指標、修改或添加標簽、調整指標名稱。
- 作用于已抓取的樣本,應確保不會錯誤地修改或刪除重要數據。
- 在多數據源中使用metric_relabel_configs進行指標格式化。
2. 選取原則
- 目的性:明確使用relabel的目的,是為了過濾數據、修改標簽、還是刪除指標。
- 效率:避免過度使用relabel,尤其是在大規模數據集上,因為這可能會增加處理時間和資源消耗。
- 可維護性:保持relabel配置的清晰和簡潔,以便于維護和更新。
3. 最佳實踐
- 分離關注點:將relabel_configs用于抓取階段的預處理,將metric_relabel_configs用于存儲前的最終處理。
- 逐步實施:在配置relabel時,逐步添加規則,測試其效果,避免一次性添加大量規則導致難以調試。
- 日志記錄:在配置中加入適當的日志記錄,以便于跟蹤relabel的效果和潛在問題。
- 備份配置:在修改配置文件之前,備份當前的配置,以便在出現問題時能夠快速恢復。