active_record_query_trace 1.6.2 → 1.7
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.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
|