実施環境:
[testuser@testhost ~]$ uname -a
Linux testhost 4.18.0-448.el8.x86_64 #1 SMP Wed Jan 18 15:02:46 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
[testuser@testhost ~]$ cat /etc/redhat-release
CentOS Stream release 8
prometheus:2.46.0.linux-amd64
blackbox_exporter:0.24.0.linux-amd64
Windows 11 Home 21H2
0. 概要
Prometheus の exporter には、収集したい情報に合わせて様々なものが存在します。
そのうちの1つである blackbox_exporter は外形監視、すなわち対象のサーバ外から HTTP や ICMP などで接続して反応を見る形式の監視を行うことができます。
今回はこの blackbox_exporter を使って、 ICMP での死活監視を行ってみました。
なお、手っ取り早く試すために、監視先にはサーバではなく Windows 端末を使用しています。
1. ダウンロード
まずは以下のサイトから blackbox_exporter をダウンロードします。
バージョンは 0.24.0 です。
2. 起動
次に blackbox_exporter をサーバ上に転送し、解凍します。
[testuser@testhost ~]$ pwd
/home/testuser
[testuser@testhost ~]$ ls -l blackbox_exporter-*.tar.gz
-rw-rw-r--. 1 testuser testuser 10956196 12月 18 22:57 blackbox_exporter-0.24.0.linux-amd64.tar.gz
[testuser@testhost ~]$ tar xzf blackbox_exporter-0.24.0.linux-amd64.tar.gz
[testuser@testhost ~]$ ls -ld blackbox_exporter-*
drwxr-xr-x. 2 testuser testuser 80 5月 16 2023 blackbox_exporter-0.24.0.linux-amd64
-rw-rw-r--. 1 testuser testuser 10956196 12月 18 22:57 blackbox_exporter-0.24.0.linux-amd64.tar.gz
[testuser@testhost ~]$
解凍した中身は以下の通りです。
[testuser@testhost ~]$ cd blackbox_exporter-0.24.0.linux-amd64/
[testuser@testhost blackbox_exporter-0.24.0.linux-amd64]$ pwd
/home/testuser/blackbox_exporter-0.24.0.linux-amd64
[testuser@testhost blackbox_exporter-0.24.0.linux-amd64]$ ls -l
合計 20700
-rw-r--r--. 1 testuser testuser 11357 5月 16 2023 LICENSE
-rw-r--r--. 1 testuser testuser 94 5月 16 2023 NOTICE
-rw-r--r--. 1 testuser testuser 956 5月 16 2023 blackbox.yml
-rwxr-xr-x. 1 testuser testuser 21174366 5月 16 2023 blackbox_exporter
[testuser@testhost blackbox_exporter-0.24.0.linux-amd64]$
以下のようなコマンドを入力することで blackbox_exporter が起動できます。
このコマンドは Ctrl + C などでプロセスを KILL するまで実行され続けます。
[testuser@testhost blackbox_exporter-0.24.0.linux-amd64]$ ./blackbox_exporter --config.file=./blackbox.yml
ts=2023-12-18T14:19:09.927Z caller=main.go:78 level=info msg="Starting blackbox_exporter" version="(version=0.24.0, branch=HEAD, revision=0b0467473916fd9e8526e2635c2a0b1c56011dff)"
なお、再起動する Windows 端末から Prometheus のあるサーバをリモートで操作している場合などでは、 $ nohup ./blackbox_exporter --config.file=./blackbox.yml &
のように nohup (起動元のセッション終了後もプロセスを動作させ続ける)と & (バックグラウンドでプロセスを実行する)を使用してプロセスを起動すれば、リモート接続が切れてもプロセスを続行できます。
3. Prometheus 側の設定編集
ここで、 blackbox_exporter の設定ファイル blackbox.yml の中身を見てみましょう。
modules:
http_2xx:
prober: http
http:
preferred_ip_protocol: "ip4"
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
grpc:
prober: grpc
grpc:
tls: true
preferred_ip_protocol: "ip4"
grpc_plain:
prober: grpc
grpc:
tls: false
service: "service1"
ssh_banner:
prober: tcp
tcp:
query_response:
- expect: "^SSH-2.0-"
- send: "SSH-2.0-blackbox-ssh-check"
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
icmp_ttl5:
prober: icmp
timeout: 5s
icmp:
ttl: 5
見ての通り、監視のプロトコルやタイムアウトに関する記載ばかりで、監視先を指定する部分が見当たりません。
実は blackbox_exporter の場合、どのサーバを監視するのかといった情報は prometheus 本体のファイル prometheus.yml に記載する必要があります。
以下は prometheus.yml のサンプルです。
監視対象が2つの場合を想定しています。
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
- job_name: "prometheus"
# metrics_path defaults to '/metrics'
# scheme defaults to 'http'.
static_configs:
- targets: ["localhost:9100"]
- job_name: "blackbox"
metrics_path: /probe
params:
module: [icmp]
static_configs:
- targets:
- 監視対象 1 の IP アドレス
- 監視対象 2 の IP アドレス
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox_exporter の IP アドレス:9115
上記の設定のうち、今回大事な部分を抜粋して説明します。
共通的な設定部分については以下の過去記事を参照してください。
Linux: システム監視ソフト「Prometheus」を無料インストールしてみた
まず、設定は scrape_configs 配下にジョブを単位として記載します。
ジョブ名は job_name で指定します。
ジョブ名は取得した情報にラベルとして付与され、検索の際に使用できます。
今回は blackbox
という名前ですが、他の名前にしても問題なく動作します。
scrape_configs:
(省略)
- job_name: "blackbox"
metrics_path では HTTP のリソースのパスを指定します。
URL でいうと http://***.***.***.***:***/probe?module=icmp&target=***.***.***.***
の /probe
の部分です。
ここで指定するべき値は監視する情報によって異なります。
デフォルトは /metrics
ですが、今回の ICMP 死活監視では /probe
を指定する必要があります。
metrics_path: /probe
params の下の module で blackbox.yml の modules 配下のモジュール名を指定します。
blackbox_exporter に 接続する URL http://***.***.***.***:***/probe?module=icmp&target=***.***.***.***
の module=icmp
の部分はここの設定で指定されます。
今回は ICMP で死活監視を行いたいので、 [icmp]
を指定します。
params:
module: [icmp]
最後の部分ですが、ここは blackbox_exporter に 接続する URL 中の文字列の置き換え規則を指定している箇所です。
説明は後にして、とりあえず監視対象の URL や IP アドレスなど(今回は Windows 端末の IP アドレス)を static_configs の下の targets に、 blackbox_exporter 自体の prometheus 本体からの接続先(今回は同一サーバ上なのでホスト名は localhost
、 blackbox_exporter のポート番号は 9115 )を replacement に指定すれば動作します。
監視対象が複数ある場合は、 targets 配下に複数行記載します。
static_configs:
- targets:
- 監視対象 1 の IP アドレス
- 監視対象 2 の IP アドレス
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox_exporter の IP アドレス:9115
置き換えの詳細を図で表すと、以下のような形になります。
relabel_configs 内の置き換えは上から順番に処理される関係上、設定の記載順を変えると想定通り動かないことがあるので注意してください。
ちなみに、 instance は情報に付与する単なるラベルなので、その分の記載は無くとも一応動作はします。
その場合、 instance はデフォルトの値として、置き換え後の __address__ の値(上の図だと ccc.ccc.ccc.ccc:9115
)をとります。
きちんと設定できれば、以下のように Prometheus の Targets 画面に blackbox_exporter が表示されるはずです。
なお、上記で指定している Windows 端末の IP アドレスは、コマンドプロンプトで ipconfig コマンドを実行すればすぐにわかります。
C:\>ipconfig
Windows IP 構成
イーサネット アダプター イーサネット:
接続固有の DNS サフィックス . . . . .: *****
リンクローカル IPv6 アドレス. . . . .: *****
IPv4 アドレス . . . . . . . . . . . .: Windows 端末の IP アドレス
サブネット マスク . . . . . . . . . .: *****
デフォルト ゲートウェイ . . . . . . .: *****
4. Windows 端末側の設定編集
さて、ここまででとりあえず Prometheus 側の設定は整いましたが、実は監視先が Windows の場合はこれだけではまだ blackbox_exporter は正しく動きません。
というのも、 Windows はデフォルトでは ping に返答しない設定となっているためです。
[testuser@testhost ~]$ ping -c 4 Windows 端末の IP アドレス
PING ***.***.***.*** (***.***.***.***) 56(84) bytes of data.
--- ***.***.***.*** ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3104ms
[testuser@testhost ~]$
そこで、 Windows 側の設定を以下のように編集して、 ping に反応するようにします。
まずは、スタートの「すべてのアプリ」から「 Windows セキュリティ」を起動します。
「ファイアウォールとネットワーク保護」を選択します。
アクティブになっている設定を確認後、「詳細設定」を選択します。
今回は「パブリック ネットワーク」がアクティブになっています。
ファイアウォールの設定画面が出るので、「受信の規則」を選択します。
規則の一覧をずっと下に行くと、「ファイルとプリンターの共有 (エコー要求・ICMPv* 受信) という行があります。
これが、 ping への応答の有無を定義している行です。
今回は IPv4 を使用するので、「 v4 」とある方を有効にします。
また、先ほど確認したアクティブな設定は「パブリック ネットワーク」なので、有効にするのはプロファイルが「プライベート、パブリック」となっている行だけでよいです。
右クリックで「規則の有効化」を選択すると、規則が有効にできます。
有効になっていれば、行の左にチェックマークが付きます。
これで無事、 Windows 端末に ping が通るようになりました。
[testuser@testhost ~]$ ping -c 4 Windows 端末の IP アドレス
PING ***.***.***.*** (***.***.***.***) 56(84) bytes of data.
64 bytes from ***.***.***.***: icmp_seq=1 ttl=128 time=0.798 ms
64 bytes from ***.***.***.***: icmp_seq=2 ttl=128 time=0.861 ms
64 bytes from ***.***.***.***: icmp_seq=3 ttl=128 time=0.560 ms
64 bytes from ***.***.***.***: icmp_seq=4 ttl=128 time=0.748 ms
--- ***.***.***.*** ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3111ms
rtt min/avg/max/mdev = 0.560/0.741/0.861/0.117 ms
5. 動作確認
以上で、 blackbox_exporter の動作環境が構築できました。
blackbox_exporter で取得した ICMP での死活監視情報は、 probe_success
で確認することができます。
以下は、 blackbox_exporter が動作している状態で Windows 端末に再起動をかけてみた際の画面です。
probe_success
では、稼働状態は 1 、停止状態は 0 として表現されます。
再起動のタイミングでグラフが 1 から 0 になり、また 1 に戻っているのが確認できます。