Prometheus基于文件的服务发现
Prometheus提供两种方式来添加被监控的目标:
静态配置(手动配置):这种方式需要手动编辑配置文件,将监控目标的信息添加进去。
服务发现:使用服务发现机制,动态地发现需要监控的目标实例。
当我们需要向Prometheus添加新的监控目标时,如果采用手动修改配置文件的方式,每次都需要编辑文件并重启Prometheus,这种方法既繁琐又容易出错,特别是在监控目标数量较多的情况下。此时,我们可以利用服务发现机制,动态地发现和添加需要监控的目标,无需手动干预。
通过使用服务发现,Prometheus能够自动发现并添加新的监控目标,大大简化了监控配置的管理过程。
1、Prometheus静态配置
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
# 采集node exporter监控数据
- job_name: 'node'
static_configs:
- targets: ['192.168.2.186:8080']
在监控配置中,目标列表和相关标签通常需要以手动服务发现的方式添加。然而,对于许多环境的动态特性以及监控主机、应用程序和服务的规模来说,这种方法显得相当受限。
为了克服这种限制,我们需要寻求更成熟的服务发现解决方案。接下来,我们将深入探讨更为灵活和自动化的服务发现方式,以更好地适应不断变化的监控需求和大规模环境。
2、Prometheus服务发现
服务发现通过自动化的机制来检测、分类和识别新的和变更的监控目标。服务发现可以通过以下几种机制来实现:
基于文件的方式:从配置管理工具生成的文件中接收目标列表。
基于云的方式:通过查询云服务提供商的API来获取目标列表。
基于DNS的方式:使用DNS记录来获取目标列表。
在Prometheus的作业中,您可以选择多种服务发现技术来指定监控目标。
以下是一些支持的服务发现来源:
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
这些服务发现机制使Prometheus能够更灵活地发现和监控目标,从而适应各种不同的环境和需求。
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
实现灵活的服务发现
要实现更灵活的服务发现,我们可以通过用 file_sd_configs
替换 prometheus.yml
文件中的 static_configs
块来指定文件列表。在 file_sd_configs
块中,我们明确指定了文件的位置,并将这些文件包含在 files
列表中。您可以根据需要创建适合您的目录结构,通常我们会为每个作业创建一个子目录,然后使用 *.json 的通配符样式来指定文件。每当这些文件发生更改时,Prometheus都会自动重新加载这些文件中的目标。
每次作业运行或这些文件发生变化时,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秒检查一次
当您在指定的路径下创建或更新YAML文件时,Prometheus会自动检测并加载这些文件,而无需手动重启。这意味着只需生成YAML配置文件,而无需担心配置更改后的繁琐操作。
这种自动加载和更新配置的机制使得管理监控目标变得更加便捷,您可以专注于配置文件的维护,而不必担心Prometheus的重启或手动操作。


赞赏是不耍流氓的鼓励