sql_tracer 0.0.9 → 0.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/app/assets/stylesheets/sql_tracer/style.css +8 -27
- data/app/views/sql_tracer/sql_tracer/index.html.erb +0 -1
- data/lib/sql_tracer.rb +3 -2
- data/lib/sql_tracer/config.rb +19 -0
- data/lib/sql_tracer/formatter.rb +3 -10
- data/lib/sql_tracer/helper.rb +35 -8
- data/lib/sql_tracer/request_logger.rb +9 -5
- data/lib/sql_tracer/sql_logger.rb +2 -2
- data/lib/sql_tracer/sql_stack.rb +5 -10
- data/lib/sql_tracer/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 98ce5725d8ff7895f2d497d33d9d56368e6074bb
|
4
|
+
data.tar.gz: 1cc0510f0278227e89a946e1f6bb760c4935bc91
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a13325d7bcbe611d574b58459ee606e6ea8e34b541975cfaa80706e2d51f787c3f0ac116f315f716b7759022e31f1d7a8000ecbeb829b83dc4f58c8f2fa9ef64
|
7
|
+
data.tar.gz: a944447d1bb4e19965ce4ae1359aea5e02ae7c6e1c012b155bd3fa5160b7985e9f755447bebf5da7aee0138b60c77d19bc7959f50b06d3b3453c61ad7667cdac
|
@@ -16,10 +16,6 @@ h3 {
|
|
16
16
|
font-weight: 300;
|
17
17
|
}
|
18
18
|
|
19
|
-
/*.container {*/
|
20
|
-
/*max-width: 970px;*/
|
21
|
-
/*}*/
|
22
|
-
|
23
19
|
div[class*='col-'] {
|
24
20
|
padding: 0 30px;
|
25
21
|
}
|
@@ -72,6 +68,14 @@ a:active {
|
|
72
68
|
padding: 0;
|
73
69
|
}
|
74
70
|
|
71
|
+
.panel-heading:hover {
|
72
|
+
background-color: #185751;
|
73
|
+
}
|
74
|
+
|
75
|
+
.sql_template:hover {
|
76
|
+
background-color: #008e80;
|
77
|
+
}
|
78
|
+
|
75
79
|
.panel-title a {
|
76
80
|
display: block;
|
77
81
|
color: #fff;
|
@@ -124,29 +128,6 @@ a:active {
|
|
124
128
|
transform: scale(0);
|
125
129
|
}
|
126
130
|
|
127
|
-
/*.panel-heading a:after {*/
|
128
|
-
/*content: ' ';*/
|
129
|
-
/*font-size: 24px;*/
|
130
|
-
/*position: absolute;*/
|
131
|
-
/*font-family: 'Material Icons';*/
|
132
|
-
/*right: 5px;*/
|
133
|
-
/*top: 10px;*/
|
134
|
-
/*-webkit-transform: scale(0);*/
|
135
|
-
/*transform: scale(0);*/
|
136
|
-
/*-webkit-transition: all 0.5s;*/
|
137
|
-
/*transition: all 0.5s;*/
|
138
|
-
/*}*/
|
139
|
-
|
140
|
-
/*.panel-heading.active a:after {*/
|
141
|
-
/*content: '\e909';*/
|
142
|
-
/*-webkit-transform: scale(1);*/
|
143
|
-
/*transform: scale(1);*/
|
144
|
-
/*-webkit-transition: all 0.5s;*/
|
145
|
-
/*transition: all 0.5s;*/
|
146
|
-
/*}*/
|
147
|
-
|
148
|
-
/* #accordion rotate icon option */
|
149
|
-
|
150
131
|
.panel-heading a:before {
|
151
132
|
content: '\e316';
|
152
133
|
font-size: 24px;
|
data/lib/sql_tracer.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
require 'sql_tracer/engine'
|
2
2
|
|
3
3
|
module SqlTracer
|
4
|
+
autoload :RequestLogger, 'sql_tracer/request_logger'
|
4
5
|
autoload :SqlLogger, 'sql_tracer/sql_logger'
|
6
|
+
autoload :SqlStack, 'sql_tracer/sql_stack'
|
5
7
|
autoload :Helper, 'sql_tracer/helper'
|
6
8
|
autoload :Formatter, 'sql_tracer/formatter'
|
7
|
-
autoload :
|
8
|
-
autoload :SqlStack, 'sql_tracer/sql_stack'
|
9
|
+
autoload :Config, 'sql_tracer/config'
|
9
10
|
end
|
10
11
|
|
11
12
|
# why does not work when wrapped in block ActiveSupport.on_load(:active_record) do
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module SqlTracer
|
2
|
+
module Config
|
3
|
+
|
4
|
+
def self.get(name)
|
5
|
+
@config ||= load_config
|
6
|
+
@config ? @config[name.to_s] : nil
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def self.load_config
|
12
|
+
default_config_file = File.join(Rails.root, 'config', 'sql_tracer.yml')
|
13
|
+
ui_config_file = File.join(Rails.root, 'config', 'ui_config.yml')
|
14
|
+
|
15
|
+
config_file = [default_config_file, ui_config_file].find { |file| File.exist?(file) }
|
16
|
+
YAML.load_file(config_file) if config_file
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/sql_tracer/formatter.rb
CHANGED
@@ -4,13 +4,6 @@ module SqlTracer
|
|
4
4
|
class Formatter
|
5
5
|
HEADER_PROMPT= '='*10 << '>'
|
6
6
|
FOOTER_PROMPT= '<' << '='*10
|
7
|
-
FORMATTER_CONFIG_TIP =
|
8
|
-
<<-TIP
|
9
|
-
You can add config to ui_config.yml to acquire advanced features
|
10
|
-
SQL_TRACER_FORMAT_SQL_ENABLED: true # show formatted and colored sql, default false
|
11
|
-
SQL_TRACER_FORMAT_STACK_ENABLED: true # show colored stack, default fasle
|
12
|
-
SQL_TRACER_SKIP_LIB: false # show all paths including the files in ruby gems, default true
|
13
|
-
TIP
|
14
7
|
|
15
8
|
def self.start_print
|
16
9
|
puts HEADER_PROMPT
|
@@ -22,7 +15,7 @@ You can add config to ui_config.yml to acquire advanced features
|
|
22
15
|
|
23
16
|
def self.print_tips
|
24
17
|
puts 'SqlTracer is watching and will capture backtrace when sql is executed.'
|
25
|
-
|
18
|
+
puts 'open http://127.0.0.1:3000/sql_tracer/index for detailed information'
|
26
19
|
end
|
27
20
|
|
28
21
|
def self.print_sql(sql)
|
@@ -47,9 +40,9 @@ You can add config to ui_config.yml to acquire advanced features
|
|
47
40
|
Formatter.end_print
|
48
41
|
end
|
49
42
|
|
50
|
-
def self.
|
43
|
+
def self.remove_filtered_path(backtrace)
|
51
44
|
backtrace.map do |path|
|
52
|
-
next if Helper.
|
45
|
+
next if Helper.shoule_skip_path_by_keywords?(path)
|
53
46
|
path
|
54
47
|
end.compact
|
55
48
|
end
|
data/lib/sql_tracer/helper.rb
CHANGED
@@ -2,33 +2,60 @@ require 'anbt-sql-formatter/formatter'
|
|
2
2
|
|
3
3
|
module SqlTracer
|
4
4
|
class Helper
|
5
|
+
|
5
6
|
class << self
|
6
7
|
def format_sql_enabled?
|
7
|
-
@format_sql_enabled ||= (
|
8
|
+
@format_sql_enabled ||= (config.get(:SQL_TRACER_FORMAT_SQL_ENABLED) || false)
|
8
9
|
end
|
9
10
|
|
10
11
|
def format_stack_enabled?
|
11
|
-
@format_stack_enabled ||= (
|
12
|
+
@format_stack_enabled ||= (config.get(:SQL_TRACER_FORMAT_STACK_ENABLED) || false)
|
13
|
+
end
|
14
|
+
|
15
|
+
def output_select_sql_enabled?
|
16
|
+
@output_select_sql_enabled ||= (config.get(:SQL_TRACER_OUTPUT_SELECT_SQL_ENABLED) || false)
|
12
17
|
end
|
13
18
|
|
14
19
|
def should_skip_lib?
|
15
|
-
@should_skip_lib ||= (
|
20
|
+
@should_skip_lib ||= (config.get(:SQL_TRACER_SKIP_LIB_PATH) == false ? false : true)
|
16
21
|
end
|
17
22
|
|
18
23
|
def should_skip_sql_by_keywords?(sql)
|
19
|
-
@sql_keywords ||= (
|
20
|
-
return false if @sql_keywords.blank?
|
24
|
+
@sql_keywords ||= (config.get(:SQL_TRACER_SQL_FILTER) || [])
|
21
25
|
@sql_keywords.any? { |keyword| sql.include?(keyword) }
|
22
26
|
end
|
23
27
|
|
24
28
|
def should_skip_url_by_keywords?(url)
|
25
|
-
@url_keywords ||= (
|
26
|
-
return false if @url_keywords.blank?
|
29
|
+
@url_keywords ||= (config.get(:SQL_TRACER_URL_FILTER) || [])
|
27
30
|
@url_keywords.any? { |keyword| url.include?(keyword) }
|
28
31
|
end
|
29
32
|
|
33
|
+
def shoule_skip_path_by_keywords?(path)
|
34
|
+
@path_keywords ||= build_path_filter
|
35
|
+
@path_keywords.any? { |keyword| path.include?(keyword) }
|
36
|
+
end
|
37
|
+
|
30
38
|
def disable_console_output?
|
31
|
-
@console_output_disabled ||= (
|
39
|
+
@console_output_disabled ||= (config.get(:SQL_TRACER_CONSOLE_OUTPUT_DISABLED) || false)
|
40
|
+
end
|
41
|
+
|
42
|
+
def should_output_sql?(sql)
|
43
|
+
reg = 'insert|update|delete'
|
44
|
+
reg << '|select' if Helper.output_select_sql_enabled?
|
45
|
+
return sql =~ /^\s*(#{reg})\s/i && !Helper.should_skip_sql_by_keywords?(sql)
|
46
|
+
end
|
47
|
+
|
48
|
+
|
49
|
+
private
|
50
|
+
|
51
|
+
def build_path_filter
|
52
|
+
path_filter = (config.get(:SQL_TRACER_PATH_FILTER) || [])
|
53
|
+
path_filter << '/.rvm/gems/' if Helper.should_skip_lib?
|
54
|
+
path_filter.uniq
|
55
|
+
end
|
56
|
+
|
57
|
+
def config
|
58
|
+
SqlTracer::Config
|
32
59
|
end
|
33
60
|
end
|
34
61
|
end
|
@@ -5,11 +5,15 @@ module SqlTracer
|
|
5
5
|
after_filter :persist_reqeust_logger
|
6
6
|
|
7
7
|
def persist_reqeust_logger
|
8
|
-
|
9
|
-
SqlTracer::
|
10
|
-
|
11
|
-
|
12
|
-
|
8
|
+
begin
|
9
|
+
if SqlTracer::Helper.should_skip_url_by_keywords?(request.path)
|
10
|
+
SqlTracer::SqlStack.abandon_request
|
11
|
+
else
|
12
|
+
SqlTracer::SqlStack.push("#{request.method} #{request.path}")
|
13
|
+
end
|
14
|
+
rescue => e
|
15
|
+
Rails.logger.error "Failed to log sql in SqlTracer. Error: #{e.message}"
|
16
|
+
Rails.logger.error e.backtrace.join("\n")
|
13
17
|
end
|
14
18
|
end
|
15
19
|
end
|
@@ -10,9 +10,9 @@ module SqlTracer
|
|
10
10
|
begin
|
11
11
|
sql = args.first
|
12
12
|
|
13
|
-
if
|
13
|
+
if Helper.should_output_sql?(sql)
|
14
14
|
backtrace = Thread.current.backtrace
|
15
|
-
backtrace = Formatter.
|
15
|
+
backtrace = Formatter.remove_filtered_path(backtrace)
|
16
16
|
Formatter.print_all(sql, backtrace) unless Helper.disable_console_output?
|
17
17
|
SqlTracer::SqlStack.sql_stack << { :sql => sql, :stack => backtrace }
|
18
18
|
end
|
data/lib/sql_tracer/sql_stack.rb
CHANGED
@@ -1,22 +1,18 @@
|
|
1
|
-
require 'fileutils'
|
2
|
-
|
3
1
|
module SqlTracer
|
4
2
|
class SqlStack
|
5
|
-
@
|
6
|
-
@
|
7
|
-
@sql_stacks = []
|
3
|
+
@sql_stack = [] # used to store current request information
|
4
|
+
@sql_stacks = [] # used to store all requests before taken by SqlTracerController#get_latest_stack_info
|
8
5
|
|
9
6
|
class << self
|
10
|
-
attr_accessor :
|
7
|
+
attr_accessor :sql_stack, :sql_stacks
|
11
8
|
|
12
9
|
def clear
|
13
10
|
@sql_stacks = []
|
14
11
|
end
|
15
12
|
|
16
|
-
def push
|
17
|
-
@sql_stacks << { :url => "[#{Time.now.strftime('%H:%M:%S')}] #{
|
13
|
+
def push(url)
|
14
|
+
@sql_stacks << { :url => "[#{Time.now.strftime('%H:%M:%S')}] #{url}", :sqls => @sql_stack }
|
18
15
|
@sql_stack = []
|
19
|
-
@url = ''
|
20
16
|
end
|
21
17
|
|
22
18
|
def to_json
|
@@ -25,7 +21,6 @@ module SqlTracer
|
|
25
21
|
|
26
22
|
def abandon_request
|
27
23
|
@sql_stack = []
|
28
|
-
@url = ''
|
29
24
|
end
|
30
25
|
end
|
31
26
|
end
|
data/lib/sql_tracer/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sql_tracer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- qzhang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-06-
|
11
|
+
date: 2017-06-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: anbt-sql-formatter
|
@@ -32,6 +32,7 @@ executables: []
|
|
32
32
|
extensions: []
|
33
33
|
extra_rdoc_files: []
|
34
34
|
files:
|
35
|
+
- lib/sql_tracer/config.rb
|
35
36
|
- lib/sql_tracer/engine.rb
|
36
37
|
- lib/sql_tracer/formatter.rb
|
37
38
|
- lib/sql_tracer/helper.rb
|