[Prometheus] blackbox_exporterで外形監視

## 目次
- [[目次] Prometheusで監視システムを作る with Docker](https://qiita.com/Esfahan/items/7dc780501f418a71ad9d)

## 概要
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](https://qiita.com/Esfahan/items/0feaedfd771f49ac7ee4)

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

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

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

## ディレクトリ構造

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

## docker-compose
blackbox-exporterのコンテナ定義。

```yaml: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を作成する。

```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クライアントを秒で作る](https://qiita.com/Esfahan/items/18fe22b171be20b42878)

## exporterの起動

```
$ sudo docker-compose up -d --build
```

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

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

```yaml: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監視

```prometheus
probe_success{job="port-ssh"}
```

![Screen Shot 2021-07-04 at 23.44.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/9bcbe4bc-c441-b57d-1947-2d625fd04e7c.png)

### nginxのresponse bodyの内容監視

```prometheus
probe_success{job="nginx-body"}
```

![Screen Shot 2021-07-05 at 17.36.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/105936/9e3729e3-1b41-bd23-a42b-348a5ced24a8.png)



## 参考
- [Prometheus : Blackbox exporter](https://www.server-world.info/query?os=CentOS_8&p=prometheus&f=6)
- [Prometheusのrelabel_configでメトリクスにオレオレなラベルを付与する](https://qiita.com/loftkun/items/4bd3bd3dcfd5864c1b6d)