rackamole 0.3.1 → 0.3.2

Sign up to get free protection for your applications and to get access to all the features.
data/HISTORY CHANGED
@@ -49,4 +49,9 @@
49
49
  * Fixed issue with rails and params not being correctly recorded
50
50
 
51
51
  0.3.1
52
- * Bugs and cleanups
52
+ * Bugs and cleanups
53
+
54
+ 0.3.2
55
+ * Fix issue with excluded_path being nil.
56
+ * Changed default excluded_path
57
+ * Added perf_excludes option to exempt alerts from being sent for known slower requests
@@ -47,9 +47,16 @@ module Rack
47
47
  #
48
48
  # :mole_excludes :: Exclude some of the paramaters that the mole would normaly include. The list of
49
49
  # customizable paramaters is: software, ip, browser type, url, path, status, headers and body.
50
- # This options takes an array of symbols. Defaults to [:body].
50
+ # This options takes an array of symbols. Defaults to [:body].
51
+ # :perf_excludes :: Specifies a set of paths that will be excluded when a performance issue is detected.
52
+ # This is useful when certain requests are known to be slow. When a match is found an
53
+ # alert won't be issued but the context will still be moled.
54
+ # ==
55
+ # Don't send an alert when perf is found on /blee/fred. Don't alert on /duh unless the request took longer than 10 secs
56
+ # :perf_excludes => [ {:context => '/blee/fred}, {:context => /^\/duh.*/, :threshold => 10 } ]
57
+ # ==
51
58
  # :excluded_paths:: Exclude paths that you do not wish to mole by specifying an array of regular expresssions.
52
- # :param_excludes:: Exempt params from being logged to the mole. Specify an array of keys as
59
+ # :param_excludes:: Exempt certain sensitive request parameters from being logged to the mole. Specify an array of keys as
53
60
  # as symbols ie [:password, :card_number].
54
61
  # :session_excludes:: Exempt session params from being logged by the mole. Specify an array of keys as symbols
55
62
  # ie [:fred, :blee] to exclude session[:fred] and session[:blee] from being stored.
@@ -126,7 +133,7 @@ module Rack
126
133
  :log_level => :info,
127
134
  :expiration => 60*60, # 1 hour
128
135
  :environment => 'development',
129
- :excluded_paths => [/.?\.ico/, /.?\.png/],
136
+ :excluded_paths => [/.*?\/stylesheets\/.*/, /.*?\/javascripts\/.*/,/\.*?\/images\/.*/ ],
130
137
  :mole_excludes => [:body],
131
138
  :perf_threshold => 10.0,
132
139
  :store => Rackamole::Store::Log.new
@@ -199,10 +206,34 @@ module Rack
199
206
 
200
207
  # Check if we've seen this perf issue before. If so stash it
201
208
  if attrs[:type] == Rackamole.perf
209
+ # Don't send alert if exempted
210
+ return true if perf_exempt?( attrs[:path], attrs[:request_time])
202
211
  return stash.stash_perf( path, attrs[:request_time], now.utc )
203
212
  end
204
213
  end
205
214
 
215
+ # Check if request should be exempted from perf alert
216
+ def perf_exempt?( path, req_time )
217
+ return false unless option_defined?( :perf_excludes )
218
+ options[:perf_excludes].each do |hash|
219
+ context = hash[:context]
220
+ threshold = hash[:threshold]
221
+ time_trip = (threshold ? req_time <= threshold : true)
222
+
223
+ if context.is_a? String
224
+ return true if path == context and time_trip
225
+ elsif context.is_a? Regexp
226
+ return true if path.match(context) and time_trip
227
+ end
228
+ end
229
+ false
230
+ end
231
+
232
+ # Check if an option is defined
233
+ def option_defined?( key )
234
+ options.has_key?(key) and options[key]
235
+ end
236
+
206
237
  # Check if an options is set and configured
207
238
  def configured?( key, configs, optional=true )
208
239
  return false if optional and !options.has_key?(key)
@@ -225,8 +256,10 @@ module Rack
225
256
 
226
257
  # Check if this request should be moled according to the exclude filters
227
258
  def mole_request?( request )
228
- options[:excluded_paths].each do |exclude_path|
229
- return false if request.path.match( exclude_path )
259
+ if options.has_key?( :excluded_paths ) and options[:excluded_paths]
260
+ options[:excluded_paths].each do |exclude_path|
261
+ return false if request.path =~ exclude_path
262
+ end
230
263
  end
231
264
  true
232
265
  end
@@ -329,7 +362,6 @@ module Rack
329
362
 
