[Prometheus] blackbox_exporterで外形監視


目次

概要

blackbox_exporterは各種プロトコルの死活監視を行うことができる。
各種ポート監視、httpのGET、POSTリクエストなどの挙動、Basic認証のチェックなど様々な事ができる。
今回は、SSHの22番ポートを監視する例と、httpのresponse bodyの内容をチェックする例を書く。

blackbox_exporter

以下を利用する。
https://github.com/prometheus/blackbox_exporter

前提

以下の手順でPrometheus, Grafana環境を構築していることを前提とする。
Prometheus + AlertManager + Grafana + Node Exporter with Docker

サーバー構成

blackbox-exporterは、監視対象のポートチェックをし、その結果をメトリクス化してPrometheusに送るので、以下のようなサーバー構成になる。

そのため、監視対象のサーバーにインストールするのではなく、Prometheusが入っているサーバーにインストールするのがよいと思う。(監視対象にインストールして使うこともできるが、設定が冗長になるのでおすすめしない。)

blackbox-exporter ├──> 監視対象001
                  ├──> 監視対象002
                  └──> 監視対象003

ディレクトリ構造

.
├── docker-compose.yaml
└── blackbox-exporter
    └── config.yaml

docker-compose

blackbox-exporterのコンテナ定義。

docker-compose.yaml
version: '3'
services:
  blackbox-exporter:
    image: prom/blackbox-exporter
    container_name: blackbox-exporter
    ports:
      - 127.0.0.1:9115:9115
    volumes:
      - ./blackbox-exporter:/etc/blackbox_exporter
    entrypoint: ['/bin/blackbox_exporter', '--config.file=/etc/blackbox_exporter/config.yaml']
    restart: always

config.yaml

blackbox-exporter/config.yamlを作成する。

blackbox-exporter/config.yaml
modules:
  ssh_banner:
    prober: tcp
    tcp:
      query_response:
        - expect: "^SSH-2.0-"
  nginx_banner:
    prober: http
    http:
      method: GET
      # 以下の文字列がなければアラートとする
      fail_if_body_not_matches_regexp:
        - '"nginx": "ok"'

ssh_banner.tcp.query_response.expectの"^SSH-2.0-"は、GoでのTCPリクエストによるレスポンス内容の一部。(blackbox_exporterはGoで書かれている)

以下の記事で、GoのTCPクライアントをさっと作る方法を書いたので、必要でれあればこれを使って各ポートのレスポンス内容がどのようになっているかを確認してみてください。
参考:GoでTCPクライアントを秒で作る

exporterの起動

$ sudo docker-compose up -d --build

Prometheusの設定

Prometheusサーバーのprometheus.yamlに以下の設定を追記する。

relabel_configs.replacementにblackbox-exporterが入っているサーバーのホストを指定する。
static_configs.targetsには22番ポートを監視するサーバーのホストを定義する。
(blackbox-exporterとtargetsのサーバーが同一でも構わない。)

prometheus/prometheus.yaml
scrape_configs:
  - job_name: port-ssh
    metrics_path: /probe
    params:
      module: [ssh_banner]
    static_configs:
      - targets:
        - target-server01.com:22
        - target-server02.com:22
        labels:
          env: development
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox-exporter-server.com:9115
  - job_name: nginx-body
    metrics_path: /probe
    params:
      module: [nginx_banner]
    static_configs:
      - targets:
        - target-server01.com:80
        - target-server02.com:80
        labels:
          env: development
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox-exporter-server.com:9115

設定を反映

$ sudo docker-compose restart prometheus

PromQL

以下のPromQLがそれぞれ1が返せばOKということになる。

SSH Port監視

probe_success{job="port-ssh"}

nginxのresponse bodyの内容監視

probe_success{job="nginx-body"}

参考