rack-insight 0.5.13 → 0.5.14

Sign up to get free protection for your applications and to get access to all the features.
data/CHANGELOG CHANGED
@@ -1,5 +1,19 @@
1
1
  == HEAD
2
2
 
3
+ * New Features
4
+
5
+ * Panel level configurations for :probes are now supported by default on all panels
6
+ * Auto-magical panel names
7
+ * Auto-magical table creation (skipped with self.tableless = false in a Panel class definition)
8
+ * Under construction, or blank, panels have more scaffolding
9
+ *
10
+
11
+ == 0.5.13 / 2012-09-10
12
+
13
+ * Bug Fixes
14
+
15
+ * Fixed the double logging of anything logged with ActiveSupport::BufferedLogger (via the new :panel_configs)
16
+
3
17
  * New Features
4
18
 
5
19
  * Panel level configuration options for all panels, including extension gems.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rack-insight (0.5.12)
4
+ rack-insight (0.5.13)
5
5
  rack
6
6
  sqlite3 (>= 1.3.3)
7
7
  uuidtools (>= 2.1.2)
@@ -9,7 +9,21 @@ module Rack::Insight
9
9
  @verbosity = true
10
10
  @rails_log_copy = true
11
11
  @filtered_backtrace = true
12
- @panel_configs = {}
12
+ @panel_configs = {
13
+ :active_record => {:probes => {'ActiveRecord' => [:class, :allocate]}},
14
+ :active_resource => {:probes => {'ActiveResource::Connection' => [:instance, :request]}},
15
+ :cache => {:probes => { 'Memcached' => [:instance, :decrement, :get, :increment, :set,
16
+ :add, :replace, :delete, :prepend, :append],
17
+ 'MemCache' => [:instance, :decr, :get, :get_multi, :incr, :set, :add, :delete],
18
+ 'Dalli::Client' => [:instance, :perform] } },
19
+ :active_record => {:probes => {'ActiveRecord' => [:class, :allocate]}},
20
+ # :log_panel => The log panel configures its probes in its initializer
21
+ :sql => {:probes => Hash[%w{ PostgreSQLAdapter MysqlAdapter SQLiteAdapter
22
+ Mysql2Adapter OracleEnhancedAdapter }.map do |adapter|
23
+ ["ActiveRecord::ConnectionAdapters::#{adapter}", [:instance, :execute]]
24
+ end ] },
25
+ :templates => {:probes => {'ActionView::Template' => [:instance, :render]}}
26
+ }
13
27
 
