Prometheus与snmp-exporter连接错误:请求参数顺序异常求助
首先纠正一个关键误区:SNMP Exporter对HTTP请求的参数顺序没有要求,module和target的前后顺序不影响接口调用,你看到的参数顺序差异不是报错的根源。真正的问题是 dial tcp [::1]:9116: connect: connection refused——Prometheus容器无法访问到snmp-exporter服务。
核心原因
在Docker Compose环境中,每个容器都是独立的网络节点,容器内的localhost指向容器自身,而非宿主机或其他容器。你在Prometheus配置里写了http://localhost:9116/snmp,导致Prometheus容器试图访问自己的9116端口(但这个端口并没有监听snmp-exporter服务),所以出现连接拒绝。
解决方法
1. 修正Prometheus配置中的snmp-exporter地址
在prometheus.yml的SNMP job配置中,将目标地址改为Docker Compose中snmp-exporter服务的名称(比如你的服务名是snmp-exporter),而非localhost。示例配置:
scrape_configs: - job_name: 'snmp' static_configs: - targets: ['你的UPS设备IP'] metrics_path: /snmp params: module: ['你使用的SNMP模块名'] relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: snmp-exporter:9116 # 替换为snmp-exporter的服务名+端口
2. 确认Docker Compose网络配置
确保所有服务都在同一个Docker网络中(默认情况下,Docker Compose会为项目创建专属网络,所有服务默认加入)。检查你的docker-compose.yml,snmp-exporter服务的端口映射是否正确,示例:
services: snmp-exporter: image: prom/snmp-exporter:latest ports: - "9116:9116" volumes: - ./snmp-exporter.yml:/etc/snmp_exporter/snmp.yml
3. 验证容器间连通性
在Prometheus容器内执行curl命令,测试是否能正常访问snmp-exporter:
docker exec -it <prometheus容器名> curl "http://snmp-exporter:9116/snmp?module=你的模块名&target=你的UPSIP"
如果能正常返回metrics数据,说明网络连通性没问题。
额外说明
你之前尝试的relabeling规则如果是为了调整参数顺序,完全没必要——HTTP查询参数是键值对,顺序不影响服务端解析。问题的核心始终是容器间的网络连通性配置。
内容的提问来源于stack exchange,提问作者kalidkto

