hmx-17の日記

技術ネタとかプライベート

ZabbixのヒストリデータをリアルタイムにSplunkへMetricsとしてインポートする方法

はじめに

監視ツールとして大変便利なZabbixですが、forecast関数しかなかったり
他のログとの突き合わせに困るときはないでしょうか。
そんなときには、SplunkにZabbixのヒストリデータを入れてしまいましょう。
ただ、単に入れてもおもしろくないので今回はSplunk 7.0から導入されている Metrics を使います。
(Metrics は通常のSplunkの イベントより高速に統計が取れるそうです)

前提

以下の三つが前提となっています

  • Zabbix Serverが入っていること

v4.0以上でないとリアルタイムエクスポートが動きません。
https://www.zabbix.com/documentation/current/manual/installation/install_from_packages

  • td-agentが入ってること

v3でないと、Splunk HECプラグインのインストールに失敗します。
https://docs.fluentd.org/v1.0/articles/install-by-rpm

  • Splunkが入ってること

v7.0 以上でないと Metrics が作れません。
https://docs.splunk.com/Documentation/Splunk/7.2.6/Installation/InstallonLinux

なお、テスト環境は以下の通りです

  • CentOS 7
  • Splunk 7.2
  • Zabbix 4.2
  • td-agent v3

実作業

そんなわけで、作業をしていきます。

Zabbix Serverの設定

Zabbixの設定
/etc/zabbix/zabbix_server.conf をに以下を追記します。

ExportDir=/var/log/zabbix/
ExportFileSize=500M

追記した後restartするとExportDirの下にrealtime exportされます。
この時の注意としてはExportFileSizeは小さめにしておくのが良いと思います。
(※: ポーラー単位で1ファイル作成される仕様なので
ExportFileSize * ポーラー数 * 2 が最大容量になります
(*2 は指定ファイルサイズを超えるとリネームされるため)
参考:
4 Real-time export of events, values, trends [Zabbix Documentation 4.0]

Splunkの設定

Zabbixのヒストリ用インデックスを作ります
Splunkにログインしてメニューバーより「設定」→「インデックス」を開き、「新規インデックス」をクリックします。
f:id:hmx-17:20190505013319p:plain
インデックス名を入力し、「メトリック」を選択してインデックスを作成します。
f:id:hmx-17:20190505013322p:plain
これでインデックスができました。つぎにHEC(HTTP Event Collector)を作成します。
メニューバーより「設定」→「データ入力」を開き、HTTP イベントコレクタの「新規作成」をクリックします。
f:id:hmx-17:20190505013606p:plain
ざっくりと名前だけ入力します。
f:id:hmx-17:20190505013710p:plain
許可されたインデックスの所で、先ほど作成したインデックスを選択します。
f:id:hmx-17:20190505013744p:plain
これでSplunk側の設定は完了です。

Fluentdの設定

あらかじめ fluent-plugin-splunk-hec を入れます

# td-agent-gem install fluent-plugin-splunk-hec

設定は以下のようにします。

<source>
  @type tail
  format json
  time_key clock
  path {PATH_TO_ZABBIX}/history-*.ndjson

  pos_file /var/log/td-agent/tmp/zabbix-history.pos
  tag splunk.zabbix
 </source>

 <filter splunk.zabbix>
  @type record_transformer
  <record>
    metric_name ${record["host"]}.${record["name"]}
  </record>
 </filter>

 <match splunk.zabbix>
  @type splunk_hec
  hec_host SPLUNK_HOST
  hec_port 8088
  hec_token SPLUNK_HEC_TOKEN
  insecure_ssl true

  index zabbix
  data_type metric
  host_key host
  metric_name_key metric_name
  metric_value_key value
  <fields>
    itemid
    groups
  </fields>
 </match>

in_tailは余りひねりがありませんが、record_transformer を挟んでいます。
これを挟まずに直接流し込むと、メトリクスを見るときにアイテム名が表示されず非常にしんどい思いをします
メトリクス名についてはベストプラクティスを見るとイマイチな感じがしますが、とりあえず動いているのでよしとします。(記号も大丈夫でした)
Best practices for metrics - Splunk Documentation

insecure_ssl についてはテスト用ということで、プロダクション環境で使用することはきちんと検討してください。
(このプラグインHTTPS専用のようです)

Splunkで見る

Fluentd設定を反映したあと、サーチアプリの「メトリクス」から見れます。
あとはSPLを書いて楽しみましょう。

おわりに

とりあえず動く感じにまでは持っていけました。
SplunkはSNMP周りの実装がつらい所があるので、Zabbixと共存出来るようになったのは良いことです。