添加relabeling规则后,如何合并Grafana/Prometheus指标序列?
解决Prometheus指标因新增标签分裂为两条序列的问题
问题原因
你新增ec2_vpc_id标签后,旧指标是添加规则前抓取的(无该标签),新指标是规则生效后抓取的(带有该标签)。Prometheus会将标签集不同的指标视为独立时间序列,因此图表中会显示两条独立曲线。
解决方案
1. 查询层面合并(最快生效,无需修改Prometheus配置)
通过PromQL的label_replace函数,给无ec2_vpc_id标签的旧指标补充默认标签值,让新旧指标的标签集对齐,从而合并为同一条序列。修改查询语句为:
label_replace(node_load1{instance="$node",job="$job"}, "ec2_vpc_id", "unknown", "", "")
如果需要更精准匹配无标签的指标,也可以用or组合查询:
node_load1{instance="$node",job="$job",ec2_vpc_id=~".*"} or label_replace(node_load1{instance="$node",job="$job",ec2_vpc_id!~".*"}, "ec2_vpc_id", "unknown", "", "")
解释:label_replace会为所有无ec2_vpc_id的指标添加ec2_vpc_id="unknown"标签,让新旧指标的标签集一致,Grafana会自动将它们合并为一条曲线。
2. Prometheus配置优化(避免未来再出现类似问题)
修改relabel规则,当__meta_ec2_vpc_id不存在时,给ec2_vpc_id设置默认值,确保所有新抓取的指标都带有该标签:
- job_name: ec2 scrape_interval: 15s scrape_timeout: 10s metrics_path: /metrics relabel_configs: - source_labels: [__meta_ec2_vpc_id] separator: ; regex: (.*) target_label: ec2_vpc_id replacement: $1 action: replace # 新增规则:当元数据为空时设置默认标签值 - source_labels: [__meta_ec2_vpc_id] regex: "" target_label: ec2_vpc_id replacement: "unknown" action: replace ec2_sd_configs: - endpoint: "" region: us-west-1 port: 1234
这条新增规则会匹配__meta_ec2_vpc_id为空的场景,给ec2_vpc_id设置默认值,确保后续抓取的所有指标都带有该标签,不会再出现序列分裂。
3. 清理旧指标(激进方案,按需使用)
如果旧的无标签指标已无保留价值,可以通过Prometheus管理API删除这些时间序列:
# 替换为你的Prometheus服务地址 curl -X POST -g 'http://your-prometheus-addr:9090/api/v1/admin/tsdb/delete_series' -d 'match[]=node_load1{instance="$node",job="$job",ec2_vpc_id!~".*"}'
执行后等待Prometheus完成数据清理(通常需要数分钟),图表就只会显示带标签的新指标。
内容的提问来源于stack exchange,提问作者boh
相关产品推荐
相关产品推荐

