«前の日記(2011-10-02 (日)) 最新 次の日記(2011-10-10 (月))»  

まちゅダイアリー


2011-10-07 (金)

Amazon API認証リバースプロキシ: MongoDBのCappedでロギング

今日もAmazon API認証リバースプロキシに手を入れる。 主な修正点はこれ。

今後の運用を考えると、リバースプロキシにどこからどれくらいアクセスがあるのかを把握しておきたい。 普通はログを解析するところなんだけど、Herokuの無料プランだとほとんどログを残せない。 前の日記に書いたように、アクセスログは Loggly というサービスに保存しているけど、これも過去24時間分だけ。 なので、DBにログを保存することにした。

MongoDBにはcappedという機能があって、ログを保存するのに適している。

cappedコレクションとは、固定されたサイズのコレクションで、とてもパフォーマンスのいいauto-LRU age-out機能を持っています(age outは挿入順を基本としたものです)。

挿入順に取り出せることと、古いログは自動的に消されていくということがポイント。 インデックスを貼らないので、高速に挿入できる。

cappedコレクションは、コレクションを作成するときに指定する。 Mongoidからは指定できないので、MongoDB(をホスティングしているMongoHQ)にて直接設定する。 以下は、MongoHQの画面。Capped Collection? にチェックを入れて、最大サイズを指定する。

mongodb - 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表示かな。