Amazon API認証リバースプロキシ: MongoDBのCappedでロギング
2011-10-07
今日もAmazon API認証リバースプロキシに手を入れる。 主な修正点はこれ。
- プロキシのアクセス状況を集計・表示するようにした
今後の運用を考えると、リバースプロキシにどこからどれくらいアクセスがあるのかを把握しておきたい。 普通はログを解析するところなんだけど、Herokuの無料プランだとほとんどログを残せない。 前の日記に書いたように、アクセスログは Loggly というサービスに保存しているけど、これも過去24時間分だけ。 なので、DBにログを保存することにした。
MongoDBにはcappedという機能があって、ログを保存するのに適している。
cappedコレクションとは、固定されたサイズのコレクションで、とてもパフォーマンスのいいauto-LRU age-out機能を持っています(age outは挿入順を基本としたものです)。
挿入順に取り出せることと、古いログは自動的に消されていくということがポイント。 インデックスを貼らないので、高速に挿入できる。
cappedコレクションは、コレクションを作成するときに指定する。 Mongoidからは指定できないので、MongoDB(をホスティングしているMongoHQ)にて直接設定する。 以下は、MongoHQの画面。Capped Collection? にチェックを入れて、最大サイズを指定する。
使い方は普通のコレクションと同じ。 Mongoid::Documentをincludeしたモデルを作っておく。
class Log
include Mongoid::Document
field :atag, type: String
field :locale, type: String
field :created_at, type: DateTime
field :success, type: Boolean
field :response, type: Float
belongs_to :proxy
end
あとは、ログを記録したいタイミングで普通にオブジェクトを生成するだけ。
Log.create(
atag: params['AssociateTag'],
locale: locale,
created_at: Time.now,
response: Time.now - start_time,
proxy: proxy,
success: true)
ログの取得も普通と変わらない。
# 全件取得
@logs = Log.all
# 先頭の100件(古い順)を取得
@logs = Log.limit(100)
# 新しい順に並び替えて100件を取得
@logs = Log.desc('$natural').limit(100)
次はログのPaginate表示かな。