研究の実験環境の整備を行う一貫で,Prometheusで外部監視(External Monitoring)を行うことにした.最終的なゴールはHTTPリクエストをあるURLへ送信し,レイテンシ(応答時間)やステータスコードを監視することである.
Blackbox Exporter
外部監視のPrometheus Exporterで有名な実装の1つにBlackbox Exporterがある.このExporterはICMPやTCP, HTTPでヘルスチェックを行い,その結果をエンドポイントでPrometheusに公開する.Blackbox ExporterでHTTPによる外部監視を行うには,アプリケーションにメトリクスを公開するエンドポイント(例: /metrics)を実装する必要となる.今回はアプリケーションへの変更なくヘルスチェック用のHTTPリクエストに関するレイテンシを取得したいため,Blackbox Exporterでは要件を満たせない.
syepes/network_exporter
Prometheus Exporterを探していた際にX(旧Twitter)で@naa0yamaさんに要件を満たせるPrometheus Exporterとしてsyepes/network_exporter (以下Network Exporter)を教えていただいた.実際にUbuntu 22.04.3にインストールした手順を紹介する.このマシンには既にPrometheusを導入済みとする.
インストール手順
(1) Network Exporterをダウンロードする.debパッケージが公開されているためこれを使う.
https://github.com/syepes/network_exporter/releases
$ wget https://github.com/syepes/network_exporter/releases/download/1.7.5/network_exporter_1.7.5_linux_amd64.deb
(2) インストールされたか確認する.
$ which network_exporter
/usr/bin/network_exporter
(3) 起動オプションを確認する.オプション --config
を使うと設定ファイルを指定できるとわかる.
$ network_exporter -h
usage: network_exporter [<flags>]
Flags:
-h, --[no-]help Show context-sensitive help (also try --help-long and --help-man).
--web.listen-address=":9427"
The address to listen on for HTTP requests
--config.file="/app/cfg/network_exporter.yml"
Exporter configuration file
--[no-]profiling Enable Profiling (pprof + fgprof)
--log.level=info Only log messages with the given severity or above. One of: [debug, info, warn, error]
--log.format=logfmt Output format of log messages. One of: [logfmt, json]
--[no-]version Show application version.
(4) 設定ファイル network_exporter.yml を作成する.
conf:
refresh: 15m
http_get:
intervals: 1m
timeout: 5s
targets:
- name: endpoint1
host: "https://www.koyama.me/"
type: HTTPGet
(5) Network Exporterを起動する.
$ network_exporter --config.file="$PWD/network_exporter.yml"
ts=2023-11-19T09:37:08.798Z caller=main.go:56 level=info msg="Starting network_exporter" version=1.7.5
ts=2023-11-19T09:37:08.799Z caller=main.go:58 level=info msg="Loading config"
ts=2023-11-19T09:37:08.799Z caller=main.go:147 level=info msg="Configured default DNS resolver"
ts=2023-11-19T09:37:08.799Z caller=main.go:140 level=info msg="Starting ping exporter" version=1.7.5
ts=2023-11-19T09:37:08.800Z caller=main.go:141 level=info msg="Listening for /metrics on :9427"
ts=2023-11-19T09:37:08.800Z caller=monitor_http.go:104 level=info type=HTTPGet func=AddTargetDelayed msg="Adding Target: endpoint1 (https://www.koyama.me/) in 0s"
(6) CurlでHTTPリクエストを送信して動作を確認する.http_getをプレフィクスにもつメトリクスを返すようになっている.これをPrometheusからポーリングでPullできればよい.
$ curl -s http://localhost:9427/metrics | grep '^http_'
http_get_content_bytes{name="endpoint1",target="https://www.koyama.me/"} -1
http_get_seconds{name="endpoint1",target="https://www.koyama.me/",type="ContentTransfer"} 0.000182125
http_get_seconds{name="endpoint1",target="https://www.koyama.me/",type="DNSLookup"} 0.00397042
http_get_seconds{name="endpoint1",target="https://www.koyama.me/",type="ServerProcessing"} 0.151319333
http_get_seconds{name="endpoint1",target="https://www.koyama.me/",type="TCPConnection"} 0.150696674
http_get_seconds{name="endpoint1",target="https://www.koyama.me/",type="TLSEarliestCertExpiry"} 1.705613539e+09
http_get_seconds{name="endpoint1",target="https://www.koyama.me/",type="TLSHandshake"} 0.154100303
http_get_seconds{name="endpoint1",target="https://www.koyama.me/",type="TLSLastChainExpiry"} 1.705613539e+09
http_get_seconds{name="endpoint1",target="https://www.koyama.me/",type="Total"} 0.460375409
http_get_status{name="endpoint1",target="https://www.koyama.me/"} 200
http_get_targets 1
http_get_up 1
(7) Prometheusの設定ファイルのscrape_configsセクションを編集し以下を追加する.その後,Prometheusへ設定を適用する.
scrape_configs:
- job_name: 'network_exporter'
scrape_interval: 15s
scrape_timeout: 5s
metrics_path: /metrics
scheme: http
static_configs:
- targets: ['localhost:9427']
(8) Prometheusにメトリクスが格納されたか確認する.メトリクスが追加された.
クエリ言語PromQLを使いグラフを作成できた.
追記: 2023/11/19
Xで@Kawakami_KentoさんからBlackbox Exporterで出来ると教えていただいた.追試をしてみたところ,Blackbox Exporterだけで設定できた.メトリクスを上手く探せていなかっただけのようだった.
PrometheusのConfigの抜粋
- job_name: blackbox_all
metrics_path: /probe
params:
module: [ http_2xx ] # Look for a HTTP 200 response.
static_configs:
- targets:
- https://blog.koyama.me/
relabel_configs:
- source_labels: [__address__]
target_label: __param_target
- source_labels: [__param_target]
target_label: instance
- target_label: __address__
replacement: localhost:9115
- job_name: 'blackbox_exporter' # collect blackbox exporter's operational metrics.
static_configs:
- targets: ['localhost:9115']
Blackbox ExporterのConfig
modules:
http_2xx:
prober: http
http:
valid_status_codes: [200, 201, 202]
method: "GET"
preferred_ip_protocol: "ip4"
メトリクス probe_duration_seconds として保存されていた.
追試でのCurlした結果
おわりに
サードパーティのPrometheus Exporterをはじめて使ったが便利だった.Prometheusに比べてZabbixは公式でサポートしている機能が豊富であることを改めて感じた.使い慣れたソフトウェアを使うのもよいが,たまには使い慣れないソフトウェアを使う経験も必要だと思った.アウトプットすると理解が深まるだけでなく,フィードバックで知識の誤りに気づけてありがたいと改めて感じた.Prometheusの修行が足りないことを痛感した.
コメントを残す