研究の実験環境の整備を行う一貫で,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の修行が足りないことを痛感した.
コメントを残す