active-record-profiler 1.2.1 → 2.0.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.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/.ruby-version +1 -1
- data/CHANGELOG.md +5 -1
- data/README.md +6 -0
- data/active-record-profiler.gemspec +2 -2
- data/app/helpers/active_record_profiler/reports_helper.rb +4 -0
- data/app/views/active_record_profiler/reports/_report_table.html.erb +4 -4
- data/config/initializers/default_config.rb +1 -0
- data/lib/active-record-profiler.rb +4 -3
- data/lib/active-record-profiler/collector.rb +8 -4
- data/lib/active-record-profiler/engine.rb +5 -3
- data/lib/active-record-profiler/version.rb +1 -1
- data/test/active_record_profiler/collector_test.rb +41 -0
- data/test/active_record_profiler_test.rb +2 -2
- data/test/dummy/config/application.rb +0 -3
- metadata +11 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c12f1f799f5c869fcf16f72e489ac780fceec1e
|
4
|
+
data.tar.gz: 4e48ed70ce4e865c1b6455d348406758c6093a8e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0ab8ee51d8c05c57b3e66b509c66da56950b9e0a56bcd675878139324195059c63e48035b69c1b874cb8ed3b6e2aadf0a489e140feca165289de3cea2c3bf31c
|
7
|
+
data.tar.gz: 1c85774fa1246002d9dbca6b845d87ab5adac01451fd2ea0111c96d9a6bd29641784a85939b626a6281fe36255d5398c603437ce2d61aa142f977a504380dfd5
|
data/.gitignore
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.2.4
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
# 2.0.0
|
2
|
+
|
3
|
+
* Rails 5 compatibility
|
4
|
+
|
1
5
|
# 1.2.0
|
2
6
|
|
3
7
|
* Support for registering alternate editor URL schemes (see README)
|
@@ -7,7 +11,7 @@
|
|
7
11
|
* Add self-profiling for the logger component
|
8
12
|
* Prevent calling a logger.add block twice in the unusual case where the block returns a nil message.
|
9
13
|
* Convert duration in events from milliseconds to seconds (doh!). You'll want to clear old profiler data when upgrading.
|
10
|
-
* Don't accumulate statistics for queries fulfilled by the CACHE
|
14
|
+
* Don't accumulate statistics for queries fulfilled by the CACHE
|
11
15
|
|
12
16
|
# 1.0
|
13
17
|
|
data/README.md
CHANGED
@@ -24,6 +24,12 @@ Add it to your Gemfile, like so:
|
|
24
24
|
gem 'active-record-profiler'
|
25
25
|
```
|
26
26
|
|
27
|
+
If you are using a version of Rails older than 5, you'll want the 1.2 release:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
gem 'active-record-profiler', '~> 1.2.1'
|
31
|
+
```
|
32
|
+
|
27
33
|
Then do `bundle install`, and then add a new initializer, `config/initializers/active_record_profiler.rb`:
|
28
34
|
|
29
35
|
```ruby
|
@@ -21,8 +21,8 @@ EOF
|
|
21
21
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
22
22
|
spec.require_paths = ["lib"]
|
23
23
|
|
24
|
-
spec.add_dependency "rails", "
|
25
|
-
spec.add_dependency "jquery-rails"
|
24
|
+
spec.add_dependency "rails", ">= 5.0"
|
25
|
+
spec.add_dependency "jquery-rails"
|
26
26
|
|
27
27
|
spec.add_development_dependency "bundler", "~> 1.3"
|
28
28
|
spec.add_development_dependency "rake", "~> 10.3"
|
@@ -3,16 +3,16 @@
|
|
3
3
|
<tr>
|
4
4
|
<th class="location">Location</th>
|
5
5
|
<th class="duration">
|
6
|
-
<%= report_column_header_link(ActiveRecordProfiler::Collector::DURATION, @report_options[:sort], 'Total Duration (s)',
|
6
|
+
<%= report_column_header_link(ActiveRecordProfiler::Collector::DURATION, @report_options[:sort], 'Total Duration (s)', report_params) %>
|
7
7
|
</th>
|
8
8
|
<th class="count">
|
9
|
-
<%= report_column_header_link(ActiveRecordProfiler::Collector::COUNT, @report_options[:sort], 'Count',
|
9
|
+
<%= report_column_header_link(ActiveRecordProfiler::Collector::COUNT, @report_options[:sort], 'Count', report_params) %>
|
10
10
|
</th>
|
11
11
|
<th class="average-duration">
|
12
|
-
<%= report_column_header_link(ActiveRecordProfiler::Collector::AVG_DURATION, @report_options[:sort], 'Avg. Duration (ms)',
|
12
|
+
<%= report_column_header_link(ActiveRecordProfiler::Collector::AVG_DURATION, @report_options[:sort], 'Avg. Duration (ms)', report_params) %>
|
13
13
|
</th>
|
14
14
|
<th class="max-duration">
|
15
|
-
<%= report_column_header_link(ActiveRecordProfiler::Collector::LONGEST, @report_options[:sort], 'Max. Duration (ms)',
|
15
|
+
<%= report_column_header_link(ActiveRecordProfiler::Collector::LONGEST, @report_options[:sort], 'Max. Duration (ms)', report_params) %>
|
16
16
|
</th>
|
17
17
|
<th class="max-duration-sql">SQL for Max Duration</th>
|
18
18
|
</tr>
|
@@ -4,5 +4,6 @@ ActiveRecordProfiler.sql_ignore_pattern =
|
|
4
4
|
/^(SHOW (:?FULL )?FIELDS |SET SQL_AUTO_IS_NULL|SET NAMES |EXPLAIN |BEGIN|COMMIT|PRAGMA )/i
|
5
5
|
ActiveRecordProfiler.app_path_pattern = Regexp.new(Regexp.quote("#{Rails.root.expand_path}/") + "(:?app|lib|vendor)/")
|
6
6
|
ActiveRecordProfiler.trim_root_path = "#{Rails.root.expand_path}/"
|
7
|
+
ActiveRecordProfiler.trim_cache_id_pattern = /___?[0-9]+_[0-9]+(?=')/
|
7
8
|
ActiveRecordProfiler.profile_self = false
|
8
9
|
ActiveRecordProfiler.link_location = false
|
@@ -7,8 +7,9 @@ require "active-record-profiler/engine" if defined?(Rails)
|
|
7
7
|
module ActiveRecordProfiler
|
8
8
|
require 'fileutils'
|
9
9
|
require 'json'
|
10
|
-
|
11
|
-
mattr_accessor :link_location, :stats_flush_period, :profile_dir,
|
12
|
-
:sql_ignore_pattern, :app_path_pattern, :trim_root_path,
|
10
|
+
|
11
|
+
mattr_accessor :link_location, :stats_flush_period, :profile_dir,
|
12
|
+
:sql_ignore_pattern, :app_path_pattern, :trim_root_path,
|
13
|
+
:trim_cache_id_pattern, :profile_self
|
13
14
|
end
|
14
15
|
|
@@ -42,7 +42,11 @@ module ActiveRecordProfiler
|
|
42
42
|
|
43
43
|
# This prefix will be removed from location names, for brevity.
|
44
44
|
cattr_accessor :trim_root_path
|
45
|
-
|
45
|
+
|
46
|
+
# This pattern will be removed from location names, to remove cache ids that change
|
47
|
+
# when templates are recompiled.
|
48
|
+
cattr_accessor :trim_cache_id_pattern
|
49
|
+
|
46
50
|
# Controls whether or not to record profiling data for time spent in the
|
47
51
|
# profiler code itself.
|
48
52
|
cattr_accessor :profile_self
|
@@ -188,8 +192,8 @@ module ActiveRecordProfiler
|
|
188
192
|
protected
|
189
193
|
|
190
194
|
def find_app_call_location(call_stack)
|
191
|
-
call_stack
|
192
|
-
|
195
|
+
call_stack ||= caller(2)
|
196
|
+
call_stack.each do |frame|
|
193
197
|
if app_path_pattern.match(frame)
|
194
198
|
return trim_location(frame)
|
195
199
|
end
|
@@ -198,7 +202,7 @@ module ActiveRecordProfiler
|
|
198
202
|
end
|
199
203
|
|
200
204
|
def trim_location(loc)
|
201
|
-
loc.sub(trim_root_path, '')
|
205
|
+
loc.sub(trim_root_path, '').sub(trim_cache_id_pattern, '')
|
202
206
|
end
|
203
207
|
|
204
208
|
def update_counts(location, seconds, count, sql, longest = nil)
|
@@ -8,10 +8,12 @@ module ActiveRecordProfiler
|
|
8
8
|
|
9
9
|
initializer "active_record_profiler.apply_default" do
|
10
10
|
# Copy module settings to collector class
|
11
|
-
[
|
12
|
-
|
11
|
+
[
|
12
|
+
:stats_flush_period, :profile_dir, :sql_ignore_pattern,
|
13
|
+
:app_path_pattern, :trim_root_path, :trim_cache_id_pattern,
|
14
|
+
:profile_self
|
13
15
|
].each do |config_item|
|
14
|
-
ActiveRecordProfiler::Collector.send("#{config_item}=".to_sym,
|
16
|
+
ActiveRecordProfiler::Collector.send("#{config_item}=".to_sym,
|
15
17
|
ActiveRecordProfiler.send(config_item))
|
16
18
|
end
|
17
19
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'test_helper.rb'
|
2
|
+
|
3
|
+
module ActiveRecordProfiler
|
4
|
+
class CollectorTest < ActiveSupport::TestCase
|
5
|
+
def setup
|
6
|
+
@test_log = StringIO.new
|
7
|
+
ActiveRecord::Base.logger = ActiveSupport::Logger.new(@test_log)
|
8
|
+
end
|
9
|
+
|
10
|
+
def test_template_path_removes_app_root
|
11
|
+
stack_locations = [
|
12
|
+
"/var/deploy/current/app/views/users/_row.html.erb:34:in `_app_views_users__row_html_erb___3709568271919910637_70125680359900'",
|
13
|
+
"/var/deploy/current/app/views/users/index.html.erb:34:in `_app_views_users_index_html_erb__1553888856029099377_70230900703660'",
|
14
|
+
"/var/deploy/rbenv/versions/2.2.4/lib/ruby/gems/2.2.0/gems/actionview-5.1.4/lib/action_view/template.rb:352:in `instrument_render_template'",
|
15
|
+
]
|
16
|
+
location = app_collector.call_location_name(stack_locations)
|
17
|
+
|
18
|
+
assert_match(%r{\A/app/views/users/_row.html.erb:34:in `}, location)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_template_path_includes_only_real_path_components
|
22
|
+
stack_locations = [
|
23
|
+
"/var/deploy/current/app/views/users/_row.html.erb:34:in `_app_views_users__row_html_erb___3709568271919910637_70125680359900'",
|
24
|
+
"/var/deploy/current/app/views/users/index.html.erb:34:in `_app_views_users_index_html_erb__1553888856029099377_70230900703660'",
|
25
|
+
"/var/deploy/rbenv/versions/2.2.4/lib/ruby/gems/2.2.0/gems/actionview-5.1.4/lib/action_view/template.rb:352:in `instrument_render_template'",
|
26
|
+
]
|
27
|
+
location = app_collector.call_location_name(stack_locations)
|
28
|
+
|
29
|
+
assert_match(/in `.*app.*views.*users.*row.*html.*erb'\z/, location)
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def app_collector(app_root: "/var/deploy/current")
|
35
|
+
@app_collector ||= Collector.new.tap do |collector|
|
36
|
+
collector.app_path_pattern = Regexp.new(Regexp.quote("/var/deploy/current"))
|
37
|
+
collector.trim_root_path = "/var/deploy/current"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -7,13 +7,13 @@ class ActiveRecordProfilerTest < ActiveSupport::TestCase
|
|
7
7
|
ActiveRecord::Base.logger = ActiveRecordProfiler::Logger.new(
|
8
8
|
ActiveSupport::Logger.new(@test_log))
|
9
9
|
end
|
10
|
-
|
10
|
+
|
11
11
|
def test_caller_location_appears_in_log
|
12
12
|
sql = 'SELECT 1 FROM widgets'
|
13
13
|
ActiveRecord::Base.connection.select_value(sql)
|
14
14
|
@test_log.rewind
|
15
15
|
log_data = @test_log.read
|
16
|
-
assert_match Regexp.new(Regexp.quote(sql)
|
16
|
+
assert_match Regexp.new(Regexp.quote(sql)), log_data
|
17
17
|
end
|
18
18
|
|
19
19
|
def test_profiler_records_query_site
|
@@ -17,9 +17,6 @@ module Dummy
|
|
17
17
|
# The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
|
18
18
|
# config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
|
19
19
|
# config.i18n.default_locale = :de
|
20
|
-
|
21
|
-
# Do not swallow errors in after_commit/after_rollback callbacks.
|
22
|
-
config.active_record.raise_in_transactional_callbacks = true
|
23
20
|
end
|
24
21
|
end
|
25
22
|
|
metadata
CHANGED
@@ -1,49 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active-record-profiler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ben Turner
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '
|
19
|
+
version: '5.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '
|
26
|
+
version: '5.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: jquery-rails
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
34
|
-
- - "<"
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version: '4.1'
|
33
|
+
version: '0'
|
37
34
|
type: :runtime
|
38
35
|
prerelease: false
|
39
36
|
version_requirements: !ruby/object:Gem::Requirement
|
40
37
|
requirements:
|
41
38
|
- - ">="
|
42
39
|
- !ruby/object:Gem::Version
|
43
|
-
version: '
|
44
|
-
- - "<"
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: '4.1'
|
40
|
+
version: '0'
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
42
|
name: bundler
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -140,6 +134,7 @@ files:
|
|
140
134
|
- lib/active-record-profiler/version.rb
|
141
135
|
- screenshots/enhanced-log.png
|
142
136
|
- screenshots/web-reports.png
|
137
|
+
- test/active_record_profiler/collector_test.rb
|
143
138
|
- test/active_record_profiler_test.rb
|
144
139
|
- test/database.yml
|
145
140
|
- test/dummy/README.rdoc
|
@@ -213,11 +208,12 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
213
208
|
version: '0'
|
214
209
|
requirements: []
|
215
210
|
rubyforge_project:
|
216
|
-
rubygems_version: 2.
|
211
|
+
rubygems_version: 2.6.13
|
217
212
|
signing_key:
|
218
213
|
specification_version: 4
|
219
214
|
summary: Enhances ActiveRecord logging and profiles queries
|
220
215
|
test_files:
|
216
|
+
- test/active_record_profiler/collector_test.rb
|
221
217
|
- test/active_record_profiler_test.rb
|
222
218
|
- test/database.yml
|
223
219
|
- test/dummy/README.rdoc
|