rackamole 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY CHANGED
@@ -5,4 +5,9 @@
5
5
  * Updated mongo store strategy
6
6
  * Tossed out mongo mapper. Trying to stay closer to the metal
7
7
  * Shortened col names for saving space. Unfortunately lame but necessary
8
- * Moved user info into separate collection.
8
+ * Moved user info into separate collection.
9
+
10
+ 0.2.0
11
+ * YAML options - You can now load the rack component from a yaml file. This is
12
+ very handy in framework where Rackamole options varies depending on the environment.
13
+ Please refer to spec/test_configs/rackamole_test.yml for an example
data/README.rdoc CHANGED
@@ -1,4 +1,5 @@
1
1
  == RackAMole
2
+
2
3
  Observe your web applications in the wild!
3
4
 
4
5
  == DESCRIPTION:
@@ -37,6 +38,9 @@ interactions and leverage these findings for the next iteration of your applicat
37
38
  * Logging
38
39
  * Hitimes
39
40
  * MongoDb + mongo ruby adapter
41
+ * Twitter4r
42
+ * Chronic
43
+ * Actionmailer
40
44
 
41
45
  == INSTALL:
42
46
 
@@ -77,6 +81,12 @@ interactions and leverage these findings for the next iteration of your applicat
77
81
  This assumes that you have session enabled to identify a user if not the mole will log the user
78
82
  as 'Unknown'
79
83
 
84
+ === Notables
85
+
86
+ Rackamole also comes with an option to specify a yaml config file to initialize the various settings.
87
+ This comes in very handy when you need to specify different options depending on the environment you
88
+ are operating in. Please see the spec/test_configs/rackamole_test.yml for an example.
89
+
80
90
  === Storing moled information
81
91
 
82
92
  Rackamole currently comes with a single storage strategy. More will come in the near future, but
@@ -93,6 +103,10 @@ interactions and leverage these findings for the next iteration of your applicat
93
103
  This expect a local mongo instance to be running on the default port. You can change the
94
104
  location by adding :host and :port options.
95
105
 
106
+ NOTE: If you intend to use Wackamole please use the following mongo database naming convention
107
+
108
+ mole_{app_name}_{environment}_mdb
109
+
96
110
  == LICENSE:
97
111
 
98
112
  (The MIT License)
@@ -1,8 +1,8 @@
1
1
  require 'hitimes'
2
2
  require 'json'
3
3
  require 'mongo'
4
+ require 'yaml'
4
5
 
5
- # BOZO !! - Need args validator or use dsl as the args are out of control...
6
6
  module Rack
7
7
  class Mole
8
8
 
@@ -16,6 +16,11 @@ module Rack
16
16
  #
17
17
  # === Options
18
18
  #
19
+ # :config_file :: This option will load rackamole options from a file versus individual options.
20
+ # You can leverage yaml and erb with the current rackamole context to specify each of
21
+ # the following options but within a yaml file. This gives more flexibility to customize
22
+ # the rack component for specific environment. You can specify the :environment option or
23
+ # the default will be development.
19
24
  # :app_name :: The name of the application (Default: Moled App)
20
25
  # :log_level :: Rackamole logger level. (Default: info )
21
26
  # :environment :: The environment for the application ie :environment => RAILS_ENV
@@ -92,7 +97,16 @@ module Rack
92
97
 
93
98
  # Load up configuration options
94
99
  def init_options( opts )
95
- @options = default_options.merge( opts )
100
+ if opts[:config_file] && (env = opts[:environment] || "development")
101
+ raise "Unable to find rackamole config file #{opts[:config_file]}" unless ::File.exists?( opts[:config_file] )
102
+ begin
103
+ opts = YAML.load( ERB.new( IO.read( opts[:config_file] ) ).result( binding ) )[env]
104
+ opts[:environment] = env
105
+ rescue => boom
106
+ raise "Unable to parse Rackamole config file #{boom}"
107
+ end
108
+ end
109
+ @options = default_options.merge( opts )
96
110
  end
97
111
 
98
112
  # Mole default options
@@ -102,7 +116,7 @@ module Rack
102
116
  :log_level => :info,
103
117
  :expiration => 60*60, # 1 hour
104
118
  :app_name => "Moled App",
105
- :environment => 'test',
119
+ :environment => 'development',
106
120
  :excluded_paths => [/.?\.ico/, /.?\.png/],
107
121
  :perf_threshold => 10.0,
108
122
  :store => Rackamole::Store::Log.new
@@ -7,7 +7,7 @@ module Rackamole
7
7
  # Mongo adapter. Stores mole info to a mongo database.