14
28
  DEFAULTS = {
15
29
  # You can augment or replace the default set of panel load paths.
@@ -40,7 +54,11 @@ module Rack::Insight
40
54
  @log_file = config[:log_file]
41
55
  @verbosity = config[:verbosity]
42
56
  @filtered_backtrace = config[:filtered_backtrace]
43
- @panel_configs = config[:panel_configs]
57
+
58
+ config[:panel_configs].each do |panel_name_sym, config|
59
+ set_panel_config(panel_name_sym, config)
60
+ end
61
+
44
62
  unless config[:panel_load_paths].kind_of?(Array)
45
63
  raise "Rack::Insight::Config.config[:panel_load_paths] is invalid: Expected kind of Array but got #{config[:panel_load_paths].class}"
46
64
  end
@@ -49,6 +67,13 @@ module Rack::Insight
49
67
  end
50
68
  end
51
69
 
70
+ # To preserve :panel_configs settings from extension libraries,
71
+ # and allowing user config to override the defaults set in this, or other extension gems.
72
+ def self.set_panel_config(panel_name_sym, config)
73
+ @panel_configs[panel_name_sym].merge!(config)
74
+ self.config[:panel_configs][panel_name_sym] = @panel_configs[panel_name_sym]
75
+ end
76
+
52
77
  def self.logger
53
78
  @logger ||= begin
54
79
  logga = self.config[:logger]
@@ -4,15 +4,26 @@ require 'base64'
4
4
 
5
5
  module Rack::Insight
6
6
  class Database
7
+
8
+ # Classes including this module must define the following structure:
9
+ # class FooBar
10
+ # include Rack::Insight::Database
11
+ # class << self
12
+ # attr_accessor :has_table
13
+ # end
14
+ # # Setting as below is only required when not using a table (Why are you including this module then?)
15
+ # # self.has_table = false
16
+ # end
7
17
  module RequestDataClient
8
18
  def key_sql_template(sql)
9
19
  @key_sql_template = sql
10
20
  end
11
21
 
12
22
  def table_setup(name, *keys)
23
+ self.class.has_table = true
13
24
  @table = DataTable.new(name, *keys)
14
25
  if keys.empty?
15
- @key_sql_template = ""
26
+ @key_sql_template = ''
16
27
  end
17
28
  end
18
29
 
@@ -2,6 +2,7 @@ require 'rack/insight/instrumentation/package-definition'
2
2
  module Rack::Insight::Instrumentation
3
3
  module Client
4
4
  def probe(collector, &block)
5
+ self.class.is_probed = true
5
6
  ::Rack::Insight::Instrumentation::PackageDefinition::probe(collector, &block)
6
7
  end
7
8
 
@@ -20,7 +20,11 @@ module Rack::Insight
20
20
 
21
21
  include Rack::Insight::Logging
22
22
 
23
- attr_accessor :template_root
23
+ attr_accessor :template_root, :is_probed, :has_table, :is_magic
24
+ @is_probed = false # Once a panel is probed this should be set to true
25
+ @has_table = true # default to true. Panels without tables override with self.has_table = false
26
+ @is_magic = false # check this to wrap any functionality targeted at magic panels.
27
+
24
28
  def file_index
25
29
  return @file_index ||= Hash.new do |h,k|
26
30
  h[k] = []
@@ -33,10 +37,17 @@ module Rack::Insight
33
37
 
34
38
  def from_file(rel_path)
35
39
  old_rel, Thread::current['rack-panel_file'] = Thread::current['rack-panel_file'], rel_path
36
- Rack::Insight::Config.config[:panel_load_paths].each do |load_path|
40
+ load_paths_to_check = Rack::Insight::Config.config[:panel_load_paths].length
41
+ Rack::Insight::Config.config[:panel_load_paths].each_with_index do |load_path, index|
37
42
  begin
38
43
  require File::join(load_path, rel_path)
44
+ break # once found
39
45
  rescue LoadError => e
46
+ # TODO: If probes are defined for this panel, instantiate a magic panel
47
+ # if self.has_custom_probes?
48
+ if (index + 1) == load_paths_to_check # You have failed me for the last time!
49
+ warn "Rack::Insight #{e.class}: Unable to find panel specified as '#{rel_path}'. Looked in the following :panel_load_paths: #{Rack::Insight::Config.config[:panel_load_paths].inspect}."
50
+ end
40
51
  end
41
52
  end
42
53
  return (file_index[rel_path] - panel_exclusion)
@@ -91,6 +102,48 @@ module Rack::Insight
91
102
  else
92
103
  @app = app
93
104
  end
105
+
106
+ # User has explicitly declared what classes/methods to probe:
107
+ # Rack::Insight::Config.configure do |config|
108
+ # config[:panel_configs][:log] = {:probes => {'Logger' => [:instance, :add] } }
109
+ # # OR EQUIVALENTLY
110
+ # config[:panel_configs][:log] = {:probes => ['Logger', :instance, :add] }
111
+ # end
112
+ panel_name = self.underscored_name.to_sym
113
+ if self.has_custom_probes?(panel_name)
114
+ custom_probes = Rack::Insight::Config.config[:panel_configs][panel_name][:probes]
115
+ if custom_probes.kind_of?(Hash)
116
+ probe(self) do
117
+ custom_probes.each do |klass, method_probes|
118
+ probe_type = method_probes.shift
119
+ instrument klass do
120
+ self.send("#{probe_type}_probe", *method_probes)
121
+ end
122
+ end
123
+ end
124
+ elsif custom_probes.kind_of?(Array) && custom_probes.length >=3
125
+ probe(self) do
126
+ custom_probes.each do |probe|
127
+ klass = probe.shift
128
+ probe_type = probe.shift
129
+ instrument klass do
130
+ self.send("#{probe_type}_probe", *probe)
131
+ end
132
+ end
133
+ end
134
+ else
135
+ raise "Expected Rack::Insight::Config.config[:panel_configs][#{self.as_sym.inspect}][:probes] to be a kind of Hash or an Array with length >= 3, but is a #{Rack::Insight::Config.config[:panel_configs][self.as_sym][:probes].class}"
136
+ end
137
+ end
138
+
139
+ # Setup a table for the panel unless
140
+ # 1. self.has_table = false has been set for the Panel class
141
+ # 2. class instance variable @has_table has been set to false
142
+ # 3. table_setup has already been called by the sub class' initializer
143
+ if !has_table?
144
+ table_setup(self.name)
145
+ end
146
+ #puts "Initalization Complete for #{panel_name}\n1. #{self.is_magic?} && 2. #{self.has_table?} && 3. #{self.is_probed?} 4. #{self.has_custom_probes?}"
94
147
  end
95
148
 
96
149
  def call(env)
@@ -113,20 +166,126 @@ module Rack::Insight
113
166
  {}
114
167
  end
115
168
 
169
+ def has_table?
170
+ !!self.class.has_table
171
+ end
172
+
173
+ def is_magic?
174
+ !!self.class.is_magic
175
+ end
176
+
116
177
  def has_content?
117
178
  true
118
179
  end
119
180
 
181
+ def is_probed?
182
+ !!self.class.is_probed
183
+ end
184
+
185
+ def has_custom_probes?(panel_name = self.underscored_name.to_sym)
186
+ #puts "Rack::Insight::Config.config[:panel_configs][#{panel_name.inspect}]: #{Rack::Insight::Config.config[:panel_configs][panel_name].inspect}"
187
+ Rack::Insight::Config.config[:panel_configs][panel_name].respond_to?(:[]) &&
188
+ !Rack::Insight::Config.config[:panel_configs][panel_name][:probes].nil?
189
+ end
190
+
191
+ # The name informs the table name, and the panel_configs hash among other things.
192
+ # Override in subclass panels if you want a custom name
120
193
  def name
121
- "Unnamed panel: #{self.class.name}" #for shame
194
+ self.underscored_name
195
+ end
196
+
197
+ # Mostly stolen from Rails' ActiveSupport' underscore method:
198
+ # See activesupport/lib/active_support/inflector/methods.rb, line 77
199
+ # HTTPClientPanel => http_client
200
+ # LogPanel => log
201
+ # ActiveRecordPanel => active_record
202
+ def underscored_name(word = self.class.to_s)
203
+ @underscored_name ||= begin
204
+ words = word.dup.split('::')
205
+ word = words.last
206
+ if word == 'Panel'
207
+ word = words[-2] # Panel class is Panel... and this won't do.
208
+ end
209
+ #word.gsub!(/(?:([A-Za-z\d])|^)(#{inflections.acronym_regex})(?=\b|[^a-z])/) { "#{$1}#{$1 && '_'}#{$2.downcase}" }
210
+ word.gsub!(/Panel$/,'')
211
+ word.gsub!(/([A-Z\d]+)([A-Z][a-z])/,'\1_\2')
212
+ word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
213
+ word.tr!("-", "_")
214
+ word.downcase!
215
+ word
216
+ end
217
+ end
218
+
219
+ def camelized_name(str = self.underscored_name)
220
+ str.split('_').map {|w| w.capitalize}.join
122
221
  end
123
222
 
124
223
  def heading_for_request(number)
125
- heading rescue "xxx" #XXX: no panel should need this
224
+ if !self.has_table?
225
+ heading
226
+ else
227
+ num = count(number)
228
+ if num == 0
229
+ heading
230
+ else
231
+ "#{self.camelized_name} (#{num})"
232
+ end
233
+ end
234
+ rescue 'XXX' # no panel should need this
126
235
  end
127
236
 
128
237
  def content_for_request(number)
129
- content rescue "" #XXX: no panel should need this
238
+ logger.info("Rack::Insight is using default content_for_request for #{self.class}") if verbose(:med)
239
+ if !self.has_table?
240
+ logger.info("#{self.class} is being used without a table") if verbose(:med)
241
+ content
242
+ elsif self.is_probed?
243
+ html = "<h3>#{self.camelized_name}</h3>"
244
+ invocations = retrieve(number)
245
+ if invocations.length > 0 && invocations.first.is_a?(Rack::Insight::Panel::DefaultInvocation)
246
+ html += '<table><thead><tr>'
247
+ logger.info("Rack::Insight is using magic content for #{self.class}, which is probed") if verbose(:med)
248
+ members = invocations.first.members # is a struct, so we have members, not keys
249
+ members.each do |member|
250
+ html += '<td>' << member.to_s << '</td>'
251
+ end
252
+ html += '</tr></thead><tbody>'
253
+ invocations.each do |invocation|
254
+ html += '<tr>'
255
+ members.each do |member|
256
+ html += '<td>' << invocation.send(member).inspect << '</td>'
257
+ end
258
+ html += '</tr>'
259
+ end
260
+ html += '</tbody></table>'
261
+ else
262
+ html += '<p>No Data Available</p>'
263
+ end
264
+ html
265
+ else
266
+ content
267
+ end
268
+ rescue 'XXX' #XXX: no panel should need this
269
+ end
270
+
271
+ def heading
272
+ self.camelized_name
273
+ end
274
+
275
+ def content
276
+ logger.info("Rack::Insight is using default content for #{self.class}") if verbose(:med)
277
+ html = "<h3>#{self.camelized_name}</h3>"
278
+ html += '<p>Add a content method to your panel</p>'
279
+ html
280
+ end
281
+
282
+ # Override in subclasses.
283
+ # This is to make magic classes work.
284
+ def after_detect(method_call, timing, args, result)
285
+ #puts "Default After Detect for #{self.underscored_name}: 1. #{self.is_magic?} && 2. #{self.has_table?} && 3. #{self.is_probed?}"
286
+ if self.is_magic? && self.has_table? && self.is_probed?
287
+ store(@env, DefaultInvocation.new(method_call.to_s, timing.duration, args, result))
288
+ end
130
289
  end
131
290
 
132
291
  def before(env)
@@ -138,6 +297,16 @@ module Rack::Insight
138
297
  def render(template)
139
298
  end
140
299
 
300
+ # For Magic Panels (not fully implemented)
301
+ class DefaultInvocation < Struct.new :method, :time, :args, :result
302
+ def initialize(*args)
303
+ @time = human_time(args[1])
304
+ end
305
+ def human_time(t)
306
+ "%.2fms" % (t * 1_000)
307
+ end
308
+ end
309
+
141
310
  end
142
311
 
143
312
  end
@@ -1,16 +1,5 @@
1
1
  module Rack::Insight
2
2
  class ActiveRecordPanel < Panel
3
- def initialize(app)
4
- super
5
-
6
- table_setup("active_record")
7
-
8
- probe(self) do
9
- instrument "ActiveRecord::Base" do
10
- class_probe :allocate
11
- end
12
- end
13
- end
14
3
 
15
4
  def request_start(env, start)
16
5
  @records = Hash.new{ 0 }
@@ -24,10 +13,6 @@ module Rack::Insight
24
13
  store(env, @records)
25
14
  end
26
15
 
27
- def name
28
- "active_record"
29
- end
30
-
31
16
  def heading_for_request(number)
32
17
  record = retrieve(number).first
33
18
  total = record.inject(0) do |memo, (key, value)|
@@ -6,16 +6,6 @@ module Rack::Insight
6
6
  #require "rack/insight/panels/sql_panel/panel_app"
7
7
  #require "rack/insight/panels/sql_panel/query"
8
8
 
9
- def initialize(app)
10
- super
11
- probe(self) do
12
- instrument "ActiveResource::Connection" do
13
- instance_probe :request
14
- end
15
- end
16
- table_setup("active_resource_requests")
17
- end
18
-
19
9
  def after_detect(method_call, timing, arguments, results)
20
10
  body = "<no body>"
21
11
  if results.respond_to? :body
@@ -30,10 +20,6 @@ module Rack::Insight
30
20
  end)
