提示:本文原创作品,良心制作,干货为主,简洁清晰,一看就会
文章目录
前言
在Prometheus监控体系中,服务发现是管理采集目标的核心能力。相较于固定地址配置,文件服务发现模式更为灵活通用。本文将围绕基于文件的服务发现展开讲解,介绍其配置方式、使用特点与实际应用场景
一、服务发现
Prometheus 基于文件的服务发现(File Service Discovery, File SD),是一种让 Prometheus 能动态加载监控目标(Targets)的机制,其最大优势是无需重启服务即可生效
它的核心概念是:Prometheus 会持续监听一个或多个特定文件的变化,当这些文件中的目标列表被更新时,它会自动更新自己的抓取目标列表,实现"热加载"

工作原理:
- 预先编写记录监控端点,标签的目标文件
- Prometheus定时轮询读取文件内容
- 对比内容变化,自动更新抓取目标列表
- 按规律周期性采集指标数据
配置方法:需要在主配置文件 prometheus.yml 中修改配置
- 定义 Job :在
scrape_configs下定义一个监控任务(job) - 添加配置块 :在该 job 下添加
file_sd_configs配置块 - 指定文件路径 :在
files下列出要监听的文件,支持使用通配符 - 设置刷新间隔 :通过
refresh_interval参数,定义周期性扫描文件的频率
二、服务发现实战
2.1 环境介绍
| 主机名 | ip地址 | 服务 | 备注 |
|---|---|---|---|
| prometheus | 192.168.13.141 | docker、docker-compose、prometheus、alertmanager、node-exporter、grafana | 监控端,已安装 |
| ubuntu | 192.168.13.142 | docker、docker-compose、各类exporter | 被监控端,已安装docker,docker-compose |
关于监控端的服务我已经安装好了,prometheus有两种安装方式:二进制安装和docker安装 ,本次实验使用的容器安装的,后续被监控端我也统一使用容器部署,大家可以自行选择
关于监控端的服务如何安装,这里不在赘述,有不懂的同学可以查看此篇文章
Prometheus二进制安装:https://blog.csdn.net/m0_63756214/article/details/161196428?spm=1001.2014.3001.5501
Prometheus容器安装:https://blog.csdn.net/m0_63756214/article/details/161225636?spm=1001.2014.3001.5501
被监控端的docker和docker-compose的安装可以参考此篇文章的2.1和2.2小节
https://blog.csdn.net/m0_63756214/article/details/161240598?spm=1001.2014.3001.5501
2.2 创建文件
接下来我们创建一个用于服务发现的目标文件,在于prometheus.yml文件相同目录下创建一个目录,这个目录存放的就是子yml文件,最后我们需要在prometheus.yml文件中配置子yml文件的地址
yaml
root@prometheus:~# mkdir /opt/prometheus/prometheus/targets
root@prometheus:~# cd /opt/prometheus/prometheus/targets
root@prometheus:/opt/prometheus/prometheus/targets# vim targets.yml
- targets: ['localhost:9090']
labels:
job: prometheus
- targets: ['cadvisor:8080']
labels:
instance: Prometheus服务器
job: cadvisor
- targets: ['192.168.13.142:8080']
labels:
instance: Linux服务器
job: cadvisor
- targets: ['node_exporter:9100']
labels:
instance: Prometheus服务器
job: node-exporter
- targets: ['192.168.13.142:9100']
labels:
instance: Linux服务器
job: node-exporter
- targets: ['192.168.13.142:9113']
labels:
instance: Linux服务器
job: nginx_exporter
- targets: ['192.168.13.142:9121']
labels:
instance: Linux服务器
job: redis_exporter
- targets: ['192.168.13.142:15692']
labels:
instance: Linux服务器
job: rabitmq_exporter
- targets: ['192.168.13.142:9104']
labels:
instance: Linux服务器
job: mysqld_exporter
- targets: ['192.168.13.142:9256']
labels:
instance: Linux服务器
job: process
yaml
root@prometheus:/opt/prometheus/prometheus/targets# vim springboot.yml
- targets:
- 192.168.13.142:8081
root@prometheus:/opt/prometheus/prometheus/targets# vim blackbox-exporter-http.yml
- targets:
- https://www.baidu.com
- https://www.jd.com
root@prometheus:/opt/prometheus/prometheus/targets# vim blackbox-exporter-tcp.yml
- targets:
- 192.168.13.141:22
- 192.168.13.141:9090
root@prometheus:/opt/prometheus/prometheus/targets# vim blackbox-exporter-icmp.yml
- targets:
- 192.168.13.141
- 192.168.13.142
2.3 配置服务发现
用于发现的目标文件创建完成后,要让 Prometheus 能够从上面的 targets.yml 文件中自动读取抓取目标,需要在 prometheus.yml 配置文件中的 scrape_configs 部分添加如下所示的抓取配置
yaml
root@prometheus:/opt/prometheus/prometheus# cp prometheus.yml prometheus.yml.bak
root@prometheus:/opt/prometheus/prometheus# vim prometheus.yml
# 全局配置
global:
scrape_interval: 15s # 将搜刮间隔设置为每15秒一次。默认是每1分钟一次。
evaluation_interval: 15s # 每15秒评估一次规则。默认是每1分钟一次。
# Alertmanager 配置
alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093']
# 报警(触发器)配置
rule_files:
- "alert.yml"
- "rules/*.yml"
# 搜刮配置
scrape_configs:
- job_name: "file-sd-test"
file_sd_configs:
- refresh_interval: 10s
files:
- "targets/targets.yml"
# Spring Boot 2.x 应用数据采集配置
- job_name: 'file-springboot-demo'
metrics_path: '/actuator/prometheus'
file_sd_configs:
- refresh_interval: 10s
files:
- targets/springboot.yml
#http配置
- job_name: "file-blackbox_http"
metrics_path: /probe
params:
module: [http_2xx]
file_sd_configs:
- refresh_interval: 10s
files:
- targets/blackbox-exporter-http.yml
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.13.142:9115
#tcp检查配置
- job_name: "file-blackbox_tcp"
metrics_path: /probe
params:
module: [tcp_connect]
file_sd_configs:
- refresh_interval: 10s
files:
- targets/blackbox-exporter-tcp.yml
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.13.142:9115
#icmp检查配置 ping
- job_name: "file-blackbox_icmp"
metrics_path: /probe
params:
module: [icmp]
file_sd_configs:
- refresh_interval: 10s
files:
- targets/blackbox-exporter-icmp.yml
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: 192.168.13.142:9115
root@prometheus:/opt/prometheus/prometheus# curl -X POST http://localhost:9090/-/reload
浏览器访问192.168.13.141:9090

yaml
root@prometheus:/opt/prometheus/prometheus# vim targets/targets.yml
- targets: ['192.168.13.142:8080']
labels:
# 添加一个测试标签
env: test
instance: Linux服务器
job: cadvisor
再次访问Prometheus页面,可以看到配置直接自动更新了

注:
文中若有疏漏,欢迎大家指正赐教。
本文为100%原创,转载请务必标注原创作者,尊重劳动成果。
求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~