sql_tracer 0.1.0 → 0.1.1
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/sql_tracer/adapters/mysql2.rb +16 -0
- data/lib/sql_tracer/adapters/postgresql.rb +14 -0
- data/lib/sql_tracer/adapters/sqlite.rb +12 -0
- data/lib/sql_tracer/adapters/sqlite3.rb +1 -0
- data/lib/sql_tracer/config.rb +12 -1
- data/lib/sql_tracer/formatter.rb +9 -35
- data/lib/sql_tracer/helper.rb +5 -15
- data/lib/sql_tracer/railtie.rb +26 -0
- data/lib/sql_tracer/request_logger.rb +2 -1
- data/lib/sql_tracer/sql_logger.rb +10 -20
- data/lib/sql_tracer/sql_stack.rb +2 -2
- data/lib/sql_tracer/version.rb +1 -1
- data/lib/sql_tracer.rb +2 -16
- metadata +18 -26
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60a8e3f163f3a5ca7ba930ad31ebf984ad1ce764
|
4
|
+
data.tar.gz: 9b36a32e8f60a9074c49a356da9fcda1f259776c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e294b9f7e22f3766521ed4006bdf31e8c60b0024900b6eca514f411db959af31391b8fabacc84bf24086d54ef45cc9f199b23a048cad4743240b3c0fc56b43cc
|
7
|
+
data.tar.gz: 3e62d68b3b7b9b6d3d991dbfd346b767f1d22b40f532a63157c7c168883c76b984eda8e1e92048718fef34b9815d84d9f34f3ca271d285d1cd5574df8b886ac1
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'active_record/connection_adapters/mysql2_adapter'
|
2
|
+
|
3
|
+
module ActiveRecord::ConnectionAdapters
|
4
|
+
module Mysql2SqlLogger
|
5
|
+
def execute(*args)
|
6
|
+
SqlTracer::SqlLogger.log_sql(args.first)
|
7
|
+
super(*args)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class Mysql2Adapter
|
12
|
+
prepend Mysql2SqlLogger
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require 'active_record/connection_adapters/postgresql_adapter'
|
2
|
+
|
3
|
+
module ActiveRecord::ConnectionAdapters
|
4
|
+
module PostgreSqlLogger
|
5
|
+
def execute(sql, *args)
|
6
|
+
SqlTracer::SqlLogger.log_sql(sql)
|
7
|
+
super(sql, *args)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class PostgreSQLAdapter
|
12
|
+
prepend PostgreSqlLogger
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'sql_tracer/adapters/sqlite'
|
data/lib/sql_tracer/config.rb
CHANGED
@@ -1,9 +1,20 @@
|
|
1
1
|
module SqlTracer
|
2
2
|
module Config
|
3
|
+
DEFAULTS = {
|
4
|
+
SQL_TRACER_SKIP_LIB_PATH: true, # method call paths in /.rvm directory won't be output, default true
|
5
|
+
SQL_TRACER_CONSOLE_OUTPUT_DISABLED: false, # sqls won't be output in back-end console if set to true, default false
|
6
|
+
SQL_TRACER_OUTPUT_SELECT_SQL_ENABLED: false, # output select type sql. By default, only (insert|update|delete) sql will be output
|
7
|
+
# sql which contains any element of this array won't be output
|
8
|
+
SQL_TRACER_SQL_FILTER: [],
|
9
|
+
# request url which contains any element of this array won't be output
|
10
|
+
SQL_TRACER_URL_FILTER: [],
|
11
|
+
# call stack path which contains any element of this array won't be output
|
12
|
+
SQL_TRACER_PATH_FILTER: []
|
13
|
+
}.freeze
|
3
14
|
|
4
15
|
def self.get(name)
|
5
16
|
@config ||= load_config
|
6
|
-
@config ? @config[name.to_s] :
|
17
|
+
@config ? @config[name.to_s] : DEFAULTS[name]
|
7
18
|
end
|
8
19
|
|
9
20
|
private
|
data/lib/sql_tracer/formatter.rb
CHANGED
@@ -1,9 +1,7 @@
|
|
1
|
-
require 'anbt-sql-formatter/formatter'
|
2
|
-
|
3
1
|
module SqlTracer
|
4
2
|
class Formatter
|
5
|
-
HEADER_PROMPT= '='*
|
6
|
-
FOOTER_PROMPT= '<' << '='*
|
3
|
+
HEADER_PROMPT= '='*20 << '>'
|
4
|
+
FOOTER_PROMPT= '<' << '='*20
|
7
5
|
|
8
6
|
def self.start_print
|
9
7
|
puts HEADER_PROMPT
|
@@ -14,30 +12,29 @@ module SqlTracer
|
|
14
12
|
end
|
15
13
|
|
16
14
|
def self.print_tips
|
17
|
-
puts 'SqlTracer is watching and will capture backtrace when sql is executed
|
18
|
-
|
15
|
+
puts 'SqlTracer is watching and will capture backtrace when sql is executed, '\
|
16
|
+
'open http://127.0.0.1:3000/sql_tracer/index for detailed information'
|
19
17
|
end
|
20
18
|
|
21
19
|
def self.print_sql(sql)
|
22
20
|
puts 'SQL:'
|
23
21
|
return sql if sql.blank?
|
24
|
-
formatted_sql = ' ' <<
|
22
|
+
formatted_sql = ' ' << sql
|
25
23
|
puts formatted_sql
|
26
24
|
end
|
27
25
|
|
28
26
|
def self.print_backtrace(backtrace)
|
29
27
|
puts Helper.should_skip_lib? ? 'Backtrace: note that paths in ruby libs have been hidden' : 'Backtrace:'
|
30
28
|
backtrace.each do |line|
|
31
|
-
line = format_line(line) if Helper.format_stack_enabled?
|
32
29
|
(puts ' ' << line) if line.present?
|
33
30
|
end
|
34
31
|
end
|
35
32
|
|
36
33
|
def self.print_all(sql, backtrace)
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
34
|
+
start_print
|
35
|
+
print_sql(sql)
|
36
|
+
print_backtrace(backtrace)
|
37
|
+
end_print
|
41
38
|
end
|
42
39
|
|
43
40
|
def self.remove_filtered_path(backtrace)
|
@@ -46,28 +43,5 @@ module SqlTracer
|
|
46
43
|
path
|
47
44
|
end.compact
|
48
45
|
end
|
49
|
-
|
50
|
-
def self.sql_formatter
|
51
|
-
return @formatter if @formatter
|
52
|
-
rule = AnbtSql::Rule.new
|
53
|
-
rule.keyword = AnbtSql::Rule::KEYWORD_UPPER_CASE
|
54
|
-
rule.function_names += %w(count sum)
|
55
|
-
rule.indent_string = ' '
|
56
|
-
@formatter = AnbtSql::Formatter.new(rule)
|
57
|
-
end
|
58
|
-
|
59
|
-
def self.format_line(line)
|
60
|
-
parts = line.match(/^(?<file>.+):(?<line>\d+):in `(?<code>.*)'$/)
|
61
|
-
if parts
|
62
|
-
"#{colorize(parts[:file], 32)}:#{colorize(parts[:line], 36)}:#{colorize(parts[:code], 31)}"
|
63
|
-
else
|
64
|
-
"#{colorize(line, 32)}"
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def self.colorize(text, color_code)
|
69
|
-
"\e[#{color_code}m#{text}\e[0m"
|
70
|
-
end
|
71
|
-
|
72
46
|
end
|
73
47
|
end
|
data/lib/sql_tracer/helper.rb
CHANGED
@@ -1,32 +1,23 @@
|
|
1
|
-
require 'anbt-sql-formatter/formatter'
|
2
1
|
|
3
2
|
module SqlTracer
|
4
3
|
class Helper
|
5
4
|
|
6
5
|
class << self
|
7
|
-
def format_sql_enabled?
|
8
|
-
@format_sql_enabled ||= (config.get(:SQL_TRACER_FORMAT_SQL_ENABLED) || false)
|
9
|
-
end
|
10
|
-
|
11
|
-
def format_stack_enabled?
|
12
|
-
@format_stack_enabled ||= (config.get(:SQL_TRACER_FORMAT_STACK_ENABLED) || false)
|
13
|
-
end
|
14
|
-
|
15
6
|
def output_select_sql_enabled?
|
16
|
-
@output_select_sql_enabled ||=
|
7
|
+
@output_select_sql_enabled ||= config.get(:SQL_TRACER_OUTPUT_SELECT_SQL_ENABLED)
|
17
8
|
end
|
18
9
|
|
19
10
|
def should_skip_lib?
|
20
|
-
@should_skip_lib ||=
|
11
|
+
@should_skip_lib ||= config.get(:SQL_TRACER_SKIP_LIB_PATH)
|
21
12
|
end
|
22
13
|
|
23
14
|
def should_skip_sql_by_keywords?(sql)
|
24
|
-
@sql_keywords ||=
|
15
|
+
@sql_keywords ||= config.get(:SQL_TRACER_SQL_FILTER)
|
25
16
|
@sql_keywords.any? { |keyword| sql.include?(keyword) }
|
26
17
|
end
|
27
18
|
|
28
19
|
def should_skip_url_by_keywords?(url)
|
29
|
-
@url_keywords ||=
|
20
|
+
@url_keywords ||= config.get(:SQL_TRACER_URL_FILTER)
|
30
21
|
@url_keywords.any? { |keyword| url.include?(keyword) }
|
31
22
|
end
|
32
23
|
|
@@ -36,7 +27,7 @@ module SqlTracer
|
|
36
27
|
end
|
37
28
|
|
38
29
|
def disable_console_output?
|
39
|
-
@console_output_disabled ||=
|
30
|
+
@console_output_disabled ||= config.get(:SQL_TRACER_CONSOLE_OUTPUT_DISABLED)
|
40
31
|
end
|
41
32
|
|
42
33
|
def should_output_sql?(sql)
|
@@ -45,7 +36,6 @@ module SqlTracer
|
|
45
36
|
return sql =~ /^\s*(#{reg})\s/i && !Helper.should_skip_sql_by_keywords?(sql)
|
46
37
|
end
|
47
38
|
|
48
|
-
|
49
39
|
private
|
50
40
|
|
51
41
|
def build_path_filter
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module SqlLogging
|
2
|
+
class Railtie < Rails::Railtie
|
3
|
+
initializer 'sql_logging.load_adapter_extensions' do
|
4
|
+
ActiveSupport.on_load(:active_record, :after => 'active_record.initialize_database') do
|
5
|
+
adapter = ActiveRecord::Base.configurations[Rails.env]['adapter']
|
6
|
+
begin
|
7
|
+
require "sql_tracer/adapters/#{adapter}"
|
8
|
+
SqlTracer::Formatter.print_tips
|
9
|
+
rescue LoadError => e
|
10
|
+
Rails.logger.error('Failed to injuect SqlTracer to ActiveRecord due to :' + e.message)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
initializer 'sql_logging.load_adapter_extensions' do
|
17
|
+
begin
|
18
|
+
ActiveSupport.on_load(:action_controller) do
|
19
|
+
ActionController::Base.send(:include, SqlTracer::RequestLogger)
|
20
|
+
end
|
21
|
+
rescue LoadError, NameError => e
|
22
|
+
Rails.logger.error('Failed to injuect RequestLogger to Controller due to :' + e.message)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -9,7 +9,8 @@ module SqlTracer
|
|
9
9
|
if SqlTracer::Helper.should_skip_url_by_keywords?(request.path)
|
10
10
|
SqlTracer::SqlStack.abandon_request
|
11
11
|
else
|
12
|
-
|
12
|
+
# Processed by #{self.class} ##{params[:action]}
|
13
|
+
SqlTracer::SqlStack.push("#{request.method} #{request.path} ")
|
13
14
|
end
|
14
15
|
rescue => e
|
15
16
|
Rails.logger.error "Failed to log sql in SqlTracer. Error: #{e.message}"
|
@@ -1,26 +1,16 @@
|
|
1
|
-
require 'anbt-sql-formatter/formatter'
|
2
|
-
|
3
1
|
module SqlTracer
|
4
2
|
module SqlLogger
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
sql
|
12
|
-
|
13
|
-
if Helper.should_output_sql?(sql)
|
14
|
-
backtrace = Thread.current.backtrace
|
15
|
-
backtrace = Formatter.remove_filtered_path(backtrace)
|
16
|
-
Formatter.print_all(sql, backtrace) unless Helper.disable_console_output?
|
17
|
-
SqlTracer::SqlStack.sql_stack << { :sql => sql, :stack => backtrace }
|
18
|
-
end
|
19
|
-
rescue => e
|
20
|
-
Rails.logger.error "Failed to log sql in SqlTracer. Error: #{e.message}"
|
21
|
-
Rails.logger.error e.backtrace.join("\n")
|
3
|
+
def self.log_sql(sql)
|
4
|
+
begin
|
5
|
+
if Helper.should_output_sql?(sql)
|
6
|
+
backtrace = Thread.current.backtrace
|
7
|
+
backtrace = Formatter.remove_filtered_path(backtrace)
|
8
|
+
Formatter.print_all(sql, backtrace) unless Helper.disable_console_output?
|
9
|
+
SqlTracer::SqlStack.sql_stack << { :sql => sql, :stack => backtrace }
|
22
10
|
end
|
23
|
-
|
11
|
+
rescue => e
|
12
|
+
Rails.logger.error "Failed to log sql in SqlTracer. Error: #{e.message}"
|
13
|
+
Rails.logger.error e.backtrace.join("\n")
|
24
14
|
end
|
25
15
|
end
|
26
16
|
end
|
data/lib/sql_tracer/sql_stack.rb
CHANGED
@@ -10,8 +10,8 @@ module SqlTracer
|
|
10
10
|
@sql_stacks = []
|
11
11
|
end
|
12
12
|
|
13
|
-
def push(
|
14
|
-
@sql_stacks << { :url => "[#{Time.now.strftime('%H:%M:%S')}] #{
|
13
|
+
def push(url_info)
|
14
|
+
@sql_stacks << { :url => "[#{Time.now.strftime('%H:%M:%S')}] #{url_info}", :sqls => @sql_stack }
|
15
15
|
@sql_stack = []
|
16
16
|
end
|
17
17
|
|
data/lib/sql_tracer/version.rb
CHANGED
data/lib/sql_tracer.rb
CHANGED
@@ -1,27 +1,13 @@
|
|
1
1
|
require 'sql_tracer/engine'
|
2
|
+
require 'sql_tracer/railtie'
|
2
3
|
|
3
4
|
module SqlTracer
|
4
5
|
autoload :RequestLogger, 'sql_tracer/request_logger'
|
5
6
|
autoload :SqlLogger, 'sql_tracer/sql_logger'
|
6
7
|
autoload :SqlStack, 'sql_tracer/sql_stack'
|
8
|
+
autoload :Railtie, 'sql_tracer/railtie'
|
7
9
|
autoload :Helper, 'sql_tracer/helper'
|
8
10
|
autoload :Formatter, 'sql_tracer/formatter'
|
9
11
|
autoload :Config, 'sql_tracer/config'
|
10
12
|
end
|
11
13
|
|
12
|
-
# why does not work when wrapped in block ActiveSupport.on_load(:active_record) do
|
13
|
-
begin
|
14
|
-
require 'active_record/connection_adapters/mysql2_adapter'
|
15
|
-
ActiveRecord::ConnectionAdapters::Mysql2Adapter.send(:include, SqlTracer::SqlLogger)
|
16
|
-
SqlTracer::Formatter.print_tips
|
17
|
-
|
18
|
-
ActiveSupport.on_load(:action_controller) do
|
19
|
-
ActionController::Base.send(:include, SqlTracer::RequestLogger)
|
20
|
-
end
|
21
|
-
rescue LoadError, NameError => e
|
22
|
-
Rails.logger.error('Failed to injuect SqlTracer to ActiveRecord due to :' + e.message)
|
23
|
-
end
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sql_tracer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- qzhang
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: anbt-sql-formatter
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - '>='
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 0.0.5
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - '>='
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 0.0.5
|
11
|
+
date: 2017-07-05 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
27
13
|
description: It helps you figure out what sqls are executed and trace method call
|
28
14
|
stack
|
29
15
|
email:
|
@@ -32,20 +18,25 @@ executables: []
|
|
32
18
|
extensions: []
|
33
19
|
extra_rdoc_files: []
|
34
20
|
files:
|
21
|
+
- app/assets/stylesheets/sql_tracer/application.css
|
22
|
+
- app/assets/stylesheets/sql_tracer/style.css
|
23
|
+
- app/controllers/sql_tracer/sql_tracer_controller.rb
|
24
|
+
- app/views/sql_tracer/sql_tracer/index.html.erb
|
25
|
+
- config/routes.rb
|
26
|
+
- lib/sql_tracer.rb
|
27
|
+
- lib/sql_tracer/adapters/mysql2.rb
|
28
|
+
- lib/sql_tracer/adapters/postgresql.rb
|
29
|
+
- lib/sql_tracer/adapters/sqlite.rb
|
30
|
+
- lib/sql_tracer/adapters/sqlite3.rb
|
35
31
|
- lib/sql_tracer/config.rb
|
36
32
|
- lib/sql_tracer/engine.rb
|
37
33
|
- lib/sql_tracer/formatter.rb
|
38
34
|
- lib/sql_tracer/helper.rb
|
35
|
+
- lib/sql_tracer/railtie.rb
|
39
36
|
- lib/sql_tracer/request_logger.rb
|
40
37
|
- lib/sql_tracer/sql_logger.rb
|
41
38
|
- lib/sql_tracer/sql_stack.rb
|
42
39
|
- lib/sql_tracer/version.rb
|
43
|
-
- lib/sql_tracer.rb
|
44
|
-
- config/routes.rb
|
45
|
-
- app/assets/stylesheets/sql_tracer/application.css
|
46
|
-
- app/assets/stylesheets/sql_tracer/style.css
|
47
|
-
- app/controllers/sql_tracer/sql_tracer_controller.rb
|
48
|
-
- app/views/sql_tracer/sql_tracer/index.html.erb
|
49
40
|
homepage: https://git.dev.fwmrm.net/qzhang/sql_tracer
|
50
41
|
licenses: []
|
51
42
|
metadata: {}
|
@@ -55,18 +46,19 @@ require_paths:
|
|
55
46
|
- lib
|
56
47
|
required_ruby_version: !ruby/object:Gem::Requirement
|
57
48
|
requirements:
|
58
|
-
- -
|
49
|
+
- - ">="
|
59
50
|
- !ruby/object:Gem::Version
|
60
51
|
version: '0'
|
61
52
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
53
|
requirements:
|
63
|
-
- -
|
54
|
+
- - ">="
|
64
55
|
- !ruby/object:Gem::Version
|
65
56
|
version: '0'
|
66
57
|
requirements: []
|
67
58
|
rubyforge_project:
|
68
|
-
rubygems_version: 2.
|
59
|
+
rubygems_version: 2.4.3
|
69
60
|
signing_key:
|
70
61
|
specification_version: 4
|
71
62
|
summary: log backtrace when sql is executed
|
72
63
|
test_files: []
|
64
|
+
has_rdoc:
|