Prometheus文件服务发现配置报错:无法解析序列为ScrapeConfigs
问题诊断:Prometheus文件服务发现启动失败报错
我用Docker部署了Prometheus 2.46.0,static_configs配置可正常运行,但测试文件服务发现时容器无法启动,日志报错:
"/etc/prometheus/scrape_configs/cadvisor.json": yaml: unmarshal errors:
line 1: cannot unmarshal !!seq into config.ScrapeConfigs
尝试使用yml格式文件仍出现相同错误,请求诊断该问题。
Docker Compose配置
version: "3" services: prometheus: image: prom/prometheus container_name: prometheus ports: - 127.0.0.1:9090:9090 volumes: - /opt/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml - /opt/prometheus/scrape_configs:/etc/prometheus/scrape_configs - /opt/promdata:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' restart: unless-stopped
Prometheus主配置文件(原)
global: scrape_interval: 30s evaluation_interval: 10s scrape_config_files: - /etc/prometheus/scrape_configs/* scrape_configs: - job_name: 'cadvisor' scrape_interval: 30s file_sd_configs: - files: - '/etc/prometheus/scrape_configs/cadvisor.json'
文件服务发现配置文件(cadvisor.json)
[ { "labels": { "job": "cadvisor" }, "targets": ["XX.XXX.XXX.120:8080"] }, { "labels": { "job": "cadvisor" }, "targets": ["XX.XXX.XXX.130:8080"] } ]
问题原因与解决方法
核心问题
scrape_config_files字段的作用是加载完整的Scrape配置文件(即包含job_name等完整scrape规则的文件),而你目录中的cadvisor.json是服务发现的目标列表文件,并非完整的scrape配置。Prometheus会把该文件当成scrape配置来解析,而目标文件的数组格式和scrape配置的结构不匹配,因此抛出反序列化错误。
修复步骤
- 移除Prometheus主配置中的
scrape_config_files字段,该字段与你使用file_sd_configs实现服务发现的场景无关。 - 保留
scrape_configs下的file_sd_configs配置,它才是用来指定服务发现目标文件的正确配置项。
修改后的Prometheus主配置
global: scrape_interval: 30s evaluation_interval: 10s scrape_configs: - job_name: 'cadvisor' scrape_interval: 30s file_sd_configs: - files: - '/etc/prometheus/scrape_configs/cadvisor.json'
修改后重启Prometheus容器即可正常启动并加载文件服务发现的目标。
内容的提问来源于stack exchange,提问作者Silver47
相关产品推荐
相关产品推荐

