如何在单个Prometheus scrape配置中同时采集多台私网Exporter
问题解答
可行,无需编写多个scrape_config,通过static_configs配合relabel_configs就能在单个job里完成所有私有Exporter的采集,具体方案如下:
核心原因
你之前直接在scrape_config里加params参数会被覆盖,是因为这个参数是全局生效的,指定多个值只会保留最后一个,无法生成多份请求。而我们可以通过给每个Exporter生成独立的target标识,再通过relabel规则把标识转化为请求参数,让Prometheus对每个标识发起单独请求。
具体配置示例
方法一:通过请求参数传递Exporter标识
这是最通用的方案,适配大多数代理转发逻辑:
scrape_configs: - job_name: 'private_exporters' static_configs: - targets: - 'vm3' # 仅作为Exporter的标识,无需可访问 - 'vm4' - 'vm5' relabel_configs: # 将target标识转为请求参数exporter_url的值 - source_labels: [__address__] target_label: __param_exporter_url # 把实际请求地址替换为代理地址 - target_label: __address__ replacement: '10.0.0.1:80' # 替换为你的代理实际地址和端口
这个配置的逻辑是:
static_configs里的targets只是用来标记三个Exporter,Prometheus不会直接连接这些地址- 第一条relabel规则把每个target的名字(vm3/vm4/vm5)作为
exporter_url参数的值 - 第二条relabel规则把所有请求的目标地址替换为代理地址
- 最终Prometheus会生成三个独立请求:
http://10.0.0.1:80/?exporter_url=vm3、http://10.0.0.1:80/?exporter_url=vm4、http://10.0.0.1:80/?exporter_url=vm5,代理只需根据exporter_url参数转发到对应私有Exporter即可
方法二:通过请求路径传递Exporter标识(需代理支持)
如果你的代理是通过路径来区分转发目标,可改用此方案:
scrape_configs: - job_name: 'private_exporters' static_configs: - targets: ['vm3', 'vm4', 'vm5'] relabel_configs: # 将target标识拼接为请求路径的一部分 - source_labels: [__address__] target_label: __path__ replacement: '/forward-to-exporter/${1}' # 替换为代理对应的转发路径 # 替换请求地址为代理地址 - target_label: __address__ replacement: '10.0.0.1:80'
最终生成的请求会是http://10.0.0.1:80/forward-to-exporter/vm3这类格式,需要代理配置对应路径的转发规则。
额外优势
用这种方式配置后,所有采集到的指标会自动带上instance="vm3"/instance="vm4"/instance="vm5"的标签,方便你区分不同Exporter的指标,无需额外配置标签规则。
内容的提问来源于stack exchange,提问作者Jobber T
相关产品推荐
相关产品推荐