31
21
  end
32
22
 
33
- def name
34
- "active_resource"
35
- end
36
-
37
23
  def heading_for_request(number)
38
24
  queries = retrieve(number)
39
25
  "ARes: #{queries.size} Queries (%.2fms)" % total_time(queries)
@@ -4,27 +4,6 @@ module Rack::Insight
4
4
  require "rack/insight/panels/cache_panel/panel_app"
5
5
  require "rack/insight/panels/cache_panel/stats"
6
6
 
7
- def initialize(app)
8
- super
9
-
10
- probe(self) do
11
- instrument("Memcached") do
12
- instance_probe :decrement, :get, :increment, :set, :add,
13
- :replace, :delete, :prepend, :append
14
- end
15
-
16
- instrument("MemCache") do
17
- instance_probe :decr, :get, :get_multi, :incr, :set, :add, :delete
18
- end
19
-
20
- instrument("Dalli::Client") do
21
- instance_probe :perform
22
- end
23
- end
24
-
25
- table_setup("cache")
26
- end
27
-
28
7
  def request_start(env, start)
29
8
  @stats = Stats.new
30
9
  end
@@ -46,10 +25,6 @@ module Rack::Insight
46
25
  PanelApp.new
47
26
  end
48
27
 
49
- def name
50
- "cache"
51
- end
52
-
53
28
  def heading_for_request(number)
