使用Docker和Prometheus来创建外部(URL)监视

我将写一篇关于最近开始接触的监控工具Prometheus的构建的Advent日历。
大家是否正在对网站进行活动监控呢?
“我可以自己搭建吗?”“我们的系统并不大,不需要与SaaS签约。”“从零搭建服务器太辛苦了。”等等,我之前也认为这个功能非常困难。
但是,通过结合Docker和Prometheus,我们可以意外地轻松地创建外部监控机制,所以我想写下来。

URL的监控是指什么?

外貌监视是一种通过HTTP访问确认网站或API服务器是否正常运行的监视方法。它会检查“响应是否正常”、“是否在规定的时间内返回响应”等等。它的优点在于可以用与用户相同的方法访问,从而能够确认系统或API整体的正常/异常状态,包括网络。我认为它通常与从内部监视服务器资源(如CPU和内存)的方法结合使用。我们使用了AWS的服务,这是一个简单说明的图示。

スクリーンショット 2020-12-18 8.07.35.png

背景 – 环境和条件

    • 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时代表正常。

スクリーンショット 2020-12-18 20.36.04.png

从菜单中选择“报警”选项可以确认警报(通知)的状态。情况以不同颜色区分,并且可以一眼就知道哪些评估出现了错误。

スクリーンショット 2020-12-18 20.53.45.png

查看Slack通知

将监视目标的URL更改为不存在的URL,并确保HTTP响应返回500系列状态码,以验证Alert的情况。当HTTP请求返回异常时,Alert菜单的状态将变为红色。

スクリーンショット 2020-12-18 21.03.11.png

然后,将通知您在Slack上发生了错误。

スクリーンショット 2020-12-18 21.10.26.png

这次是关于Slack聊天服务,但如果有人没有习惯收到聊天通知,或者有“我希望能更早更可靠地收到通知,而不是在Slack上察觉不到!”这样的需求,那么将它与SaaS电话呼叫服务连接起来,也可以在发生警报时发起电话呼叫。

我认为重要的不是通知本身,而是要考虑人们如何感知和意识到的设计。

赠品

我认为Prometheus的外观非常朴素(因为它已经具备了必要的功能而且内容充实),但如果您想要一个设计炫酷的仪表盘,我认为可以与Grafana进行协作来实现。
由于Grafana与Prometheus一样有Docker镜像,您可以通过将其添加到docker-compose.yml文件中来启动Grafana。
如果您有兴趣,不妨尝试一下这个挑战,看看效果如何。

スクリーンショット 2020-12-18 21.23.08.png

如果您认为搭建监视系统非常麻烦的话,为何不考虑使用Docker+Prometheus这套能够快速搭建和管理监视功能的工具来度过圣诞节呢?