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を最大値として格納するよにしないと…