rackamole 0.0.8 → 0.0.9
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/aaa.txt +52 -0
- data/lib/rackamole.rb +1 -1
- data/lib/rackamole/config.rb +5 -0
- data/lib/rackamole/mole.rb +25 -28
- data/spec/rackamole/mole_spec.rb +23 -18
- data/z_experiments/config_sample.rb +9 -0
- metadata +6 -12
data/Rakefile
CHANGED
@@ -28,6 +28,6 @@ PROJ.rcov.opts = ["--sort", "coverage", "-T", '-x mongo']
|
|
28
28
|
depend_on "logging" , ">= 1.2.2"
|
29
29
|
depend_on "hitimes" , ">= 1.0.3"
|
30
30
|
depend_on "mongo" , ">= 0.17.1"
|
31
|
-
depend_on "darkfish-rdoc", ">= 1.1.5"
|
31
|
+
# depend_on "darkfish-rdoc", ">= 1.1.5"
|
32
32
|
depend_on "twitter4r" , ">= 0.3.0"
|
33
33
|
depend_on "actionmailer" , ">= 2.1.0"
|
data/aaa.txt
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
Information:
|
2
|
+
|
3
|
+
* Fernand Galiana: fernand.galiana@gmail.com : @kitesufer
|
4
|
+
* Rackamole: http://rackamole.com : @rackamole
|
5
|
+
* Forum: http://groups.google.com/group/rackamole
|
6
|
+
* Git: git://github.com/derailed/rackamole.git
|
7
|
+
|
8
|
+
Rackamole: Observe your web applications in the wild...
|
9
|
+
|
10
|
+
These days, companies love to claim their entire devotion to the Agile process.
|
11
|
+
We all iterate, do the SCRUM thing, often for longer than we care for, and we are
|
12
|
+
all sworn into delivering early and often...
|
13
|
+
|
14
|
+
But how can you really measure if your application is a success or a bust?
|
15
|
+
We all know that page hits and heat maps are only good in the eyes of marketeers,
|
16
|
+
or some usability PHD... How do you accurately assess that the "must have" features
|
17
|
+
in your application are actually being used and how are your customers actually using them ?
|
18
|
+
More importantly, how can you accurately assess you are iterating down the right path for
|
19
|
+
your product and company success, and not simply digging further in the rat hole ?
|
20
|
+
|
21
|
+
In other word, at times do you feel you are adhering to the frAgile methodology
|
22
|
+
whose motto is 'Deliver early and often deliver the wrong shit?
|
23
|
+
|
24
|
+
Rackamole is a rack application that allows you to cover the 'death zone' in your application
|
25
|
+
life cycle. Prior to your next iteration, why not take the time to observe the interactions of your
|
26
|
+
customers with your application in the wild. Rackmole specializes in trapping and recording
|
27
|
+
feature usage, performance issues and application exception. By being part and not seating
|
28
|
+
outside your application stack, the mole can record the very essence of an interaction.
|
29
|
+
You can then leverage this new found knowledge to prepare for your next iterations.
|
30
|
+
As an added bonus, you can leverage Rackamole, to track your QA team progress and making sure
|
31
|
+
no features is left unturned prior to the big push.
|
32
|
+
|
33
|
+
Installation:
|
34
|
+
|
35
|
+
> gem install rackamole -s http://gemcutter.org
|
36
|
+
|
37
|
+
Usage:
|
38
|
+
|
39
|
+
use Rack::Mole, {...}
|
40
|
+
|
41
|
+
You can simply log the interaction to the console (the default) or log file.
|
42
|
+
Alternatively leverage the mongo adapter to use MongoDB to store the information
|
43
|
+
for later querying and reporting.
|
44
|
+
|
45
|
+
The gem comes bundled with an email notifier to alert you when something is happening and
|
46
|
+
needs your attention. Granted this won't improve your social ranking much, but additionally
|
47
|
+
you and your team can follow your application 'happenings' on twitter...
|
48
|
+
|
49
|
+
We are currently working on companion application aka 'Wackamole' that will allow you to view
|
50
|
+
and drilldown on the collected information.
|
51
|
+
|
52
|
+
Thanks for stopping by!
|
data/lib/rackamole.rb
CHANGED
data/lib/rackamole/mole.rb
CHANGED
@@ -31,22 +31,21 @@ module Rack
|
|
31
31
|
# ==
|
32
32
|
#
|
33
33
|
# :excluded_paths:: Exclude paths that you do not wish to mole by specifying an array of regular expresssions.
|
34
|
-
# :
|
35
|
-
#
|
36
|
-
#
|
34
|
+
# :twitter :: Set this option to have the mole twitt certain alerts. You must configure your twitter auth
|
35
|
+
# via the :username and :password keys and :alert_on with an array of mole types you
|
36
|
+
# wish to be notified on.
|
37
37
|
# ==
|
38
|
-
# :
|
38
|
+
# :twitter => { :username => 'fred', :password => 'blee', :alert_on => [Rackamole.perf, Rackamole.fault] }
|
39
39
|
# ==
|
40
40
|
# ==== BOZO! currently there is not support for throttling or monitoring these alerts.
|
41
41
|
# ==
|
42
|
-
# :
|
43
|
-
#
|
42
|
+
# :email :: The mole can be configured to send out emails bases on interesting mole features.
|
43
|
+
# This feature uses actionmailer. You must specify a hash with the following keys :from, :to
|
44
|
+
# and :alert_on options to indicate which mole type your wish to be alerted on.
|
44
45
|
# ==
|
45
|
-
# :
|
46
|
+
# :email => { :from => 'fred@acme.com', :to => ['blee@acme.com', 'doh@acme.com'], :alert_on => [Rackamole.perf, Rackamole.fault] }
|
46
47
|
# ==
|
47
|
-
#
|
48
|
-
# ==
|
49
|
-
# :mail_on => {:enabled => true, :features => [Rackamole.perf, Rackamole.fault] }
|
48
|
+
#
|
50
49
|
def initialize( app, opts={} )
|
51
50
|
@app = app
|
52
51
|
init_options( opts )
|
@@ -92,9 +91,7 @@ module Rack
|
|
92
91
|
:environment => 'test',
|
93
92
|
:excluded_paths => [/.?\.ico/, /.?\.png/],
|
94
93
|
:perf_threshold => 10.0,
|
95
|
-
:store => Rackamole::Store::Log.new
|
96
|
-
:twitt_on => { :enabled => false, :features => [Rackamole.perf, Rackamole.fault] },
|
97
|
-
:mail_on => { :enabled => false, :features => [Rackamole.perf, Rackamole.fault] }
|
94
|
+
:store => Rackamole::Store::Log.new
|
98
95
|
}
|
99
96
|
end
|
100
97
|
|
@@ -106,10 +103,9 @@ module Rack
|
|
106
103
|
raise "[M()le] -- Unable to locate required option key `#{k}" unless options[k.to_sym]
|
107
104
|
end
|
108
105
|
|
109
|
-
|
110
|
-
configured?( :
|
111
|
-
configured?( :
|
112
|
-
configured?( :mail_on , [:enabled, :features] )
|
106
|
+
# Barf early if something is wrong in the configuration
|
107
|
+
configured?( :twitter, [:username, :password, :alert_on], true )
|
108
|
+
configured?( :email , [:from, :to, :alert_on], true )
|
113
109
|
end
|
114
110
|
|
115
111
|
# Send moled info to store and potentially send out alerts...
|
@@ -120,12 +116,12 @@ module Rack
|
|
120
116
|
options[:store].mole( attrs )
|
121
117
|
|
122
118
|
# send email alert ?
|
123
|
-
if
|
124
|
-
Rackamole::Alert::Emole.deliver_alert( options[:
|
119
|
+
if alertable?( :email, attrs[:type] )
|
120
|
+
Rackamole::Alert::Emole.deliver_alert( options[:email][:from], options[:email][:to], attrs )
|
125
121
|
end
|
126
122
|
|
127
123
|
# send twitter alert ?
|
128
|
-
if
|
124
|
+
if alertable?( :twitter, attrs[:type] )
|
129
125
|
twitt.send_alert( attrs )
|
130
126
|
end
|
131
127
|
rescue => boom
|
@@ -134,12 +130,13 @@ module Rack
|
|
134
130
|
end
|
135
131
|
|
136
132
|
# Check if an options is set and configured
|
137
|
-
def configured?( key, configs )
|
138
|
-
return false
|
133
|
+
def configured?( key, configs, optional=true )
|
134
|
+
return false if optional and !options.has_key?(key)
|
135
|
+
raise "Missing option key :#{key}" unless options.has_key?(key)
|
139
136
|
configs.each do |c|
|
140
|
-
raise "Invalid value for option
|
137
|
+
raise "Invalid value for option :#{key}. Expecting a hash with symbols [#{configs.join(',')}]" unless options[key].respond_to? :key?
|
141
138
|
unless options[key].key?(c)
|
142
|
-
raise "Option
|
139
|
+
raise "Option :#{key} is not properly configured. Missing #{c.inspect} in [#{options[key].keys.sort{|a,b| a.to_s <=> b.to_s}.join(',')}]"
|
143
140
|
end
|
144
141
|
end
|
145
142
|
true
|
@@ -147,14 +144,14 @@ module Rack
|
|
147
144
|
|
148
145
|
# Check if feature should be send to alert clients ie email or twitter
|
149
146
|
def alertable?( filter, type )
|
150
|
-
return false unless configured?( filter, [:
|
151
|
-
return false unless options[filter][:
|
152
|
-
options[filter][:
|
147
|
+
return false unless configured?( filter, [:alert_on] )
|
148
|
+
return false unless options[filter][:alert_on]
|
149
|
+
options[filter][:alert_on].include?( type )
|
153
150
|
end
|
154
151
|
|
155
152
|
# Create or retrieve twitter client
|
156
153
|
def twitt
|
157
|
-
@twitt ||= Rackamole::Alert::Twitt.new( options[:
|
154
|
+
@twitt ||= Rackamole::Alert::Twitt.new( options[:twitter][:username], options[:twitter][:password] )
|
158
155
|
end
|
159
156
|
|
160
157
|
# Check if this request should be moled according to the exclude filters
|
data/spec/rackamole/mole_spec.rb
CHANGED
@@ -114,12 +114,20 @@ describe Rack::Mole do
|
|
114
114
|
describe '#alertable?' do
|
115
115
|
before( :each ) do
|
116
116
|
@rack = Rack::Mole.new( nil,
|
117
|
-
:
|
118
|
-
|
117
|
+
:twitter => {
|
118
|
+
:username => 'fred',
|
119
|
+
:password => 'blee',
|
120
|
+
:alert_on => [Rackamole.perf, Rackamole.fault]
|
121
|
+
},
|
122
|
+
:email => {
|
123
|
+
:from => 'fred',
|
124
|
+
:to => 'blee',
|
125
|
+
:alert_on => [Rackamole.perf, Rackamole.fault, Rackamole.feature]
|
126
|
+
} )
|
119
127
|
end
|
120
128
|
|
121
129
|
it "should succeeed if a feature can be twitted on" do
|
122
|
-
@rack.send( :alertable?, :
|
130
|
+
@rack.send( :alertable?, :twitter, Rackamole.perf ).should == true
|
123
131
|
end
|
124
132
|
|
125
133
|
it "should fail if the type is not in range" do
|
@@ -127,15 +135,11 @@ describe Rack::Mole do
|
|
127
135
|
end
|
128
136
|
|
129
137
|
it "should fail if this is not an included feature" do
|
130
|
-
@rack.send( :alertable?, :
|
138
|
+
@rack.send( :alertable?, :twitter, Rackamole.feature ).should == false
|
131
139
|
end
|
132
140
|
|
133
|
-
it "should
|
141
|
+
it "should fail if an alert is not configured" do
|
134
142
|
@rack.send( :alertable?, :mail_on, Rackamole.perf ).should == false
|
135
|
-
end
|
136
|
-
|
137
|
-
it "should fail if the alert is not configured" do
|
138
|
-
@rack.send( :alertable?, :fred, Rackamole.perf ).should == false
|
139
143
|
end
|
140
144
|
end
|
141
145
|
|
@@ -143,31 +147,32 @@ describe Rack::Mole do
|
|
143
147
|
before( :each ) do
|
144
148
|
options = {
|
145
149
|
:blee => [1,2,3],
|
146
|
-
:
|
147
|
-
:twitt_on => { :enabled => true, :features => [Rackamole.perf, Rackamole.fault] }
|
150
|
+
:twitter => { :username => 'Fernand', :password => "Blee", :alert_on => [Rackamole.perf, Rackamole.fault] },
|
148
151
|
}
|
149
152
|
@rack = Rack::Mole.new( nil, options )
|
150
153
|
end
|
151
154
|
|
152
155
|
it "should return true if an option is correctly configured" do
|
153
|
-
@rack.send( :configured?, :
|
154
|
-
@rack.send( :configured?, :
|
156
|
+
@rack.send( :configured?, :twitter, [:username, :password] ).should == true
|
157
|
+
@rack.send( :configured?, :twitter, [:alert_on] ).should == true
|
155
158
|
end
|
156
159
|
|
157
160
|
it "should fail if an option is not set" do
|
158
|
-
|
161
|
+
lambda {
|
162
|
+
@rack.send( :configured?, :twitter, [:username, :password, :blee] )
|
163
|
+
}.should raise_error(RuntimeError, /Option \:twitter is not properly configured. Missing \:blee in \[alert_on,password,username\]/)
|
159
164
|
end
|
160
165
|
|
161
166
|
it "should fail if an option is not a hash" do
|
162
167
|
lambda {
|
163
168
|
@rack.send( :configured?, :blee, [:username, :pwd] )
|
164
|
-
}.should raise_error(RuntimeError, /Invalid value for option blee
|
165
|
-
end
|
169
|
+
}.should raise_error(RuntimeError, /Invalid value for option \:blee\. Expecting a hash with symbols \[username,pwd\]/ )
|
170
|
+
end
|
166
171
|
|
167
172
|
it "should fail if an option is not correctly configured" do
|
168
173
|
lambda {
|
169
|
-
@rack.send( :configured?, :
|
170
|
-
}.should raise_error(RuntimeError, /
|
174
|
+
@rack.send( :configured?, :fred, [:username, :pwd], false )
|
175
|
+
}.should raise_error(RuntimeError, /Missing option key \:fred/ )
|
171
176
|
end
|
172
177
|
end
|
173
178
|
|
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.0.
|
4
|
+
version: 0.0.9
|
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-11-
|
12
|
+
date: 2009-11-25 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -42,16 +42,6 @@ dependencies:
|
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: 0.17.1
|
44
44
|
version:
|
45
|
-
- !ruby/object:Gem::Dependency
|
46
|
-
name: darkfish-rdoc
|
47
|
-
type: :runtime
|
48
|
-
version_requirement:
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
50
|
-
requirements:
|
51
|
-
- - ">="
|
52
|
-
- !ruby/object:Gem::Version
|
53
|
-
version: 1.1.5
|
54
|
-
version:
|
55
45
|
- !ruby/object:Gem::Dependency
|
56
46
|
name: twitter4r
|
57
47
|
type: :runtime
|
@@ -100,12 +90,14 @@ extensions: []
|
|
100
90
|
|
101
91
|
extra_rdoc_files:
|
102
92
|
- README.rdoc
|
93
|
+
- aaa.txt
|
103
94
|
- lib/rackamole/alert/templates/rackamole/alert/emole/alert.erb
|
104
95
|
- samples/rails/moled/public/robots.txt
|
105
96
|
files:
|
106
97
|
- ...
|
107
98
|
- README.rdoc
|
108
99
|
- Rakefile
|
100
|
+
- aaa.txt
|
109
101
|
- images/mole_logo.png
|
110
102
|
- images/mole_logo.psd
|
111
103
|
- images/mole_logo_small.png
|
@@ -114,6 +106,7 @@ files:
|
|
114
106
|
- lib/rackamole/alert/emole.rb
|
115
107
|
- lib/rackamole/alert/templates/rackamole/alert/emole/alert.erb
|
116
108
|
- lib/rackamole/alert/twitt.rb
|
109
|
+
- lib/rackamole/config.rb
|
117
110
|
- lib/rackamole/interceptor.rb
|
118
111
|
- lib/rackamole/logger.rb
|
119
112
|
- lib/rackamole/mole.rb
|
@@ -200,6 +193,7 @@ files:
|
|
200
193
|
- tasks/test.rake
|
201
194
|
- tasks/zentest.rake
|
202
195
|
- z_experiments/config.rb
|
196
|
+
- z_experiments/config_sample.rb
|
203
197
|
has_rdoc: true
|
204
198
|
homepage: http://www.rackamole.com
|
205
199
|
licenses: []
|