Prometheusで外形監視を行う

kosa3
8 min readJan 31, 2021

--

# 背景

PrometheusはPull型の監視ツールで監視対象のホストからメトリクスを取得し監視をしている。DNSやICMP、SSHでの名前解決や疎通確認を監視するには同開発元が開発しているblackbox_exporterを利用して実現することができる。今回は複数のprobeモジュールを単一のprometheus jobで設定する記事があまりなかったので小ネタとして記載する。

# 実現すること

・www.prometheus.ioへのDNS名前解決ができること(フルリゾルバは用意していないのでPublic DNS サービスを利用する)
・ICMPでの疎通確認
・HTTPSの確認(HTTPでリクエストを送ってHTTPSになるか)

こんな感じの構成で作ります。

├── blackbox_exporter
│ ├── config.yml
│ └── targets
│ ├── dns_check.yml
│ ├── icmp.yml
│ └── ssl_redirect_check.yml
├── docker-compose.yml
└── prometheus
└── prometheus.yml

# 検証環境

以下でdocker-compose環境を作成しました。

# blackbox_exporterの設定

blackbox_exporterは9115のポートで起動させ、設定ファイルは以下のように利用するproberを設定する。

modules:
icmp:
prober: icmp
icmp:
preferred_ip_protocol: ip4
dns_check:
prober: dns
dns:
query_name: "www.prometheus.io"
query_type: "A"
validate_answer_rrs:
fail_if_not_matches_regexp:
- "www.prometheus.io.*[172.67.191.149|104.21.84.118]"
ssl_redirect_check:
prober: http
timeout: 30s
http:
preferred_ip_protocol: ip4
valid_status_codes: [200]
fail_if_not_ssl: true

以下のようにmoduleとtargetのパラメータを設定することで監視したいmetricsデータを取得することができます。

http://localhost:9115/probe?module=dns_check&target=8.8.8.8

# HELP probe_dns_additional_rrs Returns number of entries in the additional resource record list
# TYPE probe_dns_additional_rrs gauge
probe_dns_additional_rrs 0
# HELP probe_dns_answer_rrs Returns number of entries in the answer resource record list
# TYPE probe_dns_answer_rrs gauge
probe_dns_answer_rrs 2
# HELP probe_dns_authority_rrs Returns number of entries in the authority resource record list
# TYPE probe_dns_authority_rrs gauge
probe_dns_authority_rrs 0
# HELP probe_dns_duration_seconds Duration of DNS request by phase
# TYPE probe_dns_duration_seconds gauge
probe_dns_duration_seconds{phase="connect"} 0.0002061
probe_dns_duration_seconds{phase="request"} 0.0765966
probe_dns_duration_seconds{phase="resolve"} 5.34e-05
# HELP probe_dns_lookup_time_seconds Returns the time taken for probe dns lookup in seconds
# TYPE probe_dns_lookup_time_seconds gauge
probe_dns_lookup_time_seconds 5.34e-05
# HELP probe_duration_seconds Returns how long the probe took to complete in seconds
# TYPE probe_duration_seconds gauge
probe_duration_seconds 0.0784229
# HELP probe_ip_addr_hash Specifies the hash of IP address. It's useful to detect if the IP address changes.
# TYPE probe_ip_addr_hash gauge
probe_ip_addr_hash 3.796287035e+09
# HELP probe_ip_protocol Specifies whether probe ip protocol is IP4 or IP6
# TYPE probe_ip_protocol gauge
probe_ip_protocol 4
# HELP probe_success Displays whether or not the probe was a success
# TYPE probe_success gauge
probe_success 1

これらのURLをprometheusで監視するためにjobを設定します。

file_sd_configsに複数の外形監視対象の設定ファイルを用意していきます。
※ file_sd_configsはstatic_configsと違い監視対象を追加した際にprometheusの再起動が不要なため便利です。
__param_moduleでURLにmoduleパラメータを付けたいのでラベリングしたmoduleを設定するようにします。

- job_name: 'blackbox'
scrape_interval: 30s
metrics_path: /probe
file_sd_configs:
- files:
- '/etc/blackbox_exporter/targets/*.yml'
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [module]
target_label: __param_module
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: blackbox-exporter:9115

dns_check.ymlなどにmoduleラベルと監視対象を設定します。

- labels:
module: dns_check
targets:
- "8.8.8.8"

この設定が終わり次第dockerを立ち上げるとPrometheusのダッシュボードにて外形監視の対象が正しく設定されていれば問題なく監視ができていることがわかります。

あとはgrafanaのデータソースにprometheusを追加して可視化してみるとこんな感じで成功(1.0)していることが確認できます。(見づらいですが3つ成功しています。)

#まとめ

blackbox_exporterで外形監視のモニタリングをすることができました。

常時動かしているとタイムアウトとかでエラーが返る時もありますが数分間成功しなければアラートマネージャを利用して通知させるみたいなことも可能なので外形監視の運用が実現できそうです。

--

--