tkuchikiの日記

Linux やプログラミングについて書きます。

Norikra の集計結果を直接 Zabbix に送る norikra-listener-zabbix をリリースしました

追記(2016/02/08 15:30):0.2.0 で group の記述方式を変更しましたので、
norikra-listener-zabbix 0.2.0 をリリースしました をご確認ください。

Norikra から直接 Zabbix にデータを送る norikra-listener-zabbix (rubygems) をリリースしました。

Zabbix へデータを送信するコードのほとんどは、
fujiwara/fluent-plugin-zabbix を使わせていただきました。ありがとうございます。

Installation

gem install norikra-listener-zabbix

Norikra をインストールした gem で gem install すれば自動で有効になります。

Usage

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

ZABBIX(zabbix_server, zabbix_host, preifx_item_key, [port=10051])
  • zabbix_server: localhost
  • zabbix_host: test server
  • prefix_item_key: nginx

の場合は、以下のとおりです。

ZABBIX(localhost, test server, nginx)

prefix_item_key については、アイテムキーの prefix です。
port は Zabbix Server デフォルトの 10051 を使っている場合は省略できます。

利用例

秒間のリクエスト数を HTTP ステータスコードごとに集計する場合を考えます。

SQL

ステータスコードごとに COUNT して秒間のデータにします。

SELECT
  COUNT(1, 200 <= status AND status <= 299) / 60 AS rate_2xx,
  COUNT(1, 300 <= status AND status <= 399) / 60 AS rate_3xx,
  COUNT(1, 400 <= status AND status <= 499) / 60 AS rate_4xx,
  COUNT(1, 500 <= status AND status <= 599) / 60 AS rate_5xx
FROM nginx_status.win:time_batch(1 min)

Zabbix

アイテム

prefix_item_key とSQL の列名(rate_2xx など) を . で連結したアイテムを作成します。 prefix_item_key は nginx、列名は rate_2xx, rate_3xx, rate_4xx, rate_5xx です。

作成するアイテムは以下のようになります。

  • タイプ: Zabbix トラッパー
  • キー: nginx.rate_2xx, nginx.rate_3xx, nginx.rate_4xx, nginx.rate_5xx
  • データ型: 数値 (浮動小数点)

1 つの SQL で複数のアイテムにデータを送信することができます。

グラフ

グラフは適宜作成してください。

f:id:tkuchiki:20160205011732p:plain

2xx のデータしかないのであまり良くない例ですが、
それぞれのステータスコードのリクエストが送られてくれば集計されます。

その他

Zabbix 周りのコードはほとんど fujiwara/fluent-plugin-zabbix を使わせていただきましたが、
一部変更した部分があります。
また、実装する上でハマったところがあったのでそのことに触れておきます。

Zabbix 周りの改良点

Zabbix Server にデータを送信すると、

{
  "response" => "success",
  "info" => "Processed 2 Failed 0 Total 2 Seconds spent 0.000103"
}

のようなレスポンスが返って来ます。
このとき、info の Failed が 1 以上だったり、Processed が 0 で全て Failed というケースでも response は success になります。
Processed が 0 でなければ 1 つ以上データが送れていることになるので良いのですが、
全て Failed した場合は失敗にしたほうがわかり易いと思い、 warn でログを出すようにしています
(実装している時、ログに何も出ないのにデータが送れていなくて理解するのに時間がかかりました)。
全て Failed になるケースは、以下の 2 つを確認しています。

  • Zabbix ホスト名が間違っている
  • アイテムキーが間違っている

split(",") だけだと空白が含まれる

Norikra::Listener::Zabbix.initializeargument, で split するときに、
ZABBIX(zabbix_server, zabbix_host, preifx_item_key)(わかりにくいですが , の後ろにスペースがあります)と書いて、
zabbix host とアイテムキーにスペースが含まれて正常に動作しない問題で1時間くらい嵌まりました...
そこで、スペースを気にしなくても良いように split したあとに strip しています。

def self.parse_argument(args)
  args.split(",").map(&:strip)
end

Listener Plugin を書く方は、この処理をしておくと変なところで嵌らなくて良いのでおすすめです。

まとめ

Norikra Listener Plugin の norikra-listener-zabbix をリリースしました。
是非お使いください!