8
8
  class MongoDb
9
9
 
10
- attr_reader :database, :logs, :features, :users #:nodoc:
10
+ attr_reader :host, :port, :db_name, :database, :logs, :features, :users #:nodoc:
11
11
 
12
12
  # Initializes the mongo db store. MongoDb can be used as a persitent store for
13
13
  # mole information. This is a preferred store for the mole as it will allow you
@@ -29,6 +29,16 @@ module Rackamole
29
29
  init_mongo( opts )
30
30
  end
31
31
 
32
+ def to_yaml( opts={} )
33
+ YAML::quick_emit( object_id, opts ) do |out|
34
+ out.map( taguri, to_yaml_style ) do |map|
35
+ map.add( :host , host )
36
+ map.add( :port , port )
37
+ map.add( :db_name , db_name )
38
+ end
39
+ end
40
+ end
41
+
32
42
  # Dump mole info to a mongo database. There are actually 2 collections
33
43
  # for mole information. Namely features and logs. The features collection hold
34
44
  # application and feature information and is referenced in the mole log. The logs
@@ -37,6 +47,10 @@ module Rackamole
37
47
  def mole( arguments )
38
48
  return if arguments.empty?
39
49
 
50
+ unless @connection
51
+ init_mongo( :host => host, :port => port, :db_name => db_name )
52
+ end
53
+
40
54
  # get a dup of the args since will mock with the original
41
55
  args = arguments.clone
42
56
 
@@ -58,8 +72,13 @@ module Rackamole
58
72
  end
59
73
 
60
74
  def init_mongo( opts )
61
- @connection = Mongo::Connection.new( opts[:host], opts[:port], :logger => opts[:logger] )
62
- @database = @connection.db( opts[:database] )
75
+ @host = opts[:host]
76
+ @port = opts[:port]
77
+ @db_name = opts[:db_name]
78
+
79
+ @connection = Mongo::Connection.new( @host, @port, :logger => opts[:logger] )
80
+ @database = @connection.db( @db_name )
81
+
63
82
  @features = database.collection( 'features' )
64
83
  @logs = database.collection( 'logs' )
65
84
  @users = database.collection( 'users' )
@@ -80,7 +99,7 @@ module Rackamole
80
99
  {
81
100
  :host => 'localhost',
82
101
  :port => Mongo::Connection::DEFAULT_PORT,
83
- :database => 'mole_mdb'
102
+ :db_name => 'mole_mdb'
84
103
  }
85
104
  end
86
105
 
@@ -133,8 +152,6 @@ module Rackamole
133
152
  # NOTE : Using min key to reduce storage needs. I know not that great for higher level api's :-(
134
153
  # also saving date and time as ints. same deal...
135
154
  def save_log( user_id, feature_id, args )
136
- puts "Saving LOG for #{feature_id} -- #{user_id}"
137
- puts caller.inspect
138
155
  now = args.delete( :created_at )
