自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Prometheus Relabeling 重新標(biāo)記的使用

運維 系統(tǒng)運維
Relabeling 重新標(biāo)記是配置 Prometheus 元信息的方式,它是轉(zhuǎn)換和過濾 Prometheus 中 label 標(biāo)簽對象的核心,本文我們將了解 Relabeling 規(guī)則的工作原理以及在不同場景中的應(yīng)用方式。

[[426218]]

Relabeling 重新標(biāo)記是配置 Prometheus 元信息的方式,它是轉(zhuǎn)換和過濾 Prometheus 中 label 標(biāo)簽對象的核心,本文我們將了解 Relabeling 規(guī)則的工作原理以及在不同場景中的應(yīng)用方式。

概述

Prometheus 發(fā)現(xiàn)、抓取和處理不同類型的 label 標(biāo)簽對象,根據(jù)標(biāo)簽值操作或過濾這些對象非常有用,比如:

  • 只監(jiān)視具有特定服務(wù)發(fā)現(xiàn)注解的某些目標(biāo),通常在服務(wù)發(fā)現(xiàn)中使用
  • 向目標(biāo)抓取請求添加 HTTP 查詢參數(shù)
  • 僅存儲從指定目標(biāo)中提取樣本的子集
  • 將抓取序列的兩個標(biāo)簽值合并為一個標(biāo)簽

Relabeling 是作為一系列轉(zhuǎn)換步驟實現(xiàn)的,我們可以在 Prometheus 的配置文件中應(yīng)用這些步驟來過濾或修改標(biāo)記對象,我們可以對一下類型的標(biāo)記對象應(yīng)用 Relabeling 操作:

  • 發(fā)現(xiàn)的抓取目標(biāo)(relabel_configs)
  • 抓取的單個樣本(metric_relabel_configs)
  • 發(fā)送給 Alertmanager 的報警(alert_relabel_configs)
  • 寫到遠(yuǎn)程存儲的樣本(write_relabel_configs)

所有這些 relabeling 配置塊都是相同類型的 relabel_config,每個配置塊都由一個規(guī)則列表組成,這些規(guī)則依次應(yīng)用于每個標(biāo)記的對象。

例如,一個 relabeling 規(guī)則可以根據(jù)正則表達(dá)式的匹配來保留或丟棄一個對象,可以修改其標(biāo)簽,也可以將一整組標(biāo)簽映射到另一組。一旦一個 relabeling 步驟決定放棄一個有標(biāo)簽的對象,就不會對這個對象執(zhí)行進一步的 relabeling 步驟,它將從輸出列表中刪除。

隱藏的標(biāo)簽與元數(shù)據(jù)

以雙下劃線__開頭的標(biāo)簽屬于特殊的標(biāo)簽,它們在重新標(biāo)記后會被刪除。標(biāo)記對象的來源最初可以附加這些隱藏的標(biāo)簽,以提供關(guān)于標(biāo)記對象的額外元數(shù)據(jù),這些特殊的標(biāo)簽可以在 relabeling 階段被用來對對象的標(biāo)簽進行修改。

對于抓取指標(biāo),其中就包含一些隱藏的標(biāo)簽,可以用來控制目標(biāo)應(yīng)該如何被抓取。

  • __address__:包含應(yīng)該被抓取目標(biāo)的地址,它最初默認(rèn)為服務(wù)發(fā)現(xiàn)機制提供的 : ,如果在此之前沒有明確地將實例標(biāo)簽 instance 設(shè)置為其他值,那么在 relabeling 之后,Prometheus 會將 instance 標(biāo)簽設(shè)置為 __address__ 的值。
  • __scheme__:抓取目標(biāo)的請求模式,包括 http 與 https,默認(rèn)為 http。
  • __metrics_path__:表示用于采集指標(biāo)的 HTTP 路徑,默認(rèn)為 /metrics。
  • __param_: 包含 HTTP 查詢參數(shù)名稱和它們的值。

上面的這些標(biāo)簽都可以使用 relabeling 規(guī)則來設(shè)置或覆蓋,這樣就可以為抓取目標(biāo)進行自定義抓取行為。

