タイトルの通り、Zabbix 4.2や4.4で使えるPromehteusのexporterの値をディスカバリして全自動で監視連携する方法を紹介します。
Prometheusのexporterはとても幅広くいろんな製品に対応しているので便利です。
Prometheusだけで完結する運用現場ならこんなことする必要はないですが、Zabbixに連携して統合的に管理したいといった時にはこの方法を使うとちょっと楽になるかもという話です。
連携の手順
以下のような3ステップで実行すればOKです。
- ① exporterから情報取得するHTTPエージェントアイテムを登録
- ② ①のアイテムを親にした依存アイテムのディスカバリルールを作成
- (Prometheus→JSON変換、LLDマクロ化を実施)
- ③ ②のアイテムプロトタイプとして依存アイテムをLLDマクロを使って登録
手順1 expoerterから情報取得するHTTPエージェントアイテムを登録

タイプをHTTPエージェントに設定し、URLのところにexporterのエンドポイントのURLを指定します。(http://ホスト名/metricsとか)
設定をテンプレート化するなら、このURL部分はテンプレートのマクロ化しておくと良いと思います。
取得結果はPrometheusのフォーマットのテキスト形式で返ってくるので「テキスト」にしておきます。

取得結果は上記のような感じで/metricsにアクセスした時の生データです。
手順2 依存アイテムのディスカバリルールを作成
ディスカバリルール自体をHTTPエージェントにしても構わないのですが、そうすると手順3で設定するアイテムプロトタイプもHTTPエージェントにしないといけなくなったりして、exporterへの呼び出し機会が増えてしまうので、手順1でまとめて取得してその値を活用するように依存アイテムで対応します。


前処理(Preprocessing)で、Promehteusのフォーマットから特定のメトリクスの情報を取り出してJSON変換させます。
ここのParametersの指定の仕方は色々と可能ですが、この後のアイテムプロトタイプとペアで紐づくようにメトリクスの名前毎にディスカバリさせるような感じのフィルタ指定が良いと思います。
上記例の場合はKONG APIのexporterからkong_http_statusというメトリクス部分をディスカバリする例です。

LLDマクロとしてどのような名前のマクロにJSON変換したどこの部分の値を登録するかを指定します。
手順3 依存アイテムのアイテムプロトタイプを作成
最後にLLDマクロを使ってアイテムプロトタイプを作成します。ここでも手順1で作成したアイテムを親にした依存アイテムで設定します。


前処理(Preprocessing)で手順2で設定したLLDマクロを活用して、複数の項目があった時にそのディスカバリ結果を展開して自動作成されるように定義します。
今回の場合は、httpのステータスコード毎やサービス毎でexporterで取得できるメトリクスだったので、{#CODE}や{#SERVICE}という名称をラベルとして指定して取得できるようにしています。
まとめ
手順はこれだけです。exporter毎にメトリクスの仕様は決まっていると思うので、仕様に合わせてテンプレート化しておけば、Zabbix Agentもいらずでいろんな監視ができますね。