5、prometheus标签
Prometheus标签
本章重点: 标签说明,标签二次处理,标签打标规则,重新打标说明
参考:prometheus监控实战一书+ai优化
一、标签核心认知
标签是Prometheus时间序列数据的核心维度,其核心作用是为指标提供上下文信息、定义监控目标,与指标名称共同构成时间序列的唯一标识——标签的任何变更(新增、修改、删除)都会生成全新的时间序列。
⚠️关键警示:标签变更会断裂历史数据连续性,导致监控图表断层、警报规则失效等问题,需谨慎设计标签体系并尽量保持稳定。
二、Target重新打标:抓取前的标签预处理
Target重新打标是在指标抓取前对监控目标标签的预处理操作,支持删除标签、修改标签值、重命名标签等场景。每个抓取配置(scrape_configs)中可定义多组打标规则,按顺序执行。
2.1 默认打标行为
Prometheus对发现的每个Target会自动执行以下默认打标操作,无需手动配置:
- 将
job标签值设为当前抓取配置的job_name; - 将
__address__标签值设为Target的“IP:端口”套接字地址; - 将
instance标签值默认设为__address__的值; - 将
__scheme__标签值设为抓取协议(默认http); - 将
__metrics_path__标签值设为指标抓取路径(默认/metrics); - 将
__param_<name>标签值设为URL参数中第一个名为的值。
2.2 核心打标规则配置
通过relabel_configs定义打标规则,核心配置字段如下(方括号表示可选):
# 1. 源标签:从现有标签中选择值,多标签会按separator拼接
[ source_labels: [ <labelname> [, ...] ] ]
# 2. 分隔符:多源标签值的拼接符,默认分号(;)
[ separator: <string> | default = ; ]
# 3. 目标标签:替换或新增的标签名(replace动作必选)
[ target_label: <labelname> ]
# 4. 正则表达式:匹配源标签值的模式,默认匹配所有(.*)
[ regex: <regex> | default = (.*) ]
# 5. 哈希模:对源标签哈希值取模(仅hashmod动作使用)
[ modulus: <int> ]
# 6. 替换值:匹配后替换的内容,支持引用正则分组($1表示第一个分组)
[ replacement: <string> | default = $1 ]
# 7. 执行动作:核心操作类型,默认replace
[ action: <relabel_action> | default = replace ]
2.3 七大核心动作详解
这里定义上面第7步action动作
| 动作类型 | 作用说明 | 关键场景 |
|---|---|---|
replace | 拼接源标签值并匹配正则,将结果赋值给目标标签 | 修改标签值、拼接多标签生成新标签 |
hashmod | 对源标签哈希值取模,结果赋值给目标标签 | 负载均衡、数据分片 |
keep | 正则不匹配源标签值时,删除该Target | 保留特定标签的目标(如生产环境节点) |
drop | 正则匹配源标签值时,删除该Target | 剔除无效目标(如测试环境节点) |
labelmap | 用正则匹配所有标签名,按替换规则生成新标签 | 批量重命名标签(如给标签加前缀) |
labeldrop | 用正则匹配标签名,删除匹配到的标签 | 剔除冗余标签(如敏感元数据) |
labelkeep | 用正则匹配标签名,保留匹配到的标签,删除其他 | 精简标签集(如仅保留核心业务标签) |
2.4 打标关键注意事项
- 元标签使用:打标时可引用服务发现生成的
__meta_*元标签(如K8s的__meta_kubernetes_pod_name); - 临时标签前缀:如需临时存储标签值,需用
__tmp为前缀(如__tmp_temp_label),避免与内置标签冲突; - 内置标签清理:打标完成后,所有以
__开头的标签会自动删除,无需手动处理。
三、标签分类:标准化标签体系设计
合理的标签分类可提升监控数据的可分析性,推荐按“拓扑维度”和“业务模式维度”划分:
| 分类 | 定义 | 典型标签示例 | 核心作用 |
|---|---|---|---|
| 拓扑标签(Topological Label) | 按物理或逻辑架构划分服务组件的标签 | job(任务名)、instance(实例名)、namespace(命名空间)、node(节点名) | 定位监控目标的部署位置和所属任务 |
| 模式标签(Schematic Label) | 描述业务特征或请求属性的标签 | service(服务名)、env(环境)、error_code(错误码)、user(用户)、method(请求方法) | 实现业务维度的聚合分析(如按环境统计错误率) |
最佳实践:固定拓扑标签(如job、instance),按需扩展模式标签(如env、service),避免标签数量过多(单指标建议不超过10个标签)。

