HTTP agentを使用したりしてMQTT Broker(EMQX Enterprise)をZabbixで監視する

# はじめに

* **MQTT Broker(EMQX Enterprise)**で**Zabbix**を設定した内容をまとめたいと思います。
* パフォーマンスチェックはAPIの値を取得するので**Zabbix agent**ではなく**HTTP agent**を使用します。

:::note info
※追記
procの引数を検索するがてら、Zabbixのソースをのぞいて検索してみたところ、
agent2でMQTTの監視をするプラグインがあったのでそっちを使った方がいいのかも。
:::
https://www.zabbix.com/documentation/7.0/en/manual/config/items/itemtypes/zabbix_agent/zabbix_agent2?hl=mqtt%2CMQTT#mqtt.get

https://github.com/zabbix/zabbix/tree/release/7.0/src/go/plugins/mqtt

## やりたいこと
1. パフォーマンスチェック:API経由でメトリクスを取得する。
2. 死活監視:APIチェックとプロセスチェック+トリガー検知の作成。

# 1.パフォーマンスチェック
* ドキュメント通りに以下のAPIを使用する。

```bash
https://{URL}/api/v5/metrics
```

* MQTT Broker(EMQX Enterprise)側でAPIKeyとSecretKeyを発行する。
    * これらを使用してPostman等で値が取れるか確認する。

:::note info
後に結果で返ってきたJSONオブジェクトを整形したり、原因の切り分けができるので推奨とします。
:::

イメージ図
![スクリーンショット 2025-02-03 13.19.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3878757/cb1832bf-0a0f-5e30-a8a2-7e2d82151c92.png)

## Zabbix Item作成
* 監視のキモとなるItemを作成します。
* またテンプレート化してマクロに環境変数を入れて管理します。(APIキー、URLなど)


### 設定内容
#### Item
* 使用するTypeは**HTTP agent**です。
* **Key**は任意で何でも良いのですが、後にダッシュボードで使用するため分かりやすい名前を使用します。
* **URL**と**Headers**に後にテンプレートマクロで記載する環境変数用の枠を入れます。

:::note info
※初回はトークンとURLを直接入れて原因の切り分けをしてもいいかもしれません。
:::

![スクリーンショット 2025-02-03 13.26.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3878757/7972cd78-cc7c-ca9c-4db1-f3690b1be092.png)

#### Preprocessing
* 取得した値を整形するためにPreprocessingタブで整形します
* JSONPathを指定しParametersに区切り文字を入れます。

:::note info
個人的にこの区切り文字でちょっと詰まりましたが、隣にTestタブがあるのですぐ結果が分かります。
:::

![スクリーンショット 2025-02-03 13.16.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3878757/314129e6-bbac-4b81-85d6-7a01b3e16cdc.png)

* 全て設定し終わったらItemをテストします。
    * ResultがValueの値と一致していればOKです。

![スクリーンショット 2025-02-03 13.43.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3878757/b2661e73-7d97-8f65-5b3d-9a4fb0db4e79.png)

# 2.死活監視(プロセスチェック)
* 今回は**Zabbix agent**を使用し**proc.num**を使用します。


https://www.zabbix.com/documentation/7.0/en/manual/config/items/itemtypes/zabbix_agent?hl=proc.num#proc.num

* 監視対象のプロセスをpsコマンド等で特定する。

```bash
ps -aux | grep emqx
```

## Zabbix Item作成


* TypeにZabbix agentを選択
:::note info
実施するインスタンスにagentを入れる&Zabbixサーバーへの疎通設定が必要です。
今回は割愛します。
:::
* Keyにはproc.num[emqx]を入れます。

:::note warn
ドキュメントを見る限り
proc.num[,,,,]のフォーマットに沿うと
proc.num[emqx,,,,]の方が正しいと思います。

proc.numを定義しているところでコード検索したのですが、引数なしの箇所が見つからなかったです。(こちらは自分の力不足)
:::


![スクリーンショット 2025-02-03 16.16.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3878757/98519634-6b68-8618-6568-79abe938baf6.png)

* 設定後値が取れているか確認する。(1が正常、0が停止状態)

## Triggers設定

* lastを使用。
    * 1の時は稼働していて0の時はアラートを出すように条件式を設定をする。

![スクリーンショット 2025-02-17 18.40.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3878757/7eaef283-3afe-4ff4-94e1-a2f2b0d47ee8.png)

* systemctl等で停止したりしてテストする。


https://www.zabbix.com/documentation/6.0/jp/manual/config/triggers/expression

## ダッシュボード設定

* **Add widget**から設定、Typeは**Item value**を選択
* Itemに先ほど指定したキー(proc.num[emqx])があるのでそちらを選択する。

![スクリーンショット 2025-02-17 18.53.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3878757/8cbe3f41-448c-413d-b0af-d8a885fa42fd.png)

* Advanced configurationにチェックを入れDescriptionにStatus等を入れる。
    * LTS 7.0ならハニカムウェジェットの方がいいかも。

![スクリーンショット 2025-02-17 18.53.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3878757/df3bf8b1-6c31-4220-aba1-1b33173d57a0.png)

### 参考
EMQX Enterprise APIドキュメント
https://docs.emqx.com/en/emqx/v5.7/admin/api-docs.html#tag/Status/paths/~1status/get

### 最後に

* 今回は**HTTPエージェント**を使用した**API経由でのメトリクス**を取得することができました。
* ただAPIキーの管理が大変なのでできるならば**HTTPエージェント**を使用せずに実装したいところですが、ここは要勉強ですね。
* またトリガー検知の部分はまだまだ最適化できそうなので学んでいきたいところですね。