fluent-plugin-redis-slowlogを作った

fluent-plugin-redis-slowlogを作った。

以前からプラグインつくってみたいなーと思っていたけどアイデアとか無かった。
すると、会社でRedisのSlowlog集めたいな−って話が出て、Fluentdのプラグインとか存在してるだろうからそれ使えば楽じゃね?と思ったらプラグイン見つからなかった…。
なので作ってみた。

始めてFluentdのプラグインをつくるので以下を参考にさせていただいた
kenjiskywalkerさんにおんぶにだっこ状態ですが…
超初級!Fluentdのプラグインを書きたくなった時の下地づくり - さよならインターネット
kenjiskywalker/fluent-plugin-rds-slowlog · GitHub

fluent-plugin-redis-slowlogの使い方
fluent.confのinputプラグインとして利用します。

<source>
  type redis_slowlog  
  host localhost         # Redis-serverのホスト名又はIP
  port 6379              # Redis-serverのPort番号 (デフォルトは6379)
  interval 10            # Slowlogを取得に行くタイミング(デフォルト10秒に1回)
  logsize  128           # 一度に取得するSlowlogの数 (デフォルト128)※Redisの初期設定だとSlowlogが128個までしか保存されない。
                         # また、数が多くなるほど取得にかかる時間も増えるのでRedisの負荷等見て調整してください
  tag redis.slowlog      # タグ名
</source>

<match ** >
  type stdout
</match>

出力はコチラ
※どんなcommandでもSlowlogに登録されるようにRedis側にconfig set slowlog-log-slower-than 1を実行しています。なので、fluent-plugin-redis-slowlogから実行しているSlowlog取得のコマンドも出力されてます。

2014-06-08 05:33:31 +0900 redis.slowlog: {"id":173,"timestamp":1402173257,"exec_time":15,"command":["keys","*"]}
2014-06-08 05:33:31 +0900 redis.slowlog: {"id":172,"timestamp":1402173253,"exec_time":137,"command":["slowlog","get","128"]}
2014-06-08 05:33:41 +0900 redis.slowlog: {"id":174,"timestamp":1402173263,"exec_time":140,"command":["slowlog","get","128"]}
2014-06-08 05:33:51 +0900 redis.slowlog: {"id":176,"timestamp":1402173275,"exec_time":9,"command":["set","hoge","aga"]}
2014-06-08 05:33:51 +0900 redis.slowlog: {"id":175,"timestamp":1402173273,"exec_time":137,"command":["slowlog","get","128"]}
2014-06-08 05:34:01 +0900 redis.slowlog: {"id":177,"timestamp":1402173283,"exec_time":166,"command":["slowlog","get","128"]}

Format"id":slowlog-id,"timestamp": Redisでcommandが発行された時間(unixtime),"exec_time":コマンドの処理にかかった時間(マイクロ秒),"command":["実際に発行されたコマンド","と","引数"]}
尚このプラグイン毎回logsize分のSlowlogを取得しに行き、取得したSlowlogは削除していません。
なので毎回取得する度に同じSlowlogを取得している場合が普通に考えられます。
しかしそのままでは無意味なので、RedisのSlowlogに付与されているidを利用しています。
取得の度に前回に取得したslowlogのidの最大値を取り出しておき、その最大値より大きなidを持つものだけemitしています。

また、今度追加する予定ですが、このプラグイン再起動するとSlowlogのid情報が無くなってしまうので以前取り出したslowlogを取得してしまいます。 id情報をファイルに出力しておいて再起動時にはそのファイルのidを最大値として格納するよにしないと…