如何为负载均衡后的多主机配置Prometheus指标重标记
解决Prometheus通过负载均衡器采集多主机node_exporter指标的配置问题
问题根源
你的配置核心问题有两个:
__address__字段包含了路径和URL参数,Prometheus会将整个字符串当作目标地址解析,导致识别失败- 正则表达式
host=(.*)无法匹配带前缀的__address__内容,导致__param_host和instance标签无法正确提取
方案一:适配现有app_targets.json结构
无需修改JSON文件,调整prometheus.yml的relabel_configs顺序和正则即可:
- job_name: node_exporter_app_via_load_balancer file_sd_configs: - files: - 'app_targets.json' relabel_configs: # 从原始地址中提取host参数值,设置instance标签 - source_labels: [__address__] regex: '.*host=(.*)' replacement: '$1' target_label: instance # 从原始地址中提取host参数值,设置URL请求参数__param_host - source_labels: [__address__] regex: '.*host=(.*)' replacement: '$1' target_label: __param_host # 剥离地址中的路径和参数,仅保留主机:端口 - source_labels: [__address__] regex: '([^/:]+:[0-9]+).*' replacement: '$1' target_label: __address__ # 设置指标采集路径为/metrics - target_label: __metrics_path__ replacement: '/metrics' scheme: 'https'
关键调整说明:
- 调整relabel顺序:先提取参数和instance标签,再修正
__address__(避免后续步骤丢失原始数据) - 正则
.*host=(.*)匹配整个地址字符串中的host参数部分 - 正则
([^/:]+:[0-9]+).*提取主机和端口,覆盖__address__字段
方案二:优化app_targets.json结构(推荐)
将主机标识通过labels明确标注,配置更直观且不易出错:
修改app_targets.json为:
[ { "targets": ["load-balancer.example.com:443"], "labels": { "instance": "docker01", "host_param": "docker01" } }, { "targets": ["load-balancer.example.com:443"], "labels": { "instance": "docker02", "host_param": "docker02" } }, { "targets": ["load-balancer.example.com:443"], "labels": { "instance": "docker03", "host_param": "docker03" } } ]
对应的prometheus.yml配置简化为:
- job_name: node_exporter_app_via_load_balancer file_sd_configs: - files: - 'app_targets.json' relabel_configs: # 用labels中的host_param设置URL请求参数 - source_labels: [host_param] target_label: __param_host scheme: 'https' metrics_path: '/metrics'
优势:
- 目标配置清晰,直接通过labels定义instance和请求参数
- 无需复杂正则,减少配置出错概率
- 后续新增主机只需复制JSON节点修改标识即可
内容的提问来源于stack exchange,提问作者Keith Palmer Jr.
相关产品推荐
相关产品推荐

