query_tracer 0.0.2 → 0.0.3
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.
- data/README.markdown +3 -3
- data/lib/query_tracer/logger.rb +3 -5
- data/lib/query_tracer/tracer/revision.rb +3 -3
- data/lib/query_tracer/tracer.rb +4 -24
- data/lib/query_tracer.rb +46 -2
- data/query_tracer.gemspec +1 -1
- metadata +4 -5
- data/lib/query_tracer/configuration.rb +0 -32
data/README.markdown
CHANGED
@@ -18,17 +18,17 @@ Rewrite SQL queries adding small trace as a comment. It will show where long run
|
|
18
18
|
|
19
19
|
Add following code to config/initializers/query_tracer.rb:
|
20
20
|
|
21
|
-
QueryTracer
|
21
|
+
QueryTracer.configure do |tracer|
|
22
22
|
tracer.enabled = true
|
23
23
|
tracer.colorize = true
|
24
24
|
tracer.show_revision = true
|
25
25
|
tracer.multiline = true
|
26
|
-
tracer.
|
26
|
+
tracer.exclude_queries << %r{FROM sqlite_master}
|
27
27
|
end
|
28
28
|
|
29
29
|
QueryTracer::Logger.attach_to :active_record
|
30
30
|
|
31
|
-
`
|
31
|
+
`exclude_queries` will contain default expressions list for currently selected DB.
|
32
32
|
|
33
33
|
## Example
|
34
34
|
|
data/lib/query_tracer/logger.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
1
|
require 'active_record/log_subscriber'
|
2
|
-
|
3
|
-
require 'query_tracer/configuration'
|
4
2
|
require 'query_tracer/tracer'
|
5
3
|
|
6
4
|
module QueryTracer
|
@@ -10,21 +8,21 @@ module QueryTracer
|
|
10
8
|
# event.duration
|
11
9
|
# event.payload[:sql]
|
12
10
|
def sql(event)
|
13
|
-
return unless
|
11
|
+
return unless QueryTracer.config.enabled
|
14
12
|
|
15
13
|
sql = event.payload[:sql]
|
16
14
|
# Skip noisy queries
|
17
15
|
trace = Tracer.build_trace(sql)
|
18
16
|
return if trace.blank?
|
19
17
|
# We're done
|
20
|
-
if
|
18
|
+
if QueryTracer.config.colorize
|
21
19
|
message = "\e[34m\e[43m^^^^ Called from:\e[0m "
|
22
20
|
indent = "\e[34m\e[43m->\e[0m "
|
23
21
|
else
|
24
22
|
message = '^^^^ Called from: '
|
25
23
|
indent = " "
|
26
24
|
end
|
27
|
-
logger.send QueryTracer
|
25
|
+
logger.send QueryTracer.config.log_level.to_sym, message + trace.join("\n#{indent}")
|
28
26
|
end
|
29
27
|
end
|
30
28
|
end
|
@@ -4,14 +4,14 @@ module QueryTracer
|
|
4
4
|
module Revision
|
5
5
|
# Detect the current code revision and memoize it for the future.
|
6
6
|
def self.current
|
7
|
-
return nil unless QueryTracer
|
7
|
+
return nil unless QueryTracer.config.show_revision
|
8
8
|
|
9
9
|
begin
|
10
10
|
# Do we have the code revision memoized?
|
11
11
|
unless defined?(@@current_code_revision)
|
12
|
-
@@current_code_revision = if File.exists?("#{
|
12
|
+
@@current_code_revision = if File.exists?("#{QueryTracer.config.root}/REVISION")
|
13
13
|
# Capistrano-deployed application, we know where to get current revision
|
14
|
-
File.read("#{
|
14
|
+
File.read("#{QueryTracer.config.root}/REVISION").chomp.strip
|
15
15
|
else
|
16
16
|
# Try to use git
|
17
17
|
rev = `git rev-parse HEAD 2>/dev/null`.chomp.strip
|
data/lib/query_tracer/tracer.rb
CHANGED
@@ -1,41 +1,21 @@
|
|
1
|
-
require 'query_tracer/configuration'
|
2
1
|
require 'query_tracer/tracer/revision'
|
3
2
|
|
4
3
|
module QueryTracer
|
5
4
|
module Tracer
|
6
5
|
extend self
|
7
6
|
|
8
|
-
INCLUDE_CODEPOINTS = [
|
9
|
-
%r{^#{Rails.root}/(app/presenters/.*)},
|
10
|
-
%r{^#{Rails.root}/(app/views/.*)},
|
11
|
-
%r{^#{Rails.root}/(app/controllers/.*)},
|
12
|
-
%r{^#{Rails.root}/(app/models/.*)},
|
13
|
-
%r{^#{Rails.root}/(lib/.*)},
|
14
|
-
%r{^#{Rails.root}/(spec/.*)},
|
15
|
-
%r{^#{Rails.root}/(app/.*)},
|
16
|
-
%r{^#{Rails.root}/(vendor/(?:gems|plugins)/.*)},
|
17
|
-
%r{^#{Rails.root}/(.*)},
|
18
|
-
%r{in `(irb)_binding'}
|
19
|
-
]
|
20
|
-
# A regular expression used to skip certain code points (gems that do nothing
|
21
|
-
# but add noice to the result).
|
22
|
-
EXCLUDE_CODEPOINT = %r{^(#{Rails.root}/(?:vendor/(?:rails|gems/(?:composite_primary_keys|db-charmer)|plugins/(?:paginating_find|acts_as_sluggable))|config/initializers/mysql_adapter_extensions\.rb|tmp/gems|lib/query_tracer))|\.rvm/|/gems/}
|
23
|
-
# A regular expression to exclude certain SQL queries from processing (who cares
|
24
|
-
# where SHOW TABLES was issues from).
|
25
|
-
EXCLUDE_SQL = []
|
26
|
-
|
27
7
|
def build_trace(sql)
|
28
8
|
unless skip_query?(sql)
|
29
9
|
# Skip noisy codepoints
|
30
10
|
lines = caller.inject([]) do |filtered, line|
|
31
|
-
unless line =~
|
32
|
-
filtered << line unless
|
11
|
+
unless line =~ QueryTracer.config.exclude_codepoint
|
12
|
+
filtered << line unless QueryTracer.config.include_codepoints.select{ |expr| line =~ expr }.blank?
|
33
13
|
end
|
34
14
|
filtered
|
35
15
|
end
|
36
16
|
|
37
17
|
unless lines.blank?
|
38
|
-
lines = lines.first unless QueryTracer
|
18
|
+
lines = lines.first unless QueryTracer.config.multiline
|
39
19
|
[QueryTracer::Tracer::Revision.current, lines].flatten
|
40
20
|
end
|
41
21
|
|
@@ -43,7 +23,7 @@ module QueryTracer
|
|
43
23
|
end
|
44
24
|
|
45
25
|
def skip_query?(sql)
|
46
|
-
!
|
26
|
+
!QueryTracer.config.exclude_sql.select { |expr| sql =~ expr }.blank?
|
47
27
|
end
|
48
28
|
|
49
29
|
end
|
data/lib/query_tracer.rb
CHANGED
@@ -1,4 +1,48 @@
|
|
1
|
-
require 'query_tracer/configuration'
|
2
1
|
require 'query_tracer/tracer'
|
3
2
|
require 'query_tracer/logger'
|
4
|
-
require 'query_tracer/db'
|
3
|
+
require 'query_tracer/db'
|
4
|
+
|
5
|
+
module QueryTracer
|
6
|
+
|
7
|
+
def self.configure
|
8
|
+
@config = OpenStruct.new({
|
9
|
+
:enabled => true,
|
10
|
+
:colorize => true,
|
11
|
+
:show_revision => true,
|
12
|
+
:multiline => true,
|
13
|
+
:log_level => :debug,
|
14
|
+
:exclude_sql => [],
|
15
|
+
:root => Rails.root
|
16
|
+
})
|
17
|
+
|
18
|
+
@config.include_codepoints = [
|
19
|
+
%r{^#{@config.root}/(app/presenters/.*)},
|
20
|
+
%r{^#{@config.root}/(app/views/.*)},
|
21
|
+
%r{^#{@config.root}/(app/controllers/.*)},
|
22
|
+
%r{^#{@config.root}/(app/models/.*)},
|
23
|
+
%r{^#{@config.root}/(lib/.*)},
|
24
|
+
%r{^#{@config.root}/(spec/.*)},
|
25
|
+
%r{^#{@config.root}/(app/.*)},
|
26
|
+
%r{^#{@config.root}/(vendor/(?:gems|plugins)/.*)},
|
27
|
+
%r{^#{@config.root}/(.*)},
|
28
|
+
%r{in `(irb)_binding'}
|
29
|
+
]
|
30
|
+
|
31
|
+
@config.exclude_codepoint = %r{^(#{@config.root}/(?:vendor/(?:rails|gems/(?:composite_primary_keys|db-charmer)|plugins/(?:paginating_find|acts_as_sluggable))|config/initializers/mysql_adapter_extensions\.rb|tmp/gems|lib/query_tracer))|\.rvm/|/gems/}
|
32
|
+
|
33
|
+
@config.db_adapter = ActiveRecord::Base.connection.adapter_name.capitalize
|
34
|
+
|
35
|
+
begin
|
36
|
+
@config.exclude_sql << QueryTracer::Db.const_get(@config.db_adapter)::SKIP_QUERIES
|
37
|
+
@config.exclude_sql.flatten!
|
38
|
+
rescue
|
39
|
+
end
|
40
|
+
|
41
|
+
yield @config
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.config
|
45
|
+
@config
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
data/query_tracer.gemspec
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: query_tracer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 25
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 3
|
10
|
+
version: 0.0.3
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Dmitry Shaposhnik
|
@@ -16,7 +16,7 @@ autorequire:
|
|
16
16
|
bindir: bin
|
17
17
|
cert_chain: []
|
18
18
|
|
19
|
-
date: 2011-04-
|
19
|
+
date: 2011-04-20 00:00:00 +03:00
|
20
20
|
default_executable:
|
21
21
|
dependencies: []
|
22
22
|
|
@@ -36,7 +36,6 @@ files:
|
|
36
36
|
- README.markdown
|
37
37
|
- Rakefile
|
38
38
|
- lib/query_tracer.rb
|
39
|
-
- lib/query_tracer/configuration.rb
|
40
39
|
- lib/query_tracer/db.rb
|
41
40
|
- lib/query_tracer/db/mysql.rb
|
42
41
|
- lib/query_tracer/db/sqlite.rb
|
@@ -1,32 +0,0 @@
|
|
1
|
-
module QueryTracer
|
2
|
-
class Configuration
|
3
|
-
|
4
|
-
class << self
|
5
|
-
|
6
|
-
attr_accessor :show_revision, :enabled, :colorize
|
7
|
-
attr_accessor :multiline, :log_level
|
8
|
-
|
9
|
-
def set
|
10
|
-
db_adapter = ActiveRecord::Base.connection.adapter_name.capitalize
|
11
|
-
begin
|
12
|
-
QueryTracer::Tracer::EXCLUDE_SQL << QueryTracer::Db.const_get(db_adapter)::SKIP_QUERIES
|
13
|
-
QueryTracer::Tracer::EXCLUDE_SQL.flatten!
|
14
|
-
rescue
|
15
|
-
end
|
16
|
-
|
17
|
-
yield self
|
18
|
-
end
|
19
|
-
|
20
|
-
def log_level
|
21
|
-
@log_level || :debug
|
22
|
-
end
|
23
|
-
|
24
|
-
def skip_queries=(val)
|
25
|
-
QueryTracer::Tracer::EXCLUDE_SQL << val
|
26
|
-
QueryTracer::Tracer::EXCLUDE_SQL.flatten!
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
end
|
32
|
-
end
|