使用Prometheus和Blackbox Exporter进行服务器的生死监控
这篇文章是转载自博客的内容。
Prometheus 是一款开源监控工具。该工具的主要特点如下所示。
-
- 我们通过HTTP进行Pull型的方式来收集指标。
-
- 您可以使用灵活的查询来进行聚合,并将其显示为图形。我们将这个查询正式称为”PromQL”。
- 它由多个组件组成。Prometheus本身是监控服务器,GUI部分由Grafana担当,警报部分由AlertManagert等组件担当。
上述的特点完全符合我的需求,成为了我非常喜欢的工具。
现在,在这篇文章中要讨论的是一个名为Blackbox Exporter的组件。这个组件通过各种通信协议生成与目标服务器的存亡状态相关的指标。在运维Prometheus时,这个组件是非常必要的,但是关于这个组件的日语文章似乎很少见。因此,我将在以下记录下搭建和运维的方法,也兼作备忘录。
建构方法
如果您想要快速地构建监控环境,我建议您使用Docker。我们将使用官方提供的Docker镜像。以下是Docker Compose文件的内容。
./docker-compose.yml 的翻译是:Docker Compose配置文件
version: '2'
services:
prometheus:
image: prom/prometheus:latest
ports:
- 9090:9090
volumes:
- data-prometheus:/prometheus
- ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
command: -config.file=/etc/prometheus/prometheus.yml -storage.local.path=/prometheus -web.console.libraries=/usr/share/prometheus/console_libraries -web.console.templates=/usr/share/prometheus/consoles
blackbox_exporter:
image: prom/blackbox-exporter:latest
volumes:
- ./blackbox_exporter/config.yml:/etc/blackbox_exporter/config.yml
volumes:
data-prometheus:
driver: local
黑匣子导出器的配置
可以利用 GitHub 存储库中的 Blackbox Exporter 配置文件。由于可以自行调整请求和响应等细节,所以如果您有兴趣,可以参考配置或示例。
./黑匣子导出器/配置文件.yml
modules:
http_2xx:
prober: http
http:
http_post_2xx:
prober: http
http:
method: POST
tcp_connect:
prober: tcp
pop3s_banner:
prober: tcp
tcp:
query_response:
- expect: "^+OK"
tls: true
tls_config:
insecure_skip_verify: false
ssh_banner:
prober: tcp
tcp:
query_response:
- expect: "^SSH-2.0-"
irc_banner:
prober: tcp
tcp:
query_response:
- send: "NICK prober"
- send: "USER prober prober prober :prober"
- expect: "PING :([^ ]+)"
send: "PONG ${1}"
- expect: "^:[^ ]+ 001"
icmp:
prober: icmp
普罗米修斯的配置
在scrape_configs中设置要使用的模块。下面是各主要协议的配置方法。
如果使用HTTP的话
请将http_2xx作为一个模块进行设置。在targets中设置URL。关于重新标记的设置,请复用Prometheus Configuration。在replacement中,设置Blackbox Exporter组件的IP地址或主机名以及端口号(9115)。
./prometheus/prometheus.yml的中文意思是./prometheus/prometheus.yml。
scrape_configs:
- job_name: 'blackbox_http'
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- http://example.com:8080
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox_exporter:9115
如果要使用ICMP
请将 ICMP 设置为模块。在 targets 中设置 IP 地址或主机名。
./prometheus/prometheus.yml的内容。
scrape_configs:
- job_name: 'blackbox_icmp'
metrics_path: /probe
params:
module: [icmp]
static_configs:
- targets:
- example.com
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox_exporter:9115
如果使用指定端口的TCP,
请将tcp_connect功能设置为一个模块。在targets中,要设置IP地址或主机名和端口号。
./prometheus/prometheus.yml 可以被解释为:”./prometheus/prometheus配置文件”
scrape_configs:
- job_name: 'blackbox'
metrics_path: /probe
params:
module: [tcp_connect]
static_configs:
- targets:
- example.com:1666
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox_exporter:9115
方法的运用
我们会检查目标服务器的活跃状态,通过查看probe_success指标。如果值为1表示服务器正在运行,如果值为0表示服务器已停止。

如果在Prometheus的警报规则中添加以下描述,则当存在停止超过2分钟的实例时,警报将触发。有关实际警报通知,AlertManager组件负责处理。由于不在我们的讨论范围内,我们将省略对该组件的说明。
ALERT probe_down
IF probe_success == 0
FOR 2m
LABELS { severity = "critical" }
ANNOTATIONS {
summary = "Instance {{ $labels.instance }} down",
description = "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 2 minutes.",
}
最后
请享受舒适的Prometheus生活。