Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

ZabbixのデータをElasticsearch+Kibanaで可視化してみた

こんにちは。インフラよりのエンジニアtoshikiです。
本記事はZabbix Advent Calendar 2018の23日目です。

はじめに

2018年10月にZabbix 4.0がリリースされました。
試してみたいことはいろいろとありますが、今回はZabbix 4.0でHistoryデータを、時系列データの扱いが得意なElasticsearchに保存することを試してみました。

バックエンドとしてElasticsearchを利用可能となれば、大量データでもスケールするElasticsearchのメリットを活かすことができそうです。
そして、Kibanaを利用して表現力があるグラフを簡単に作れるかもしれません(?)

なお、この機能は3.4から組み込まれていますが、

Elasticsearch support is experimental!  (3 Elasticsearch setup [Zabbix Documentation 4.0])

とのことで、現在の4.0でも実験中の機能になります。

概要

内容としては、以下の流れで説明します。

  1. Zabbixの設定
  2. Elasticsearchのマッピング定義
  3. Elasticsearchにデータ投入されたことを確認
  4. まとめ

構成として、以下に示す3台のサーバ(CentOS 7.6)を使用しました。
Zabbix, Elasticsearch(データストア), Kibana(可視化サーバ)はそれぞれ各サーバにインストールしてあります。
(Elasticsearch、Kibanaのインストールは各サイト(ElasticsearchKibana)を参照ください。)
また、Zabbix agentも各サーバにインストールしています。

種類 Hostname IP Address
Zabbix Server(MariaDB) zabbix 172.16.10.141/24
Elasticsearch elastic01 172.16.10.151/24
Kibana kibana01 172.16.10.150/24

f:id:acro-engineer:20181223214900p:plain:w500
ノード構成

Zabbixの設定

ZabbixのHistoryデータがElasticsearchに保存されるようにします。
設定については以下のページを参照しました。
https://www.zabbix.com/documentation/4.0/manual/appendix/install/elastic_search_setup

具体的には/etc/zabbix/zabbix_server.confに以下を設定します。

### Option: HistoryStorageURL
HistoryStorageURL=http://172.16.10.151:9200

### Option: HistoryStorageTypes
HistoryStorageTypes=uint,dbl,str,log,text

次にZabbixのWeb画面設定として、/etc/zabbix/web/zabbix.conf.phpファイルに以下を記述します。

// Elasticsearch url (can be string if same url is used for all types).
$HISTORY['url']   = [
        'uint' => 'http://172.16.10.151:9200',
        'dbl' => 'http://172.16.10.151:9200',
        'str' => 'http://172.16.10.151:9200',
        'log' => 'http://172.16.10.151:9200',
        'text' => 'http://172.16.10.151:9200'
];
// Value types stored in Elasticsearch.
$HISTORY['types'] = ['uint', 'dbl', 'str', 'log', 'text'];

Elasticsearchのマッピング定義

Elasticsearchにはマッピング定義(データベースのスキーマ定義に相当)を行います。

マッピング定義の内容を確認するため、以下からソースコードを取得します。
https://www.zabbix.com/download_sources

取得したソースコードのファイル(zabbix-4.0.3.tar.gz)を展開すると以下にマッピング定義が書かれたファイルがあります。
zabbix-4.0.3/database/elasticsearch/elasticsearch.map

こちらのマッピング定義の内容を参照し、KibanaのDev Toolsを利用してマッピング定義を行いました。
(以下を実行しています。)

PUT uint
{"settings":{"index":{"number_of_replicas":0,"number_of_shards":1}},"mappings":{"values":{"properties":{"itemid":{"type":"long"},"clock":{"format":"epoch_second","type":"date"},"value":{"type":"long"}}}}}

PUT dbl
{"settings":{"index":{"number_of_replicas":0,"number_of_shards":1}},"mappings":{"values":{"properties":{"itemid":{"type":"long"},"clock":{"format":"epoch_second","type":"date"},"value":{"type":"double"}}}}}