139
156
  row = {
140
157
  min_field( :type ) => args[:type],
data/lib/rackamole.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Rackamole
2
2
 
3
3
  # :stopdoc:
4
- VERSION = '0.1.1'
4
+ VERSION = '0.2.0'
5
5
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
6
6
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
7
7
  # :startdoc:
@@ -11,16 +11,18 @@ puts "mole_sinatra_#{Sinatra::Application.environment}_mdb"
11
11
  use Rack::Lint
12
12
  use Rack::Session::Cookie
13
13
  use Rack::Mole, {
14
- :app_name => "Moled Franky",
14
+ :app_name => "Franky",
15
15
  :environment => Sinatra::Application.environment,
16
16
  :log_level => :debug,
17
17
  :user_key => :user_name,
18
- # :store => Rackamole::Store::MongoDb.new( :database => "mole_sinatra_dev_mdb" ),
19
- :store => Rackamole::Store::MongoDb.new( :database => "mole_sinatra_#{Sinatra::Application.environment}_mdb" ),
18
+ :store => Rackamole::Store::MongoDb.new(
19
+ :host => 'ec2-174-129-88-130.compute-1.amazonaws.com',
20
+ :database => "mole_franky_#{Sinatra::Application.environment}_mdb" ),
21
+ # :store => Rackamole::Store::MongoDb.new( :database => "mole_franky_#{Sinatra::Application.environment}_mdb" ),
20
22
  :expiration => 10,
21
23
  :perf_threshold => 0.2,
22
- :twitter => { :username => 'moled', :password => 'fernand~1', :alert_on => [Rackamole.perf, Rackamole.fault] },
23
- :excluded_paths => [ /.+?\.css/, /.+?\.js/, /.+?\.png/ ]
24
+ # :twitter => { :username => 'moled', :password => 'fernand~1', :alert_on => [Rackamole.perf, Rackamole.fault] },
25
+ :excluded_paths => [ /.+?\.css/, /.+?\.js/, /.+?\.png/, /.+?\.ico/ ]
24
26
  }
25
27
  end
26
28
 
@@ -365,4 +365,42 @@ describe Rack::Mole do
365
365
  @rack.send( :id_browser, 'IBrowse' ).should == 'N/A'
366
366
  end
367
367
  end
368
+
369
+ # ---------------------------------------------------------------------------
370
+ describe 'YAML load' do
371
+ before :all do
372
+ @config_file = File.join( File.dirname(__FILE__), %w[.. test_configs rackamole_test.yml] )
373
+ end
374
+
375
+ it "should load the test env correctly from a yaml file" do
376
+ @rack = Rack::Mole.new( nil, :environment => 'test', :config_file => @config_file )
377
+ @rack.send( 'options' )[:moleable].should == false
378
+ end
379
+
380
+ it "should load the dev env correctly from a yaml file" do
381
+ @rack = Rack::Mole.new( nil, :environment => 'development', :config_file => @config_file )
382
+ opts = @rack.send( 'options' )
383
+ opts[:moleable].should == true
384
+ opts[:app_name].should == 'TestApp'
385
+ opts[:user_key].should == :user_name
386
+ opts[:perf_threshold].should == 2
387
+
388
+ @rack.send( :alertable?, :twitter, Rackamole.perf ).should == true
389
+ @rack.send( :alertable?, :twitter, Rackamole.fault ).should == false
390
+ @rack.send( :alertable?, :email, Rackamole.fault ).should == true
391
+ @rack.send( :alertable?, :email, Rackamole.perf ).should == false
392
+ end
393
+
394
+ it "should load the prod env correctly" do
395
+ @rack = Rack::Mole.new( nil, :environment => 'production', :config_file => @config_file )
396
+ opts = @rack.send( 'options' )
397
+ opts[:moleable].should == true
398
+ opts[:app_name].should == 'TestApp'
399
+ opts[:perf_threshold].should == 5
400
+ (opts[:store].instance_of?(Rackamole::Store::MongoDb)).should == true
401
+ opts[:store].db_name.should == "mole_fred_production"
402
+ opts[:store].port.should == 10
403
+ opts[:store].host.should == "fred"
404
+ end
405
+ end
368
406
  end
@@ -0,0 +1,42 @@
1
+ # -----------------------------------------------------------------------------
2
+ # Rackamole Test rack configuration file
3
+ # -----------------------------------------------------------------------------
4
+
5
+ # -----------------------------------------------------------------------------
6
+ # Shared configuration
7
+ defaults: &defaults
8
+ :moleable: true
9
+ :app_name: TestApp
10
+ :user_key: :user_name
11
+ :twitter:
12
+ :username: bumblebtuna
13
+ :password: secret
14
+ :alert_on:
15
+ - <%= Rackamole.perf %>
16
+ :email:
17
+ :from: Bozo@acme.com
18
+ :to:
19
+ - 'fernand@acme.com'
20
+ :alert_on:
21
+ - <%= Rackamole.fault %>
22
+
23
+ # -----------------------------------------------------------------------------
24
+ #
25
+ development:
26
+ <<: *defaults
27
+ :perf_threshold: 2
28
+
29
+ # -----------------------------------------------------------------------------
30
+ # Turn mole off in test
31
+ test:
32
+ :moleable: false
33
+
34
+ # -----------------------------------------------------------------------------
35
+ # Use mongo based store in production env
36
+ production:
37
+ <<: *defaults
38
+ :perf_threshold: 5
39
+ :store: !ruby/object:Rackamole::Store::MongoDb
40
+ host: fred
41
+ port: 10
42
+ db_name: mole_fred_production
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rackamole
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Fernand Galiana
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-12-09 00:00:00 -07:00
12
+ date: 2009-12-21 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -203,6 +203,7 @@ files:
203
203
  - spec/rackamole/store/mongo_db_spec.rb
204
204
  - spec/rackamole_spec.rb
205
205
  - spec/spec_helper.rb
206
+ - spec/test_configs/rackamole_test.yml
206
207
  - tasks/bones.rake
207
208
  - tasks/gem.rake
208
209
  - tasks/git.rake