54
29
  stats = retrieve(number).first
55
30
 
@@ -22,8 +22,12 @@ module Rack::Insight
22
22
  end
23
23
 
24
24
  def initialize(app)
25
- probe(self) do
26
- if !Rack::Insight::Config.config[:panel_configs][:log_panel].respond_to?(:[])
25
+
26
+ # Call super before setting up probes in case there are any custom probes configured
27
+ super # will setup custom probes
28
+
29
+ unless is_probed?
30
+ probe(self) do
27
31
  # Trying to be smart...
28
32
  if defined?(ActiveSupport)
29
33
  instrument "ActiveSupport::BufferedLogger" do
@@ -34,31 +38,8 @@ module Rack::Insight
34
38
  instance_probe :add
35
39
  end
36
40
  end
37
- else
38
- # User has explicitly declared what log classes to monitor:
39
- # Rack::Insight::Config.configure do |config|
40
- # config[:panel_configs][:log_panel] = {:watch => {'Logger' => :add}}
41
- # end
42
- Rack::Insight::Config.config[:panel_configs][:log_panel][:watch].each do |klass, method_probe|
43
- instrument klass do
44
- instance_probe method_probe
45
- end
46
- end
47
41
  end
48
42
  end
49
-
50
- table_setup("log_entries")
51
-
52
- super
53
- end
54
-
55
- def name
56
- "log"
57
- end
58
-
59
- def heading_for_request(number)
60
- num = count(number)
61
- "Logs (#{num})"
62
43
  end
