oranie's blog

旧:iをgに変えると・・・なんだっけ・・・

#fluentd RubyでApache→fluentd→mongodbに入れたデータをカウントする方法のメモ

設定とかはこの辺読んでね。

http://d.hatena.ne.jp/oranie/20120417/1334662934

タイトルそのまま

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とかでもう少し複雑な値を取得してグラフ作れる。


以上、メモでした。