active_record_query_trace 1.6.2 → 1.7
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.rb +60 -27
- data/lib/active_record_query_trace/version.rb +1 -1
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3b9863216a6d3587bfe68f4aeee1213e6f1e16475045e20231fac8870f996ccb
|
4
|
+
data.tar.gz: 43a7bd0611953022e35f1909deefb395d35c2c1b2349a49eb5270b0c74566d83
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9936bc3e438c24fc1d652c8710b8f9e82b485ab26f1189ec45667015bc96fa88d7256bd6259247df65b8f81b70eb6b8a0f719027edff01a6626b6fe7c9972d92
|
7
|
+
data.tar.gz: 90568c7a20aa1c64a2465efea7a9769119d5999c2a7bdf01ea785375e3ddc5445132607d0dfe0d0e693b6811e1c8782060270571cc5ef882094073d16ef30a8b
|
@@ -33,6 +33,16 @@ 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
48
|
class CustomLogSubscriber < ActiveRecord::LogSubscriber # rubocop:disable Metrics/ClassLength
|
@@ -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,36 @@ module ActiveRecordQueryTrace
|
|
61
71
|
|
62
72
|
private
|
63
73
|
|
74
|
+
def cached_query?(payload)
|
75
|
+
return false unless ActiveRecordQueryTrace.ignore_cached_queries
|
76
|
+
payload[:cached] || payload[:name] == 'CACHE'
|
77
|
+
end
|
78
|
+
|
64
79
|
# rubocop:disable Metrics/CyclomaticComplexity
|
65
|
-
# rubocop:disable Metrics/PerceivedComplexity
|
66
80
|
# TODO: refactor and remove rubocop:disable comments.
|
67
81
|
def display_backtrace?(payload)
|
68
82
|
ActiveRecordQueryTrace.enabled \
|
69
83
|
&& !transaction_begin_or_commit_query?(payload) \
|
70
84
|
&& !schema_query?(payload) \
|
71
|
-
&& !(
|
85
|
+
&& !cached_query?(payload) \
|
72
86
|
&& !(ActiveRecordQueryTrace.suppress_logging_of_db_reads && db_read_query?(payload)) \
|
73
87
|
&& display_backtrace_for_query_type?(payload)
|
74
88
|
end
|
75
89
|
# rubocop:enable Metrics/CyclomaticComplexity
|
76
|
-
# rubocop:enable Metrics/PerceivedComplexity
|
77
90
|
|
78
91
|
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
92
|
case ActiveRecordQueryTrace.query_type
|
83
93
|
when :all then true
|
84
94
|
when :read then db_read_query?(payload)
|
85
95
|
when :write then !db_read_query?(payload)
|
86
|
-
else
|
96
|
+
else
|
97
|
+
raise 'Invalid ActiveRecordQueryTrace.query_type value ' \
|
98
|
+
"#{ActiveRecordQueryTrace.level}. Should be :all, :read, or :write."
|
87
99
|
end
|
88
100
|
end
|
89
101
|
|
90
102
|
def db_read_query?(payload)
|
91
|
-
|
103
|
+
payload[:sql] !~ /INSERT|UPDATE|DELETE/
|
92
104
|
end
|
93
105
|
|
94
106
|
def fully_formatted_trace
|
@@ -104,24 +116,36 @@ module ActiveRecordQueryTrace
|
|
104
116
|
end
|
105
117
|
|
106
118
|
def transaction_begin_or_commit_query?(payload)
|
107
|
-
payload[:sql]
|
119
|
+
payload[:sql] =~ /\Abegin transaction|commit transaction|BEGIN|COMMIT\Z/
|
108
120
|
end
|
109
121
|
|
110
122
|
def schema_query?(payload)
|
111
123
|
payload[:name] == 'SCHEMA'
|
112
124
|
end
|
113
125
|
|
126
|
+
# rubocop:disable Metrics/MethodLength
|
114
127
|
def clean_trace(full_trace)
|
115
|
-
|
116
|
-
|
117
|
-
|
128
|
+
case ActiveRecordQueryTrace.level
|
129
|
+
when :full
|
130
|
+
trace = full_trace
|
131
|
+
when :app, :rails
|
132
|
+
trace = Rails.backtrace_cleaner.clean(full_trace)
|
133
|
+
when :custom
|
134
|
+
unless ActiveRecordQueryTrace.backtrace_cleaner
|
135
|
+
raise 'Configure your backtrace cleaner first via ActiveRecordQueryTrace.backtrace_cleaner = MyCleaner'
|
136
|
+
end
|
137
|
+
trace = ActiveRecordQueryTrace.backtrace_cleaner.call(full_trace)
|
138
|
+
else
|
139
|
+
raise 'Invalid ActiveRecordQueryTrace.level value ' \
|
140
|
+
"#{ActiveRecordQueryTrace.level}. Should be :full, :rails, or :app."
|
141
|
+
end
|
118
142
|
|
119
|
-
trace = ActiveRecordQueryTrace.level == :full ? full_trace : Rails.backtrace_cleaner.clean(full_trace)
|
120
143
|
# We cant use a Rails::BacktraceCleaner filter to display only the relative
|
121
144
|
# path of application trace lines because it breaks the silencer that selects
|
122
145
|
# the lines to display or hide based on whether they include `Rails.root`.
|
123
|
-
trace.map { |line| line.
|
146
|
+
trace.map { |line| line.sub(rails_root_prefix, '') }
|
124
147
|
end
|
148
|
+
# rubocop:enable Metrics/MethodLength
|
125
149
|
|
126
150
|
# Rails by default silences all backtraces that *do not* match
|
127
151
|
# Rails::BacktraceCleaner::APP_DIRS_PATTERN. In other words, the default
|
@@ -135,9 +159,9 @@ module ActiveRecordQueryTrace
|
|
135
159
|
|
136
160
|
case ActiveRecordQueryTrace.level
|
137
161
|
when :app
|
138
|
-
Rails.backtrace_cleaner.add_silencer { |line|
|
162
|
+
Rails.backtrace_cleaner.add_silencer { |line| line !~ rails_root_regexp }
|
139
163
|
when :rails
|
140
|
-
Rails.backtrace_cleaner.add_silencer { |line| line
|
164
|
+
Rails.backtrace_cleaner.add_silencer { |line| line =~ rails_root_regexp }
|
141
165
|
end
|
142
166
|
end
|
143
167
|
|
@@ -167,28 +191,37 @@ module ActiveRecordQueryTrace
|
|
167
191
|
end
|
168
192
|
|
169
193
|
def color_code
|
194
|
+
return @color_code if @color_code && @configured_color == ActiveRecordQueryTrace.colorize
|
195
|
+
|
196
|
+
@configured_color = ActiveRecordQueryTrace.colorize
|
197
|
+
|
170
198
|
# Backward compatibility for string color names with space as word separator.
|
171
|
-
color_code =
|
199
|
+
@color_code =
|
172
200
|
case ActiveRecordQueryTrace.colorize
|
173
|
-
when Symbol then COLORS[ActiveRecordQueryTrace.colorize]
|
201
|
+
when Symbol, true then COLORS[ActiveRecordQueryTrace.colorize]
|
174
202
|
when String then COLORS[ActiveRecordQueryTrace.colorize.tr("\s", '_').to_sym]
|
175
203
|
end
|
204
|
+
end
|
176
205
|
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
206
|
+
def validate_color_code(color_code)
|
207
|
+
valid_color_code?(color_code) || raise(
|
208
|
+
'ActiveRecordQueryTrace.colorize was set to an invalid ' \
|
209
|
+
"color. Use one of #{COLORS.keys} or a valid color code."
|
210
|
+
)
|
182
211
|
end
|
183
212
|
|
184
213
|
def valid_color_code?(color_code)
|
185
|
-
/\A\d+(
|
214
|
+
/\A\d+(?:;\d+)?\Z/ =~ color_code
|
215
|
+
end
|
216
|
+
|
217
|
+
def rails_root_prefix
|
218
|
+
@rails_root_prefix ||= "#{Rails.root}/"
|
186
219
|
end
|
187
220
|
|
188
221
|
# This cannot be set in a constant as Rails.root is not yet available when
|
189
222
|
# this file is loaded.
|
190
223
|
def rails_root_regexp
|
191
|
-
%r{#{Regexp.escape(Rails.root.to_s)}(?!\/vendor)}
|
224
|
+
@rails_root_regexp ||= %r{#{Regexp.escape(Rails.root.to_s)}(?!\/vendor)}
|
192
225
|
end
|
193
226
|
end
|
194
227
|
end
|
@@ -213,7 +246,7 @@ ActiveSupport::LogSubscriber.class_eval do
|
|
213
246
|
|
214
247
|
def debug(*args, &block)
|
215
248
|
return if ActiveRecordQueryTrace.suppress_logging_of_db_reads \
|
216
|
-
&& args.first !~ /
|
249
|
+
&& args.first !~ /INSERT|UPDATE|DELETE|#{ActiveRecordQueryTrace::BACKTRACE_PREFIX}/
|
217
250
|
original_debug(*args, &block)
|
218
251
|
end
|
219
252
|
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.7'
|
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: 2019-
|
12
|
+
date: 2019-10-21 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -113,14 +113,14 @@ dependencies:
|
|
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
|