63
44
 
64
45
  def content_for_request(number)
@@ -1,10 +1,6 @@
1
1
  module Rack::Insight
2
2
 
3
3
  class MemoryPanel < Panel
4
- def initialize(app)
5
- super
6
- table_setup("memory_records")
7
- end
8
4
 
9
5
  def before(env)
10
6
  @original_memory = `ps -o rss= -p #{$$}`.to_i
@@ -27,10 +23,6 @@ module Rack::Insight
27
23
  false
28
24
  end
29
25
 
30
- def name
31
- "Memory"
32
- end
33
-
34
26
  end
35
27
 
36
28
  end
@@ -4,6 +4,8 @@ module Rack::Insight
4
4
  require "rack/insight/panels/mongo_panel/mongo_extension"
5
5
  require "rack/insight/panels/mongo_panel/stats"
6
6
 
7
+ self.has_table = false
8
+
7
9
  def self.record(command, &block)
8
10
  return block.call unless Rack::Insight.enabled?
9
11
 
@@ -22,10 +24,6 @@ module Rack::Insight
22
24
  Thread.current["rack-insight.mongo"] ||= Stats.new
23
25
  end
24
26
 
25
- def name
26
- "mongo"
27
- end
28
-
29
27
  def heading
30
28
  "Mongo: %.2fms (#{self.class.stats.queries.size} calls)" % self.class.stats.time
