norikra-listener-mackerel で Norikra のクエリ結果を直接 Mackerel に投げる

Norikra でクエリした結果を Mackerel に投げたい場合、これまでは fluent-plugin-norikra で取得して fluent-plugin-mackerel で送信する、という作りにしていたと思います。

Norikra 1.2以降では Listener plugin が使えるようになったので、クエリ結果を直接 Norikra 上で扱うことが可能になりました。

ということで、norikra-listener-mackerel (rubygems) を書きました。Norikra 単体で、クエリ結果を Mackerel のサービスメトリクスとして送信できます。

使い方

$ gem install norikra-listener-mackerel

norikra が動作する ruby でインストールすれば、norikra start 時に自動的に読み込まれます。

クエリを通常と同じように書き、group を MACKEREL(service_name,api_key) として登録します。

  • Mackerel のサービス名: nginx
  • metricsのprefix: status
  • API Key: bpzpdhjzmTnkp+ZkE3bFX2EcoWG+N1wqy2x5wVdAr7o=

の場合は以下のようになります。

MACKEREL(nginx.status,bpzpdhjzmTnkp+ZkE3bFX2EcoWG+N1wqy2x5wVdAr7o=)

API keyが未指定の場合は環境変数 MACKEREL_APIKEY から読むようになっています。

たとえば「アクセスログからステータスコードを1分ごとにカウントして、秒間のリクエスト数として送信する」というよくあるユースケースだとこんな感じですね。

SELECT
  COUNT(1, 200 <= status AND status <= 299) / 60.0 AS rate_2xx,
  COUNT(1, 300 <= status AND status <= 399) / 60.0 AS rate_3xx,
  COUNT(1, 400 <= status AND status <= 499) / 60.0 AS rate_4xx,
  COUNT(1, 500 <= status AND status <= 599) / 60.0 AS rate_5xx
FROM nginx_access.win:time_batch(1 min)
-- group: MACKEREL(nginx.status,bpzpdhjzmTnkp+ZkE3bFX2EcoWG+N1wqy2x5wVdAr7o=)

これで Norikra に fluentd からログを流し込んでやれば、Mackerel に自動的にサービスメトリクスが定義されてグラフができあがります。(サービスの定義だけは事前にしておく必要がありますが)

f:id:sfujiwara:20151109100328p:plain

Norikra から値を取得して送信する fluentd が不要になるので、よりお手軽になりますね。

どうぞご利用ください。