分散システムとポエム

Prometheusで外部監視(External Monitoring)を行う

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です