prometheus在處理數據指標的過程中,包括【抓取的生命周期】和【標簽的生命周期】
默認情況下,當prometheus加載target實例完成后,這些target時候會包含一些默認的標簽,這些標簽將會告訴prometheus如何從target實例中獲取監控數據
發生在采集樣本數據之前,對Target實例的標簽進行重寫的機制在Prometheus被稱為Relabeling。Prometheus允許用戶在采集任務設置中通過relabel_configs來添加自定義的Relabeling過程
Prometheus 從數據源拉取數據后,會對原始數據進行編輯;其中 metric_relabel_configs是 Prometheus 在保存數據前的最后一步標簽重新編輯(relabel_configs)。哪怕你將 metric_relabel_configs模塊放在 job_name模塊的最前端,Prometheus 解析編輯文件后,也會將 metric_relabel_configs放在最后。metric_relabel_configs 模塊和 relabel_config 模塊很相似。metric_relabel_configs一個很常用的用途:將監控不需要的數據,直接丟掉,不在Prometheus 中保存。
系統默認使用的標簽
- __address__:當前Target實例的訪問地址[host]:[port]
- __scheme__:采集目標服務訪問地址的HTTP Scheme,HTTP或者HTTPS
- __metrics_path__:采集目標服務訪問地址的訪問路徑
- __param_:采集任務目標服務的中包含的請求參數
- __name__: 此標簽是標識指標名稱的預留標簽。
- job:target的
job
標簽設置為配置文件里的job_name
的值
prometheus 允許在采集之前對任何目標及其標簽進行修改操作
- 重命名標簽名
- 刪除標簽
- 過濾標簽
action 標簽的動作
- replace: 默認,通過regex匹配source_label標簽的值,使用replacement來引用表達式匹配的分組
- keep: 刪除regex與連接不匹配的目標source_labels (保留source_labels標簽中的值與regex定義表達匹配的target)
- drop:刪除regex與連接匹配的目標source_labels (刪除source_labels標簽中的值與regex定義表達匹配的target)
- labeldrop: 刪除regex匹配的標簽名稱
- labelkeep:刪除regex不匹配的標簽名稱
- labelmap: 匹配regex所有標簽名稱。然后復制匹配標簽的值進行分組,replacement分組引用(${1}, ${2},……)替換
- hashmod:設置target_label為modules連接的哈希值source_labels
relable_configs: # 源標簽 [ source_labels: '[' <labelname> [, ...] ']' ] # 多個源標簽時連接的分隔符 [ separator: <string> | default = ; ] # 定義重新標記的標簽 [ target_label: <labelname> ] # 正則表達式匹配源標簽的值 [ regex: <regex> | default = (.*) ] # 用的少,占時略 [ modulus: <uint64> ] # 替換正則表達式匹配的分組,分組引用 $1,$2,$3,.... [ replacement: <string> | default = $1 ] # 基於正則表達式匹配執行的操作 [ action: <relabel_action> | default = replace ]
一、 replace 不指定action的動作就是 replace
以下三種寫法都是一種意思 把addr = IP(IP為__address__值中的ip地址)
relabel_configs: - source_labels: [ '__address__' ] target_label: 'addr' replacement: 'localhost' relabel_configs: - source_labels: [ '__address__' ] target_label: 'addr' #regex: "(.*):.*" #如果只是取$1,那么這句話跟下面的意思一樣 regex: "(.*):(.*)" replacement: $1 relabel_configs: - action: replace source_labels: [ '__address__' ] regex: "(.*):(.*)" replacement: $1 target_label: 'addr'
二、keep
只采集 172.19.1.21這台主機的指標
relabel_configs: - separator: ; source_labels: [ '__address__'] regex: '172.19.1.21:.*' action: keep
不采集172.19.1.21這台主機的指標
relabel_configs:
- action: drop
source_labels: ['__address__']
regex: '172.19.1.21:.*'
三、labelmap 標簽名替換
- job_name: 'node_exporter' static_configs: - targets: ['172.19.1.21:9100','172.19.1.22:9100','172.19.1.23:9100'] labels: env: 'test' zone: 'shanghai' label_name: 'Test_label' label_value: 'za' __host__: 'master_abc' relabel_configs: - source_labels: [ '__host___'] regex: 'label_(.+)' replacement: $1 action: labelmap
效果如下
四、根據hashmod來選擇采集哪些target
當relabel_config設置為hashmod時,Prometheus會根據modulus的值作為系數,計算source_labels值的hash值。
relabel_configs:
- source_labels: [ '__address__']
modulus: 8 # 根據當前Target實例__address__
的值以8作為系數,這樣每個Target實例都會包含一個新的標簽_tmp_hash_value,並且該值的范圍在1~10之間
target_label: _tmp_bash_value
action: hashmod
效果如下
這個時候就可以利用_tmp_hash_value這個臨時標簽做任何標簽處理了,如下對_tmp_bash_value=3的實例drop
relabel_configs: - source_labels: [ '__address__' ] modulus: 8 target_label: _tmp_hash_value action: hashmod - source_labels: [ '_tmp_hash_value' ] regex: "^3$" action: drop
relabel_configs:
- source_labels: [ '__address__' ] modulus: 8 target_label: _tmp_hash_value action: hashmod - source_labels: [ '_tmp_hash_value' ] regex: "(^1$|^9$)" action: keep
五、labeldrop使用
- job_name: 'node_exporter' static_configs: - targets: ['172.19.1.21:9100','172.19.1.22:9100','172.19.1.23:9100'] labels: env: 'test' zone: 'shanghai' label_name: 'Test_label' label_value: 'za' __host__: 'master_abc' relabel_configs: - regex: "label(.+)" action: labeldrop
metric_relabel_configs對拉取數據的操作
1、刪除不需要的metrics
刪除以node_cpu_開頭的所有metrics
metric_relabel_configs: - source_labels: [__name__] separator: ; regex: node_cpu_(.+) replacement: $1 action: drop
修改指標(metrics)中標簽(label)
讓metric標簽中的container_label_io_kubernetes_pod_name
這個標簽的值賦給新的標簽pod_name
metric_relabel_configs:pod_name - source_labels: ['container_label_io_kubernetes_pod_name
']
regex: (.+)
replacement: $1
target_label: pod_name
action: replace