使用Docker和Prometheus来创建外部(URL)监视
我将写一篇关于最近开始接触的监控工具Prometheus的构建的Advent日历。
大家是否正在对网站进行活动监控呢?
“我可以自己搭建吗?”“我们的系统并不大,不需要与SaaS签约。”“从零搭建服务器太辛苦了。”等等,我之前也认为这个功能非常困难。
但是,通过结合Docker和Prometheus,我们可以意外地轻松地创建外部监控机制,所以我想写下来。
URL的监控是指什么?
外貌监视是一种通过HTTP访问确认网站或API服务器是否正常运行的监视方法。它会检查“响应是否正常”、“是否在规定的时间内返回响应”等等。它的优点在于可以用与用户相同的方法访问,从而能够确认系统或API整体的正常/异常状态,包括网络。我认为它通常与从内部监视服务器资源(如CPU和内存)的方法结合使用。我们使用了AWS的服务,这是一个简单说明的图示。
背景 – 环境和条件
-
- Webシステムに対して外形監視をしたい
-
- SaaSもあるがシステムが大規模じゃない場合はオーバースペックだと感じた(大規模ならお金かけて使った方が良いのかもしれないけれど)
- 柔軟な選択ができるよう環境(開発端末・クラウドなど)に関係なく構築できるようにしたい
这次要做的事情
-
- 監視ツールであるPrometheusを使って外形監視をする
-
- OSに寄らずに環境構築できるDocker+Prometheusで構築する
-
- 開発端末で起動する
- 異常を検知した場合、Slackに通知する
不作解释
由于我在这里不写出来,请自行去查阅。
-
- ターミナルの操作方法
- Docker, docker-composeについて
环境。
这次我会用Mac来做,但是由于使用了Docker,所以无论是在Windows还是Linux上都可以启动。
-
- Mac : 10.15.5
-
- Docker : 19.03.8
- docker-compose : 1.25.5
使用过的Docker镜像
-
- prom/prometheus : 2.19.1
-
- prom/blackbox-exporter : 0.17.0
- prom/alertmanager : 0.21.0
文件夹和文件的结构
━ docker-compose.yml
┣ prometheus
┃ ┗ alert_roles.yml
┃ ┗ prometheus.yml
┣ blackbox_exporter
┃ ┗ config.yml
┗ alertmanager
┗ config.yml
创建docker-compose.yml文件
-
- prometheus:本体のイメージ
-
- blackbox_exporter:URL監視してくれるexporter(外部ライブラリ的なもの)
-
- alertmanager:アラートが発生した時にメッセージ通知をしてくれるexporter(今回はslack通知で使用する)
- 各々のポート番号とconfigファイルを設定していきます
version: '3'
services:
prometheus:
image: prom/prometheus
container_name: prometheus
volumes:
- ./prometheus:/etc/prometheus
command: "--config.file=/etc/prometheus/prometheus.yaml"
ports:
- 9090:9090
restart: always
blackbox_exporter:
image: prom/blackbox-exporter:latest
volumes:
- ./blackbox_exporter/config.yml:/etc/blackbox_exporter/config.yml
alertmanager:
image: prom/alertmanager
container_name: alertmanager
volumes:
- ./alertmanager:/etc/alertmanager
command: "--config.file=/etc/alertmanager/config.yaml"
ports:
- 9093:9093
restart: always
黑盒出口者
我们将使用yml格式来设置URL监控。
在模块中,我们将根据要确认的协议设置配置(默认情况下为tcp、pop3、ssh)。
这次我们添加了http_post_2xx:作为POST方法的配置。
您可以在headers:中设置HTTP头。
有关可设置的内容,请参考blackbox_exporter的Configuration。
modules:
http_2xx:
prober: http
http:
http_post_2xx:
prober: http
http:
method: POST
headers:
xxx: yyyy
普罗米修斯
我們將在 Prometheus 主體中記錄外觀監視的設定。評估內容已定義在 “alert_roles.yml” 中。
global:
# prometheusがexporter等に情報を取りに行く間隔(今回はblackbox_exporter)
scrape_interval: 15s
# ruleの評価を行う間隔(今回はrule_filesで指定されているalert_roles.ymlが評価内容)
evaluation_interval: 15s
external_labels:
monitor: 'codelab-monitor'
rule_files:
- /etc/prometheus/alert_roles.yml
alerting:
alertmanagers:
- scheme: http
static_configs:
- targets:
- alertmanager:9093
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets:
- prometheus:9090
# 1つの監視条件をjobという単位で扱う
- job_name: 'blackbox_http'
metrics_path: /probe
# blackbox_exporterのconfig.ymlで定義しているmoduleを指定
params:
module: [http_post_2xx]
static_configs:
# 監視対象のURLを指定
- targets:
- '[target_url]'
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox_exporter:9115
# alertの定義
groups:
- name: blackbox_exporter
rules:
- alert: http_success
# 評価するメトリクスと条件
# probe_successの条件を"blackbox_http"のjobに適用しています
expr: probe_success{job='blackbox_http'} != 1
# 評価NGとするまでの継続時間(10秒間alert状態の場合NG)
for: 10s
labels:
severity: critical
annotations:
summary: "{{ $labels.instance }}: http request not return 200"
description: "{{ $labels.instance }} http request not return 200 for more than 10 seconds."
告警管理器
alertmaneager会发送通知
这次我们设置了对Slack的通知
请参考官方网站以获取Slack的Webhook链接
global:
# slackのwebhookURLを指定
slack_api_url: '[slack webhook url]'
smtp_smarthost: 'localhost:25'
smtp_require_tls: false
smtp_from: 'Alertmanager'
route:
receiver: 'test-route'
# グループ化の設定(アラート名)
group_by: '[alertname]'
# alertグループの通知の送信を最初に待機する時間
group_wait: 10s
# alertグループでの最小送信間隔(新しいアラート送信まで待機する時間)
group_interval: 5m
# 通知を再度送信するまで待機する時間
repeat_interval: 1h
receivers:
- name: 'test-route'
# slackのチャンネル名
slack_configs:
- channel: '#general'
# email(※slackには表示されなかった)
email_configs:
- to: "zzz@gmail.com"
启动Docker容器
本次将启动多个Docker容器,我们将使用docker-compose一次性启动它们。
$ docker-compose build
# "-d"オプションをつけることで、バックグラウンドで実行します
# オプションがないとターミナルを閉じた時にコンテナが停止してしまいます
$ docker-compose up -d
# コンテナの起動を確認
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab4455256cff prom/prometheus "/bin/prometheus --c…" 5 days ago Up 5 days 0.0.0.0:9090->9090/tcp prometheus
830bf6475888 prom/alertmanager "/bin/alertmanager -…" 5 days ago Up 5 days 0.0.0.0:9093->9093/tcp alertmanager
b6fcd4f26f57 prom/blackbox-exporter:latest "/bin/blackbox_expor…" 5 days ago Up 5 days 9115/tcp prometheus_sample_blackbox_exporter_1
确认 Prometheus 的仪表板
访问 http://localhost:9090
在实际运营中,会处理 https、端口转发等,但由于这是开发终端,所以保持原样
输入 alert_roles.yml 中指定的评估指标,点击执行即可在图表中显示评估结果
本次评估以 http 请求成功 (200 OK) 为标准,结果为1.0时代表正常。
从菜单中选择“报警”选项可以确认警报(通知)的状态。情况以不同颜色区分,并且可以一眼就知道哪些评估出现了错误。
查看Slack通知
将监视目标的URL更改为不存在的URL,并确保HTTP响应返回500系列状态码,以验证Alert的情况。当HTTP请求返回异常时,Alert菜单的状态将变为红色。
然后,将通知您在Slack上发生了错误。
这次是关于Slack聊天服务,但如果有人没有习惯收到聊天通知,或者有“我希望能更早更可靠地收到通知,而不是在Slack上察觉不到!”这样的需求,那么将它与SaaS电话呼叫服务连接起来,也可以在发生警报时发起电话呼叫。
我认为重要的不是通知本身,而是要考虑人们如何感知和意识到的设计。
赠品
我认为Prometheus的外观非常朴素(因为它已经具备了必要的功能而且内容充实),但如果您想要一个设计炫酷的仪表盘,我认为可以与Grafana进行协作来实现。
由于Grafana与Prometheus一样有Docker镜像,您可以通过将其添加到docker-compose.yml文件中来启动Grafana。
如果您有兴趣,不妨尝试一下这个挑战,看看效果如何。
如果您认为搭建监视系统非常麻烦的话,为何不考虑使用Docker+Prometheus这套能够快速搭建和管理监视功能的工具来度过圣诞节呢?