Zabbixを触ったことない人間が、ZabbixからPrometheusのメトリクスが取れると聞いて、どんな感じで取れるかを確認した時のメモ。
素人のメモなのでツッコミどころが多そうだが、記録として残しておく。
検証環境
以下の環境で確認した。
- Ubuntu 20.04.6
- docker 24.0.2
Zabbixの起動
docker-composeだと簡単に構築できるため、こちらを採用した。
Zabbixのdocker-composeによる起動は公式サイトでもサポートされている。
公式ドキュメントでは5.4がサポートされていると書いているが、GitHubのリポジトリを見るとv6.4.4に対応している。今回は6.4.4で起動する。
docker-composeのファイルによって構成が変わるようだが、今回はUbuntu上にZabbixとMySQLを立てる、docker-compose_v3_ubuntu_mysql_latest.yamlを使って構築する。
公式手順によると、git clone
してからdocker compose up
する手順となっていたので、以下のような感じで実行する。
git clone https://github.com/zabbix/zabbix-docker.git
cd zabbix-docker/
docker compose -f ./docker-compose_v3_ubuntu_mysql_latest.yaml up -d
実際は利用Portが被ったため、801ポートで待つよう修正したdocker-compose.ymlを利用した。
zabbix-web-nginx-mysql:
image: zabbix/zabbix-web-nginx-mysql:ubuntu-6.4-latest
ports:
- "801:8080"
- "443:8443"
Node Exporterの起動
Prometheus形式のメトリクスであれば何でもよかったので、ここでは手っ取り早く、踏み台環境にそのままNode Exporterを立ててメトリクスを公開する。
こちらで公開されているdocker-compose.ymlに公開用ポートを足して起動する。
cat << EOF > ./docker-compose.yml
version: '3.8'
services:
node_exporter:
image: quay.io/prometheus/node-exporter:latest
ports:
- 9100:9100
container_name: node_exporter
command:
- '--path.rootfs=/host'
network_mode: host
pid: host
restart: unless-stopped
volumes:
- '/:/host:ro,rslave'
EOF
docker compose up -d
起動したらメトリクスが取得できるか確認しておく。
$ curl -s 10.41.79.87:9100/metrics
# HELP go_gc_duration_seconds A summary of the pause duration of garbage collection cycles.
# TYPE go_gc_duration_seconds summary
go_gc_duration_seconds{quantile="0"} 2.0534e-05
:(省略)
Zabbixからメトリクスを取得する
<ホストのIP>:<待ち受けポート>でアクセスすると、アカウント情報を聞かれるので、Admin/zabbixでログインする。ログイン後の画面は以下のような感じになる。
Data collection
-> Hosts
から右上のCreate host
をクリックする。
クリックすると以下のような画面が出るので適当に入力してAdd
をクリックして登録する。
追加したホストが表示されているはずなので、そのホスト名の列のItems
をクリックし、右上のCreate Item
をクリックする。
ここでは、親となるメトリクスのエンドポイントの情報を入力する。
入力する値は以下となる。
- Name:
node-exporter
- Type:
HTTP agent
- Key:
node-exporter
- Type of information:
Charactor
- URL:
http://Node ExporterのホストのIP:9100/metrics
おそらくNameとKeyは何でもよい。
この状態でTest
をクリックし、Get value and test
をクリックすると、以下のようにResult
のところにcurlした結果と同じような文字列が取得できることが確認できる。
この状態でAdd
を押して追加する。
次にメトリクスを追加する。
どうも調べている感じだと、特定のエンドポイント(Node Exporter等)のメトリクスはまとめてZabbix側で取れるようだが、任意のメトリクス(例えば自作のアプリケーションなど)は1個1個メトリクスを指定しないと取れないように見えている。
そのため、ここでは1つ1つ指定していく。
Data collection
-> Hosts
->対象ホストのItems
から右上のCreate item
を再度選択し、メトリクスを追加する。
入力する値は以下となる。
- Name:
<対象メトリクス名>
- Type:
Dependent item
- Key:
<対象メトリクス名>
- Type of information:
Numeric (unsigned)
※データの種類によって変える必要あり - Master item:
<先程作成したエンドポイントのitem>
また、Processingのタブを開いてZabbixがサポートするクエリを設定する。
入力する値は以下となる。
- Name:
Prometheus pattern
- Parameters:
<クエリ>
※ここではpromhttp_metric_handler_requests_total{code="200"}
とした
これで保存すると、しばらくすると問題なければStatusがEnabled
に変化する。
Items
をクリックして、Latest data
をクリックすると、データが取れていることが確認できる。
一応ZabbixからPrometheus形式のメトリクスが読めることが確認できた。
残課題
以下調査不足なのか仕様なのか課題が残っている。
- 任意のアプリケーションに対して個々のメトリクスを指定せずにまとめて取る方法(要は普通のPrometheus的なスクレイプ方法)が分からない
識者の方、対策ご存知だったら教えてください。