330
363
  # check exclusion to see if the information should be moled
331
364
  def mole?( key, stash, value )
332
- # puts "Checking #{key} -- #{options[:mole_excludes].inspect}"
333
365
  return stash[key] = value if !options[:mole_excludes] or options[:mole_excludes].empty?
334
366
  stash[key] = (options[:mole_excludes].include?( key ) ? nil : value)
335
367
  end
data/lib/rackamole.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  module Rackamole
2
2
 
3
3
  # :stopdoc:
4
- VERSION = '0.3.1'
4
+ VERSION = '0.3.2'
5
5
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
6
6
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
7
7
  # :startdoc:
@@ -15,7 +15,6 @@ describe Rack::Mole do
15
15
  @opts = {
16
16
  :app_name => "Test App",
17
17
  :environment => :test,
18
- :excluded_paths => ['/should_bail'],
19
18
  :perf_threshold => 0.1,
20
19
  :user_key => :username,
21
20
  :store => @test_store
@@ -66,7 +65,7 @@ describe Rack::Mole do
66
65
  get "/", nil, @test_env
67
66
  rescue
68
67
  last_request.env['mole.stash'].should_not be_nil
69
- fault = last_request.env['mole.stash'].send( :find_fault, "/", "./spec/rackamole/mole_spec.rb:45:in `error_app'" )
68
+ fault = last_request.env['mole.stash'].send( :find_fault, "/", "./spec/rackamole/mole_spec.rb:44:in `error_app'" )
70
69
  fault.should_not be_nil
71
70
  fault.count.should == 1
72
71
  end
@@ -79,7 +78,7 @@ describe Rack::Mole do
79
78
  get "/", nil, env
80
79
  rescue
81
80
  last_request.env['mole.stash'].should_not be_nil
82
- fault = last_request.env['mole.stash'].send( :find_fault, "/", "./spec/rackamole/mole_spec.rb:45:in `error_app'" )
81
+ fault = last_request.env['mole.stash'].send( :find_fault, "/", "./spec/rackamole/mole_spec.rb:44:in `error_app'" )
83
82
  fault.should_not be_nil
84
83
  fault.count.should == i+1
85
84
  env = last_request.env
@@ -95,7 +94,7 @@ describe Rack::Mole do
95
94
  get "/#{i}", nil, env
96
95
  rescue => boom
97
96
  last_request.env['mole.stash'].should_not be_nil
98
- fault = last_request.env['mole.stash'].send( :find_fault, "/", "./spec/rackamole/mole_spec.rb:45:in `error_app'" )
97
+ fault = last_request.env['mole.stash'].send( :find_fault, "/", "./spec/rackamole/mole_spec.rb:44:in `error_app'" )
99
98
  fault.should_not be_nil
100
99
  fault.count.should == i+1
101
100
  env = last_request.env
@@ -103,7 +102,45 @@ describe Rack::Mole do
103
102
  end
104
103
  end
105
104
  end
105
+
106
+ # ---------------------------------------------------------------------------
107
+ describe "perfomance exemptions" do
108
+ it "should exempt a string path correctly" do
109
+ rack = Rack::Mole.new( nil, :app_name => "test app", :perf_excludes => [ {:context => "/fred/blee" } ] )
110
+ rack.send( :perf_exempt?, "/fred/blee", 10 ).should == true
111
+ rack.send( :perf_exempt?, "/fred/blee1", 10 ).should == false
112
+ end
113
+
114
+ it "should exempt a regex path correctly" do
115
+ rack = Rack::Mole.new( nil, :app_name => "test app", :perf_excludes => [ {:context => /^\/fred\/?.*/ } ] )
116
+ rack.send( :perf_exempt?, "/fred/blee", 10 ).should == true
117
+ rack.send( :perf_exempt?, "/fred", 10 ).should == true
118
+ rack.send( :perf_exempt?, "/fred/blee/bubba", 10 ).should == true
119
+ rack.send( :perf_exempt?, "/freud", 10 ).should == false
120
+ end
106
121
 
122
+ it "should exempt path with threshold correctly" do
123
+ rack = Rack::Mole.new( nil, :app_name => "test app", :perf_excludes => [ {:context => /^\/fred\/?.*/, :threshold => 15 } ] )
124
+ rack.send( :perf_exempt?, "/fred/blee", 10 ).should == true
125
+ rack.send( :perf_exempt?, "/fred/blee", 16 ).should == false
126
+ end
127
+
128
+ it "should exempt an array of path correctly" do
129
+ excludes = [
130
+ { :context => "/duh/1" , :threshold => 5 },
131
+ { :context => /^\/fred\/?.*/, :threshold => 15 },
132
+ ]
133
+ rack = Rack::Mole.new( nil, :app_name => "test app", :perf_excludes => excludes )
134
+ rack.send( :perf_exempt?, "/fred/blee", 10 ).should == true
135
+ rack.send( :perf_exempt?, "/crap/10/fred", 10 ).should == false
136
+ rack.send( :perf_exempt?, "/fred/blee", 16 ).should == false
137
+
138
+ rack.send( :perf_exempt?, "/duh/1", 5 ).should == true
139
+ rack.send( :perf_exempt?, "/duh/1", 6 ).should == false
140
+ rack.send( :perf_exempt?, "/duh/2", 6 ).should == false
141
+ end
142
+ end
143
+
107
144
  # ---------------------------------------------------------------------------
108
145
  describe "performance duplicate" do
109
146
  before( :each ) do
@@ -156,7 +193,7 @@ describe Rack::Mole do
156
193
  rescue
157
194
  @test_store.mole_result[:stack].should have(4).items
158
195
  last_request.env['mole.stash'].should_not be_nil
159
- fault = last_request.env['mole.stash'].send( :find_fault, "/", "./spec/rackamole/mole_spec.rb:45:in `error_app'" )
196
+ fault = last_request.env['mole.stash'].send( :find_fault, "/", "./spec/rackamole/mole_spec.rb:44:in `error_app'" )
160
197
  fault.should_not be_nil
161
198
  fault.count.should == 1
162
199
  end
@@ -236,7 +273,7 @@ describe Rack::Mole do
236
273
  @test_store.mole_result[:stack].should have(4).items
237
274
  @test_store.mole_result[:fault].should == 'Oh snap!'
238
275
  last_request.env['mole.stash'].should_not be_nil
239
- fault = last_request.env['mole.stash'].send( :find_fault, "/", "./spec/rackamole/mole_spec.rb:231" )
276
+ fault = last_request.env['mole.stash'].send( :find_fault, "/", "./spec/rackamole/mole_spec.rb:268" )
240
277
  fault.should_not be_nil
241
278
  fault.count.should == 1
242
279
  end
@@ -246,8 +283,16 @@ describe Rack::Mole do
246
283
  get "/", { :blee => 'duh' }, @test_env
247
284
  @test_store.mole_result[:params].should == { :blee => "duh".to_json }
248
285
  end
286
+
287
+ it "should not mole a standard exclusion" do
288
+ %w(/stylesheets/style.css /javascripts/blee.js /images/fred.png).each do |path|
289
+ get path, nil, @test_env
290
+ @test_store.mole_result.should be_nil
291
+ end
292
+ end
249
293
 
250
- it "should not mole an exclusion" do
294
+ it "should not mole a custom exclusion" do
295
+ @opts[:excluded_paths] = [/\/should_bail/]
251
296
  get '/should_bail', nil, @test_env
252
297
  @test_store.mole_result.should be_nil
253
298
  end
@@ -274,15 +319,15 @@ describe Rack::Mole do
274
319
  describe "rails env" do
275
320
  it "should find route info correctly" do
276
321
  pending do
277
- RAILS_ENV = true
278
- ActionController::Routing::Routes.stub!( :recognize_path ).and_return( { :controller => 'fred', :action => 'blee' } )
279
- rack = Rack::Mole.new( nil, :app_name => "test app" )
322
+ RAILS_ENV = true
323
+ ActionController::Routing::Routes.stub!( :recognize_path ).and_return( { :controller => 'fred', :action => 'blee' } )
324
+ rack = Rack::Mole.new( nil, :app_name => "test app" )
280
325
 
281
- # routes.should_receive( 'recognize_path' ).with( 'fred', { :method => 'blee' } ).and_return( )
282
- res = rack.send( :get_route, OpenStruct.new( :path => "/", :request_method => "GET") )
283
- res.should_not be_nil
284
- res[:controller].should == 'fred'
285
- res[:action].should == 'blee'
326
+ # routes.should_receive( 'recognize_path' ).with( 'fred', { :method => 'blee' } ).and_return( )
327
+ res = rack.send( :get_route, OpenStruct.new( :path => "/", :request_method => "GET") )
328
+ res.should_not be_nil
329
+ res[:controller].should == 'fred'
330
+ res[:action].should == 'blee'
286
331
  end
287
332
  end
288
333
 
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.3.1
4
+ version: 0.3.2
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: 2010-02-07 00:00:00 -07:00
12
+ date: 2010-02-11 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency