[英]Relabeling in Prometheus
Prometheus node exporter 注冊為具有各種標簽的 consul agent 的服務。 提供給領事代理的示例服務定義:
{
"service":{
"id": "server-stats",
"name": "server-stats",
"tags": [
"a=1_meow",
"b=2_woof",
"c=3_moo",
"monkey"
],
"port": 9100,
"checks": [
{
"name": "Process #1",
"script": "/path/to/healthcheck/script.sh",
"interval": "5s"
}
]
}
}
Prometheus 被設置為尋找這個server-stats
服務並使用 Consul 提供的配置(主機地址和端口)從服務器中抓取統計信息。 上述標簽在__meta_consul_tags
中以逗號分隔的列表形式提供,可用於重新標記。
普羅米修斯重新標記配置:
relabel_configs:
- source_labels: [__meta_consul_tags]
separator: ','
#regex: '(.+)=(.+)'
regex: '([a-z_]+)=([a-z_]+|\d+)'
target_label: ${1}
replacement: ${2}
我正在嘗試將標簽公開給普羅米修斯,以便我們可以根據標簽獲取統計數據和圖表。 牢記上述服務配置,除了 Prometheus 內部所做的任何事情之外,我希望每個指標都有以下標簽: a=1_meow
、 b=2_woof
、 c=3_moo
並忽略monkey
,因為它只是一個字符串。 如果有需要=
的解決方案,我可以從我的標簽列表中刪除monkey
。 上面寫的 relabel 配置根本不會導致暴露任何標簽,而且似乎被忽略了。 在日志級別設置為調試的情況下運行 Prometheus 也不會產生任何結果。
我認為我對普羅米修斯的標簽如何運作有一個錯誤。 我的錯誤理解是:
regex
之前,首先將字符串拆分為separator
(否則它的目的是什么?), regex
, target_label
和replacement
字段的索引值。 regex
不匹配,則該子字符串將被忽略。 regex
應用於每個子字符串,所以它將導致來自多個子字符串的多個標簽。 然而,從他的答案和普羅米修斯的文檔中鏈接的布里安 - 巴西的帖子看來,似乎發生了以下情況:
__meta
標簽組合成一個長separator
分隔線。 regex
僅在該行上應用一次。 regex
匹配並包含組,則它們從1開始編制索引,並可用於target_label
和replacement
。 separator
似乎也會在本節中被忽略。 從這個想法和問題中的例子,我能夠使以下配置工作
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: '.*,a=([a-z0-9_]+),.+'
target_label: 'a'
replacement: ${1}
- source_labels: [__meta_consul_tags]
regex: '.*,b=([a-z0-9_]+),.+'
target_label: 'b'
replacement: ${1}
- source_labels: [__meta_consul_tags]
regex: '.*,c=([a-z0-9_]+),.+'
target_label: 'c'
replacement: ${1}
- source_labels: [__meta_consul_tags]
regex: '.*,d=([a-z0-9_]+),.+'
target_label: 'd'
replacement: ${1}
我相信這兩種方法(brian-brazil在他的博客中寫的方法,以及我上面使用的方法)都有警告 - 我們要么事先知道我們想要的所有標簽,要么有一定數量的標簽。 這意味着如果開發人員想要將不同或更多標簽與他/她的服務相關聯,他/她將需要使用操作,因為一般流程將無法處理它。 我認為這是一個應該解決的小問題。
https://www.robustperception.io/extracting-full-labels-from-consul-tags/顯示了如何執行此操作,特別是最后一個示例。
以下重新標記規則可用於從__meta_consul_tags
中提取特定tag
並將其放置到destination_label
:
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: '.*,tag=([^,]+),.*'
target_label: destination_label
無需指定replacement
選項,因為它默認為$1
。
如果必須將多個標簽從__meta_consul_tags
中提取到多個標簽中,則只需為每個需要的標簽重復重新標記規則。 例如,以下重新標記規則將a
標簽提取到a
標簽,將b
標簽提取到b
標簽:
relabel_configs:
- source_labels: [__meta_consul_tags]
regex: '.*,a=([^,]+),.*'
target_label: a
- source_labels: [__meta_consul_tags]
regex: '.*,b=([^,]+),.*'
target_label: b
本文提供了有關 Prometheus 中重新標記規則的更多信息。
更新(2022-12-19):VictoriaMetrics 和vmagent (這些是我使用的類似 Prometheus 的監控系統和爬蟲)從v1.85.2開始為發現的目標公開__meta_consul_tag_<tagname>
和__meta_consul_tagpresent_<tagname>
標簽。 這允許使用單個重新標記規則將 Consul 服務中定義的所有標簽復制到抓取目標標簽中:
- action: labelmap
regex: __meta_consul_tag_(.+)
嘗試在Prometheus relabel debugger中使用這個重新標記規則。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.