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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 98ce5725d8ff7895f2d497d33d9d56368e6074bb
4
- data.tar.gz: 1cc0510f0278227e89a946e1f6bb760c4935bc91
3
+ metadata.gz: 60a8e3f163f3a5ca7ba930ad31ebf984ad1ce764
4
+ data.tar.gz: 9b36a32e8f60a9074c49a356da9fcda1f259776c
5
5
  SHA512:
6
- metadata.gz: a13325d7bcbe611d574b58459ee606e6ea8e34b541975cfaa80706e2d51f787c3f0ac116f315f716b7759022e31f1d7a8000ecbeb829b83dc4f58c8f2fa9ef64
7
- data.tar.gz: a944447d1bb4e19965ce4ae1359aea5e02ae7c6e1c012b155bd3fa5160b7985e9f755447bebf5da7aee0138b60c77d19bc7959f50b06d3b3453c61ad7667cdac
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,12 @@
1
+ module ActiveRecord::ConnectionAdapters
2
+ module SqliteSqlLogger
3
+ def execute(sql, name = nil)
4
+ SqlTracer::SqlLogger.log_sql(sql)
5
+ super(sql, name)
6
+ end
7
+ end
8
+
9
+ class SQLiteAdapter
10
+ prepend SqliteSqlLogger
11
+ end
12
+ end
@@ -0,0 +1 @@
1
+ require 'sql_tracer/adapters/sqlite'
@@ -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] : nil
17
+ @config ? @config[name.to_s] : DEFAULTS[name]
7
18
  end
8
19
 
9
20
  private
@@ -1,9 +1,7 @@
1
- require 'anbt-sql-formatter/formatter'
2
-
3
1
  module SqlTracer
4
2
  class Formatter
5
- HEADER_PROMPT= '='*10 << '>'
6
- FOOTER_PROMPT= '<' << '='*10
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
- puts 'open http://127.0.0.1:3000/sql_tracer/index for detailed information'
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 = ' ' << (Helper.format_sql_enabled? ? colorize(sql_formatter.format(sql.squeeze(' ')), 32) : 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
- Formatter.start_print
38
- Formatter.print_sql(sql)
39
- Formatter.print_backtrace(backtrace)
40
- Formatter.end_print
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
@@ -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 ||= (config.get(:SQL_TRACER_OUTPUT_SELECT_SQL_ENABLED) || false)
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 ||= (config.get(:SQL_TRACER_SKIP_LIB_PATH) == false ? false : true)
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 ||= (config.get(:SQL_TRACER_SQL_FILTER) || [])
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 ||= (config.get(:SQL_TRACER_URL_FILTER) || [])
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 ||= (config.get(:SQL_TRACER_CONSOLE_OUTPUT_DISABLED) || false)
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
- SqlTracer::SqlStack.push("#{request.method} #{request.path}")
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
- extend ActiveSupport::Concern
6
- included do
7
- alias_method :execute_without_sql_tracer, :execute
8
-
9
- def execute(*args)
10
- begin
11
- sql = args.first
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
- execute_without_sql_tracer(*args)
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
@@ -10,8 +10,8 @@ module SqlTracer
10
10
  @sql_stacks = []
11
11
  end
12
12
 
13
- def push(url)
14
- @sql_stacks << { :url => "[#{Time.now.strftime('%H:%M:%S')}] #{url}", :sqls => @sql_stack }
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
 
@@ -1,3 +1,3 @@
1
1
  module SqlTracer
2
- VERSION = '0.1.0'
2
+ VERSION = '0.1.1'
3
3
  end
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.0
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-06-03 00:00:00.000000000 Z
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.0.14.1
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: