file_sd 是什么
file_sd_configs 让 Prometheus 从 JSON 或 YAML 文件读取目标列表,并自动检测文件变化重载(默认 5 分钟检查一次,可配 refresh_interval)。目标是「静态写法 + 自动更新」的折中:由配置管理或脚本生成文件,Prometheus 侧不需重启即可感知目标变化。
基本信息
| 配置键 | file_sd_configs |
|---|---|
| 文件格式 | JSON 或 YAML |
| 自动重载 | 默认约 5 分钟检测一次 |
| 刷新间隔 | refresh_interval 可自定义 |
| 支持通配 | files 里可用 *.json |
| 适用场景 | 无法动态发现的中间件与自建服务 |
典型使用场景
- 由 Ansible 或脚本生成目标文件,机器变更时自动更新采集范围
- 自建系统没有服务发现接口,用定时任务刷新目标文件
- 多团队各自维护一份目标文件,通过目录通配统一接入
- 为中间件(MySQL、Redis、Kafka)集中维护采集清单
- 测试环境按需增删目标文件,无需改动 Prometheus 主配置
- 把目标清单纳入发布流水线,随服务一起更新
prometheus.yml 片段
prometheus.yml 片段
scrape_configs:
- job_name: 'file-targets'
file_sd_configs:
- files:
- /etc/prometheus/targets/*.json # 通配目录下全部文件
refresh_interval: 1m # 自定义刷新间隔targets/app.json 内容
targets/app.json 内容
[
{
"targets": ["10.0.1.21:8080", "10.0.1.22:8080"],
"labels": {"env": "prod", "team": "order"}
}
]字段说明
| 字段 | 作用 | 注意 |
|---|---|---|
| files | 文件列表 | 支持通配符 |
| refresh_interval | 刷新间隔 | 默认约 5 分钟 |
| targets | 目标数组 | 每条记录一组 |
| labels | 标签映射 | 附加到该组目标 |
文件里可写多个目标组,每组可带独立标签;Prometheus 会监视文件变化并自动重载,无需重启服务。
文件格式错误会导致整份目标列表被拒绝,生成脚本应先做 JSON 校验,避免一次笔误让整批目标消失。
多个 Prometheus 实例共享同一目录时要注意刷新与权限一致,写入方式应避免让读取方看到半写入的文件(如先写临时文件再原子改名)。
file_sd 只解决目标来源问题,其余抓取参数(间隔、路径)仍在任务层配置,两者不要混淆。
目标文件的写入建议采用「写临时文件再原子改名」:直接覆盖时,读取方可能正好读到写了一半的内容而报格式错误。