31
29
  end
@@ -1,9 +1,7 @@
1
1
  module Rack::Insight
2
2
  class RailsInfoPanel < Panel
3
3
 
4
- def name
5
- "rails_info"
6
- end
4
+ self.has_table = false
7
5
 
8
6
  def heading
9
7
  return unless (defined?(Rails) && defined?(Rails::Info))
@@ -5,6 +5,8 @@ module Rack::Insight
5
5
 
6
6
  require "rack/insight/panels/redis_panel/stats"
7
7
 
8
+ self.has_table = false
9
+
8
10
  def self.record(redis_command_args, backtrace, &block)
9
11
  return block.call unless Rack::Insight.enabled?
10
12
 
@@ -23,10 +25,6 @@ module Rack::Insight
23
25
  Thread.current["rack-insight.redis"] ||= Stats.new
24
26
  end
25
27
 
26
- def name
27
- "redis"
28
- end
29
-
30
28
  def heading
31
29
  "Redis: %.2fms (#{self.class.stats.queries.size} calls)" % self.class.stats.time
32
30
  end
@@ -1,14 +1,5 @@
1
1
  module Rack::Insight
2
2
  class RequestVariablesPanel < Panel
3
- def initialize(app)
4
- super
5
-
6
- table_setup("request_variables")
7
- end
8
-
9
- def name
10
- "request_variables"
11
- end
12
3
 
13
4
  def after(env,status,headers,body)
14
5
  sections = {}
@@ -52,12 +52,10 @@ module Rack::Insight
52
52
  super
53
53
  end
54
54
 
55
-
56
55
  def call(env)
57
56
  env['rack-insight.speedtracer-id'] = @uuid
58
57
 
59
58
  status, headers, body = @app.call(env)
60
-
61
59
  store(env, env['rack-insight.speedtracer-id'], env['rack-insight.speedtracer-record'])
62
60
  headers['X-TraceUrl'] = '__insight__/speedtracer?id=' + env['rack-insight.speedtracer-id']
63
61
  return [status, headers, body]
@@ -67,10 +65,6 @@ module Rack::Insight
67
65
  { "speedtracer" => TraceApp.new }
68
66
  end
69
67
 
70
- def name
71
- "speedtracer"
72
- end
73
-
74
68
  def heading
75
69
  "#{table_length} traces"
76
70
  end
@@ -7,6 +7,11 @@ module Rack::Insight
7
7
 
8
8
  FourOhFour = [404, {"Content-Type" => "text/html"}, "App tracker doesn't know that path or id"].freeze
9
9
 
10
+ class << self
11
+ attr_accessor :has_table
12
+ end
13
+ self.has_table = true
14
+
10
15
  def initialize
11
16
  table_setup("speedtracer", "uuid")
12
17
  key_sql_template = "'%s'"
@@ -4,6 +4,8 @@ module Rack::Insight
4
4
  require "rack/insight/panels/sphinx_panel/sphinx_extension"
5
5
  require "rack/insight/panels/sphinx_panel/stats"
6
6
 
7
+ self.has_table = false
8
+
7
9
  def self.record(*sphinx_command_args, &block)
8
10
  return block.call unless Rack::Insight.enabled?
9
11
 
@@ -22,10 +24,6 @@ module Rack::Insight
22
24
  Thread.current["rack-insight.sphinx"] ||= Stats.new
23
25
  end
24
26
 
25
- def name
26
- "sphinx"
27
- end
28
-
29
27
  def heading
30
28
  "Sphinx: %.2fms (#{self.class.stats.queries.size} calls)" % self.class.stats.time
31
29
  end
@@ -7,19 +7,6 @@ module Rack::Insight
7
7
  require "rack/insight/panels/sql_panel/panel_app"
8
8
  require "rack/insight/panels/sql_panel/query"
9
9
 
10
- def initialize(app)
11
- super
12
- probe(self) do
13
- %w{ PostgreSQLAdapter MysqlAdapter SQLiteAdapter
14
- Mysql2Adapter OracleEnhancedAdapter }.each do |adapter|
15
- instrument "ActiveRecord::ConnectionAdapters::#{adapter}" do
16
- instance_probe :execute
17
- end
18
- end
19
- end
20
- table_setup("sql_queries")
21
- end
22
-
23
10
  def self.panel_mappings
