Prometheus服务发现

一、环境

主机名 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 也提供了与基础设施中的服务发现集成的功能。

p9Ntw0P.png

Prometheus 已经支持多种内置的服务发现机制:

  • 发现云服务商的 VM 虚拟机
  • Kubernetes 上的自动发现
  • 通用的服务查找,例如 DNS、Consul、Zookeeper 或自定义发现机制

我们都可以通过 Prometheus 配置文件中的 scrape_config 部分进行配置,Prometheus 会不断更新动态的抓取目标列表,自动停止抓取旧的实例,开始抓取新的实例,Prometheus 特别适合运行于 Kubernetes 集群下面,可以自动发现监控目标。

此外大部分服务发现机制还会提供目标的一些元数据,通常都是带有 __ 的前缀, 比如标签、注解、服务名等等,可以在 relabeling 阶段使用这些元数据来过滤修改目标,这些元信息标签在重新标记阶段后被删除。

三、基于文件的服务发现

除了基于 Consul 的服务发现之外,Prometheus 也允许我们进行自定义的发现集成,可以通过 watch 一组本地文件来获取抓取目标以及标签信息,也就是我们常说的基于文件的服务发现方式。

p9Nt0Tf.png

基于文件的服务发现提供了一种更通用的方式来配置静态目标,并作为一个接口插入自定义服务发现机制。

它读取一组包含零个或多个 <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 页面下面查看

p9NUfiT.png

然后我们可以尝试改变 targets.yml 的内容,比如为192.168.224.12:8080实例增加一个 env: test的标签,不用重新加载 Prometheus 配置,Prometheus 将 watch 该文件,并自动接收任何变化。

注意:当在生产环境 Prometheus 服务器中改变 file_sd 目标文件时,确保改变是原子的,以避免重新加载出现错误,最好的方法是在一个单独的位置创建更新的文件,然后将其重命名为目标文件名(使用 mv 命令或 rename() 系统调用)。

p9NaGfU.png

这样我们就完成了基于文件的通用服务发现机制,可以让我们动态地改变 Prometheus 的监控目标,而不需要重新启动或重新加载 Prometheus 服务。

评论


:D 一言句子获取中...

加载中,最新评论有1分钟缓存...