一、环境
主机名 |
IP地址 |
系统 |
说明 |
localhost |
192.168.224.11 |
Centos7.6 |
docker安装的prometheus |
server2.com |
192.168.224.12 |
Centos7.6 |
已经完成了rabbitmq,mysql,redis,nginx等基于配置文件的监控 |
二、服务发现
接下来我们将学习 Prometheus 中是如何使用服务发现来查找和抓取目标的。我们知道在 Prometheus 配置文件中可以通过一个 static_configs
来配置静态的抓取任务,但是在云环境下,特别是容器环境下,抓取目标地址是经常变动的,所以用静态的方式就不能满足这些场景了,还有特别在很多服务器需要监控时。所以我们需要监控系统能够动态感知这个变化,不可能每次变动都去手动重新配置的,为了应对复杂的动态环境,Prometheus 也提供了与基础设施中的服务发现集成的功能。
Prometheus 已经支持多种内置的服务发现机制:
- 发现云服务商的 VM 虚拟机
- Kubernetes 上的自动发现
- 通用的服务查找,例如 DNS、Consul、Zookeeper 或自定义发现机制
我们都可以通过 Prometheus 配置文件中的 scrape_config
部分进行配置,Prometheus 会不断更新动态的抓取目标列表,自动停止抓取旧的实例,开始抓取新的实例,Prometheus 特别适合运行于 Kubernetes 集群下面,可以自动发现监控目标。
此外大部分服务发现机制还会提供目标的一些元数据,通常都是带有 __
的前缀, 比如标签、注解、服务名等等,可以在 relabeling 阶段使用这些元数据来过滤修改目标,这些元信息标签在重新标记阶段后被删除。
三、基于文件的服务发现
除了基于 Consul 的服务发现之外,Prometheus 也允许我们进行自定义的发现集成,可以通过 watch 一组本地文件来获取抓取目标以及标签信息,也就是我们常说的基于文件的服务发现方式。
基于文件的服务发现提供了一种更通用的方式来配置静态目标,并作为一个接口插入自定义服务发现机制。
它读取一组包含零个或多个 <static_config>
列表的文件,对所有定义的文件的变更通过磁盘监视被检测到并立即应用,文件可以以 YAML 或 JSON 格式提供。文件必须包含一个静态配置的列表:
当然该文件也可以使用 JSON 格式进行配置:
1 2 3 4 5 6 7 8 9
| [ { "targets": [ "<host>", ... ], "labels": { "<labelname>": "<labelvalue>", ... } }, ... ]
|
如果是 YAML 文件则格式为:
1 2 3 4
| - targets: [ - '<host>' ] labels: [ <labelname>: <labelvalue> ... ]
|
文件内容也会在指定的刷新间隔时间内定期重新读取。
1 2 3 4 5 6
| # 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
。
1、创建文件
接下来我们来创建一个用于服务发现的目标文件,在与 prometheus.yml
文件相同目录下面创建一个名为 targets.yml
的文件,内容如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| cd /data/docker-prometheus mkdir prometheus/targets
cat > prometheus/targets/targets.yml<<"EOF" - targets: ['localhost:9090'] labels: job: prometheus - targets: ['cadvisor:8080'] labels: instance: Prometheus服务器 job: cadvisor - targets: ['192.168.224.12:8080'] labels: instance: server2.com服务器 job: cadvisor - targets: ['node_exporter:9100'] labels: instance: Prometheus服务器 job: node-exporter - targets: ['192.168.224.12:9100'] labels: instance: server2.com服务器 job: node-exporter - targets: ['192.168.224.12:9113'] labels: instance: server2.com服务器 job: nginx_exporter - targets: ['192.168.224.12:9121'] labels: instance: server2.com服务器 job: redis_exporter - targets: ['192.168.224.12:9419'] labels: instance: server2.com服务器 job: rabitmq_exporter - targets: ['192.168.224.12:9216'] labels: instance: server2.com服务器 job: mongodb_exporter - targets: ['192.168.224.12:9104'] labels: instance: server2.com服务器 job: mysqld_exporter - targets: ['192.168.224.12:9256'] labels: instance: server2.com服务器 job: process EOF
|
springboot.yml
1 2 3 4
| cat >prometheus/targets/springboot.yml<<"EOF" - targets: - 192.168.224.12:8081 EOF
|
blackbox-exporter-http.yml
1 2 3 4 5
| cat >prometheus/targets/blackbox-exporter-http.yml<<"EOF" - targets: - https://www.baidu.com - https://www.jd.com EOF
|
blackbox-exporter-tcp.yml
1 2 3 4 5
| cat >prometheus/targets/blackbox-exporter-tcp.yml<<"EOF" - targets: - 192.168.224.11:22 - 192.168.224.11:9090 EOF
|
blackbox-exporter-icmp.yml
1 2 3 4 5
| cat >prometheus/targets/blackbox-exporter-icmp.yml<<"EOF" - targets: - 192.168.224.11 - 192.168.224.12 EOF
|
domain.yml
1 2 3 4 5
| cat >prometheus/targets/domain.yml<<"EOF" - targets: - qq.com - baidu.com EOF
|
2、配置文件服务发现
用于发现的目标文件创建完成后,要让 Prometheus 能够从上面的 targets.yml
文件中自动读取抓取目标,需要在 prometheus.yml
配置文件中的 scrape_configs
部分添加如下所示的抓取配置:
备份文件
1 2 3
| cp -a prometheus/prometheus.yml{,.bak}
ls -l prometheus/prometheus.yml.bak
|
使用cat新建文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97
| cat >prometheus/prometheus.yml<<"EOF"
# 全局配置 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.224.12: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.224.12:9115
#icmp检查配置 ping - job_name: "blackbox_icmp" metrics_path: /probe params: module: [icmp] 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.224.12:9115 - job_name: domain #scrape_interval: 1h scrape_interval: 15s metrics_path: /probe relabel_configs: - source_labels: [__address__] target_label: __param_target - target_label: __address__ replacement: 192.168.224.12:9222 # domain_exporter address file_sd_configs: - refresh_interval: 10s files: - targets/domain.yml EOF
|
重载
1
| curl -X POST http://localhost:9090/-/reload
|
重新 reload 或者重启下 Prometheus 让其重新读取配置文件信息,然后同样前往 Prometheus UI 的 targets
页面下面查看
然后我们可以尝试改变 targets.yml
的内容,比如为192.168.224.12:8080
实例增加一个 env: test的标签,不用重新加载 Prometheus 配置,Prometheus 将 watch 该文件,并自动接收任何变化。
注意:当在生产环境 Prometheus 服务器中改变 file_sd
目标文件时,确保改变是原子的,以避免重新加载出现错误,最好的方法是在一个单独的位置创建更新的文件,然后将其重命名为目标文件名(使用 mv
命令或 rename()
系统调用)。
这样我们就完成了基于文件的通用服务发现机制,可以让我们动态地改变 Prometheus 的监控目标,而不需要重新启动或重新加载 Prometheus 服务。