sql_tracker 1.0.1 → 1.1.0
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/.travis.yml +4 -1
- data/README.md +13 -0
- data/lib/sql_tracker/config.rb +7 -1
- data/lib/sql_tracker/handler.rb +28 -7
- data/lib/sql_tracker/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 29226162337ee889c358d175c76c9aea25a6e7ec
|
4
|
+
data.tar.gz: 51c36a794abd3c99398247a8884cfc5bd472a982
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d1d5d91215717b8ab3a928a0a2568683fa26e2fb4d782b166b4ac5218bab710963fa1778717dfe7fa1679e9859ea216214636233db36b132d12cc3af666cca2
|
7
|
+
data.tar.gz: e87a892f671de2faedce163085e4ec89326581ab572550a856ba6628517ccb445c7bc200392701e462106f556e1a3142a40451131333668909403438a1a04ecb
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -1,5 +1,8 @@
|
|
1
1
|
# Rails SQL Query Tracker
|
2
2
|
|
3
|
+
[](https://codeclimate.com/github/steventen/sql_tracker)
|
4
|
+
[](https://travis-ci.org/steventen/sql_tracker)
|
5
|
+
|
3
6
|
`sql_tracker` tracks SQL queries by subscribing to Rails' `sql.active_record` event notifications.
|
4
7
|
|
5
8
|
It then aggregates and generates report to give you insights about all the sql queries happened in your Rails application.
|
@@ -34,6 +37,16 @@ To generate report, run
|
|
34
37
|
sql_tracker tmp/sql_tracker-*.json
|
35
38
|
```
|
36
39
|
|
40
|
+
## Configurations
|
41
|
+
|
42
|
+
All the configurable variables and their defaults are list below:
|
43
|
+
```ruby
|
44
|
+
SqlTracker::Config.enabled = true
|
45
|
+
SqlTracker::Config.tracked_paths = %w(app lib)
|
46
|
+
SqlTracker::Config.tracked_sql_command = %w(SELECT INSERT UPDATE DELETE)
|
47
|
+
SqlTracker::Config.output_path = File.join(Rails.root.to_s, 'tmp')
|
48
|
+
```
|
49
|
+
|
37
50
|
## License
|
38
51
|
|
39
52
|
The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
|
data/lib/sql_tracker/config.rb
CHANGED
@@ -10,7 +10,13 @@ module SqlTracker
|
|
10
10
|
self.enabled = enabled.nil? ? true : enabled
|
11
11
|
self.tracked_paths ||= %w(app lib)
|
12
12
|
self.tracked_sql_command ||= %w(SELECT INSERT UPDATE DELETE)
|
13
|
-
self.output_path ||=
|
13
|
+
self.output_path ||= begin
|
14
|
+
if defined?(::Rails) && ::Rails.root
|
15
|
+
File.join(::Rails.root.to_s, 'tmp')
|
16
|
+
else
|
17
|
+
'tmp'
|
18
|
+
end
|
19
|
+
end
|
14
20
|
self
|
15
21
|
end
|
16
22
|
end
|
data/lib/sql_tracker/handler.rb
CHANGED
@@ -4,24 +4,26 @@ require 'fileutils'
|
|
4
4
|
|
5
5
|
module SqlTracker
|
6
6
|
class Handler
|
7
|
+
attr_reader :data
|
8
|
+
|
7
9
|
def initialize(config)
|
8
10
|
@config = config
|
9
11
|
@started_at = Time.now.to_s
|
10
12
|
@data = {} # {key: {sql:, count:, duration, source: []}, ...}
|
11
13
|
end
|
12
14
|
|
13
|
-
def call(
|
15
|
+
def call(_name, started, finished, _id, payload)
|
14
16
|
return unless @config.enabled
|
15
17
|
|
16
18
|
sql = payload[:sql]
|
17
|
-
return unless
|
19
|
+
return unless track?(sql)
|
18
20
|
|
19
21
|
cleaned_trace = clean_trace(caller)
|
20
22
|
return if cleaned_trace.empty?
|
21
23
|
|
22
24
|
sql = clean_sql_query(sql)
|
23
25
|
duration = 1000.0 * (finished - started) # in milliseconds
|
24
|
-
sql_key = Digest::MD5.hexdigest(sql)
|
26
|
+
sql_key = Digest::MD5.hexdigest(sql.downcase)
|
25
27
|
|
26
28
|
if @data.key?(sql_key)
|
27
29
|
update_data(sql_key, cleaned_trace, duration)
|
@@ -30,23 +32,42 @@ module SqlTracker
|
|
30
32
|
end
|
31
33
|
end
|
32
34
|
|
35
|
+
def track?(sql)
|
36
|
+
return true unless @config.tracked_sql_command.respond_to?(:join)
|
37
|
+
tracked_sql_matcher =~ sql
|
38
|
+
end
|
39
|
+
|
40
|
+
def tracked_sql_matcher
|
41
|
+
@tracked_sql_matcher ||= /\A#{@config.tracked_sql_command.join('|')}/i
|
42
|
+
end
|
43
|
+
|
44
|
+
def trace_path_matcher
|
45
|
+
@trace_path_matcher ||= %r{^(#{@config.tracked_paths.join('|')})\/}
|
46
|
+
end
|
47
|
+
|
33
48
|
def clean_sql_query(query)
|
34
49
|
query.squish!
|
35
50
|
query.gsub!(/(\s(=|>|<|>=|<=|<>|!=)\s)('[^']+'|\w+)/, '\1xxx')
|
36
|
-
query.gsub!(/(\sIN\s)\([^\(\)]+\)
|
37
|
-
query.gsub!(/
|
51
|
+
query.gsub!(/(\sIN\s)\([^\(\)]+\)/i, '\1(xxx)')
|
52
|
+
query.gsub!(/(\sBETWEEN\s)('[^']+'|\w+)(\sAND\s)('[^']+'|\w+)/i, '\1xxx\3xxx')
|
38
53
|
query
|
39
54
|
end
|
40
55
|
|
41
56
|
def clean_trace(trace)
|
57
|
+
return trace unless defined?(::Rails)
|
58
|
+
|
42
59
|
if Rails.backtrace_cleaner.instance_variable_get(:@root) == '/'
|
43
60
|
Rails.backtrace_cleaner.instance_variable_set :@root, Rails.root.to_s
|
44
61
|
end
|
45
62
|
|
46
63
|
Rails.backtrace_cleaner.remove_silencers!
|
47
|
-
|
48
|
-
|
64
|
+
|
65
|
+
if config.tracked_paths.respond_to?(:join)
|
66
|
+
Rails.backtrace_cleaner.add_silencer do |line|
|
67
|
+
line !~ trace_path_matcher
|
68
|
+
end
|
49
69
|
end
|
70
|
+
|
50
71
|
Rails.backtrace_cleaner.clean(trace)
|
51
72
|
end
|
52
73
|
|
data/lib/sql_tracker/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sql_tracker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Steven Yue
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-10-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|