Prometheus标签的使用说明
Posted 凤舞飘伶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prometheus标签的使用说明相关的知识,希望对你有一定的参考价值。
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_labels 标签的值(注意:多个 source_label 的值会按 照 separator 进行拼接),并且将匹配到的值写入到 target_label 当中,如果有多个匹 配组,则可以使用 $1, $2 确定写入的内容。如果没匹配到任何内容则不对 target_label 进行重新, 默认为 replace。
hashmod: 将 target_label 设置为关联的 source_label 的哈希模块删除指标:如:不想监控 某 个target可以用drop删除。
keep: 丢弃 source_labels 的值中没有匹配到 regex 正则表达式内容的 Target 实例
drop: 丢弃 source_labels 的值中匹配到 regex 正则表达式内容的 Target 实例
创建或删除标签:
labelmap: #根据 regex 去匹配 Target 实例所有标签的名称(注意是名称),并且将捕获到的 内容作为为新的标签名称,regex 匹配到标签的的值作为新标签的值。
labeldrop: 对 Target 标签进行过滤,会移除匹配过滤条件的所有标签
labelkeep: 对 Target 标签进行过滤,会移除不匹配过滤条件的所有标签
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'
- job_name: 'elasticsearch'
metrics_path: "/metrics"
static_configs:
- targets:
- '10.32.238.22:9114'
labels:
service: elasticsearch # 新添加的标签
relabel_configs:
- action: replace # 执行的动作,默认就是这个值,可以省略不写。
source_labels: [__address__] # 要替换的标签
regex: '(.*)\\:9114' # 正则匹配标签中的值,以备后面替换使用
target_label: 'instance' # 替换后的标签名,instance=$1,target_label用于创建新标签
replacement: '$1' # 替换为正则匹配中的子模式的值,就是regex中的括号里的值
二、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
使用 metric 值查询 prometheus 标签值
【中文标题】使用 metric 值查询 prometheus 标签值【英文标题】:Querying prometheus label values with metric values 【发布时间】:2020-05-14 19:56:44 【问题描述】:有没有办法将标签值作为普罗米修斯查询的值。 例如,我需要过滤掉 CPU 使用率超过 80% 的实例。我需要 ip 地址列表作为输出。值列是否可能或将只是指标值。
预期输出:
Value
10.21.123.21
72.34.128.31
【问题讨论】:
【参考方案1】:使用 HTTP API
您可以运行以下命令获取 CPU 使用率超过 80% 的实例:
curl --silent --globoff --request GET "http://PROMETHEUS-SERVER/api/v1/query?query=100-100*avg%20by%20(instance)(irate(node_cpu_seconds_totalmode=\"idle\"[5m]))>80" | jq --raw-output '.data.result[].metric.instance'
使用 Grafana
如果您使用的是 Grafana,您可以在“仪表板设置”>“变量”>“新建”中添加变量
查询选项:
Data source: Prometheus
Query: query_result(100 - 100 * avg by (instance) (irate(node_cpu_seconds_totalmode="idle"[5m])) > 80)
Regex: /.*\"(.*)\".*/
【讨论】:
我没有使用 grafana 进行可视化。我需要使用 prometheus 公开的 Http API 来完成它。如果我使用 /label/instance/values,我将获得标签值。但是如何获取查询结果中存在的值。 我添加了 HTTP API 信息。以上是关于Prometheus标签的使用说明的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Grafana 警报显示 Prometheus 标签
[Prometheus][Grafana] 使用标签在它们之间映射指标