此外,服務(wù)發(fā)現(xiàn)機制也可以提供一組以 __meta_ 開頭的標(biāo)簽,包含關(guān)于目標(biāo)的特定發(fā)現(xiàn)元數(shù)據(jù)。例如,當(dāng)發(fā)現(xiàn) Kubernetes 集群中的 pod 時,Kubernetes 服務(wù)發(fā)現(xiàn)引擎將為每個 pod 目標(biāo)提供一個 __meta_kubernetes_pod_name 的標(biāo)簽,包含被發(fā)現(xiàn)的 pod 的名字,以及一個 __meta_kubernetes_pod_ready 標(biāo)簽,表明 pod 是否處于就緒狀態(tài),關(guān)于服務(wù)發(fā)現(xiàn)生成的元標(biāo)簽可以查看官方文檔 https://prometheus.io/docs/prometheus/latest/configuration/configuration/#kubernetes_sd_config 了解更多。

如果一個 relabeling 步驟需要將一個值保存到一個臨時標(biāo)簽中(以便在隨后的步驟中處理),那么我們可以使用 __tmp 標(biāo)簽名稱前綴進行標(biāo)記,以 __tmp 開通的標(biāo)簽是不會被 Prometheus 本身使用的。

Relabeling 規(guī)則

Relabeling 規(guī)則主要由以下的一些配置屬性組成,但對于每種類型的操作,只使用這些字段的一個子集。

  • action:執(zhí)行的 relabeling 動作,可選值包括 replace、keep、drop、hashmod、labelmap、labeldrop 或者 labelkeep,默認(rèn)值為 replace。
  • separator:分隔符,一個字符串,用于在連接源標(biāo)簽 source_labels 時分隔它們,默認(rèn)為;。
  • source_labels:源標(biāo)簽,使用配置的分隔符串聯(lián)的標(biāo)簽名稱列表,并與提供的正則表達(dá)式進行匹配。
  • target_label:目標(biāo)標(biāo)簽,當(dāng)使用 replace 或者 hashmod 動作時,應(yīng)該被覆蓋的標(biāo)簽名。
  • regex:正則表達(dá)式,用于匹配串聯(lián)的源標(biāo)簽,默認(rèn)為 (.*),匹配任何源標(biāo)簽。
  • modulus:模數(shù),串聯(lián)的源標(biāo)簽哈希值的模,主要用于 Prometheus 水平分片。
  • replacement:replacement 字符串,寫在目標(biāo)標(biāo)簽上,用于替換 relabeling 動作,它可以參考由 regex 捕獲的正則表達(dá)式捕獲組。

設(shè)置或替換標(biāo)簽值

Relabeling 的一個常見操作就是設(shè)置或者覆蓋一個標(biāo)簽的值,我們可以通過 replace 這個操作來完成,如果沒有指定 action 字段,則默認(rèn)就是 replace。

一個 replace 動作的規(guī)則配置方式如下所示:

  1. actionreplace 
  2. source_labels: [<source label name list>] 
  3. separator: <source labels separator> # 默認(rèn)為 ';' 
  4. regex: <regular expression> # 默認(rèn)為 '(.*)' (匹配任何值)) 
  5. replacement: <replacement string> # 默認(rèn)為 '$1' (使用第一個捕獲組作為 replacement) 
  6. target_label: <target label> 

該操作按順序執(zhí)行以下步驟:

  • 使用提供的 separator 分隔符將 source_labels 中的標(biāo)簽列表值連接起來
  • 測試 regex 中的正則表達(dá)式是否與上一步連接的字符串匹配,如果不匹配,就跳到下一個 relabeling 規(guī)則,不替換任何東西
  • 如果正則匹配,就提取正則表達(dá)式捕獲組中的值,并將 replacement 字符串中對這些組的引用(2, ...)用它們的值替換
  • 把經(jīng)過正則表達(dá)式替換的 replacement 字符串作為 target_label 標(biāo)簽的新值存儲起來

下面我們來簡單看一看 replace 操作的示例。

設(shè)置一個固定的標(biāo)簽值

最簡單的 replace 例子就是將一個標(biāo)簽設(shè)置為一個固定的值,比如你可以把 env 標(biāo)簽設(shè)置為 production:

  1. actionreplace 
  2. replacement: production 
  3. target_label: env 

這里我們并沒有設(shè)置規(guī)則的大部分屬性,這是因為大部分的默認(rèn)值已經(jīng)可以滿足這里的需求了,這里會將替換的字符串 production 作為 target_label 標(biāo)簽 env 的新值存儲起來,也就是將 env 標(biāo)簽的值設(shè)置為 production。

替換抓取任務(wù)端口

另一個稍微復(fù)雜的示例是重寫一個被抓取任務(wù)實例的端口,我們可以用一個固定的 80 端口來替換 __address__ 標(biāo)簽的端口:

  1. actionreplace 
  2. source_labels: [__address__] 
  3. regex: ([^:]+)(?::\d+)? # 第一個捕獲組匹配的是 host,第二個匹配的是 port 端口。 
  4. replacement: "$1:80" 
  5. target_label: __address__ 

這里我們替換的源標(biāo)簽為 __address__,然后通過正則表達(dá)式 ([^:]+)(?::\d+)? 進行匹配,這里有兩個捕獲組,第一個匹配的是 host(,第二個匹配的是端口2),所以在 replacement 字符串中我們保留第一個捕獲組 $1,然后將端口更改為 80,這樣就可以將 __address__ 的實例端口更改為 80 端口,然后重新寫會 __address__ 這個目標(biāo)標(biāo)簽。

保留或丟棄對象

Relabeling 另一個常見的用例就是過濾有標(biāo)簽的對象,keep 或 drop 這兩個動作可以來完成,使用這兩個操作,可以幫助我們完成如下的一些操作:

  • 來自服務(wù)發(fā)現(xiàn)的哪些目標(biāo)應(yīng)該被抓取
  • 從目標(biāo)中抓取哪些指定的序列樣本,或?qū)⑵浒l(fā)送到遠(yuǎn)程存儲
  • 哪些報警要發(fā)送到 Alertmanager

一個 keep 動作的配置規(guī)則如下所示:

  1. action: keep 
  2. source_labels: [<source label name list>] 
  3. separator: <source labels separator> # 默認(rèn)為 ';' 
  4. regex: <regular expression> # 默認(rèn)為 '(.*)' (匹配任何值) 

keep 操作同樣按順序執(zhí)行如下步驟:

  • 使用 separator 分隔符將 source_labels 中列出的標(biāo)簽值連接起來
  • 測試 regex 中的正則表達(dá)式是否與上一步的連接字符串匹配
  • 如果不匹配,該對象將從最終輸出列表中刪除
  • 如果匹配,則保留該對象

drop 動作和 keep 類似,只是它是刪除一個對象而不是保留。

同樣接下來看一看 keep 和 drop 的示例。

只抓取具有注解的目標(biāo)

在服務(wù)發(fā)現(xiàn)的時候,我們可能只想抓取那些具有特定元數(shù)據(jù)標(biāo)簽的目標(biāo),例如,下面的配置讓我們只抓取 Kubernetes 中具有 example.io/should_be_scraped=true 這個 annotation 的目標(biāo)。

  1. action: keep 
  2. source_labels: 
  3.   [__meta_kubernetes_service_annotation_example_io_should_be_scraped] 
  4. regex: true 

Kubernetes 服務(wù)發(fā)現(xiàn)機制下面會將 labels 標(biāo)簽與 annotation 作為元信息輸出到 Prometheus,這些元信息都包含 __meta_ 前綴,這里我們的配置就是保留具有 example.io/should_be_scraped 這個 annotation 標(biāo)簽,且值為 true 的目標(biāo)。

只存儲特定的指標(biāo)

當(dāng)使用 metric_relabel_configs 來控制目標(biāo)的抓取方式時,我們可以使用下面的規(guī)則來只存儲指標(biāo)名稱以 api_ 或 http_ 開頭的指標(biāo)。

  1. action: keep 
  2. source_labels: [__name__] 
  3. regex: "(api_|http_).*" 

標(biāo)簽映射

有時我們可能想把源標(biāo)簽的值映射到一組新的標(biāo)簽中去,這個時候就可以使用 labelmap 這個動作了。labelmap 最常用的使用場景就是從服務(wù)發(fā)現(xiàn)中獲取一組隱藏的或臨時的元數(shù)據(jù)標(biāo)簽,并將它們映射到新的目標(biāo)標(biāo)簽中。

labelmap 動作的配置規(guī)則如下所示:

  1. action: labelmap 
  2. regex: <regular expression> # 默認(rèn)為 '(.*)' 
  3. replacement: <replacement string> # 默認(rèn)為 '$1' 

和前面的一些 action 不同,labelmap 是對標(biāo)簽名而不是標(biāo)簽值進行重新匹配和操作。labelmap 按順序執(zhí)行以下步驟:

  • 將 regex 中的正則表達(dá)式與所有標(biāo)簽名進行匹配
  • 將匹配的標(biāo)簽名的任何匹配值復(fù)制到由 replacement 字符串決定的新的標(biāo)簽名中

下面我們看一個使用 labelmap 映射 Kubernetes Service 標(biāo)簽的示例。當(dāng)使用基于 Kubernetes 的服務(wù)發(fā)現(xiàn)來發(fā)現(xiàn) pod 端點時,我們可能希望每個端點的最終目標(biāo)標(biāo)簽也包含 Kubernetes Service 標(biāo)簽,這樣可以更好的區(qū)分端點數(shù)據(jù)。Kubernetes 服務(wù)發(fā)現(xiàn)機制會將這些標(biāo)簽添加到 Prometheus 中去,標(biāo)簽名稱格式為 __meta_kubernetes_service_label_,我們可以提取這些元數(shù)據(jù)標(biāo)簽中的 部分,并將相應(yīng)的標(biāo)簽值映射到一組以 k8s_ 為前綴的新標(biāo)簽名稱上,如下所示:

  1. action: labelmap 
  2. regex: __meta_kubernetes_service_label_(.+) 
  3. replacement: "k8s_$1" 

通過上面的 labelmap 操作,regex 正則表達(dá)式中匹配標(biāo)簽名,然后將標(biāo)簽名對應(yīng)的值復(fù)制到 k8s_$1 的新標(biāo)簽中,$1 就是匹配的標(biāo)簽名這個捕獲組。

保留或刪除標(biāo)簽

有的時候我們也有保留或刪除一些標(biāo)簽的需求,比如有的目標(biāo)在時間序列上提供了許多額外的標(biāo)簽,這些標(biāo)簽用途不大,這個時候我們就可以使用 labelkeep 和 labeldrop 這兩個操作,使用這兩個操作可以有選擇地保留或刪除一些標(biāo)簽。

labelkeep 的配置規(guī)則如下所示:

  1. action: labelkeep 
  2. regex: <regular expression> # 默認(rèn)為'(.*)' 

一樣 labelkeep 按順序執(zhí)行下面的步驟:

  • 首先將 regex 中的正則表達(dá)式與所有標(biāo)簽名稱進行匹配
  • 它只保留那些匹配的標(biāo)簽

labeldrop 與 labelkeep 類似,只是它是刪除那些匹配正則表達(dá)式的標(biāo)簽而不是保留。

下面我們看一看 labelkeep/labeldrop 操作的簡單示例。

從報警中刪除高可用副本標(biāo)簽

當(dāng)運行兩個相同的 Prometheus 作高可用的時候,通常兩個服務(wù)器都被配置為有一個外部標(biāo)簽(通過全局配置選項 external_labels),表明它們代表哪個副本,例如:replica: A 和 replica: B,在從兩個副本向同一個 Alertmanager 實例發(fā)送報警之前,Prometheus 需要刪除這個副本標(biāo)簽,這樣 Alertmanager 就不會把收到的報警看成不同的報警了,否則可能我們會收到兩個同樣的報警通知。這個時候我們就可以使用 labeldrop 來實現(xiàn)這個操作。

  1. action: labeldrop 
  2. regex: replica 

這條配置規(guī)則很簡單的,就是匹配 replica 這個標(biāo)簽,然后執(zhí)行 labeldrop 刪除標(biāo)簽動作即可。

刪除指標(biāo)中不需要的標(biāo)簽

有的時候我們抓取的指標(biāo)在每個時間序列上都附加了一些額外的標(biāo)簽,這些標(biāo)簽對于我們來說用處不大,還會增加 Prometheus 的存儲壓力,所以我們可以想辦法刪除不需要的額外標(biāo)簽。

比如現(xiàn)在我們想要刪除一 info_ 開頭的標(biāo)簽,我們可以使用下面的配置規(guī)則來完成。

  1. action: labeldrop 
  2. regex: info_.* 

同樣也只是配置一個要刪除的目標(biāo)標(biāo)簽的正則表達(dá)式即可,只要匹配了的標(biāo)簽都會執(zhí)行 labeldrop 操作將該標(biāo)簽進行刪除。

標(biāo)簽哈希和分片

在一些場景下我們可能需要運行多個幾乎相同的 Prometheus 副本來橫向擴展,每個副本只抓取部分目標(biāo),這樣可以降低 Prometheus 的壓力,在這種情況下 hashmod 操作有助于我們對目標(biāo)進行分片操作。

hashmod 的配置規(guī)則如下所示:

  1. action: hashmod 
  2. source_labels: [<source label name list>] 
  3. modulus: <modulus value> 
  4. target_label: <target label> 

該操作按順序執(zhí)行下面的步驟:

  • 首先使用分隔符將源標(biāo)簽集 source_labels 的值連接起來
  • 計算連接后的字符串的哈希值
  • 將 modulus 中提供的模數(shù)應(yīng)用于哈希值,以將哈希值限制在 0 和modulus-1之間

將上一步的模數(shù)值存儲在 target_label 目標(biāo)標(biāo)簽中

使用 hashmod 的主要場景是將一個服務(wù)的整體目標(biāo)進行分片,用于水平擴展 Prometheus,通過首先根據(jù)每個目標(biāo)的一個或多個標(biāo)簽計算基于哈希的模數(shù)來實現(xiàn)的,然后只保留具有特定輸出模數(shù)值的目標(biāo)。比如為了根據(jù) instance 標(biāo)簽對目標(biāo)進行分片,只保留分片 2 的實例,我們可以把 hashmod 和 keep 結(jié)合起來操作。

  1. action: hashmod 
  2.   source_labels: [instance] 
  3.   modulus: 10 
  4.   target_label: __tmp_hashmod 
  5. action: keep 
  6.   source_labels: [__tmp_hashmod] 
  7.   regex: 2 

首先通過 hashmod 操作對 instance 標(biāo)簽進去哈希操作,將取模后的值存儲在臨時標(biāo)簽 __tmp_hashmod 中,然后通過第二個 keep 操作,只保留分片數(shù)為 2 的指標(biāo),這樣就達(dá)到了分片的目的。

到這里我們基本上就了解了 relabeling 的使用,后續(xù)我們可以再去了解服務(wù)發(fā)現(xiàn)在 Prometheus 中的使用。

 

責(zé)任編輯:姜華 來源: k8s技術(shù)圈
相關(guān)推薦

2021-09-30 08:54:58

prometheus監(jiān)控遠(yuǎn)端服務(wù)

2009-06-24 09:19:56

JSF標(biāo)記JSTL標(biāo)記

2024-10-08 08:36:50

HTML標(biāo)簽前端

2021-10-08 06:22:00

Prometheus 儀表化應(yīng)用運維

2019-05-05 11:20:06

PythonPrometheus跟蹤天氣

2022-05-19 08:21:02

vmalert監(jiān)控

2022-07-08 08:00:31

Prometheus監(jiān)控

2023-10-09 07:31:25

2020-03-09 09:15:56

集群Prometheus開源

2022-05-12 08:01:26

vmagentprometheus

2021-07-01 11:29:45

KubernetesGrafana監(jiān)控

2010-01-20 17:41:13

VB.NET標(biāo)記語句

2021-05-28 08:58:41

Golang網(wǎng)卡metrics

2023-12-27 18:05:13

2009-11-30 16:24:24

PHP腳本

2023-02-23 08:00:27

PostgreSQPrometheus指標(biāo)

2018-10-24 12:15:06

無服務(wù)器軟件方式

2010-07-30 11:03:54

Flex數(shù)據(jù)綁定

2011-05-05 09:36:48

Oracle安全標(biāo)記

2022-07-29 09:35:25

WAF溯源識別
點贊
收藏

51CTO技術(shù)棧公眾號