wested-rack-bug 0.2.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +3 -0
- data/History.txt +0 -0
- data/MIT-LICENSE.txt +19 -0
- data/README.rdoc +29 -0
- data/Rakefile +20 -0
- data/Thorfile +109 -0
- data/VERSION +1 -0
- data/lib/rack/bug.rb +43 -0
- data/lib/rack/bug/options.rb +89 -0
- data/lib/rack/bug/panel.rb +50 -0
- data/lib/rack/bug/panel_app.rb +33 -0
- data/lib/rack/bug/panels/active_record_panel.rb +45 -0
- data/lib/rack/bug/panels/active_record_panel/activerecord_extensions.rb +18 -0
- data/lib/rack/bug/panels/cache_panel.rb +50 -0
- data/lib/rack/bug/panels/cache_panel/memcache_extension.rb +129 -0
- data/lib/rack/bug/panels/cache_panel/panel_app.rb +48 -0
- data/lib/rack/bug/panels/cache_panel/stats.rb +97 -0
- data/lib/rack/bug/panels/log_panel.rb +39 -0
- data/lib/rack/bug/panels/log_panel/rails_extension.rb +11 -0
- data/lib/rack/bug/panels/memory_panel.rb +27 -0
- data/lib/rack/bug/panels/rails_info_panel.rb +23 -0
- data/lib/rack/bug/panels/redis_panel.rb +44 -0
- data/lib/rack/bug/panels/redis_panel/redis_extension.rb +14 -0
- data/lib/rack/bug/panels/redis_panel/stats.rb +48 -0
- data/lib/rack/bug/panels/request_variables_panel.rb +25 -0
- data/lib/rack/bug/panels/sql_panel.rb +55 -0
- data/lib/rack/bug/panels/sql_panel/panel_app.rb +37 -0
- data/lib/rack/bug/panels/sql_panel/query.rb +73 -0
- data/lib/rack/bug/panels/sql_panel/sql_extension.rb +11 -0
- data/lib/rack/bug/panels/templates_panel.rb +44 -0
- data/lib/rack/bug/panels/templates_panel/actionview_extension.rb +12 -0
- data/lib/rack/bug/panels/templates_panel/rendering.rb +67 -0
- data/lib/rack/bug/panels/templates_panel/trace.rb +34 -0
- data/lib/rack/bug/panels/timer_panel.rb +40 -0
- data/lib/rack/bug/params_signature.rb +65 -0
- data/lib/rack/bug/public/__rack_bug__/bookmarklet.html +10 -0
- data/lib/rack/bug/public/__rack_bug__/bookmarklet.js +215 -0
- data/lib/rack/bug/public/__rack_bug__/bug.css +211 -0
- data/lib/rack/bug/public/__rack_bug__/bug.js +84 -0
- data/lib/rack/bug/public/__rack_bug__/jquery-1.3.2.js +4376 -0
- data/lib/rack/bug/public/__rack_bug__/jquery.tablesorter.min.js +1 -0
- data/lib/rack/bug/public/__rack_bug__/spinner.gif +0 -0
- data/lib/rack/bug/render.rb +66 -0
- data/lib/rack/bug/toolbar.rb +137 -0
- data/lib/rack/bug/views/error.html.erb +16 -0
- data/lib/rack/bug/views/panels/active_record.html.erb +17 -0
- data/lib/rack/bug/views/panels/cache.html.erb +93 -0
- data/lib/rack/bug/views/panels/execute_sql.html.erb +32 -0
- data/lib/rack/bug/views/panels/explain_sql.html.erb +32 -0
- data/lib/rack/bug/views/panels/log.html.erb +23 -0
- data/lib/rack/bug/views/panels/profile_sql.html.erb +32 -0
- data/lib/rack/bug/views/panels/rails_info.html.erb +19 -0
- data/lib/rack/bug/views/panels/redis.html.erb +32 -0
- data/lib/rack/bug/views/panels/request_variables.html.erb +107 -0
- data/lib/rack/bug/views/panels/sql.html.erb +43 -0
- data/lib/rack/bug/views/panels/templates.html.erb +7 -0
- data/lib/rack/bug/views/panels/timer.html.erb +19 -0
- data/lib/rack/bug/views/panels/view_cache.html.erb +19 -0
- data/lib/rack/bug/views/redirect.html.erb +16 -0
- data/lib/rack/bug/views/toolbar.html.erb +42 -0
- data/spec/fixtures/config.ru +8 -0
- data/spec/fixtures/dummy_panel.rb +2 -0
- data/spec/fixtures/sample_app.rb +29 -0
- data/spec/rack/bug/panels/active_record_panel_spec.rb +30 -0
- data/spec/rack/bug/panels/cache_panel_spec.rb +159 -0
- data/spec/rack/bug/panels/log_panel_spec.rb +25 -0
- data/spec/rack/bug/panels/memory_panel_spec.rb +21 -0
- data/spec/rack/bug/panels/rails_info_panel_spec.rb +25 -0
- data/spec/rack/bug/panels/redis_panel_spec.rb +57 -0
- data/spec/rack/bug/panels/sql_panel_spec.rb +136 -0
- data/spec/rack/bug/panels/templates_panel_spec.rb +71 -0
- data/spec/rack/bug/panels/timer_panel_spec.rb +38 -0
- data/spec/rack/toolbar_spec.rb +100 -0
- data/spec/rcov.opts +1 -0
- data/spec/spec.opts +1 -0
- data/spec/spec_helper.rb +70 -0
- data/wested-rack-bug.gemspec +127 -0
- metadata +153 -0
@@ -0,0 +1,18 @@
|
|
1
|
+
if defined?(ActiveRecord)
|
2
|
+
ActiveRecord::Base.class_eval do
|
3
|
+
|
4
|
+
if instance_methods.include?("after_initialize")
|
5
|
+
def after_initialize_with_rack_bug
|
6
|
+
Rack::Bug::ActiveRecordPanel.record(self.class.base_class.name)
|
7
|
+
after_initialize_without_rack_bug
|
8
|
+
end
|
9
|
+
|
10
|
+
alias_method_chain :after_initialize, :rack_bug
|
11
|
+
else
|
12
|
+
def after_initialize
|
13
|
+
Rack::Bug::ActiveRecordPanel.record(self.class.base_class.name)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require "rack/bug/panels/cache_panel/memcache_extension"
|
2
|
+
|
3
|
+
module Rack
|
4
|
+
module Bug
|
5
|
+
|
6
|
+
class CachePanel < Panel
|
7
|
+
autoload :PanelApp, "rack/bug/panels/cache_panel/panel_app"
|
8
|
+
autoload :Stats, "rack/bug/panels/cache_panel/stats"
|
9
|
+
|
10
|
+
def self.record(method, *keys, &block)
|
11
|
+
return block.call unless Rack::Bug.enabled?
|
12
|
+
|
13
|
+
start_time = Time.now
|
14
|
+
result = block.call
|
15
|
+
total_time = Time.now - start_time
|
16
|
+
hit = result.nil? ? false : true
|
17
|
+
stats.record_call(method, total_time * 1_000, hit, *keys)
|
18
|
+
return result
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.reset
|
22
|
+
Thread.current["rack.bug.cache"] = Stats.new
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.stats
|
26
|
+
Thread.current["rack.bug.cache"] ||= Stats.new
|
27
|
+
end
|
28
|
+
|
29
|
+
def panel_app
|
30
|
+
PanelApp.new
|
31
|
+
end
|
32
|
+
|
33
|
+
def name
|
34
|
+
"cache"
|
35
|
+
end
|
36
|
+
|
37
|
+
def heading
|
38
|
+
"Cache: %.2fms (#{self.class.stats.queries.size} calls)" % self.class.stats.time
|
39
|
+
end
|
40
|
+
|
41
|
+
def content
|
42
|
+
result = render_template "panels/cache", :stats => self.class.stats
|
43
|
+
self.class.reset
|
44
|
+
return result
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,129 @@
|
|
1
|
+
if defined?(Memcached)
|
2
|
+
Memcached.class_eval do
|
3
|
+
|
4
|
+
def set_with_rack_bug(key, value, timeout=0, marshal=true)
|
5
|
+
Rack::Bug::CachePanel.record(:set, key) do
|
6
|
+
set_without_rack_bug(key, value, timeout, marshal)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_with_rack_bug(key, value, timeout=0, marshal=true)
|
11
|
+
Rack::Bug::CachePanel.record(:add, key) do
|
12
|
+
add_without_rack_bug(key, value, timeout, marshal)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def increment_with_rack_bug(key, offset=1)
|
17
|
+
Rack::Bug::CachePanel.record(:incr, key) do
|
18
|
+
increment_without_rack_bug(key, offset)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def decrement_with_rack_bug(key, offset=1)
|
23
|
+
Rack::Bug::CachePanel.record(:decr, key) do
|
24
|
+
decrement_without_rack_bug(key, offset)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def replace_with_rack_bug(key, value, timeout=0, marshal=true)
|
29
|
+
Rack::Bug::CachePanel.record(:replace, key) do
|
30
|
+
replace_without_rack_bug(key, value, timeout, marshal)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def append_with_rack_bug(key, value)
|
35
|
+
Rack::Bug::CachePanel.record(:append, key) do
|
36
|
+
append_without_rack_bug(key, value)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def prepend_with_rack_bug(key, value)
|
41
|
+
Rack::Bug::CachePanel.record(:prepend, key) do
|
42
|
+
prepend_without_rack_bug(key, value)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def delete_with_rack_bug(key)
|
47
|
+
Rack::Bug::CachePanel.record(:delete, key) do
|
48
|
+
delete_without_rack_bug(key)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def get_with_rack_bug(keys, marshal=true)
|
53
|
+
if keys.is_a? Array
|
54
|
+
Rack::Bug::CachePanel.record(:get_multi, *keys) do
|
55
|
+
get_without_rack_bug(keys, marshal)
|
56
|
+
end
|
57
|
+
else
|
58
|
+
Rack::Bug::CachePanel.record(:get, keys) do
|
59
|
+
get_without_rack_bug(keys, marshal)
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
alias_method_chain :decrement, :rack_bug
|
65
|
+
alias_method_chain :get, :rack_bug
|
66
|
+
alias_method_chain :increment, :rack_bug
|
67
|
+
alias_method_chain :set, :rack_bug
|
68
|
+
alias_method_chain :add, :rack_bug
|
69
|
+
alias_method_chain :replace, :rack_bug
|
70
|
+
alias_method_chain :delete, :rack_bug
|
71
|
+
alias_method_chain :prepend, :rack_bug
|
72
|
+
alias_method_chain :append, :rack_bug
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
if defined?(MemCache)
|
77
|
+
MemCache.class_eval do
|
78
|
+
|
79
|
+
def decr_with_rack_bug(key, amount = 1)
|
80
|
+
Rack::Bug::CachePanel.record(:decr, key) do
|
81
|
+
decr_without_rack_bug(key, amount)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
def get_with_rack_bug(key, raw = false)
|
86
|
+
Rack::Bug::CachePanel.record(:get, key) do
|
87
|
+
get_without_rack_bug(key, raw)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def get_multi_with_rack_bug(*keys)
|
92
|
+
Rack::Bug::CachePanel.record(:get_multi, *keys) do
|
93
|
+
get_multi_without_rack_bug(*keys)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def incr_with_rack_bug(key, amount = 1)
|
98
|
+
Rack::Bug::CachePanel.record(:incr, key) do
|
99
|
+
incr_without_rack_bug(key, amount)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
103
|
+
def set_with_rack_bug(key, value, expiry = 0, raw = false)
|
104
|
+
Rack::Bug::CachePanel.record(:set, key) do
|
105
|
+
set_without_rack_bug(key, value, expiry, raw)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def add_with_rack_bug(key, value, expiry = 0, raw = false)
|
110
|
+
Rack::Bug::CachePanel.record(:add, key) do
|
111
|
+
add_without_rack_bug(key, value, expiry, raw)
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def delete_with_rack_bug(key, expiry = 0)
|
116
|
+
Rack::Bug::CachePanel.record(:delete, key) do
|
117
|
+
delete_without_rack_bug(key, expiry)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
alias_method_chain :decr, :rack_bug
|
122
|
+
alias_method_chain :get, :rack_bug
|
123
|
+
alias_method_chain :get_multi, :rack_bug
|
124
|
+
alias_method_chain :incr, :rack_bug
|
125
|
+
alias_method_chain :set, :rack_bug
|
126
|
+
alias_method_chain :add, :rack_bug
|
127
|
+
alias_method_chain :delete, :rack_bug
|
128
|
+
end
|
129
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
module Rack
|
2
|
+
module Bug
|
3
|
+
class CachePanel
|
4
|
+
|
5
|
+
class PanelApp < ::Rack::Bug::PanelApp
|
6
|
+
|
7
|
+
def dispatch
|
8
|
+
case request.path_info
|
9
|
+
when "/__rack_bug__/view_cache" then view_cache
|
10
|
+
when "/__rack_bug__/delete_cache" then delete_cache
|
11
|
+
when "/__rack_bug__/delete_cache_list" then delete_cache_list
|
12
|
+
else not_found
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def ok
|
17
|
+
Rack::Response.new(["OK"]).to_a
|
18
|
+
end
|
19
|
+
|
20
|
+
def view_cache
|
21
|
+
validate_params
|
22
|
+
render_template "panels/view_cache", :key => params["key"], :value => Rails.cache.read(params["key"])
|
23
|
+
end
|
24
|
+
|
25
|
+
def delete_cache
|
26
|
+
validate_params
|
27
|
+
raise "Rails not found... can't delete key" unless defined?(Rails)
|
28
|
+
Rails.cache.delete(params["key"])
|
29
|
+
ok
|
30
|
+
end
|
31
|
+
|
32
|
+
def delete_cache_list
|
33
|
+
validate_params
|
34
|
+
raise "Rails not found... can't delete key" unless defined?(Rails)
|
35
|
+
|
36
|
+
params.each do |key, value|
|
37
|
+
next unless key =~ /^keys_/
|
38
|
+
Rails.cache.delete(value)
|
39
|
+
end
|
40
|
+
|
41
|
+
ok
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module Rack
|
2
|
+
module Bug
|
3
|
+
class CachePanel
|
4
|
+
|
5
|
+
class Stats
|
6
|
+
class Query
|
7
|
+
attr_reader :method, :time, :hit, :keys
|
8
|
+
|
9
|
+
def initialize(method, time, hit, keys)
|
10
|
+
@method = method
|
11
|
+
@time = time
|
12
|
+
@hit = hit
|
13
|
+
@keys = keys
|
14
|
+
end
|
15
|
+
|
16
|
+
def display_time
|
17
|
+
"%.2fms" % time
|
18
|
+
end
|
19
|
+
|
20
|
+
def display_keys
|
21
|
+
if keys.size == 1
|
22
|
+
keys.first
|
23
|
+
else
|
24
|
+
keys.join(", ")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
attr_reader :calls
|
30
|
+
attr_reader :keys
|
31
|
+
attr_reader :queries
|
32
|
+
|
33
|
+
def initialize
|
34
|
+
@queries = []
|
35
|
+
@misses =
|
36
|
+
@calls = 0
|
37
|
+
@time = 0.0
|
38
|
+
@keys = []
|
39
|
+
end
|
40
|
+
|
41
|
+
def record_call(method, time, hit, *keys)
|
42
|
+
@queries << Query.new(method, time, hit, keys)
|
43
|
+
@calls += 1
|
44
|
+
@time += time
|
45
|
+
@keys += keys
|
46
|
+
end
|
47
|
+
|
48
|
+
def display_time
|
49
|
+
"%.2fms" % time
|
50
|
+
end
|
51
|
+
|
52
|
+
def time
|
53
|
+
@queries.inject(0) do |memo, query|
|
54
|
+
memo + query.time
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def gets
|
59
|
+
count_queries(:get)
|
60
|
+
end
|
61
|
+
|
62
|
+
def sets
|
63
|
+
count_queries(:set)
|
64
|
+
end
|
65
|
+
|
66
|
+
def deletes
|
67
|
+
count_queries(:delete)
|
68
|
+
end
|
69
|
+
|
70
|
+
def get_multis
|
71
|
+
count_queries(:get_multi)
|
72
|
+
end
|
73
|
+
|
74
|
+
def hits
|
75
|
+
@queries.select { |q| [:get, :get_multi].include?(q.method) && q.hit }.size
|
76
|
+
end
|
77
|
+
|
78
|
+
def misses
|
79
|
+
@queries.select { |q| [:get, :get_multi].include?(q.method) && !q.hit }.size
|
80
|
+
end
|
81
|
+
|
82
|
+
def count_queries(method)
|
83
|
+
@queries.select { |q| q.method == method }.size
|
84
|
+
end
|
85
|
+
|
86
|
+
def queries_to_param
|
87
|
+
params = {}
|
88
|
+
@queries.each_with_index do |query, index|
|
89
|
+
params["keys_#{index}"] = query.keys.first
|
90
|
+
end
|
91
|
+
params
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "rack/bug/panels/log_panel/rails_extension"
|
2
|
+
|
3
|
+
module Rack
|
4
|
+
module Bug
|
5
|
+
|
6
|
+
class LogPanel < Panel
|
7
|
+
|
8
|
+
def self.record(message)
|
9
|
+
return unless Rack::Bug.enabled?
|
10
|
+
return unless message
|
11
|
+
logs << message.to_s
|
12
|
+
end
|
13
|
+
|
14
|
+
def self.reset
|
15
|
+
Thread.current["rack.bug.logs"] = []
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.logs
|
19
|
+
Thread.current["rack.bug.logs"] ||= []
|
20
|
+
end
|
21
|
+
|
22
|
+
def name
|
23
|
+
"log"
|
24
|
+
end
|
25
|
+
|
26
|
+
def heading
|
27
|
+
"Log"
|
28
|
+
end
|
29
|
+
|
30
|
+
def content
|
31
|
+
result = render_template "panels/log", :logs => self.class.logs
|
32
|
+
self.class.reset
|
33
|
+
return result
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
if defined?(Rails) && Rails.respond_to?(:logger) && Rails.logger
|
2
|
+
module LoggingExtensions
|
3
|
+
def add(*args, &block)
|
4
|
+
logged_message = super
|
5
|
+
Rack::Bug::LogPanel.record(logged_message)
|
6
|
+
return logged_message
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
Rails.logger.extend LoggingExtensions
|
11
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#
|
2
|
+
module Rack
|
3
|
+
module Bug
|
4
|
+
|
5
|
+
class MemoryPanel < Panel
|
6
|
+
|
7
|
+
def before(env)
|
8
|
+
@original_memory = `ps -o rss= -p #{$$}`.to_i
|
9
|
+
end
|
10
|
+
|
11
|
+
def after(env, status, headers, body)
|
12
|
+
@total_memory = `ps -o rss= -p #{$$}`.to_i
|
13
|
+
@memory_increase = @total_memory - @original_memory
|
14
|
+
end
|
15
|
+
|
16
|
+
def heading
|
17
|
+
"#{@memory_increase} KB Δ, #{@total_memory} KB total"
|
18
|
+
end
|
19
|
+
|
20
|
+
def has_content?
|
21
|
+
false
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Rack
|
2
|
+
module Bug
|
3
|
+
|
4
|
+
class RailsInfoPanel < Panel
|
5
|
+
|
6
|
+
def name
|
7
|
+
"rails_info"
|
8
|
+
end
|
9
|
+
|
10
|
+
def heading
|
11
|
+
return unless (defined?(Rails) && defined?(Rails::Info))
|
12
|
+
"Rails #{Rails.version}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def content
|
16
|
+
return unless (defined?(Rails) && defined?(Rails::Info))
|
17
|
+
render_template "panels/rails_info"
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|