一 對target重新打標
- 對target從新打標是在數據抓取之前動態重寫target標簽的強大工具,在每個數據抓取配置中,可以定義多個relabel步驟,它們將按照定義的順序依次執行;
- 對於發現的每個target,Prometheus默認會執行如下操作;
- job的標簽設定為其所屬的job_name的值;
- __address__標簽的值為該target的套接字地址:“<host>:<port>”;
- instance標簽的值為__address__的值;
- __scheme__標簽的值為抓取該target上指標時使用的協議(http或https);
- __metrics_path__標簽的值為抓取該target上的指標時使用URL路徑,默認為/metrics;
- __param_<name>標簽的值為傳遞的URL參數中的第一名稱為<name>的參數的值;
- 從新標記期間,還可以使用該target以上“__meta__”開頭的元標簽;
- 各服務發現機制為其target添加的元標簽會有所不同;
- 從新標記完成后,該target上以“__”開頭的所有標簽都會被移除;
- 若在relabel的過程中需要臨時存儲標簽值,則要使用__tmp標簽名稱為前綴進行保存,以避免同Prometheus的內建標簽沖突;
二 relabel_configs
- <relabel_action>字段用於定義重新標記的行為,其可用取值如下:
- 替換標簽值;
- replace:首先將source_labels中指定的各標簽的值進行串聯,而后將regex字段中的正則表達式對源標簽值進行匹配判定,若匹配,則將target_label字段中指定的標簽的值替換為replacement字段中保存的值;
- replacement可按需引用保存regex中的某個分組模式匹配到的值;默認保存整個regex匹配到的內容;
- 進行值替換時,replacement字段中指定標簽的值也支持以分組格式進行引用;
- hashmod:將target_label的值設置為一個hash值,該hash則由modules字段指定的hash模對塊source_labels上各標簽的串聯值進行hash計算生成;
- replace:首先將source_labels中指定的各標簽的值進行串聯,而后將regex字段中的正則表達式對源標簽值進行匹配判定,若匹配,則將target_label字段中指定的標簽的值替換為replacement字段中保存的值;
- 刪除指標:該處的每個指標名稱對應一個target;
- keep:regex不能匹配到target上的source_labels上的各標簽的串聯值時,則刪除該target;
- drop:regex能夠匹配到target上的source_labels上的各標簽的串聯值時,則刪除該target;
- 創建或刪除標簽;
- labelmap:將regex對所有的標簽名進行匹配判定,而后將匹配到的標簽的值賦給replacement字段指定的標簽名之上,通常用於取出匹配的標簽名的一部分生成新標簽;
- labeldrop:將regex對所有的標簽名進行匹配判定,能夠匹配到的標簽將從該target的標簽集中刪除;
- labelkeep:將regex對所有的標簽名進行匹配判定,不能匹配到的標簽將從該target的標簽集中刪除;
- 注意:要確保在labeldrop或labelkeep操作后,余下的標簽集依然能唯一標識該指標;
- 替換標簽值;
[ source_labels: '[' <labelname> [, ...] ']' ] #引用已有標簽,可以引用多個
[ separator: <string> | default = ; ] #對應於元標簽的值連接時,選用的連接符
[ target_label: <labelname> ] #regex匹配引用標簽的值
[ regex: <regex> | default = (.*) ] #選擇正則表達式對引用標簽進行模式匹配,匹配后的值賦值給target_label
[ modulus: <int> ]
[ replacement: <string> | default = $1 ]
[ action: <relabel_action> | default = replace ] #打標的動作,替換指定目標標簽的值
三 對抓取到的metric從新打標
- 對metric重新打標是在數據抓取之后動態重寫metric標簽的工具,在每個數據抓取配置中,可以定義多個metric relabel的步驟,他們將按照定義的順序依次執行;
- 刪除不必要的標簽;
- 從指標中刪除敏感或不需要的標簽;
- 添加、編輯或修改指標的標簽值或標簽格式;
- 對metric重新打標的配置格式與target重新打標的格式相同,但但前者要定義在專用的metr_relabel_configs字段中;
- 但是要注意的是,更改或添加標簽會創建新的時間序列;
- 應該明確的使用各個標簽,並盡可能保持不變,以避免創建出一個動態的數據環境;
- 標簽是時間序列的唯一性約束,刪除標簽並導致時間序列重復時,可能會導致系統出現問題;
四 重新打標示例
4.1 replace
4.1.1 查看打標之前狀態
4.1.2 修改Prometheus配置文件
- 下面示例,將三個源標簽的值按順序串聯后,由指定的正則表達式進行模式匹配,而后由replacement引用模式匹配結果,並加以改造后,將其賦值給endpoint標簽;
- 對job_name: "prometheus-containers" 生效
- job_name: "prometheus-containers"
static_configs:
- targets: ['192.168.174.106:8080']
relabel_configs:
- source_labels:
- __scheme__
- __address__
- __metrics_path__
regex: "(http|https)(.*)"
separator: ""
target_label: "endpoint"
replacement: "${1}://${2}"
action: replace
4.1.2 驗證打標后結果
4.2 drop
4.2.1 查看打標之前狀態
4.2.2 修改Prometheus配置文件
- 在source_label字段上,通過指標上元標簽“__name__”引用指標名稱,而后由regex進行匹配判定,可使用drop action刪除匹配的指標,或使用keep action僅保留匹配的指標;
- 對job_name: "prometheus-containers" 生效
- job_name: "prometheus-containers"
static_configs:
- targets: ['192.168.174.106:8080']
metric_relabel_configs:
- source_labels:
- __name__
regex: "go_info.*"
action: drop
4.2.3 驗證打標后的狀態
注意:狀態會有延遲,需要稍等幾分鍾;
prometheus-containers 已經不存在;
4.3 labelmap
4.3.1 查看打標之前狀態
4.3.2 修改Prometheus配置
- 該示例,將regex指定的模式對target上的所有標簽進行匹配判定,對於匹配到的標簽名,它將以該標簽名中匹配的部分為前綴,指定的“_name”為后綴生成新的標簽名,而新標簽的值則與原標簽的值相同;
- job_name: "prometheus-node"
static_configs:
- targets: ['192.168.174.100:9100']
relabel_configs:
- regex: "(job|app)"
replacement: ${1}_name
action: labelmap
4.3.3 驗證打標后的結果