成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Prometheus Relabeling 重新標記的使用

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

[[426218]]

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

概述

Prometheus 發現、抓取和處理不同類型的 label 標簽對象,根據標簽值操作或過濾這些對象非常有用,比如:

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

Relabeling 是作為一系列轉換步驟實現的,我們可以在 Prometheus 的配置文件中應用這些步驟來過濾或修改標記對象,我們可以對一下類型的標記對象應用 Relabeling 操作:

  • 發現的抓取目標(relabel_configs)
  • 抓取的單個樣本(metric_relabel_configs)
  • 發送給 Alertmanager 的報警(alert_relabel_configs)
  • 寫到遠程存儲的樣本(write_relabel_configs)

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

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

隱藏的標簽與元數據

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

對于抓取指標,其中就包含一些隱藏的標簽,可以用來控制目標應該如何被抓取。

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

上面的這些標簽都可以使用 relabeling 規則來設置或覆蓋,這樣就可以為抓取目標進行自定義抓取行為。

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

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

Relabeling 規則

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

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

設置或替換標簽值

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

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

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

該操作按順序執行以下步驟:

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

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

設置一個固定的標簽值

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

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

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

替換抓取任務端口

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

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

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

保留或丟棄對象

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

  • 來自服務發現的哪些目標應該被抓取
  • 從目標中抓取哪些指定的序列樣本,或將其發送到遠程存儲
  • 哪些報警要發送到 Alertmanager

一個 keep 動作的配置規則如下所示:

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

keep 操作同樣按順序執行如下步驟:

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

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

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

只抓取具有注解的目標

在服務發現的時候,我們可能只想抓取那些具有特定元數據標簽的目標,例如,下面的配置讓我們只抓取 Kubernetes 中具有 example.io/should_be_scraped=true 這個 annotation 的目標。

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

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

只存儲特定的指標

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

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

標簽映射

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

labelmap 動作的配置規則如下所示:

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

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

  • 將 regex 中的正則表達式與所有標簽名進行匹配
  • 將匹配的標簽名的任何匹配值復制到由 replacement 字符串決定的新的標簽名中

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

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

通過上面的 labelmap 操作,regex 正則表達式中匹配標簽名,然后將標簽名對應的值復制到 k8s_$1 的新標簽中,$1 就是匹配的標簽名這個捕獲組。

保留或刪除標簽

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

labelkeep 的配置規則如下所示:

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

一樣 labelkeep 按順序執行下面的步驟:

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

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

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

從報警中刪除高可用副本標簽

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

  1. action: labeldrop 
  2. regex: replica 

這條配置規則很簡單的,就是匹配 replica 這個標簽,然后執行 labeldrop 刪除標簽動作即可。

刪除指標中不需要的標簽

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

比如現在我們想要刪除一 info_ 開頭的標簽,我們可以使用下面的配置規則來完成。

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

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

標簽哈希和分片

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

hashmod 的配置規則如下所示:

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

該操作按順序執行下面的步驟:

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

將上一步的模數值存儲在 target_label 目標標簽中

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

  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 標簽進去哈希操作,將取模后的值存儲在臨時標簽 __tmp_hashmod 中,然后通過第二個 keep 操作,只保留分片數為 2 的指標,這樣就達到了分片的目的。

到這里我們基本上就了解了 relabeling 的使用,后續我們可以再去了解服務發現在 Prometheus 中的使用。

 

責任編輯:姜華 來源: k8s技術圈
相關推薦

2021-09-30 08:54:58

prometheus監控遠端服務

2009-06-24 09:19:56

JSF標記JSTL標記

2024-10-08 08:36:50

HTML標簽前端

2019-05-05 11:20:06

PythonPrometheus跟蹤天氣

2023-10-09 07:31:25

2022-07-08 08:00:31

Prometheus監控

2022-05-19 08:21:02

vmalert監控

2021-10-08 06:22:00

Prometheus 儀表化應用運維

2021-07-01 11:29:45

KubernetesGrafana監控

2020-03-09 09:15:56

集群Prometheus開源

2022-05-12 08:01:26

vmagentprometheus

2010-01-20 17:41:13

VB.NET標記語句

2021-05-28 08:58:41

Golang網卡metrics

2023-12-27 18:05:13

2009-11-30 16:24:24

PHP腳本

2023-02-23 08:00:27

PostgreSQPrometheus指標

2018-10-24 12:15:06

無服務器軟件方式

2011-05-05 09:36:48

Oracle安全標記

2014-03-14 17:01:44

2010-07-30 11:03:54

Flex數據綁定
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲一区电影 | 国产三区在线观看视频 | a看片 | 亚洲日韩中文字幕一区 | 国产精品久久久久久久久久 | 午夜影视网 | 毛片视频网站 | 国产高清久久久 | 国产精品久久久久9999鸭 | 国产精品久久久久无码av | 日韩精品极品视频在线观看免费 | 中文字幕一区二区三区四区不卡 | 亚洲一区 中文字幕 | 欧美中文在线 | 日韩一区二区三区av | 在线看日韩 | 不卡视频在线 | 久久久久久亚洲 | 亚洲一区二区三区欧美 | 羞羞网站免费观看 | 精品久久香蕉国产线看观看亚洲 | 黄色三级免费 | 天天夜夜操 | 国产精品视频不卡 | 99久久婷婷国产综合精品电影 | 国产欧美三区 | 男女视频在线免费观看 | 二区在线观看 | 欧美日韩高清在线观看 | 中国一级特黄真人毛片免费观看 | 日韩不卡在线观看 | 欧美日韩亚洲一区 | 亚洲精品在线91 | 色资源站| 国产婷婷精品av在线 | 久久久久国产视频 | 蜜桃av鲁一鲁一鲁一鲁 | 亚洲97 | 亚洲欧美激情精品一区二区 | 欧美成人aaa级毛片在线视频 | 日日干夜夜干 |