#fluentd RubyでApache→fluentd→mongodbに入れたデータをカウントする方法のメモ
設定とかはこの辺読んでね。
タイトルそのまま
fluentd入れてちょっとした判定を行なってデータ数とかをカウントしたり積算するにはfluentd-plugin-datacounterだけでは厳しいので、とりあえずMongoDBにぶち込んで簡単なスクリプトをCactiから呼び出して、カウントさせようと考えた。以下はMongoDBのチュートリアル
http://api.mongodb.org/ruby/current/file.TUTORIAL.html
の内、範囲指定で検索する所だけをやってみて、出来たのでメモ。
こんな感じ。
MongoDBには以下の様なデータがDB:apache、コレクション:accessに入っているとお考え下さい。
{ "_id" : ObjectId("4f951dc226e3fa0ba2000004"), "XFF-host" : "-", "host" : "192.168.1.2", "user" : "-", "TIME" : "23/Apr/2012:18:16:41 +0900", "method" : "HEAD", "path" : "/", "status" : "200", "size" : "-", "referer" : "-", "agent" : "-", "response_time" : "166", "time" : ISODate("2012-04-23T09:16:42Z") } { "_id" : ObjectId("4f951dc226e3fa0ba2000005"), "XFF-host" : "-", "host" : "192.168.1.2", "user" : "-", "TIME" : "23/Apr/2012:18:16:46 +0900", "method" : "HEAD", "path" : "/", "status" : "200", "size" : "-", "referer" : "-", "agent" : "-", "response_time" : "240", "time" : ISODate("2012-04-23T09:16:47Z") }
で、TIMEプロパティの範囲指定をして検索するコードが以下の通り。
#!/usr/lib64/fluent/ruby/bin/ruby require 'mongo' m = Mongo::Connection.new('localhost', 27017) db = m.db('apache') puts "all data" puts db['access'].count puts "SAME 24/Apr/2012:12:16:41 +0900' data count" puts db['access'].find({:TIME => '23/Apr/2012:18:16:41 +0900'}).count puts "OVER 24/Apr/2012:12:16:41 +0900 data count" puts db['access'].find({:TIME => {"$gt" => '24/Apr/2012:12:16:41 +0900'}}).count puts "OVER 24/Apr/2012:12:16:41 +0900 AND UNDER 24/Apr/2012:17:16:41 +0900 data count" puts db['access'].find({:TIME => {"$gt" => '24/Apr/2012:12:16:41 +0900' , "$lte" => '24/Apr/2012:17:16:41 +0900' }}).count
実行結果はこんな感じ。
all data 18504 SAME 24/Apr/2012:12:16:41 +0900' data count 1 OVER 24/Apr/2012:12:16:41 +0900 data count 4247 OVER 24/Apr/2012:12:16:41 +0900 AND UNDER 24/Apr/2012:17:16:41 +0900 data count 3601
多分合っているはず。とりあえずこれでCactiとかでもう少し複雑な値を取得してグラフ作れる。
以上、メモでした。