ゼロからZabbix6.4を起動して、Prometheus形式のメトリクスを取得する

Zabbixを触ったことない人間が、ZabbixからPrometheusのメトリクスが取れると聞いて、どんな感じで取れるかを確認した時のメモ。
素人のメモなのでツッコミどころが多そうだが、記録として残しておく。

## 検証環境
以下の環境で確認した。
- Ubuntu 20.04.6
- docker 24.0.2

## Zabbixの起動
docker-composeだと簡単に構築できるため、こちらを採用した。
Zabbixのdocker-composeによる起動は[公式サイトでもサポートされている](https://www.zabbix.com/documentation/current/jp/manual/installation/containers#docker-compose)。
公式ドキュメントでは5.4がサポートされていると書いているが、[GitHubのリポジトリ](https://github.com/zabbix/zabbix-docker)を見るとv6.4.4に対応している。今回は6.4.4で起動する。
docker-composeのファイルによって構成が変わるようだが、今回はUbuntu上にZabbixとMySQLを立てる、[docker-compose_v3_ubuntu_mysql_latest.yaml](https://github.com/zabbix/zabbix-docker/blob/6.4/docker-compose_v3_ubuntu_mysql_latest.yaml)を使って構築する。

公式手順によると、`git clone`してから`docker compose up`する手順となっていたので、以下のような感じで実行する。
```sh
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を利用した。
```yaml
 zabbix-web-nginx-mysql:
  image: zabbix/zabbix-web-nginx-mysql:ubuntu-6.4-latest
  ports:
   - "801:8080"
   - "443:8443"
```

## Node Exporterの起動
Prometheus形式のメトリクスであれば何でもよかったので、ここでは手っ取り早く、踏み台環境にそのままNode Exporterを立ててメトリクスを公開する。
[こちら](https://github.com/prometheus/node_exporter#docker)で公開されているdocker-compose.ymlに公開用ポートを足して起動する。
```yaml
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
```

起動したらメトリクスが取得できるか確認しておく。
```sh
$ 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でログインする。ログイン後の画面は以下のような感じになる。
![1689045001575.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/32f3b900-7ab1-7f5b-b7e3-522cc2d2b5ee.png)

`Data collection` -> `Hosts`から右上の`Create host`をクリックする。
クリックすると以下のような画面が出るので適当に入力して`Add`をクリックして登録する。
![1689049253999.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/d34b2e8d-32e2-cfc5-e301-19701a9e9ccc.png)

追加したホストが表示されているはずなので、そのホスト名の列の`Items`をクリックし、右上の`Create Item`をクリックする。
ここでは、親となるメトリクスのエンドポイントの情報を入力する。
![1689049860284.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/bc4ff314-3ea2-cdab-70fc-f699b4feeeae.png)

入力する値は以下となる。
- 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した結果と同じような文字列が取得できることが確認できる。

![1689072348263.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/273db29c-3fb7-09e7-98d9-f23cf7a7ce79.png)

この状態で`Add`を押して追加する。
次にメトリクスを追加する。
どうも調べている感じだと、特定のエンドポイント(Node Exporter等)のメトリクスはまとめてZabbix側で取れるようだが、任意のメトリクス（例えば自作のアプリケーションなど）は1個1個メトリクスを指定しないと取れないように見えている。
そのため、ここでは1つ1つ指定していく。
`Data collection` -> `Hosts`->対象ホストの`Items`から右上の`Create item`を再度選択し、メトリクスを追加する。
![1689072877903.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/72e0b8ae-df4b-f6b7-d932-65ac816fdcbf.png)
入力する値は以下となる。
- Name: `<対象メトリクス名>`
- Type: `Dependent item`
- Key: `<対象メトリクス名>`
- Type of information: `Numeric (unsigned)`　※データの種類によって変える必要あり
- Master item: `<先程作成したエンドポイントのitem>`

また、Processingのタブを開いて[Zabbixがサポートするクエリ](https://www.zabbix.com/documentation/current/en/manual/config/items/itemtypes/prometheus)を設定する。
![1689072974238.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/e0003e63-aeb9-7d77-57a3-58cf097f8f62.png)
入力する値は以下となる。
- Name: `Prometheus pattern`
- Parameters: `<クエリ>`　※ここでは`promhttp_metric_handler_requests_total{code="200"}`とした

これで保存すると、しばらくすると問題なければStatusが`Enabled`に変化する。

![1689073305259.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/d88018f4-de6c-df50-4245-1296fc9533c1.png)

`Items`をクリックして、`Latest data`をクリックすると、データが取れていることが確認できる。
![1689073379808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/df64ebbd-ee5b-ec48-ccb6-f7bc514bc2eb.png)

グラフも表示可能。
![1689073413885.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/547981/bc73e124-3ddf-c908-43cf-63975586dc75.png)

一応ZabbixからPrometheus形式のメトリクスが読めることが確認できた。

## 残課題
以下調査不足なのか仕様なのか課題が残っている。
- 任意のアプリケーションに対して個々のメトリクスを指定せずにまとめて取る方法(要は普通のPrometheus的なスクレイプ方法)が分からない

識者の方、対策ご存知だったら教えてください。