active_record_query_trace 1.6 → 1.8
Sign up to get free protection for your applications and to get access to all the features.
- 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
|