四、标签实操:常用场景配置示例
以下示例基于文件服务发现(file_sd)或静态配置,核心规则可复用至其他服务发现模式(如K8s SD)。
4.1 标签添加:静态添加与批量生成
场景1:静态配置直接添加标签
适用于静态目标,直接在配置中定义业务标签:
- job_name: 'zookeeper_exporter'static_configs:- targets: ["192.168.0.10:9143"] # Zookeeper监控目标labels:service: "zookeeper" # 业务服务标签env: "production" # 环境标签cluster: "cluster-1" # 集群标签
场景2:批量重命名标签(labelmap)
将现有标签名按规则重命名并生成新标签,原标签可通过labeldrop删除:
- job_name: 'node_exporter'file_sd_configs:- files: ["targets/node*.yaml"] # 文件服务发现目标refresh_interval: 30srelabel_configs:# 匹配job和app开头的标签,重命名为"原标签名_name"(如job→job_name)- regex: "^(job|app).*"replacement: "${1}_name"action: labelmap# 可选:删除原标签(注释后保留原标签)# - regex: "^(job|app)$"# action: labeldrop
4.2 标签替换:多标签拼接与格式优化
将协议、地址、路径等标签拼接为标准端点地址,赋值给新标签endpoint:
- job_name: 'node_exporter'file_sd_configs:- files: ["targets/node*.yaml"]refresh_interval: 30srelabel_configs:- source_labels: [__scheme__, __address__, __metrics_path__]separator: "" # 取消拼接分隔符regex: "(http|https)(.*)(/.*)" # 正则分组匹配协议、地址、路径target_label: "endpoint" # 目标标签名replacement: "${1}://${2}${3}" # 拼接为完整URL(如http://192.168.0.236:9100/metrics)action: replace
对应目标文件(targets/node-exporter.yaml):
- targets: ["192.168.0.236:9100"]labels:job: "node_exporter"
4.3 目标过滤:保留/删除指定Target
场景1:保留生产环境目标(keep)
通过标签匹配保留特定环境的Target,剔除其他环境:
- job_name: 'app_exporter'file_sd_configs:- files: ["targets/app*.yaml"]refresh_interval: 30srelabel_configs:# 仅保留env标签为production的目标- source_labels: [env]regex: "production"action: keep
场景2:删除指定节点目标(drop)
通过地址匹配删除节点名大于1的Target(如node2、node3):
- job_name: 'node_exporter'file_sd_configs:- files: ["targets/node*.yaml"]refresh_interval: 30srelabel_configs:# 匹配地址以node2-node9开头的目标并删除- source_labels: [__address__]regex: "^node[2-9].*" # 正则匹配节点名action: drop
五、Metrics重新打标:抓取后的指标处理
Metrics重新打标(metric_relabel_configs)与Target打标逻辑完全一致,区别在于执行时机——在指标抓取后、存储前执行,用于处理指标级别的标签或过滤指标。
5.1 核心使用场景
- 删除无用指标(如Go语言内置指标);
- 修改指标的标签值或新增标签;
- 剔除指标中的敏感标签(如包含IP的instance标签)。
5.2 常用配置示例
- job_name: 'node_exporter'static_configs:- targets: ["192.168.0.236:9100"]# 指标级打标规则(抓取后执行)metric_relabel_configs:# 1. 删除指定指标(Go内置的GC和版本指标)- source_labels: [__name__] # __name__是指标名的内置标签regex: 'go_gc_duration_seconds|go_info' # 多指标用|分隔action: drop# 2. 复制标签值(将instance标签值复制给cce标签)- source_labels: [instance]regex: '(.*)'replacement: "$1"target_label: cceaction: replace# 3. 删除敏感标签(如instance标签)- regex: 'instance'action: labeldrop
六、标签使用最佳实践
- 标签命名规范:使用小写字母+下划线(snake_case),避免特殊字符,标签名需语义清晰(如用env而非e);
- 避免高频变更:拓扑标签(job、instance)建议永久固定,模式标签(如user)避免用于高频变化的维度(可改用日志记录);
- 控制标签数量:单指标标签不超过10个,避免“标签爆炸”导致存储和查询性能下降;
- 复用元标签:服务发现生成的
__meta_*标签可直接用于打标(如K8s的命名空间、Pod名); - 测试打标效果:通过Prometheus WebUI的“Status → Targets”查看打标后的标签,确认规则生效后再上线。
