00:文章简介
介绍prometheus的labels标签管理和metric指标管理。
01:什么是标签
Prometheus上可以对主机设置labels,便于我们在筛选的时候快速定位一个或多个同类型的主机。
标签有2种类型
- 私有标签
- 以"__label_name"样式存在,是获取监控目标的默认元数据属性
- “__address__” 记录获取目标的地址
- "__scheme__"记录获取目标的请求协议方法
- "__metrics_path__"记录获取目标metrics的uri地址
- 以"__label_name"样式存在,是获取监控目标的默认元数据属性
- 普通标签
- 一般都是我们自定义的标签,或者metrics中自动生成的标签
- 对于这些标签,我们应该
- 删除不必要或敏感的标签
- 添加、编辑、修改需要的标签
标签和指标流程:
- 重新标记relable_configs时
- 只是对主机的target进行配置
- 重新标记metric_relable_configs
- 只是对主机的metric进行配置
02:添加初始target标签
我们可以在提供资源清单时,对Job进行统一标签
- targets:
- 192.168.31.11:9100
- 192.168.31.12:9100
- 192.168.31.13:9100
- 192.168.31.21:9100
- 192.168.31.22:9100
- 192.168.31.23:9100
labels:
app: node_exporter
03:管理target标签
我们也可以在prometheus配置文件中,对某一个job中的target标签进行增加、修改、删除、映射
官网文档:https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config
配置示例如下:
scrape_configs:
- job_name: "nodes"
metrics_path: '/metrics'
static_configs:
- targets:
- '192.168.31.11:9100'
relabel_configs:
- source_labels: [<label_name> [,...]] # 原有标签,使用完整名称表达
regex: '<regex> | default = (.*)' # 存在source_labes时,表示匹配对应的值,不存在时,表示匹配source_labes的名字
replacement: '<string> | default = $1' # 替换标签时,标签对应的值
target_label: '<label_name>' # 替换后的标签
action: '<relabel_action> | default = replace' # 标签管理的动作
relabel_config 和 metric_relabel_configs的区别
- relabel_config
- 用于发现目标前的标签设置,针对于target对象,最后是显示在target中
- metric_relabel_configs
- 用于target获取完成后,针对于metric中的监控数据,最后是作用于metric中
- 它是在Prometheus保存数据前,对标签进行重新编辑
常见的action动作有:
- replace,默认,通过regex匹配source_label的值,使用replacement来进行修改值,或target_label修改名称
- keep,删除所有与regex不匹配的source_labels的target
- drop,删除与regex匹配的source_labels的target,就是不对该target进行监控
- labelkeep,删除regex不匹配的标签
- labeldrop,删除regex匹配的标签
- labelmap,将regex匹配的所有标签名中的replacement放置在指定的标签名中,类似与copy + rename
3.1:替换标签
在targets中,一般不会显示带有双下划线的label,如果我们想要在labels中显示,可以使用replace,replace后的label就可以在labels中显示。
- job_name: "from cmdb"
metrics_path: '/metrics'
http_sd_configs:
- url: http://192.168.31.89:80/api/hosts
refresh_interval: 10s
relabel_configs:
- source_labels:
- __scheme__
- __address__
- __metrics_path__
regex: '(http|https)(.*)'
separator: ""
target_label: "endpoint"
replacement: '${1}://${2}'
action: replace
重启prometheus查看结果
对比之前
3.2:删除标签
- job_name: "from cmdb"
metrics_path: '/metrics'
http_sd_configs:
- url: http://192.168.31.89:80/api/hosts
refresh_interval: 10s
relabel_configs:
- regex: '(job)'
action: labeldrop
重启prometheus查看结果
3.3:根据标签删除target
- job_name: "from cmdb"
metrics_path: '/metrics'
http_sd_configs:
- url: http://192.168.31.89:80/api/hosts
refresh_interval: 10s
relabel_configs:
- source_labels:
- __address__
regex: '192\.168\.31\.11.*'
action: drop
3.4:映射标签
映射标签类似于copy + rename,保留原标签和值
- job_name: "from cmdb"
metrics_path: '/metrics'
http_sd_configs:
- url: http://192.168.31.89:80/api/hosts
refresh_interval: 10s
relabel_configs:
- regex: '(job)'
replacement: '${1}_name'
action: labelmap
3.5:重命名标签
重命名就是映射后删除
- job_name: "from cmdb"
metrics_path: '/metrics'
http_sd_configs:
- url: http://192.168.31.89:80/api/hosts
refresh_interval: 10s
relabel_configs:
- regex: '(job)'
replacement: '${1}_name'
action: labelmap
- regex: '(job)'
action: labeldrop
04:管理metric指标
我们也可以在prometheus配置文件中,对某一个job中的target获取到的metric指标进行增加、修改、删除、映射
官网文档:https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs
配置示例如下:
scrape_configs:
- job_name: "nodes"
metrics_path: '/metrics'
static_configs:
- targets:
- '192.168.31.11:9100'
metric_relabel_configs:
- source_labels: [<label_name> [,...]] # 原有指标名,使用完整名称表达
regex: '<regex> | default = (.*)' # 存在source_labes时,表示匹配对应的值,不存在时,表示匹配source_labes的名字
replacement: '<string> | default = $1' # 替换指标值时,指标对应的值
separator: "" # replacement操作时,指标值的连接符
target_label: '<label_name>' # 替换后的指标名
action: '<relabel_action> | default = replace' # 标签管理的动作
relabel_config 和 metric_relabel_configs的区别
- relabel_config
- 用于发现目标前的标签设置,针对于target对象,最后是显示在target中
- metric_relabel_configs
- 用于target获取完成后,针对于metric中的监控数据,最后是作用于metric中
- 它是在Prometheus保存数据前,对标签进行重新编辑
常见的action动作有:
- replace,默认,通过regex匹配source_label的值,使用replacement来进行修改值,或target_label修改名称
- keep,删除所有与regex不匹配的source_labels的target
- drop,删除与regex匹配的source_labels的target
- labelkeep,删除regex不匹配的标签
- labeldrop,删除regex匹配的标签
- labelmap,将regex匹配的所有标签名中的replacement放置在指定的标签名中,类似与copy + rename
4.1:了解metric组成
这部分有关于PromQL,详细的可以去看PromQL的文章,这里只简单介绍一下在管理metric时用到的知识点。
Metric Name的表示方式有2种:
- 指标名称可以使用字母、数字、下划线,且必须能匹配RE2规范的正则表达式
- 以"__"为前缀的名称为Prometheus系统预留使用
正常表示
#|<- Metric Name ->| |<- Labels ->|
http_requests_total {status="200",method="GET"}
Prometheus内部表示
#|<- Metric Name ->| |<- Labels ->|
__name__="http_requests_total" {status="200",method="GET"}
所以在匹配prometheus指标名称时,有2种方式
# 1
- source_labels:
- __name__
regex: 'http_requests_total'
# 意思是匹配__name__='http_requests_total' 的指标
# 2
- source_labels:
- http_requests_total
regex: '.*'
# 意思是匹配http_requests_total指标名,且指标的值为任意值
4.2:删除metric指标
删除指标通常用于简化metrics,避免额外的开销
- job_name: "from cmdb"
metrics_path: '/metrics'
http_sd_configs:
- url: http://192.168.31.89:80/api/hosts
refresh_interval: 10s
metric_relabel_configs:
- source_labels:
- __name__ # 标识指标名称的预留标签
regex: 'node_network_receive_bytes_total'
action: drop
!> 这里的效果可能会因为时间关系延迟生效,可以等待2-3分钟后观察
4.3:替换metric指标
重命名的原因可能是,不同的业务类型中,对于指标的名称可能不同,但指标的意义却相同,比如
A:
pod_xxxxx
B:
container_xxx
这时我们就可以规范这些名称,统一为pod,方便使用query进行查询统计
metric_relabel_configs:
- source_labels:
- pod
separator: ;
regex: (.+)
target_label: pod
replacement: $1
action: replace
- source_labels:
- container
separator: ;
regex: (.+)
target_label: pod
replacement: $1
action: replace
05:自定义metric指标
对于一些业务需要兼容prometheus时,我们可以对业务中开放metric接口,此时就需要我们自定义这个metric了。
以python的prometheus client为例演示
from prometheus_client import start_http_server, Counter, Summary, Gauge
# start_http_server 启动http服务,并在/metrics uri中提供自定义指标的访问
# 自定义指标,('指标名称', '指标描述')返回一个可以对指标值进行操作的对象
REQUEST_TIME = Summary('linux98_processing_seconds', 'Time spect')
g = Gauge('linux98_gauge', 'description')
counter_TIME = Counter('linux98_request_count', 'Time spect')
start_http_server(9100)
while True:
# 由于start_http_server是不阻塞的,运行起来就掉了,这里使用while来阻塞
counter_TIME.inc() # 对counter单调递增
g.set('123456') # 对gauge设置值
其他的客户端操作请看prometheus的github主页
https://github.com/prometheus/?q=client&type=all&language=&sort=
评论区