以下記事にて、ZabbixとGrafanaを組み合わせて、グラフィカルなダッシュボードを描写する方法をご紹介しました。
しかし、上記記事の構成でGrafanaからグラフ描写すると、若干ですが描写に時間がかかっている気がしてストレスを感じました。そこで今回は、ZabbixとGrafanaの間に監視情報と相性のよい時系列データベース「InfluxDB」を構築し、Grafanaからの監視情報要求先をInfluxDBが受け持つことで、Grafanaのグラフ描写を高速化したいと思います。
Grafanaは標準でInfluxDBとの情報連携に対応していますが、ZabbixとInfluxDBとの情報連携には、「influxdb-zabbix」というオープンソフトウェアを利用します。
では早速、構築を始めてみましょう。
前提
Zabbix及びGrafanaは既に構築済とします。
influxdb-zabbixの制約として、現(2017年5月)時点ではPostgreSQL版のZabbixのみ対応しています。
構築
以降はroot権限での操作を想定し、SELinuxは無効化にしています。
InfluxDB構築
InfluxDBのインストール及び初期設定を実施します。
今回、構築するバージョンは 1.2.2 となります。
# wget https://dl.influxdata.com/influxdb/releases/influxdb-1.2.2.x86_64.rpm # sudo yum localinstall influxdb-1.2.2.x86_64.rpm # systemctl start influxdb
監視情報を格納するデータベースを作成します。
# influx -precision rfc3339 Connected to https://localhost:8086 version 1.2.2 InfluxDB shell version: 1.2.2 > CREATE DATABASE [データベース名] > SHOW DATABASES name: databases name ---- _internal [データベース名]
InfluxDBではデータベースごとにRetention Policyという機能を用いてデータに期限を持たせ、 期限が切れたデータを自動的に削減することが可能です。要件などにより保存期間が決定している場合に便利です。デフォルトでは無期限となっています。
以下例では保存期間を1年間に設定しています。
> SHOW RETENTION POLICIES ON [データベース名] name duration shardGroupDuration replicaN default ---- -------- ------------------ -------- ------- autogen 0s 168h0m0s 1 true > CREATE RETENTION POLICY [ポリシー名] ON [データベース名] DURATION 365d REPLICATION 1 DEFAULT > SHOW RETENTION POLICIES ON [データベース名] name duration shardGroupDuration replicaN default ---- -------- ------------------ -------- ------- autogen 0s 168h0m0s 1 false [ポリシー名] 8760h0m0s 168h0m0s 1 true
Grafana用の連携ユーザを作成します。
> CREATE USER [ユーザ名] WITH PASSWORD '[パスワード]' WITH ALL PRIVILEGES > GRANT ALL PRIVILEGES TO grafana > SHOW USERS user admin ---- ----- [ユーザ名] true > exit
Go言語環境構築
influxdb-zabbixはGo言語で開発されているため、Go言語が動作する環境を構築します。
# wget https://storage.googleapis.com/golang/go1.8.1.linux-amd64.tar.gz # tar -C /usr/local -xzf go1.8.1.linux-amd64.tar.gz
Go言語ツールを利用するための各環境変数を登録します。
また、ワークスペースとして環境変数GOPATHに /opt/go を登録します。
# echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile # echo "export GOPATH=/opt/go" >> /etc/profile # export PATH=$PATH:/usr/local/go/bin # export GOPATH=/opt/go
PostgreSQL設定
PostgreSQLのZabbix用データベースに、influxdb-zabbix用の連携ユーザと権限を追加します。
# sudo -u postgres psql -d [データベース名] # CREATE USER [ユーザ名] WITH PASSWORD '[パスワード]'; # GRANT USAGE ON SCHEMA public TO [ユーザ名]; # GRANT SELECT ON public.history, public.history_uint TO [ユーザ名]; # GRANT SELECT ON public.trends, public.trends_uint TO [ユーザ名]; # GRANT SELECT ON public.applications, public.groups, public.hosts, public.hosts_groups TO [ユーザ名]; # GRANT SELECT ON public.items, public.items_applications TO [ユーザ名]; # \q
influxdb-zabbix構築
influxdb-zabbixをダウンロードし、初期設定を実施します。
ユーザ名やパスワード、データベース名はPostgreSQL設定でした値を入力します。
# go get github.com/zensqlmonitor/influxdb-zabbix # cp -p /opt/go/src/github.com/zensqlmonitor/influxdb-zabbix/influxdb-zabbix.conf /opt/go/bin/ # vi /opt/go/bin/influxdb-zabbix.conf address="host=localhost user=[ユーザ名] password=[パスワード] sslmode=disable database=[データベース名]" filename="influxdb-zabbix.log" modes="file"
サービスファイルを作成し、influxdb-zabbixを起動します。
# vi /usr/lib/systemd/system/influxdb-zabbix.service [Unit] Description=The Influxdb-zabbix Server After=syslog.target network.target postgresql.service influxdb.service [Service] Type=simple WorkingDirectory=/opt/go/bin ExecStart=/opt/go/bin/influxdb-zabbix ExecStop=/bin/kill ${MAINPID} KillSignal=SIGCONT [Install] WantedBy=multi-user.target # systemctl daemon-reload # systemctl start influxdb-zabbix # cat /opt/go/bin/influxdb-zabbix.log
ログを確認し、エラーが出力されていないことを確認します。
InfluxDBとZabbixの連携確認
Zabbixの監視アイテムがInfluxDBに格納されていることを確認します。
※Zabbix側で監視アイテムを追加した場合、自動的にInfluxDBにも登録されます。
# influx -precision rfc3339 Connected to https://localhost:8086 version 1.2.2 InfluxDB shell version: 1.2.2 > USE [データベース名] > SHOW MEASUREMENTS name: measurements name ---- Agent ping Available memory CPU idle time ~中略~ Zabbix value cache hits Zabbix value cache misses Zabbix value cache operating mode > \q
Grafanaとの連携
WebブラウザからGrafanaのWebUIにアクセスし、InfluxDBを情報取得先として登録します。
・Name:Influxdb (任意)
・Type:Influxdb
■Http settings
・Url:https://localhost:8086
・Access:proxy
■Zabbix API details
・Username:[ユーザ名] (Grafana連携用ユーザ)
・Password:*******
・Trends:Enable
ダッシュボードには以下例のように登録します。
select文で書く場合は、以下例の様に入力します。
SELECT "value" FROM "Available memory" WHERE "host_name" = 'Zabbix server' AND $timeFilter
上記を組み合わせることで以下の様な画面を作成できます。
最後に
今回はInfluxDBを利用して、Grafanaのグラフ描写を高速化する方法をご紹介しました。
感覚的にみてもGrafanaのグラフ表示が非常に高速化していると実感できました。やはり時系列データベースそのものが監視情報の形式に適しているためだと思われます。また、Grafanaからの監視情報要求先をInfluxDBが受け持つことで、Zabbixにかかる負荷も軽減していると考えられます。そういう意味でも十分に導入するメリットは十分あると思いますので、導入を検討してみては如何でしょうか。
サイオステクノロジー株式会社 山田