quake-db_profiling 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README ADDED
@@ -0,0 +1,21 @@
1
+ = DB Profiling
2
+
3
+ A simple database query profiling tool, basis of Aaron Patterson's blog:
4
+ http://tenderlovemaking.com/2008/03/13/profiling-database-queries-in-rails/
5
+ Honor to him, bug to me
6
+
7
+ == Installation
8
+
9
+ The recommended way is that you get the gem:
10
+
11
+ gem install quake-db_profiling --source http://gems.github.com/
12
+
13
+ == Example usage
14
+
15
+ add one line to environment.rb:
16
+
17
+ require 'db_profiling' if RAILS_ENV == "development"
18
+
19
+ add helper output to the view which you want to profiling, for example, layouts/application.rhtml:
20
+
21
+ <%= db_profiling_view if RAILS_ENV == "development" %>
@@ -0,0 +1,58 @@
1
+ ActiveRecord::ConnectionAdapters::QueryCache.module_eval do
2
+ @@stats_hits = []
3
+ @@stats_misses = []
4
+ @@stats_bytes = @@stats_rows = 0
5
+
6
+ def self.get_stats
7
+ { :hits => @@stats_hits,
8
+ :misses => @@stats_misses,
9
+ :rows => @@stats_rows,
10
+ :bytes => @@stats_bytes,
11
+ :queries => @@stats_hits.size + @@stats_misses.size,
12
+ }
13
+ end
14
+
15
+ def self.reset_stats
16
+ @@stats_hits = []
17
+ @@stats_misses = []
18
+ @@stats_bytes = @@stats_rows = 0
19
+ end
20
+
21
+ def cache_sql_with_stats(sql, &block)
22
+ if @query_cache.has_key?(sql)
23
+ @@stats_hits << [sql, extract_app_caller]
24
+ else
25
+ @@stats_misses << [sql, extract_app_caller]
26
+ end
27
+ bytes = 0
28
+ rows = cache_sql_without_stats(sql, &block)
29
+ rows.each do |row|
30
+ row.each do |key, value|
31
+ bytes += key.length
32
+ bytes += value.length if value
33
+ end
34
+ end
35
+ @@stats_rows += rows.length
36
+ @@stats_bytes += bytes
37
+ rows
38
+ end
39
+ alias_method_chain :cache_sql, :stats
40
+
41
+ def extract_app_caller
42
+ caller.select {|s| s.index("#{RAILS_ROOT}/app") == 0}
43
+ end
44
+ end
45
+
46
+ ActionController::Base.module_eval do
47
+ def perform_action_with_reset
48
+ ActiveRecord::ConnectionAdapters::QueryCache::reset_stats
49
+ perform_action_without_reset
50
+ end
51
+
52
+ alias_method_chain :perform_action, :reset
53
+
54
+ def active_record_runtime(runtime)
55
+ stats = ActiveRecord::ConnectionAdapters::QueryCache::get_stats
56
+ "#{super} #{sprintf("%.1fk", stats[:bytes].to_f / 1024)} queries: #{stats[:queries]}"
57
+ end
58
+ end
@@ -0,0 +1,21 @@
1
+ module JavaEye
2
+ module DbProfiling
3
+ module Helper
4
+ def db_profiling_view
5
+ stats = ActiveRecord::ConnectionAdapters::QueryCache.get_stats
6
+ <<HTML
7
+ <div id="db_profiling" style="background:pink;color:black;position:absolute;top:16px;left:25%;padding:0.5em;border: 2px solid red;z-index:999;text-align:left;">
8
+ <strong>
9
+ Queries: <a href="#" onclick="$('cache_hits').toggle();return false;" title="Query cache hits">#{stats[:hits].size}</a> / <a href="#" onclick="$('cache_misses').toggle();return false;" title="DB queries">#{stats[:misses].size}</a> / #{number_to_percentage((stats[:hits].size.to_f / (stats[:queries])) * 100, :precision => 0)} |
10
+ Rows: #{stats[:rows]} |
11
+ Transfer: #{sprintf("%.1fk", stats[:bytes].to_f / 1024)} |
12
+ <a href="#" onclick="$('db_profiling').remove();return false;" title="Close">[X]</a>
13
+ </strong>
14
+ <ul id="cache_hits" style="text-align:left;display:none;">#{stats[:hits].inject("") {|output, s| output << "<li title='Click to display detail' onclick='$(this).next().toggle();return false;' style='cursor: pointer'>#{s[0]}</li><li style='display:none;list-style:none;'>#{s[1].join('<br/>')}</li>" }}</ul>
15
+ <ul id="cache_misses" style="text-align:left;display:none;">#{stats[:misses].inject("") {|output, s| output << "<li title='Click to display detail' onclick='$(this).next().toggle();return false;' style='cursor: pointer'>#{s[0]}</li><li style='display:none;list-style:none;'>#{s[1].join('<br/>')}</li>" }}</ul>
16
+ </div>
17
+ HTML
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,4 @@
1
+ require 'db_profiling/db_profiling'
2
+ require 'db_profiling/db_profiling_helper'
3
+
4
+ ActionView::Base.send :include, JavaEye::DbProfiling::Helper
metadata ADDED
@@ -0,0 +1,56 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: quake-db_profiling
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.3
5
+ platform: ruby
6
+ authors:
7
+ - Quake Wang
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2008-06-11 00:00:00 -07:00
13
+ default_executable:
14
+ dependencies: []
15
+
16
+ description:
17
+ email: quake.wang@gmail.com
18
+ executables: []
19
+
20
+ extensions: []
21
+
22
+ extra_rdoc_files:
23
+ - README
24
+ files:
25
+ - lib/db_profiling.rb
26
+ - lib/db_profiling/db_profiling.rb
27
+ - lib/db_profiling/db_profiling_helper.rb
28
+ - README
29
+ has_rdoc: false
30
+ homepage: https://github.com/quake/db_profiling/wikis
31
+ post_install_message:
32
+ rdoc_options: []
33
+
34
+ require_paths:
35
+ - lib
36
+ required_ruby_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: "0"
41
+ version:
42
+ required_rubygems_version: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - ">="
45
+ - !ruby/object:Gem::Version
46
+ version: "0"
47
+ version:
48
+ requirements: []
49
+
50
+ rubyforge_project:
51
+ rubygems_version: 1.0.1
52
+ signing_key:
53
+ specification_version: 2
54
+ summary: simple database query profiling tool
55
+ test_files: []
56
+