active-profiling 0.0.2 → 0.1.0

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/README.rdoc CHANGED
@@ -2,8 +2,7 @@
2
2
  = ActiveProfiling
3
3
 
4
4
  ActiveProfiling is a gem I've slapped together over the years to help with
5
- profiling Rails applications. It is mostly aimed at profiling actions but
6
- can also be used to profile generic blocks of code.
5
+ profiling Rails applications.
7
6
 
8
7
  == Profiler ActionController Filters
9
8
 
@@ -25,6 +24,9 @@ To enable this filter, add the following to your application configuration:
25
24
 
26
25
  config.active_profiling.profiler.enabled = true
27
26
 
27
+ Additional configuration options can be found in the documentation for
28
+ ActiveProfiling::Railtie.
29
+
28
30
  === +action_gc_statistics+
29
31
 
30
32
  This filter wraps up the functionality of either GC::Profiler in Ruby 1.9+ or
@@ -45,6 +47,9 @@ To enable this filter, add the following to your application configuration:
45
47
 
46
48
  config.active_profiling.gc_statistics.enabled = true
47
49
 
50
+ Additional configuration options can be found in the documentation for
51
+ ActiveProfiling::Railtie.
52
+
48
53
  == Profiling Blocks
49
54
 
50
55
  You can also profile individual blocks of code by using the
@@ -65,6 +70,23 @@ minus the +:enabled+ option.
65
70
  # ...
66
71
  end
67
72
 
73
+
74
+ == Extended ActiveRecord Logging
75
+
76
+ The database can often be a performance hotspot, and tracking down where and
77
+ why some queries are occuring in your application can be a pain.
78
+ ActiveProfiling includes an extended query logger that can be configured
79
+ to log backtraces for SQL queries that can help you track down where
80
+ unexpected queries are occuring in your code.
81
+
82
+ To enable extended logging, add the following to your application
83
+ configuration:
84
+
85
+ config.active_profiling.active_record.backtrace_logger.enabled = true
86
+
87
+ Additional configuration options can be found in the documentation for
88
+ ActiveProfiling::Railtie.
89
+
68
90
  == Using In A Rails Project
69
91
 
70
92
  Profiling should be performed in a production environment, as profiling in
@@ -107,6 +129,8 @@ like so:
107
129
  :print_file => true
108
130
  }
109
131
  config.active_profiling.gc_statistics.enabled = true
132
+
133
+ config.active_profiling.active_record.backtrace_logger.enabled = true
110
134
  end
111
135
 
112
136
  # etc...
@@ -20,7 +20,8 @@ module ActiveProfiling
20
20
  end
21
21
 
22
22
  require 'active-profiling/railtie'
23
- require 'active-profiling/log_subscriber'
24
23
  require 'active-profiling/gc_statistics'
25
24
  require 'active-profiling/ruby_profiler'
26
- require 'active-profiling/action_controller/action_profiling'
25
+ require 'active-profiling/action_controller'
26
+ require 'active-profiling/active_record'
27
+
@@ -0,0 +1,3 @@
1
+
2
+ require 'active-profiling/action_controller/action_profiling'
3
+ require 'active-profiling/action_controller/log_subscriber'
@@ -1,5 +1,5 @@
1
1
 
2
- module ActiveProfiling
2
+ module ActiveProfiling::ActionController
3
3
  class LogSubscriber < ActiveSupport::LogSubscriber
4
4
  def profiler_output(event)
5
5
  return unless logger &&
@@ -56,4 +56,4 @@ module ActiveProfiling
56
56
  end
57
57
  end
58
58
 
59
- ActiveProfiling::LogSubscriber.attach_to :active_profiling
59
+ ActiveProfiling::ActionController::LogSubscriber.attach_to :active_profiling
@@ -0,0 +1,3 @@
1
+
2
+ require 'active-profiling/active_record/backtrace_log_subscriber'
3
+
@@ -0,0 +1,41 @@
1
+
2
+ module ActiveProfiling::ActiveRecord
3
+ class BacktraceLogSubscriber < ::ActiveSupport::LogSubscriber
4
+ def sql(event)
5
+ return unless config.log_level &&
6
+ logger &&
7
+ logger.send("#{config.log_level}?")
8
+
9
+ payload = event.payload
10
+
11
+ return if 'SCHEMA' == payload[:name]
12
+
13
+ backtrace = event.send(:caller).collect { |line|
14
+ if line_match(line)
15
+ " #{line}"
16
+ end
17
+ }.compact
18
+
19
+ unless backtrace.empty?
20
+ name = color(payload[:name], YELLOW, true)
21
+ logger.send(config.log_level, " #{name}\n#{backtrace.join("\n")}")
22
+ end
23
+ end
24
+
25
+ def logger
26
+ ::ActiveRecord::Base.logger
27
+ end
28
+
29
+ protected
30
+ def config
31
+ Rails.application.config.active_profiling.active_record.backtrace_logger
32
+ end
33
+
34
+ def line_match(line)
35
+ config.enabled && (config.verbose || !!(line =~ config.matcher))
36
+ end
37
+ end
38
+ end
39
+
40
+ ActiveProfiling::ActiveRecord::BacktraceLogSubscriber.attach_to :active_record
41
+
@@ -84,15 +84,40 @@ module ActiveProfiling
84
84
  :log_level => :info
85
85
  }.freeze
86
86
 