PUT str
{"settings":{"index":{"number_of_replicas":0,"number_of_shards":1}},"mappings":{"values":{"properties":{"itemid":{"type":"long"},"clock":{"format":"epoch_second","type":"date"},"value":{"fields":{"analyzed":{"index":true,"type":"text","analyzer":"standard"}},"index":false,"type":"text"}}}}}

PUT text
{"settings":{"index":{"number_of_replicas":0,"number_of_shards":1}},"mappings":{"values":{"properties":{"itemid":{"type":"long"},"clock":{"format":"epoch_second","type":"date"},"value":{"fields":{"analyzed":{"index":true,"type":"text","analyzer":"standard"}},"index":false,"type":"text"}}}}}

PUT log
{"settings":{"index":{"number_of_replicas":0,"number_of_shards":1}},"mappings":{"values":{"properties":{"itemid":{"type":"long"},"clock":{"format":"epoch_second","type":"date"},"value":{"fields":{"analyzed":{"index":true,"type":"text","analyzer":"standard"}},"index":false,"type":"text"}}}}}

Elasticsearchにデータ投入されたことを確認

上記の設定後、Zabbixを再起動し、各サーバのZabbix agentをHost登録しました。
しばらくしたのち確認すると、Zabbix側では、CPUのグラフが以下のように参照できます。

f:id:acro-engineer:20181223184146p:plain:w740
CPUグラフ

ダッシュボードは以下のようにしてみました。

f:id:acro-engineer:20181223184242p:plain:w740
Zabbixダッシュボード
Zabbix 4.0でダッシュボードがよりカッコよくなりましたよね。

また、Elasticsearch側でも各Index(uint,dbl,str,log)にデータ(ドキュメント)が入っていることをElasticsearchのcat APIsを利用して確認できます。(#Elasticsearch の cat APIs にまじめに入門する話 - Taste of Tech Topics
※textのIndexは対応する監視アイテムがなかったため、docs.countが0になっています。

f:id:acro-engineer:20181223184208p:plain:w760
ElasticsearchのIndex


Kibanaは簡単にグラフを作成できるため、Zabbixのデータ保存数等をグラフ化してみました。

f:id:acro-engineer:20181223184304p:plain:w740
Zabbixデータのカウント

KIbanaはグラフを簡単に作成できますが、当然ながらZabbixのデータはKibanaでグラフを作成するためのデータ構造にはなっていません。
たとえば、上記グラフでは"dbl"インデックスに保存されたNumeric (float)型のデータ件数をカウントするぐらいはできますが、各データ(ドキュメント)にはホスト情報はなく、アイテムIDが格納されいます。
このため、現状では各ホスト毎や、意図した監視アイテムを簡単に選択してグラフ化するのは難しいですね^^;

まとめ

experimental扱いの機能ですが、ZabbixのバックエンドとしてElasticsearchを利用する設定について試してみました。
対象としてはHistoryデータだけですが、Elasticsearchにデータが保存され、Zabbixの画面でグラフを参照できることを確認できました。
いずれ監視対象が多く、大量データを保持するようなケースがあった場合に、Elasticsearchが一つの選択肢になるかもしれませんね。

追加で、上記で試したのは、各データタイプごとに1つのIndexを作成していますが、Zabbix 4.0では日付でIndexを分ける対応が追加されています。(HistoryStorageDateIndexパラメータを有効に設定)

また、Elasticsearchは、ZabbixによるHousekeeperの対象外となっています。
運用で利用するには、まだ機能的な対応が必要ではありますが、Zabbixの進化を期待している私としては、今後どのように開発が進むのか楽しみなところです。

それでは。

Acroquest Technologyでは、キャリア採用を行っています。

  • ディープラーニング等を使った自然言語/画像/音声/動画解析の研究開発
  • Elasticsearch等を使ったデータ収集/分析/可視化
  • マイクロサービス、DevOps、最新のOSSを利用する開発プロジェクト
  • 書籍・雑誌等の執筆や、社内外での技術の発信・共有によるエンジニアとしての成長

少しでも上記に興味を持たれた方は、是非以下のページをご覧ください。
顧客のビジネスをインフラから加速するエンジニア募集! - Acroquest Technology株式会社のインフラエンジニア中途・インターンシップ・契約・委託の求人 - Wantedlywww.wantedly.com