4. 使用文件服务发现
任务目标
在Prometheus中,当监控目标(如新增或下线的主机)频繁变化时,手动修改static_configs并重载服务效率低下。本案例通过创建JSON格式的目标文件,配置file_sd_configs,使Prometheus自动感知文件变更并动态更新抓取目标,无需重启服务。
环境与依赖
- 已安装Prometheus(本案例以v2.x为例)
- 目标节点已暴露/metrics接口(如node_exporter默认端口9100)
- 具备Prometheus配置文件修改权限
实现步骤与代码
1. 创建文件服务发现的目标JSON文件
在Prometheus服务器上创建目录/etc/prometheus/targets/,并新建文件nodes.json,内容如下:
[
{
"targets": ["192.168.1.101:9100", "192.168.1.102:9100"],
"labels": {
"env": "prod",
"job": "node"
}
},
{
"targets": ["192.168.1.201:9100"],
"labels": {
"env": "staging"
}
}
]
2. 配置Prometheus使用file_sd_configs
编辑Prometheus主配置文件prometheus.yml,添加或修改如下scrape_configs段落:
scrape_configs:
- job_name: 'node-exporter'
file_sd_configs:
- files:
- /etc/prometheus/targets/*.json
refresh_interval: 30s
3. 完整最小配置示例
若从零开始,最小可运行的prometheus.yml如下(已包含上述配置):
global:
scrape_interval: 15s
scrape_configs:
- job_name: 'node-exporter'
file_sd_configs:
- files:
- /etc/prometheus/targets/*.json
refresh_interval: 30s
运行与验证
启动Prometheus(若已运行则执行curl -X POST http://localhost:9090/-/reload重载配置):
./prometheus --config.file=prometheus.yml
验证动态更新是否生效:
- 打开Prometheus Web UI(默认
http://localhost:9090),进入Status → Targets页面,确认能看到node-exporter任务下包含JSON文件中定义的3个目标,且每个目标都带有对应的env标签。 - 编辑
nodes.json,例如删除192.168.1.201:9100这一行,保存文件。 - 等待最多30秒(即
refresh_interval配置的间隔),刷新Targets页面,此时staging目标应消失,且Prometheus日志中不会出现错误。 - 再次编辑
nodes.json,新增一个目标地址(如192.168.1.103:9100),保存后等待30秒,刷新页面确认新目标出现且状态为UP(若该节点确实运行了node_exporter)。
判定通过条件:在不重启Prometheus进程的前提下,仅修改JSON文件并等待一个刷新周期,Targets页面中的目标列表能随文件内容变化而自动增删,且新增目标能被正常抓取(状态为UP)。
常见问题
- JSON格式错误:Prometheus无法解析文件时,会在日志中输出
file_sd_config相关错误,且该文件对应的目标不会更新。可用python3 -m json.tool nodes.json校验格式。 - 文件路径权限:确保Prometheus进程对
targets/目录及JSON文件有读权限。 - 刷新间隔:
refresh_interval默认5分钟,本案例显式设为30s以便快速验证;生产环境可根据变更频率调整。