87
+ # These settings are the default values used for the ActiveRecord
88
+ # backtrace logger.
89
+ #
90
+ # * +:enabled+ - Enables backtrace logging of SQL queries so you can see
91
+ # where your queries originate.
92
+ # * +:verbose+ - Logs all backtrace lines. Normally we have a +:matcher+
93
+ # option that you can use to filter out lines you want to log, but this
94
+ # is a quick method to bypass that matching completely.
95
+ # * +:log_level+ - The log level to use when logging SQL backtraces.
96
+ # * +:matcher+ - A Regexp that is used to match caller lines in the
97
+ # backtraces being logged. By default, this is set to
98
+ # /^#{Rails.root}(?!(\/vendor\/rails|\/\.bundle))/ so that only lines
99
+ # in your application code are logged.
100
+ DEFAULT_AR_BACKTRACE_LOGGER_OPTIONS = {
101
+ :enabled => false,
102
+
103
+ :verbose => false,
104
+
105
+ :log_level => :debug
106
+ }.freeze
107
+
87
108
  config.active_profiling = ActiveSupport::OrderedOptions.new
88
109
  config.active_profiling.profiler = ActiveSupport::OrderedOptions.new
89
110
  config.active_profiling.gc_statistics = ActiveSupport::OrderedOptions.new
111
+ config.active_profiling.active_record = ActiveSupport::OrderedOptions.new
112
+ config.active_profiling.active_record.backtrace_logger = ActiveSupport::OrderedOptions.new
90
113
 
91
114
  initializer "active_profiling.set_profiling_config" do |app|
92
115
  options = app.config.active_profiling
93
116
 
94
117
  options.profiler.reverse_merge!(DEFAULT_PROFILER_OPTIONS)
95
118
  options.gc_statistics.reverse_merge!(DEFAULT_GC_STATISTICS_OPTIONS)
119
+ options.active_record.backtrace_logger.reverse_merge!(DEFAULT_AR_BACKTRACE_LOGGER_OPTIONS)
120
+ options.active_record.backtrace_logger[:matcher] ||= /^#{Rails.root}(?!(\/vendor\/rails|\/\.bundle))/
96
121
  end
97
122
  end
98
123
  end
@@ -36,8 +36,13 @@ module ActiveProfiling
36
36
  GC.disable if options[:disable_gc]
37
37
 
38
38
  result = nil
39
+ exception = nil
39
40
  profiler_result = RubyProf.profile do
40
- result = yield
41
+ begin
42
+ result = yield
43
+ rescue
44
+ exception = $!
45
+ end
41
46
  end
42
47
 
43
48
  case output
@@ -94,7 +99,11 @@ module ActiveProfiling
94
99
  printer_class.new(profiler_result).print(File.open(file_name, 'w'), options[:printer_options])
95
100
  end
96
101
 
97
- result
102
+ if exception
103
+ raise exception
104
+ else
105
+ result
106
+ end
98
107
  ensure
99
108
  GC.enable if options[:disable_gc]
100
109
  end
@@ -1,4 +1,4 @@
1
1
 
2
2
  module ActiveProfiling
3
- VERSION = "0.0.2"
3
+ VERSION = "0.1.0"
4
4
  end
metadata CHANGED
@@ -2,31 +2,31 @@
2
2
  name: active-profiling
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.0.2
5
+ version: 0.1.0
6
6
  platform: ruby
7
7
  authors:
8
8
  - J Smith
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-12-24 00:00:00.000000000 Z
12
+ date: 2013-05-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
- version_requirements: !ruby/object:Gem::Requirement
15
+ name: rails
16
+ type: :runtime
17
+ requirement: !ruby/object:Gem::Requirement
16
18
  requirements:
17
19
  - - ! '>='
18
20
  - !ruby/object:Gem::Version
19
21
  version: '3.0'
20
22
  none: false
21
- name: rails
22
- type: :runtime
23
- prerelease: false
24
- requirement: !ruby/object:Gem::Requirement
23
+ version_requirements: !ruby/object:Gem::Requirement
25
24
  requirements:
26
25
  - - ! '>='
27
26
  - !ruby/object:Gem::Version
28
27
  version: '3.0'
29
28
  none: false
29
+ prerelease: false
30
30
  description: A Rails profiling suite.
31
31
  email: dark.panda@gmail.com
32
32
  executables: []
@@ -41,9 +41,12 @@ files:
41
41
  - Rakefile
42
42
  - active-profiling.gemspec
43
43
  - lib/active-profiling.rb
44
+ - lib/active-profiling/action_controller.rb
44
45
  - lib/active-profiling/action_controller/action_profiling.rb
46
+ - lib/active-profiling/action_controller/log_subscriber.rb
47
+ - lib/active-profiling/active_record.rb
48
+ - lib/active-profiling/active_record/backtrace_log_subscriber.rb
45
49
  - lib/active-profiling/gc_statistics.rb
46
- - lib/active-profiling/log_subscriber.rb
47
50
  - lib/active-profiling/railtie.rb
48
51
  - lib/active-profiling/ruby_profiler.rb
49
52
  - lib/active-profiling/version.rb
@@ -57,6 +60,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
57
60
  requirements:
58
61
  - - ! '>='
59
62
  - !ruby/object:Gem::Version
63
+ segments:
64
+ - 0
65
+ hash: 1112450418277949513
60
66
  version: '0'
61
67
  none: false
62
68
  required_rubygems_version: !ruby/object:Gem::Requirement
@@ -67,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
67
73
  none: false
68
74
  requirements: []
69
75
  rubyforge_project:
70
- rubygems_version: 1.8.23
76
+ rubygems_version: 1.8.24
71
77
  signing_key:
72
78
  specification_version: 3
73
79
  summary: A Rails profiling suite.