本文共 3408 字,大约阅读时间需要 11 分钟。
在Prometheus的配置文件中,我们知道可以通过static_configs来配置静态地址获取数据。但在云环境下,尤其是在容器化环境中,抓取地址经常是动态变化的。每次地址变动都意味着我们需要手动修改prometheus.yml文件并重启Prometheus,这种操作实在是太麻烦了。
因此,我们引入了file_sd和http_sd等服务发现机制,让Prometheus能够自动获取最新的监控目标。
file_sd是基于文件的服务发现机制,用于动态更新Prometheus的数据。这种方式的工作原理是将原本在prometheus.yml中通过static_config配置的方式,统一写入一个文件中(例如,mysql集群所有实例写入一个文件,mongo集群所有实例写入另一个文件...)。文件的格式可以是yml或json,并且必须包含一个静态配置的列表。
通常更多的使用json格式,如下所示:
[ { "targets": ["10.0.1.1:9100"], "labels": { "env": "master", "job": "mysql" } }, { "targets": ["10.0.0.1:9100", "10.0.0.2:9100"], "labels": { "env": "slave", "job": "mysql" } }, // 其他目标配置...] job和env标签。在prometheus.yml中配置file_sd如下:
scrape_configs: - job_name: 'file_sd_example' file_sd_configs: - files: ['/root/prometheus/targets/*.json'] refresh_interval: 10s
Prometheus会每10秒读取/root/prometheus/targets/目录下的所有.json文件,获取最新的监控目标。
假设我们有一个prometheus.yml配置文件:
scrape_configs: - job_name: file_sd_expoter file_sd_configs: - files: ['/sd/*.json'] refresh_interval: 5s
在Docker环境中部署Prometheus时,需要注意文件路径是容器内的路径。建议在启动容器时挂载好目录,以便操作。
目标JSON文件示例:
[ { "targets": ["env-base:9100"], "labels": { "env": "prod", "job": "node_exporter" } }, { "targets": ["env-base:9104", "env-base:9121"], "labels": { "env": "prod", "job": "mysql_and_redis_exporter" } }] 启动Prometheus容器后,在浏览器中输入env-base:9090进入Prometheus主页,进入Targets目录即可查看监控目标。
http_sd方式允许Prometheus通过HTTP请求动态获取需要监控的目标列表。
prometheus.yml文件中指定一个HTTP端点。[ { "targets": ["10.0.0.1:9100", "10.0.0.2:9100"], "labels": { "env": "prod", "job": "node_exporter" } }, { "targets": ["10.0.1.1:9100"], "labels": { "env": "staging", "job": "node_exporter" } }] 在prometheus.yml中配置http_sd如下:
scrape_configs: - job_name: 'http_sd_example' http_sd_configs: - url: 'http://example.com/targets' refresh_interval: 10s
http://ip:port。在公司项目中,通常会部署一个发布系统来复杂地将程序发布到预发、生产等环境。发布系统可以提供一个HTTP接口,用于从数据库中获取所有服务器的套接字信息,并返回指定格式的JSON数据。
例如,SpringBoot应用中的一个简单示例:
@RestControllerclass HttpApi { @RequestMapping("/targets") fun targets(): List { // 从数据库中获取对应的套接字信息... // 组装JSON数据 val v1 = PrometheusVo( targets = listOf("env-base:9100"), labels = Labels( env = "prod", job = "node_exporter" ) ) val v2 = PrometheusVo( targets = listOf("env-base:9104", "env-base:9121"), labels = Labels( env = "prod", job = "mysql_and_redis_exporter" ) ) return listOf(v1, v2) }}data class PrometheusVo( val targets: List , val labels: Labels)data class Labels( val env: String, val job: String) 访问100.94.135.96:9000/targets可以看到以下内容:
{ "targets": ["env-base:9100"], "labels": { "env": "prod", "job": "node_exporter" }} 通过以上两种服务发现机制,Prometheus能够更加灵活地监控动态变化的目标地址。在实际应用中,可以根据项目需求选择合适的方式。无论是基于文件的file_sd,还是基于HTTP的http_sd,都能显著提升监控系统的可维护性和扩展性。
转载地址:http://ohxfk.baihongyu.com/