基于文件的服务发现
除了基于 Consul 的服务发现之外,Prometheus 也允许我们进行自定义的发现集成,可以通过 watch 一组本地文件来获取抓取目标以及标签信息,也就是我们常说的基于文件的服务发现方式。
基于文件的服务发现提供了一种更通用的方式来配置静态目标,并作为一个接口插入自定义服务发现机制。
它读取一组包含零个或多个 <static_config>
列表的文件,对所有定义的文件的变更通过磁盘监视被检测到并立即应用,文件可以以 YAML 或 JSON 格式提供。文件必须包含一个静态配置的列表:
JSON json [ { "targets": [ "<host>", ... ], "labels": { "<labelname>": "<labelvalue>", ... } }, ... ]
YAML yaml - targets: [ - '<host>' ] labels: [ <labelname>: <labelvalue> ... ]
文件内容也会在指定的刷新间隔时间内定期重新读取。
# Patterns for files from which target groups are extracted.
files:
[ - <filename_pattern> ... ]
# Refresh interval to re-read the files.
[ refresh_interval: <duration> | default = 5m ]
其中 <filename*pattern>
可以是一个以 .json
、.yml
或 .yaml
结尾的路径,最后一个路径段可以包含一个匹配任何字符序列的 *
,例如:my/path/tg_*.json
。
创建文件
接下来我们来创建一个用于服务发现的目标文件,在与 prometheus.yml
文件相同目录下面创建一个名为 targets.yml
的文件,内容如下所示:
- targets:
- '192.168.31.46:10000'
- '192.168.31.46:10001'
labels:
env: production
- targets:
- '192.168.31.46:10002'
labels:
env: staging
该文件中我们列举了 3 个 demo 服务实例,给前两个实例添加上了 env=production
的标签,后面一个加上了 env=staging
的标签,当然该文件也可以使用 JSON 格式进行配置:
[
{
"targets": [ "<host>", ... ],
"labels": {
"<labelname>": "<labelvalue>", ...
}
},
...
]
如果是 YAML 文件则格式为:
- targets:
[ - '<host>' ]
labels:
[ <labelname>: <labelvalue> ... ]
配置文件服务发现
用于发现的目标文件创建完成后,要让 Prometheus 能够从上面的 targets.yml
文件中自动读取抓取目标,需要在 prometheus.yml
配置文件中的 scrape_configs
部分添加如下所示的抓取配置:
- job_name: 'file-sd-demo'
file_sd_configs:
- files:
- 'targets.yml'
重新 reload 或者重启下 Prometheus 让其重新读取配置文件信息,然后同样前往 Prometheus UI 的 targets
页面下面查看是否有上面定义的抓取目标。
然后我们可以尝试改变 targets.yml
的内容,比如为第三个实例增加一个 role: sd
的标签,不用重新加载 Prometheus 配置,Prometheus 将 watch 该文件,并自动接收任何变化。
当在生产环境 Prometheus 服务器中改变 file_sd
目标文件时,确保改变是原子的,以避免重新加载出现错误,最好的方法是在一个单独的位置创建更新的文件,然后将其重命名为目标文件名(使用 mv
命令或 rename()
系统调用)。
这样我们就完成了基于文件的通用服务发现机制,可以让我们动态地改变 Prometheus 的监控目标,而不需要重新启动或重新加载 Prometheus 服务。当然除了基于 Consul 和文件的服务发现之外,更多的时候我们会在 Kubernetes 环境下面使用 Prometheus,由于这部分内容比较独立,后续我们再进行单独讲解。