朝から昼寝

整理しておきたいIT関連の小ネタ

ZabbixでMQTTのデータを監視

概要

IoT機器等で使用されるPub/Sub型プロトコル、MQTT。監視ソフトウェアとして広く使用されているZabbixでもMQTT経由で取得したデータを監視できます。
本記事は、ZabbixでMQTTのデータを監視する方法をまとめたものです。対象は主にZabbix 6系+Zabbixエージェント2です。OSはRHEL8系ですが他のバージョンでも同様のはずです。
参考として、MQTTブローカーのMosquitto導入についてこちらの記事に、また簡単にセットアップできるZabbix Applianceの導入についてこちらの記事にまとめてあります。

本記事の目的

  • Zabbixにおいて、MQTTで取得したデータを監視する。

目次

基本

ZabbixによるMQTT監視方法

Zabbix.comに、ZabbixのMQTT対応方法について説明があります。

  • Zabbix Agent 2のMQTT plugin (本記事の対象)
  • 3rd Party Solutions (Agent、個別スクリプト等)

Zabbixの標準機能で対応できるのは、MQTT Plugin(Zabbix Agent 2)です。Zabbix Agent (2ではない方)ではありません。

Zabbix Agent 2の導入

別途Zabbixサーバは導入済みであるものとします。

Zabbix Agent 2は、Zabbixサーバと同じサーバでも、別サーバでも、どちらにインストールしても大丈夫です。
なお、Zabbix Agent 2を動作させるサーバは、目的のMQTTブローカーに対して通信できる必要性があります。Agent 2の機能でMQTTブローカーに対しSubscribeするためです。

Zabbix Agent 2のインストール

以下のZabbixマニュアルを参考に、Zabbix Agent 2を導入します。

Zabbixダウンロードとインストール方法の説明ページを参考に、dnfによるパッケージインストールが可能です。

以下、インストール時のコマンド例です。
# rpm -Uvh https://repo.zabbix.com/zabbix/6.0/rhel/8/x86_64/zabbix-release-6.0-1.el8.noarch.rpm
# dnf install zabbix-agent2.x86_64

Zabbixのリポジトリを登録し、Agent 2のみをインストールしています。

Zabbix Agent 2の初期設定

インストール後、Agent 2の設定ファイルを編集します。
# cp -p /etc/zabbix/zabbix_agent2.conf /etc/zabbix/zabbix_agent2.conf.org
# vi /etc/zabbix/zabbix_agent2.conf
以下の行を編集します。

…
Server=(ZabbixサーバのFQDN/IPアドレス)
…
ServerActive=(ZabbixサーバのFQDN/IPアドレス)
…
Hostname=(後でZabbixサーバで監視対象を指定する際のHostnameと同じ文字列)  
…
  • MQTT Pluginのみを使用する場合、RefreshActiveChecksの設定は不要でした。
  • 別途、/etc/zabbix/zabbix_agent2.d/plugins.d/mqtt.confという設定ファイルがありますが、これは基本的に修正不要です。本記事の作成時点で、Plugins.MQTT.Timeoutというタイムアウト値のオプションが指定できるのみです。

次に、サービス設定をします。(ちなみに、マニュアルに"Agent 2 does not have built-in daemonization support on Linux; it can be run as a Windows service."とあるのですが、以下のようにサービスの登録は可能のようなので、具体的に何ができないのか不明です)

# systemctl enable zabbix-agent2.service
Created symlink /etc/systemd/system/multi-user.target.wants/zabbix-agent2.service → /usr/lib/systemd/system/zabbix-agent2.service.

# systemctl start zabbix-agent2.service

# systemctl status zabbix-agent2.service
● zabbix-agent2.service - Zabbix Agent 2
  Loaded: loaded (/usr/lib/systemd/system/zabbix-agent2.service; enabled; vendor preset: disabled)
  Active: active (running) since Fri 2022-07-17 12:01:25 JST; 2s ago
Main PID: 12800 (zabbix_agent2)
    Tasks: 5 (limit: 23520)
  Memory: 5.6M
  CGroup: /system.slice/zabbix-agent2.service
          mq12800 /usr/sbin/zabbix_agent2 -c /etc/zabbix/zabbix_agent2.conf
…

Agent 2 を自動起動する設定と、手動でのサービス起動確認ができました。

続いて、MQTTのSubscribe等の設定は、Zabbixサーバ側の監視設定の中で行います。

Zabbixサーバにて、Agent 2からMQTTデータ取得

Zabbixサーバ側で、Agent 2からMQTTのデータを取得できるよう設定します。

ホスト、アイテムの登録

先ほどAgent 2を導入したサーバを監視対象として登録します。

まずホスト設定です。

Agent 2 ホスト登録
Agent 2 ホスト登録

  • Host Nameは、Agent 2側のzabbix_agent2.confのHostnameで指定した文字列と同じものを指定します。この文字列が一致していないと、データを取得できません。
  • Groupsの内容は任意です。
  • Interfacesは"Agent"としてAgent 2をインストールしたサーバのFQDNIPアドレスを指定します。

次にアイテム設定です。

Agent 2 アイテム登録
Agent 2 アイテム登録

  • Nameの内容は任意です。
  • Typeは、"Zabbix agent (active)"を指定します。MQTT Pluginによる監視はActive Check用アイテムの指定が必須です。
    • Active Check用アイテムの詳細は、Zabbixマニュアルに記載されています。
    • Active Check用アイテムは、Zabbixサーバで指定した監視内容に沿って、Agent側からデータ送信するものです。なお、MQTT Pluginによる監視の場合は、Agent 2が定期的(RefreshActiveChecks)にデータ送信するのではなく、MQTTブローカーからデータを受け取った際に、都度Zabbixサーバにデータを送信するようです。
  • Keyは、取得したいMQTTのトピック等を指定します。
    • 基本的な書式:mqtt.get[tcp://(MQTTブローカーのFQDNやIPアドレス):1883,"(トピック名)"]
    • Agent 2が動作するサーバから、MQTTブローカーに対して指定のトピックをSubscribeするよう指示します。1883はMQTTの標準的なポート番号です。
    • mqtt.getキーの詳細は、Zabbixマニュアルに記載されています。ワイルドカード指定や認証、TLS等についての説明があります。
  • Type of Informationは、取得するデータの型に合わせて指定します。

以上の設定により、Zabbixサーバ側で、Agent 2からMQTTのデータを取得できるようになりました。
あとは他のデータと同じようにZabbixサーバ側で監視やグラフ化などが可能ですが、MQTT固有の手順は不要なので本記事では省略します。

参考として、Zabbixでの監視データの加工についてこちらの記事にまとめてあります。MQTT経由で受信したデータに対し、計算やJSONデータのパースなどが必要な場合に使える設定例です。

参考URL等