<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Prometheus Relabeling 重新標記的使用

          共 7821字,需瀏覽 16分鐘

           ·

          2021-09-28 10:24

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

          概述

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

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

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

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

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

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

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

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

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

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

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

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

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

          Relabeling 規(guī)則

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

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

          設置或替換標簽值

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

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

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

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

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

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

          設置一個固定的標簽值

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

          action: replace
          replacement: production
          target_label: env

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

          替換抓取任務端口

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

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

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

          保留或丟棄對象

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

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

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

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

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

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

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

          同樣接下來看一看 keepdrop 的示例。

          只抓取具有注解的目標

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

          action: keep
          source_labels:
            [__meta_kubernetes_service_annotation_example_io_should_be_scraped]
          regex: true

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

          只存儲特定的指標

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

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

          標簽映射

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

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

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

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

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

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

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

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

          保留或刪除標簽

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

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

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

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

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

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

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

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

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

          action: labeldrop
          regex: replica

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

          刪除指標中不需要的標簽

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

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

          action: labeldrop
          regex: info_.*

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

          標簽哈希和分片

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

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

          action: hashmod
          source_labels: [<source label name list>]
          modulus: <modulus value>
          target_label: <target label>

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

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

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

          - action: hashmod
            source_labels: [instance]
            modulus: 10
            target_label: __tmp_hashmod
          - action: keep
            source_labels: [__tmp_hashmod]
            regex: 2

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

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


          瀏覽 55
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲国产精品福利一区 | 天天色综合zx | 风间由美一二三区AV片 | 啪啪啪视频免费在线观看 | 黄色免费在线观看电影 |