Skip to content

Commit

Permalink
Added mongo mapper support
Browse files Browse the repository at this point in the history
  • Loading branch information
derailed committed Nov 19, 2009
1 parent d11bc54 commit 6f9d0e3
Show file tree
Hide file tree
Showing 15 changed files with 334 additions and 252 deletions.
5 changes: 4 additions & 1 deletion Rakefile
Expand Up @@ -22,8 +22,11 @@ PROJ.version = Rackamole::VERSION
PROJ.spec.opts << '--color' PROJ.spec.opts << '--color'
PROJ.ruby_opts = %w[-W0] PROJ.ruby_opts = %w[-W0]
PROJ.readme = 'README.rdoc' PROJ.readme = 'README.rdoc'
PROJ.rcov.opts = ["--sort", "coverage", "-T", '-x mongo']


# Dependencies # Dependencies
depend_on "logging" , ">= 1.2.2" depend_on "logging" , ">= 1.2.2"
depend_on "hitimes" , ">= 1.0.3" depend_on "hitimes" , ">= 1.0.3"
depend_on "mongodb-mongo", ">= 0.14.1" depend_on "mongo" , ">= 0.17.1"
depend_on "mongo_mapper" , ">= 0.6.1"
depend_on "darkfish-rdoc", ">= 1.1.5"
2 changes: 1 addition & 1 deletion lib/rackamole/mole.rb
@@ -1,6 +1,6 @@
require 'hitimes' require 'hitimes'
require 'mongo/util/ordered_hash'
require 'json' require 'json'
require 'mongo'


module Rack module Rack
class Mole class Mole
Expand Down
4 changes: 4 additions & 0 deletions lib/rackamole/mongo.rb
@@ -0,0 +1,4 @@
require 'mongo_mapper'
require 'activesupport'

Rackamole.require_all_libs_relative_to(__FILE__)
13 changes: 13 additions & 0 deletions lib/rackamole/mongo/feature.rb
@@ -0,0 +1,13 @@
module Rackamole::Mongo
class Feature
include MongoMapper::Document

key :controller, String, :required => false
key :action , String, :required => false
key :context , String, :required => false
key :app_name , String, :required => true
timestamps!

many :logs, :class_name => 'Rackamole::Mongo::Log'
end
end
22 changes: 22 additions & 0 deletions lib/rackamole/mongo/log.rb
@@ -0,0 +1,22 @@
module Rackamole::Mongo
class Log
include MongoMapper::Document

key :feature_id , String, :required => true
key :perf_issue , Boolean, :required => true, :default => false
key :type , String , :required => true, :default => 'Feature'
key :ip , String , :required => true
key :browser , String , :required => true
key :method , String , :required => true
key :path , String , :required => true
key :url , String , :required => true

key :user_id , Integer, :required => false, :default => -1
key :user_name , String , :required => false, :default => "Unknown"
key :session , Hash , :required => false
key :router_info, Hash , :required => false
timestamps!

belongs_to :feature, :class_name => 'Rackamole::Mongo::Feature'
end
end
1 change: 1 addition & 0 deletions lib/rackamole/store.rb
@@ -0,0 +1 @@
Rackamole.require_all_libs_relative_to(__FILE__)
121 changes: 0 additions & 121 deletions lib/rackamole/store/mongo.rb

This file was deleted.

77 changes: 77 additions & 0 deletions lib/rackamole/store/mongo_db.rb
@@ -0,0 +1,77 @@
require 'mongo'

include Mongo

# TODO !! Need to deal with auth
module Rackamole
module Store
# Mongo adapter. Stores mole info in a mongo database.
class MongoDb

def initialize( options={} )
opts = default_options.merge( options )
MongoMapper.connection = Connection.new( opts[:host], opts[:port], :logger => opts[:logger] )
MongoMapper.database = opts[:database]
end

# clear out db content ( used in testing... )
def reset!
Rackamole::Mongo::Feature.delete_all
Rackamole::Mongo::Log.delete_all
end

# Dump mole info to logger
def mole( arguments )
return if arguments.empty?
args = arguments.clone

app_name = args.delete( :app_name )

