active_record_query_trace 1.6 → 1.8
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/lib/active_record_query_trace/version.rb +1 -1
- data/lib/active_record_query_trace.rb +78 -32
- metadata +27 -25
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 06d7497a2165d922974efd1ffc10bf6b6725d1c4705f9b5d5464affca6db069e
|
4
|
+
data.tar.gz: 1d5bf04f35d74b69cddc657d9f91795c315ce4b50422cc79aa06843a0299d3e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '09cd3daa1e090acc6e8bafd776c28c3df40f190baccd3799e5b93629a416f890ce4b4514993842830159840fe8d688ef71ba45f54893c62cf053b045c8dd978f'
|
7
|
+
data.tar.gz: d53226b99e6eae63ea2b79abf5db75f4f04c546773dc61fda88962d9de2b4c465f84c3af6481b3778d0410e3c4ed07433b29ba29eba5d4481c04efe9d836118c
|
@@ -33,9 +33,19 @@ module ActiveRecordQueryTrace
|
|
33
33
|
attr_accessor :colorize
|
34
34
|
attr_accessor :query_type
|
35
35
|
attr_accessor :suppress_logging_of_db_reads
|
36
|
+
attr_reader :backtrace_cleaner
|
37
|
+
|
38
|
+
def backtrace_cleaner=(cleaner)
|
39
|
+
@backtrace_cleaner =
|
40
|
+
if cleaner.is_a?(Proc)
|
41
|
+
cleaner
|
42
|
+
else
|
43
|
+
proc { |trace| cleaner.clean(trace) }
|
44
|
+
end
|
45
|
+
end
|
36
46
|
end
|
37
47
|
|
38
|
-
class CustomLogSubscriber < ActiveRecord::LogSubscriber
|
48
|
+
class CustomLogSubscriber < ActiveRecord::LogSubscriber # rubocop:disable Metrics/ClassLength
|
39
49
|
def initialize
|
40
50
|
super
|
41
51
|
ActiveRecordQueryTrace.enabled = false
|
@@ -51,7 +61,7 @@ module ActiveRecordQueryTrace
|
|
51
61
|
payload = event.payload
|
52
62
|
return unless display_backtrace?(payload)
|
53
63
|
|
54
|
-
setup_backtrace_cleaner
|
64
|
+
setup_backtrace_cleaner unless ActiveRecordQueryTrace.backtrace_cleaner
|
55
65
|
|
56
66
|
trace = fully_formatted_trace # Memoize
|
57
67
|
debug(trace) unless trace.blank?
|
@@ -61,34 +71,34 @@ module ActiveRecordQueryTrace
|
|
61
71
|
|
62
72
|
private
|
63
73
|
|
64
|
-
|
65
|
-
|
74
|
+
def cached_query?(payload)
|
75
|
+
return false unless ActiveRecordQueryTrace.ignore_cached_queries
|
76
|
+
payload[:cached] || payload[:name] == 'CACHE'
|
77
|
+
end
|
78
|
+
|
66
79
|
# TODO: refactor and remove rubocop:disable comments.
|
67
80
|
def display_backtrace?(payload)
|
68
81
|
ActiveRecordQueryTrace.enabled \
|
69
82
|
&& !transaction_begin_or_commit_query?(payload) \
|
70
83
|
&& !schema_query?(payload) \
|
71
|
-
&& !(
|
84
|
+
&& !cached_query?(payload) \
|
72
85
|
&& !(ActiveRecordQueryTrace.suppress_logging_of_db_reads && db_read_query?(payload)) \
|
73
86
|
&& display_backtrace_for_query_type?(payload)
|
74
87
|
end
|
75
|
-
# rubocop:enable Metrics/CyclomaticComplexity
|
76
|
-
# rubocop:enable Metrics/PerceivedComplexity
|
77
88
|
|
78
89
|
def display_backtrace_for_query_type?(payload)
|
79
|
-
invalid_type_msg = 'Invalid ActiveRecordQueryTrace.query_type value ' \
|
80
|
-
"#{ActiveRecordQueryTrace.level}. Should be :all, :read, or :write."
|
81
|
-
|
82
90
|
case ActiveRecordQueryTrace.query_type
|
83
91
|
when :all then true
|
84
92
|
when :read then db_read_query?(payload)
|
85
93
|
when :write then !db_read_query?(payload)
|
86
|
-
else
|
94
|
+
else
|
95
|
+
raise 'Invalid ActiveRecordQueryTrace.query_type value ' \
|
96
|
+
"#{ActiveRecordQueryTrace.level}. Should be :all, :read, or :write."
|
87
97
|
end
|
88
98
|
end
|
89
99
|
|
90
100
|
def db_read_query?(payload)
|
91
|
-
|
101
|
+
payload[:sql] !~ /INSERT|UPDATE|DELETE/
|
92
102
|
end
|
93
103
|
|
94
104
|
def fully_formatted_trace
|
@@ -104,24 +114,36 @@ module ActiveRecordQueryTrace
|
|
104
114
|
end
|
105
115
|
|
106
116
|
def transaction_begin_or_commit_query?(payload)
|
107
|
-
payload[:sql]
|
117
|
+
payload[:sql] =~ /\Abegin transaction|commit transaction|BEGIN|COMMIT\Z/
|
108
118
|
end
|
109
119
|
|
110
120
|
def schema_query?(payload)
|
111
121
|
payload[:name] == 'SCHEMA'
|
112
122
|
end
|
113
123
|
|
124
|
+
# rubocop:disable Metrics/MethodLength
|
114
125
|
def clean_trace(full_trace)
|
115
|
-
|
116
|
-
|
117
|
-
|
126
|
+
case ActiveRecordQueryTrace.level
|
127
|
+
when :full
|
128
|
+
trace = full_trace
|
129
|
+
when :app, :rails
|
130
|
+
trace = Rails.backtrace_cleaner.clean(full_trace)
|
131
|
+
when :custom
|
132
|
+
unless ActiveRecordQueryTrace.backtrace_cleaner
|
133
|
+
raise 'Configure your backtrace cleaner first via ActiveRecordQueryTrace.backtrace_cleaner = MyCleaner'
|
134
|
+
end
|
135
|
+
trace = ActiveRecordQueryTrace.backtrace_cleaner.call(full_trace)
|
136
|
+
else
|
137
|
+
raise 'Invalid ActiveRecordQueryTrace.level value ' \
|
138
|
+
"#{ActiveRecordQueryTrace.level}. Should be :full, :rails, or :app."
|
139
|
+
end
|
118
140
|
|
119
|
-
trace = ActiveRecordQueryTrace.level == :full ? full_trace : Rails.backtrace_cleaner.clean(full_trace)
|
120
141
|
# We cant use a Rails::BacktraceCleaner filter to display only the relative
|
121
142
|
# path of application trace lines because it breaks the silencer that selects
|
122
143
|
# the lines to display or hide based on whether they include `Rails.root`.
|
123
|
-
trace.map { |line| line.
|
144
|
+
trace.map { |line| line.sub(rails_root_prefix, '') }
|
124
145
|
end
|
146
|
+
# rubocop:enable Metrics/MethodLength
|
125
147
|
|
126
148
|
# Rails by default silences all backtraces that *do not* match
|
127
149
|
# Rails::BacktraceCleaner::APP_DIRS_PATTERN. In other words, the default
|
@@ -129,11 +151,15 @@ module ActiveRecordQueryTrace
|
|
129
151
|
# application lines.
|
130
152
|
def setup_backtrace_cleaner
|
131
153
|
setup_backtrace_cleaner_path
|
132
|
-
return
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
154
|
+
return if ActiveRecordQueryTrace.level == :full
|
155
|
+
|
156
|
+
remove_filters_and_silencers
|
157
|
+
|
158
|
+
case ActiveRecordQueryTrace.level
|
159
|
+
when :app
|
160
|
+
Rails.backtrace_cleaner.add_silencer { |line| line !~ rails_root_regexp }
|
161
|
+
when :rails
|
162
|
+
Rails.backtrace_cleaner.add_silencer { |line| line =~ rails_root_regexp }
|
137
163
|
end
|
138
164
|
end
|
139
165
|
|
@@ -146,6 +172,11 @@ module ActiveRecordQueryTrace
|
|
146
172
|
Rails.backtrace_cleaner.instance_variable_set :@root, Rails.root.to_s
|
147
173
|
end
|
148
174
|
|
175
|
+
def remove_filters_and_silencers
|
176
|
+
Rails.backtrace_cleaner.remove_filters!
|
177
|
+
Rails.backtrace_cleaner.remove_silencers!
|
178
|
+
end
|
179
|
+
|
149
180
|
# Allow query to be colorized in the terminal
|
150
181
|
def colorize_text(text)
|
151
182
|
return text unless ActiveRecordQueryTrace.colorize
|
@@ -158,22 +189,37 @@ module ActiveRecordQueryTrace
|
|
158
189
|
end
|
159
190
|
|
160
191
|
def color_code
|
192
|
+
return @color_code if @color_code && @configured_color == ActiveRecordQueryTrace.colorize
|
193
|
+
|
194
|
+
@configured_color = ActiveRecordQueryTrace.colorize
|
195
|
+
|
161
196
|
# Backward compatibility for string color names with space as word separator.
|
162
|
-
color_code =
|
197
|
+
@color_code =
|
163
198
|
case ActiveRecordQueryTrace.colorize
|
164
|
-
when Symbol then COLORS[ActiveRecordQueryTrace.colorize]
|
199
|
+
when Symbol, true then COLORS[ActiveRecordQueryTrace.colorize]
|
165
200
|
when String then COLORS[ActiveRecordQueryTrace.colorize.tr("\s", '_').to_sym]
|
166
201
|
end
|
202
|
+
end
|
167
203
|
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
204
|
+
def validate_color_code(color_code)
|
205
|
+
valid_color_code?(color_code) || raise(
|
206
|
+
'ActiveRecordQueryTrace.colorize was set to an invalid ' \
|
207
|
+
"color. Use one of #{COLORS.keys} or a valid color code."
|
208
|
+
)
|
173
209
|
end
|
174
210
|
|
175
211
|
def valid_color_code?(color_code)
|
176
|
-
/\A\d+(
|
212
|
+
/\A\d+(?:;\d+)?\Z/ =~ color_code
|
213
|
+
end
|
214
|
+
|
215
|
+
def rails_root_prefix
|
216
|
+
@rails_root_prefix ||= "#{Rails.root}/"
|
217
|
+
end
|
218
|
+
|
219
|
+
# This cannot be set in a constant as Rails.root is not yet available when
|
220
|
+
# this file is loaded.
|
221
|
+
def rails_root_regexp
|
222
|
+
@rails_root_regexp ||= %r{#{Regexp.escape(Rails.root.to_s)}(?!\/vendor)}
|
177
223
|
end
|
178
224
|
end
|
179
225
|
end
|
@@ -198,7 +244,7 @@ ActiveSupport::LogSubscriber.class_eval do
|
|
198
244
|
|
199
245
|
def debug(*args, &block)
|
200
246
|
return if ActiveRecordQueryTrace.suppress_logging_of_db_reads \
|
201
|
-
&& args.first !~ /
|
247
|
+
&& args.first !~ /INSERT|UPDATE|DELETE|#{ActiveRecordQueryTrace::BACKTRACE_PREFIX}/
|
202
248
|
original_debug(*args, &block)
|
203
249
|
end
|
204
250
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: active_record_query_trace
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: '1.
|
4
|
+
version: '1.8'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cody Caughlan
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-10-13 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -17,110 +17,110 @@ dependencies:
|
|
17
17
|
requirements:
|
18
18
|
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
20
|
+
version: 4.0.0
|
21
21
|
type: :development
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
25
|
- - ">="
|
26
26
|
- !ruby/object:Gem::Version
|
27
|
-
version:
|
27
|
+
version: 4.0.0
|
28
28
|
- !ruby/object:Gem::Dependency
|
29
29
|
name: pry
|
30
30
|
requirement: !ruby/object:Gem::Requirement
|
31
31
|
requirements:
|
32
|
-
- - "
|
32
|
+
- - "~>"
|
33
33
|
- !ruby/object:Gem::Version
|
34
|
-
version:
|
34
|
+
version: 0.13.0
|
35
35
|
type: :development
|
36
36
|
prerelease: false
|
37
37
|
version_requirements: !ruby/object:Gem::Requirement
|
38
38
|
requirements:
|
39
|
-
- - "
|
39
|
+
- - "~>"
|
40
40
|
- !ruby/object:Gem::Version
|
41
|
-
version:
|
41
|
+
version: 0.13.0
|
42
42
|
- !ruby/object:Gem::Dependency
|
43
43
|
name: pry-byebug
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
45
45
|
requirements:
|
46
|
-
- - "
|
46
|
+
- - "~>"
|
47
47
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
48
|
+
version: 3.9.0
|
49
49
|
type: :development
|
50
50
|
prerelease: false
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
52
52
|
requirements:
|
53
|
-
- - "
|
53
|
+
- - "~>"
|
54
54
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
55
|
+
version: 3.9.0
|
56
56
|
- !ruby/object:Gem::Dependency
|
57
57
|
name: rspec
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
59
59
|
requirements:
|
60
60
|
- - ">="
|
61
61
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
62
|
+
version: 3.8.0
|
63
63
|
type: :development
|
64
64
|
prerelease: false
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
66
66
|
requirements:
|
67
67
|
- - ">="
|
68
68
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
69
|
+
version: 3.8.0
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rubocop
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
73
73
|
requirements:
|
74
74
|
- - ">="
|
75
75
|
- !ruby/object:Gem::Version
|
76
|
-
version:
|
76
|
+
version: 0.65.0
|
77
77
|
type: :development
|
78
78
|
prerelease: false
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
80
80
|
requirements:
|
81
81
|
- - ">="
|
82
82
|
- !ruby/object:Gem::Version
|
83
|
-
version:
|
83
|
+
version: 0.65.0
|
84
84
|
- !ruby/object:Gem::Dependency
|
85
85
|
name: rubocop-rspec
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
87
87
|
requirements:
|
88
88
|
- - ">="
|
89
89
|
- !ruby/object:Gem::Version
|
90
|
-
version:
|
90
|
+
version: 1.32.0
|
91
91
|
type: :development
|
92
92
|
prerelease: false
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
94
94
|
requirements:
|
95
95
|
- - ">="
|
96
96
|
- !ruby/object:Gem::Version
|
97
|
-
version:
|
97
|
+
version: 1.32.0
|
98
98
|
- !ruby/object:Gem::Dependency
|
99
99
|
name: simplecov
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
101
101
|
requirements:
|
102
102
|
- - ">="
|
103
103
|
- !ruby/object:Gem::Version
|
104
|
-
version:
|
104
|
+
version: 0.16.1
|
105
105
|
type: :development
|
106
106
|
prerelease: false
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
108
108
|
requirements:
|
109
109
|
- - ">="
|
110
110
|
- !ruby/object:Gem::Version
|
111
|
-
version:
|
111
|
+
version: 0.16.1
|
112
112
|
- !ruby/object:Gem::Dependency
|
113
113
|
name: sqlite3
|
114
114
|
requirement: !ruby/object:Gem::Requirement
|
115
115
|
requirements:
|
116
|
-
- - "
|
116
|
+
- - ">="
|
117
117
|
- !ruby/object:Gem::Version
|
118
118
|
version: 1.3.6
|
119
119
|
type: :development
|
120
120
|
prerelease: false
|
121
121
|
version_requirements: !ruby/object:Gem::Requirement
|
122
122
|
requirements:
|
123
|
-
- - "
|
123
|
+
- - ">="
|
124
124
|
- !ruby/object:Gem::Version
|
125
125
|
version: 1.3.6
|
126
126
|
description: Print stack trace of all DB queries to the Rails log. Helpful to find
|
@@ -144,15 +144,17 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
144
144
|
requirements:
|
145
145
|
- - ">="
|
146
146
|
- !ruby/object:Gem::Version
|
147
|
-
version: '
|
147
|
+
version: '2.4'
|
148
|
+
- - "<"
|
149
|
+
- !ruby/object:Gem::Version
|
150
|
+
version: '4.0'
|
148
151
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
152
|
requirements:
|
150
153
|
- - ">="
|
151
154
|
- !ruby/object:Gem::Version
|
152
155
|
version: '0'
|
153
156
|
requirements: []
|
154
|
-
|
155
|
-
rubygems_version: 2.7.8
|
157
|
+
rubygems_version: 3.0.6
|
156
158
|
signing_key:
|
157
159
|
specification_version: 4
|
158
160
|
summary: Print stack trace of all DB queries to the Rails log. Helpful to find where
|