You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prometheus多主机多metric_path配置异常:自动追加/metric

问题描述

我有数百台服务器,每台包含数十个metrics抓取路径。目前Prometheus可以抓取所有主机,但会自动在每个主机后追加/metrics。当前Prometheus配置和target.json内容如下,期望实现针对每个主机的指定路径进行抓取,而非默认的/metrics。

当前Prometheus配置

global:
  scrape_interval: 30s

scrape_configs:
  - job_name: 'file_sd_targets'  
    metrics_path: '/configuration/1'
    
    file_sd_configs:
      - files:
        - /etc/prometheus/targets.json
    relabel_configs:
      - source_labels: [__address__]
        regex: '([^:]+):.*'
        target_label: instance
        replacement: '$1'

当前target.json内容

[ 
  { "target": "1.2.3.4:10091", "metrics_paths": ["/configuration/1", "/analytics/1"] }, 
  { "target": "1.2.3.5:10091", "metrics_paths": ["/configuration/1", "/analytics/1"] }, 
  { "target": "1.2.3.6:10091", "metrics_paths": ["/configuration/1", "/analytics/1"] } 
]

期望的抓取路径

http://1.2.3.4:10091/configuration/1
http://1.2.3.4:10091/analytics/1
http://1.2.3.5:10091/configuration/1
http://1.2.3.5:10091/analytics/1
http://1.2.3.6:10091/configuration/1
http://1.2.3.6:10091/analytics/1
解决方案

1. 修改target.json结构

Prometheus服务发现不支持数组类型的自定义标签,因此需要将每个metrics路径拆分为独立的target条目,通过labels字段指定对应的抓取路径:

[
  {"target": "1.2.3.4:10091", "labels": {"metrics_path": "/configuration/1"}},
  {"target": "1.2.3.4:10091", "labels": {"metrics_path": "/analytics/1"}},
  {"target": "1.2.3.5:10091", "labels": {"metrics_path": "/configuration/1"}},
  {"target": "1.2.3.5:10091", "labels": {"metrics_path": "/analytics/1"}},
  {"target": "1.2.3.6:10091", "labels": {"metrics_path": "/configuration/1"}},
  {"target": "1.2.3.6:10091", "labels": {"metrics_path": "/analytics/1"}}
]

2. 更新Prometheus配置

移除job级别的固定metrics_path,添加relabel规则将自定义的metrics_path标签映射到Prometheus内部保留标签__metrics_path__(该标签会覆盖默认的/metrics路径):

global:
  scrape_interval: 30s

scrape_configs:
  - job_name: 'file_sd_targets'  
    file_sd_configs:
      - files:
        - /etc/prometheus/targets.json
    relabel_configs:
      - source_labels: [__address__]
        regex: '([^:]+):.*'
        target_label: instance
        replacement: '$1'
      # 将自定义标签映射为抓取路径
      - source_labels: [metrics_path]
        target_label: __metrics_path__

3. 批量生成target.json(可选)

针对数百台服务器的场景,可通过脚本自动展开原始配置:

import json

# 原始配置,可从文件读取
original_targets = [
    {"target": "1.2.3.4:10091", "metrics_paths": ["/configuration/1", "/analytics/1"]},
    {"target": "1.2.3.5:10091", "metrics_paths": ["/configuration/1", "/analytics/1"]},
    {"target": "1.2.3.6:10091", "metrics_paths": ["/configuration/1", "/analytics/1"]}
]

expanded_targets = []
for item in original_targets:
    target_addr = item["target"]
    for path in item["metrics_paths"]:
        expanded_targets.append({
            "target": target_addr,
            "labels": {"metrics_path": path}
        })

# 写入目标文件
with open("/etc/prometheus/targets.json", "w") as f:
    json.dump(expanded_targets, f, indent=2)

内容的提问来源于stack exchange,提问作者Ankur Rangwala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 10:12:18