if args[:route_info]
controller = args[:route_info][:controller]
action = args[:route_info][:action]
feature = Rackamole::Mongo::Feature.find_or_create_by_app_name_and_controller_and_action( app_name, controller, action )
else
context = args[:path]
feature = Rackamole::Mongo::Feature.find_or_create_by_app_name_and_context( app_name, context )
end
log_feature( feature, args )
rescue => mole_boom
$stderr.puts "MOLE STORE CRAPPED OUT -- #{mole_boom}"
$stderr.puts mole_boom.backtrace.join( "\n " )
end

# =======================================================================
private

# Set up mongo default options ie localhost host, default mongo port and
# the database being mole_mdb
def default_options
{
:host => 'localhost',
:port => 27017,
:database => 'mole_mdb'
}
end

# Insert a new feature in the db
def log_feature( feature, args )
type = 'Feature'
type = 'Exception' if args[:stack]
type = 'Performance' if args[:performance]

attrs = {
:type => type,
:feature => feature,
:created_at => Time.now,
:updated_at => Time.now
}

args.each do |k,v|
attrs[k] = v
end
Rackamole::Mongo::Log.create!( attrs )
end
end
end
end
36 changes: 30 additions & 6 deletions spec/rackamole/mole_spec.rb
@@ -1,16 +1,16 @@
require File.join(File.dirname(__FILE__), %w[.. spec_helper]) require File.join(File.dirname(__FILE__), %w[.. spec_helper])
require 'actionpack' # require 'actionpack'


describe Rack::Mole do describe Rack::Mole do
include Rack::Test::Methods include Rack::Test::Methods


before :each do before :each do
@response = [ 200, {"Content-Type" => "text/plain"}, ["success"] ] @response = [ 200, {"Content-Type" => "text/plain"}, ["success"] ]
@test_env = { 'rack.session' => { :user_id => 100 }, 'HTTP_X_FORWARDED_FOR' => '1.1.1.1', 'HTTP_USER_AGENT' => "IBrowse" }
end end


class TestStore class TestStore
attr_accessor :mole_result attr_accessor :mole_result

def mole( args ) def mole( args )
@mole_result = args @mole_result = args
end end
Expand All @@ -24,11 +24,35 @@ def app( opts={} )
run lambda { |env| response } run lambda { |env| response }
end end
end end


def error_app( opts={} )
@app ||= Rack::Builder.new do
use Rack::Lint
use Rack::Mole, opts
run lambda { |env| raise "Oh Snap!" }
end
end

it "should mole a framwework exception correctly" do
@test_store = TestStore.new
@test_env = { 'rack.session' => { :user_id => 100 }, 'HTTP_X_FORWARDED_FOR' => '1.1.1.1', 'HTTP_USER_AGENT' => "IBrowse" }
error_app(
:app_name => "Test App",
:environment => :test,
:perf_threshold => 0.1,
:user_key => { :session_key => :user_id, :extractor => lambda{ |k| "Test user #{k}"} },
:store => @test_store )

begin
get "/", nil, @test_env
rescue
@test_store.mole_result[:stack].should have(4).items
end
end

describe 'moling a request' do describe 'moling a request' do
before :each do before :each do
@test_store = TestStore.new @test_store = TestStore.new
@test_env = { 'rack.session' => { :user_id => 100 }, 'HTTP_X_FORWARDED_FOR' => '1.1.1.1', 'HTTP_USER_AGENT' => "IBrowse" }
app( app(
:app_name => "Test App", :app_name => "Test App",
:environment => :test, :environment => :test,
Expand Down Expand Up @@ -62,7 +86,7 @@ def app( opts={} )
@test_store.mole_result[:stack].should have(4).items @test_store.mole_result[:stack].should have(4).items
end end
end end

it "should capture request parameters correctly" do it "should capture request parameters correctly" do
get "/", { :blee => 'duh' }, @test_env get "/", { :blee => 'duh' }, @test_env
@test_store.mole_result[:params].should == { :blee => "duh".to_json } @test_store.mole_result[:params].should == { :blee => "duh".to_json }
Expand Down
1 change: 0 additions & 1 deletion spec/rackamole/store/log_spec.rb
@@ -1,5 +1,4 @@
require File.join(File.dirname(__FILE__), %w[.. .. spec_helper]) require File.join(File.dirname(__FILE__), %w[.. .. spec_helper])
require 'mongo/util/ordered_hash'


describe Rackamole::Store::Log do describe Rackamole::Store::Log do
describe "#mole" do describe "#mole" do
Expand Down

0 comments on commit 6f9d0e3

Please sign in to comment.