relabel 是什么
relabel_configs 在抓取发生之前处理目标:它以目标的元标签为输入,通过 keep、drop、replace 等动作改写标签或决定是否保留该目标。常见用途是改抓取端口、从地址里提取实例名、按角色过滤目标,以及给目标补上业务标签。
基本信息
| 执行时机 | 抓取之前,作用于目标及其元标签 |
|---|---|
| 输入标签 | __address__、__param_*、__meta_* 等内置标签 |
| 默认动作 | 未写 action 时按 replace 执行 |
| 正则语义 | 完整匹配,等价于自动加上首尾锚点 |
典型使用场景
- 改抓取端口:服务发现给出的端口与实际端点不一致时改写 __address__
- 按角色过滤:只保留需要采集的实例,其余目标在抓取前丢弃
- 提取实例名:从地址或元标签中截取主机名,作为 instance 展示
- 补充业务标签:把环境、团队、区域写到样本上,便于跨集群聚合
- 目标分片:用 hashmod 把大批目标分配给多个 Prometheus 实例
常用动作
| action | 作用 | 典型用例 |
|---|---|---|
| keep / drop | 保留或丢弃目标 | 只采集特定角色的实例 |
| replace | 用正则捕获改写标签 | 从 __address__ 提取端口生成标签 |
| labeldrop / labelkeep | 删除或保留标签 | 清理无用的元标签 |
| hashmod | 按哈希分片目标 | 多个 Prometheus 分担大目标集 |
从地址提取实例标签并改写抓取端口
从地址提取实例标签并改写抓取端口
relabel_configs:
- source_labels: [__address__]
regex: '([^:]+):(\\d+)'
target_label: instance # 只保留主机名作为展示名
replacement: '$1'
- source_labels: [__address__]
regex: '([^:]+):.*'
target_label: __address__
replacement: '$1:9100' # 统一改成实际抓取端口抓取前与抓取后的分工
抓取前的 relabel 管目标,抓取后的指标治理管样本:前者决定要不要抓这个目标、抓哪个地址,后者决定哪些指标与标签能进入存储。两者写在同一 job 里,但作用对象与可改写的标签集完全不同,搞混会出现规则位置写对却毫无效果的情况。
以双下划线开头的内置标签只存在于抓取前阶段,抓取完成后会被移除,因此要用它们生成普通标签,必须在这一步完成。
relabel 的正则是完整匹配,要部分匹配需用 .* 包裹;写错时目标会被静默丢弃,只在 Targets 页面少几条记录,很容易被忽略。