簡體   English   中英

在 Prometheus 中重新標記

[英]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_meowb=2_woofc=3_moo並忽略monkey ,因為它只是一個字符串。 如果有需要=的解決方案,我可以從我的標簽列表中刪除monkey 上面寫的 relabel 配置根本不會導致暴露任何標簽,而且似乎被忽略了。 在日志級別設置為調試的情況下運行 Prometheus 也不會產生任何結果。

相關文檔

理解不正確

我認為我對普羅米修斯的標簽如何運作有一個錯誤。 我的錯誤理解是:

  1. 在應用regex之前,首先將字符串拆分為separator (否則它的目的是什么?),
  2. 每個子字符串都有針對它的regex
  3. 如果聲明並找到匹配組,它們將作為可用於target_labelreplacement字段的索引值。
  4. 如果regex不匹配,則該子字符串將被忽略。
  5. 因為預期在分割后將regex應用於每個子字符串,所以它將導致來自多個子字符串的多個標簽。

正確理解

然而,從他的答案和普羅米修斯的文檔中鏈接的布里安 - 巴西的帖子看來,似乎發生了以下情況:

  1. 所有__meta標簽組合成一個長separator分隔線。
  2. regex僅在該行上應用一次。
  3. 如果regex匹配並包含組,則它們從1開始編制索引,並可用於target_labelreplacement
  4. 即使你提到它, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM