Prometheus基于文件的服务发现
Prometheus 添加被监控目标支持两种方式:
- 静态配置(手动配置):手动的在配置文件里面添加。
- 服务发现:动态发现需要监控的目标实例。
当我们往 Prometheus 中要添加监控目标时,如果采用修改配置文件的方式,每次都需要进行修改和重启,比较
繁琐。并且如果被监控的目标数很多的话,每次修改配置文件很容易出错。此时我们可以使用服务发现去动态发现
需要监控的目标,将被监控的目标加入监控,不需要人工干预这件事。
1、静态配置
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 采集node exporter监控数据
- job_name: 'node'
static_configs:
- targets: ['192.168.2.186:8080']
目标列表和关联标签都是采用手动服务发现的方式,对于大多数环境的动态特性,以及被监控主机、应用程序和服
务的规模来说,这种局限性更为明显。因此需要更成熟的服务发现方式,下面我们将探索服务发现方案。
2、服务发现
服务发现通过自动化的机制来检测、分类和识别新的和变更的目标,服务发现可以通过以下几种机制实现:
- 基于文件的方式:从配置管理工具生成的文件中接收目标列表。
- 基于云的方式:查询API 以获取目标列表。
- 基于DNS的方式:使用 DNS 记录以返回目标列表。
我们将从基于文件的服务发现开始作业可以使用多种类型的服务发现,我们可以通过多种服务发现技术在作业中指
定目标。
支持服务发现的来源:
- azure_sd_configs
- consul_sd_configs
- dns_sd_configs
- ec2_sd_configs
- openstack_sd_configs
- file_sd_configs
- gce_sd_configs
- kubernetes_sd_configs
- marathon_sd_configs
- nerve_sd_configs
- serverset_sd_configs
- triton_sd_configs
2.1 基于文件的服务发现
基于文件的发现只比静态配置更先进一小步,但它非常适合配置管理工具。借助基于文件的服务发现,
Prometheus 会使用文件中指定的目标。这些文件通常由另一个系统生成,例如 Puppet、Ansible 或 Chef 等配置
管理系统,或者从其他源(如 CMDB )查询。定期执行脚本或进行查询可以(重新)生成这些文件。Prometheus 会按
指定的时间计划从这些文件重新加载目标。 这个简单,只需要在配置文件里面。
这些文件可以是 YAML 或 JSON 格式,包含定义的目标列表,就像我们在静态配置中定义它们一样。让我们从将现
有作业迁移到基于文件的服务发现开始。
基于文件的服务发现:
- job_name: 'file_sd'
file_sd_configs:
- files: ['/usr/local/prometheus/sd_config/*.yml']
refresh_interval: 5s # 每隔5秒检查一次
# 或者
- job_name: 'file_sd'
file_sd_configs:
- files:
- '/usr/local/prometheus/sd_config/*.yml'
refresh_interval: 5s # 每隔5秒检查一次
我们用 file_sd_configs 块替换 prometheus.yml 文件中的 static_configs 块。在这些块中,已经指定了文件列
表,并包含在 files 列表中。我们可以在目录 /usr/local/prometheus/sd_config/
下为每个作业指定了对应的文
件,并为每个作业创建了一个子目录,你可以创建适合你的任何文件结构。然后使用 *.json 的 glob 样式来指定文
件。每当这些文件发生更改时,系统都将从此目录中所有以 .json 结尾的文件加载目标。
每次作业运行或这些文件发生变化时, Prometheus 都会重新加载文件的内容。以防万一,我们还指定了
refresh_interval 选项,该选项将在每个间隔结束时加载文件列表中的目标。
下面演示一个示例:
$ cd /usr/local/prometheus/sd_config/
$ vim node.yml
- targets: ['192.168.2.186:8080']
# 也可以是带标签的
- labels:
service: prometheus
idc: su
project: monitor
targets:
- 192.168.2.186:8080
# 也可以是带分组的
- labels:
service: prometheus1
targets:
- 192.168.2.187:8080
- 192.168.2.188:8080
- labels:
service: prometheus2
targets:
- 192.168.2.185:8080
- 192.168.2.186:8080
// 也可以编写json文件
[
{
"targets": ["10.161.4.63:9091","10.161.4.61:9100"]
}
]
如果需要认证可以使用:
- job_name: 'file_sd'
basic_auth:
username: prometheus
password: 123456
file_sd_configs:
- files: ['/usr/local/prometheus/sd_config/*.yml']
refresh_interval: 5s # 每隔5秒检查一次
所以当指定路径下面有 yml 文件或者 yml 文件有更新的时候,那么普罗米修斯会自动的帮你加载,就不需要重启
这种操作,所以只需要生成 yml 配置文件就行了。