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

验证动态更新是否生效:

  1. 打开Prometheus Web UI(默认http://localhost:9090),进入Status → Targets页面,确认能看到node-exporter任务下包含JSON文件中定义的3个目标,且每个目标都带有对应的env标签。
  2. 编辑nodes.json,例如删除192.168.1.201:9100这一行,保存文件。
  3. 等待最多30秒(即refresh_interval配置的间隔),刷新Targets页面,此时staging目标应消失,且Prometheus日志中不会出现错误。
  4. 再次编辑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以便快速验证;生产环境可根据变更频率调整。