24
11
  { "sql" => PanelApp.new }
25
12
  end
@@ -34,10 +21,6 @@ module Rack::Insight
34
21
  end)
35
22
  end
36
23
 
37
- def name
38
- "sql"
39
- end
40
-
41
24
  def heading_for_request(number)
42
25
  queries = retrieve(number)
43
26
  "#{queries.size} Queries (%.2fms)" % total_time(queries)
@@ -6,14 +6,6 @@ module Rack::Insight
6
6
  def initialize(app)
7
7
  super
8
8
 
9
- probe(self) do
10
- instrument "ActionView::Template" do
11
- instance_probe :render
12
- end
13
- end
14
-
15
- table_setup("templates")
16
-
17
9
  @current = nil
18
10
  end
19
11
 
@@ -40,17 +32,12 @@ module Rack::Insight
40
32
  @current = @current.parent
41
33
  end
42
34
 
43
- def name
44
- "templates"
45
- end
46
-
47
35
  def heading_for_request(number)
48
36
  "Templates: %.2fms" % (retrieve(number).inject(0.0){|memo, rendering| memo + rendering.duration})
49
37
  end
50
38
 
51
39
  def content_for_request(number)
52
- result = render_template "panels/templates", :root_rendering => retrieve(number).first
53
- return result
40
+ render_template "panels/templates", :root_rendering => retrieve(number).first
54
41
  end
55
42
 
56
43
  end
@@ -2,14 +2,6 @@ require 'benchmark'
2
2
 
3
3
  module Rack::Insight
4
4
  class TimerPanel < Panel
5
- def initialize(app)
6
- super
7
- table_setup("timer")
8
- end
9
-
10
- def name
11
- "timer"
12
- end
13
5
 
14
6
  def call(env)
15
7
  status, headers, body = nil
@@ -36,5 +28,6 @@ module Rack::Insight
36
28
  def content_for_request(number)
37
29
  render_template "panels/timer", :measurements => retrieve(number).first
38
30
  end
31
+
39
32
  end
40
33
  end
@@ -9,6 +9,7 @@ jQuery(function($) {
9
9
 
10
10
  Insight.prototype = {
11
11
  switchCurrentPanel: function() {
12
+ console.log(this.panel_id);
12
13
  if(this.request_id && this.panel_id) {
13
14
  this.current = $('#rack-insight #request_' + this.request_id + ' #' + this.panel_id)
14
15
  }
@@ -1,7 +1,7 @@
1
1
  module Rack
2
2
  module Insight
3
3
 
4
- VERSION = '0.5.13'
4
+ VERSION = '0.5.14'
5
5
 
6
6
  end
7
7
  end
@@ -4,7 +4,7 @@
4
4
  <li>
5
5
  <% begin %>
6
6
  <% if panel.has_content? %>
7
- <a href="#" class="<%= panel.name %>">
7
+ <a href="#" class="<%= panel.camelized_name %>Panel">
8
8
  <%= panel.heading_for_request(request_id) %>
9
9
  </a>
10
10
  <% else %>
@@ -1,7 +1,7 @@
1
1
  <div id="request_<%=request_id%>">
2
2
  <% panels.each do |panel| %>
3
3
  <% if panel.has_content? %>
4
- <div class="panel_content" id="<%= panel.name %>">
4
+ <div class="panel_content" id="<%= panel.camelized_name %>Panel">
5
5
  <div class="panel_controls">
6
6
  <form action="#">
7
7
  <select id="request_id_menu" name="current_request">
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rack-insight
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.13
4
+ version: 0.5.14
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -12,7 +12,7 @@ authors:
12
12
  autorequire:
13
13
  bindir: bin
14
14
  cert_chain: []
15
- date: 2012-09-10 00:00:00.000000000 Z
15
+ date: 2012-09-11 00:00:00.000000000 Z
16
16
  dependencies:
17
17
  - !ruby/object:Gem::Dependency
18
18
  name: rack