fluent-plugin-zabbix-agentを作った

fluent-plugin-zabbix-agentというfluentdのプラグインを作りました。

github.com

zabbixのpassive checkを使って、zabbix-agentから、各種メトリクスをfluentdに流すInputプラグインです。

使い方

以下のような設定ファイルを書くと、指定したitemをzabbix-agentから取得します。

<source>
  type zabbix_agent
  tag zabbix.item
  interval 60
  extra {"hostname", "my-host"}
  items {
    "system.cpu.load[all,avg1]": "load_avg1",
    "system.cpu.load[all,avg5]": null
  }
</source>
2015-01-02 12:30:40 +0000 zabbix.item: {"key":"load_avg1","value":0.0,"hostname":"my-host"}
2015-01-02 12:30:40 +0000 zabbix.item: {"key":"system.cpu.load[all,avg5]","value":0.01,"hostname":"my-host"}

itamsの指定はhashで、キーがzabbixのitem名、値がfluentdのレコードに書くときのキーです(nullの場合、item名をそのまま使う)。 itemsを外部のJSONファイルから読み込むとか、複数itemを一つのレコードにまとめるとかもできます。

ユースケース

ひとつはzabbixのitemをzabbixサーバだけではなくて、DataDogとかGrowthForecastにも流したい場合などです。 それらを併用している環境がどのくらいあるか分からないんですが…。

もうひとつは、zabbix-agentは使いたいけどzabbix-serverは使いたくないような場合です。

とある環境でメトリクス収集をfluentdでやろうとしてまして、fluent-plugin-dstatを導入しようとしてみたのですが、メトリクスの「収集」部分に関してはかなり手間な感じでした。fluentdのcron的pluginとかcronそのものでがんばるとかも考えたのですが、zabbix-agentに収集させるのが結構楽そうだったので、今回作った次第です。

TIME_WAIT問題

今のところ、ひとつ問題がありまして、1メトリクスの収集ごとにTCPの接続をzabbix-agentに対して行っているので、あんまりintervalを短くするとTIME_WAITが一杯になります。

zabbixのドキュメントやソースコードで、1セッションで複数のメトリクスを取得する方法や、つなぎっぱなしのコネクションを使い回す方法を探したのですが、現状では対応していないように見えました(active check使えってことですかね)。 個人的には60sぐらいならそれほど問題にならないかと考えています。


というわけで、どうぞご利用ください。