active-record-profiler 1.2.1 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|