time_bandits 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  == About
4
4
 
5
- Time Bandits is a plugin which enhances Rails' controller/view/db benchmark logging.
5
+ Time Bandits is a gem plugin for Rails which enhances Rails' controller/view/db benchmark logging.
6
6
 
7
7
  == Usage
8
8
 
@@ -81,9 +81,7 @@ rewrite, hence we changed the name.
81
81
 
82
82
  == License
83
83
 
84
- Copyright (c) 2009,2011 Stefan Kaes <skaes@railsexpress.de>
85
-
86
- Some portions Copyright (c) 2008 tylerkovacs
84
+ Copyright (c) 2009, 2011 Stefan Kaes <skaes@railsexpress.de>
87
85
 
88
86
  Permission is hereby granted, free of charge, to any person obtaining
89
87
  a copy of this software and associated documentation files (the
@@ -0,0 +1,98 @@
1
+ = Time Bandits
2
+
3
+ == About
4
+
5
+ Time Bandits is a plugin which enhances Rails' controller/view/db benchmark logging.
6
+
7
+ == Usage
8
+
9
+ Without configuration, the standard Rails 'Completed line' will change
10
+ from its default format
11
+
12
+ Completed in 56ms (View: 28, DB: 5) | 200 OK [http://127.0.0.1/jobs/info]
13
+
14
+ to:
15
+
16
+ Completed in 56.278ms (View: 28.488, DB: 5.111(2,0)) | 200 OK [http://127.0.0.1/jobs/info]
17
+
18
+ Here "DB: 5.111(2,0)" means that 2 DB queries were executed and there were 0 SQL query cache hits.
19
+
20
+ However, non-trivial applications also rather often use external services, which consume time that adds
21
+ to your total response time, and sometimes these external services are not under your control. In these
22
+ cases, it's very helpful to have an entry in your log file that records the time spent in the exterrnal
23
+ service (so that you can prove that it wasn't your rails app that slowed down during your slashdotting,
24
+ for example ;-).
25
+
26
+ Additional TimeConsumers can be added to the log using the "Timebandits.add" method.
27
+
28
+ Example:
29
+
30
+ TimeBandits.add TimeBandits::TimeConsumers::Memcached
31
+ TimeBandits.add TimeBandits::TimeConsumers::GarbageCollection.instance if GC.respond_to? :enable_stats
32
+
33
+ Here we've added two additional consumers, which are already provided with the plugin. (Note that GC
34
+ information requires a patched ruby, (e.g. http://github.com/skaes/matzruby, branch ruby187pl202patched
35
+ or Ruby Enterprise Edition).
36
+
37
+ With these two new time consumers, the log line changes to
38
+
39
+ Completed in 680.378ms (View: 28.488, DB: 5.111(2,0), MC: 5.382(6r,0m), GC: 120.100(1), HP: 0(2000000,546468,18682541,934967)) | 200 OK [http://127.0.0.1/jobs/info]
40
+
41
+ "MC: 5.382(6r,0m)" means that 6 memcache reads were performed and all keys were found in the cache (0 misses).
42
+
43
+ "GC: 120.100(1)" tells us that 1 garbage collection was triggered during the request, taking 120.100 milliseconds.
44
+
45
+ "HP: 0(2000000,546468,18682541,934967)" shows statistics on heap usage. The format is g(s,a,m,l), where
46
+
47
+ g: heap growth during the request (#slots)
48
+ s: size of the heap after request processing was completed (#slots)
49
+ a: number of object allocations during the request (#slots)
50
+ m: number of bytes allocated by the ruby x_malloc call (#bytes)
51
+ l: live data set size after last GC (#slots)
52
+
53
+ It's pretty easy to write additional time consumers; please refer to the source code.
54
+
55
+
56
+ == Prerequisites
57
+
58
+ Rails 2.3.2, 2.3.3 or 2.3.4 The plugin will raise an error if you try
59
+ to use it with a different version.
60
+
61
+ A ruby with the railsbench GC patches applied, if you want to include
62
+ GC and heap size information in the completed line. This is very
63
+ useful, especially if you want to analyze your rails logs using logjam
64
+ (see http://github.com/alpinegizmo/logjam/).
65
+
66
+
67
+ == History
68
+
69
+ This plugin started from the code of the 'custom_benchmark' plugin
70
+ written by tylerkovacs. However, we changed so much of the code that
71
+ is is practically a full rewrite, hence we changed the name.
72
+
73
+
74
+ == License
75
+
76
+ Copyright (c) 2009 Stefan Kaes <skaes@railsexpress.de>
77
+
78
+ Some portions Copyright (c) 2008 tylerkovacs
79
+
80
+ Permission is hereby granted, free of charge, to any person obtaining
81
+ a copy of this software and associated documentation files (the
82
+ "Software"), to deal in the Software without restriction, including
83
+ without limitation the rights to use, copy, modify, merge, publish,
84
+ distribute, sublicense, and/or sell copies of the Software, and to
85
+ permit persons to whom the Software is furnished to do so, subject to
86
+ the following conditions:
87
+
88
+ The above copyright notice and this permission notice shall be
89
+ included in all copies or substantial portions of the Software.
90
+
91
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
92
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
93
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
94
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
95
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
96
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
97
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
98
+
data/init.rb ADDED
@@ -0,0 +1,12 @@
1
+ # this file gets only loaded for rails2
2
+ require 'time_bandits'
3
+ require 'time_bandits/monkey_patches/active_record_rails2'
4
+ require 'time_bandits/monkey_patches/action_controller_rails2'
5
+
6
+ ActionController::Base.send :include, ActionController::TimeBanditry
7
+
8
+ TimeBandits::TimeConsumers::GarbageCollection.heap_dumps_enabled = %w(production development).include?(RAILS_ENV)
9
+
10
+ # TimeBandits.add TimeBandits::TimeConsumers::Memcached if defined?(Memcached)
11
+ # TimeBandits.add TimeBandits::TimeConsumers::GarbageCollection.instance if GC.respond_to? :enable_stats
12
+ # TimeBandits.add TimeBandits::TimeConsumers::JMX.instance if defined? JRUBY_VERSION
data/lib/time_bandits.rb CHANGED
@@ -3,14 +3,18 @@ require 'active_support/core_ext'
3
3
  module TimeBandits
4
4
 
5
5
  module TimeConsumers
6
- autoload :Database, 'time_bandits/time_consumers/database'
6
+ if defined?(Rails) && Rails::VERSION::STRING < "3.0"
7
+ autoload :Database, 'time_bandits/time_consumers/database_rails2'
8
+ else
9
+ autoload :Database, 'time_bandits/time_consumers/database'
10
+ end
7
11
  autoload :GarbageCollection, 'time_bandits/time_consumers/garbage_collection'
8
12
  autoload :JMX, 'time_bandits/time_consumers/jmx'
9
13
  autoload :MemCache, 'time_bandits/time_consumers/mem_cache'
10
14
  autoload :Memcached, 'time_bandits/time_consumers/memcached'
11
15
  end
12
16
 
13
- require 'time_bandits/railtie' if defined?(Rails)
17
+ require 'time_bandits/railtie' if defined?(Rails) && Rails::VERSION::STRING >= "3.0"
14
18
 
15
19
  mattr_accessor :time_bandits
16
20
  self.time_bandits = []
@@ -0,0 +1,129 @@
1
+ # =========================================================================================================
2
+ # IMPORTANT: the plugin changes the ActionController#process method chain
3
+ #
4
+ # the original rails stack looks like this:
5
+ #
6
+ # ApplicationController#process_with_unload_user
7
+ # ActionController::SessionManagement#process_with_session_management_support
8
+ # ActionController::Filters#process_with_filters
9
+ # ActionController::Base#process
10
+ # ActionController::Caching::SqlCache#perform_action_with_caching
11
+ # ActionController::Rescue#perform_action_with_rescue
12
+ # *** ActionController::Benchmarking#perform_action_with_benchmark ***
13
+ # ActionController::Filters#perform_action_with_filters (==> this runs the filters)
14
+ # ActionController::Base#perform_action (==> run the action and eventually call render)
15
+ # ActionController::Benchmarking#render_with_benchmark (==> this is where the rendering time gets computed)
16
+ # ActionController::Base::render
17
+ #
18
+ # with the plugin installed, the stack looks like this:
19
+ #
20
+ # ApplicationController#process_with_unload_user
21
+ # ActionController::SessionManagement#process_with_session_management_support
22
+ # ActionController::Filters#process_with_filters
23
+ # ActionController::Base#process
24
+ # *** ActionController::Benchmarking#perform_action_with_time_bandits *** <=========== !!!!
25
+ # ActionController::Caching::SqlCache#perform_action_with_caching
26
+ # ActionController::Rescue#perform_action_with_rescue
27
+ # ActionController::Filters#perform_action_with_filters (==> this runs the filters)
28
+ # ActionController::Base#perform_action (==> run the action and eventually call render)
29
+ # ActionController::Benchmarking#render_with_benchmark (==> this is where the rendering time gets computed)
30
+ # ActionController::Base::render
31
+ # =========================================================================================================
32
+
33
+ module ActionController #:nodoc:
34
+ module TimeBanditry #:nodoc:
35
+ def self.included(base)
36
+ base.class_eval do
37
+ alias_method_chain :perform_action, :time_bandits
38
+ alias_method_chain :rescue_action, :time_bandits
39
+
40
+ # if timebandits are used, the default benchmarking is
41
+ # disabled. As alias_method_chain is unfriendly to extensions,
42
+ # this is done by skipping perform_action_with_benchmarks by
43
+ # calling perform_action_without_benchmarks at the appropriate
44
+ # place.
45
+ def perform_action_without_rescue
46
+ perform_action_without_benchmark
47
+ end
48
+
49
+ alias_method :render, :render_with_benchmark
50
+ end
51
+
52
+ TimeBandits.add TimeBandits::TimeConsumers::Database.instance
53
+ end
54
+
55
+ def render_with_benchmark(options = nil, extra_options = {}, &block)
56
+ if logger
57
+ before_rendering = TimeBandits.consumed
58
+
59
+ render_output = nil
60
+ @view_runtime = Benchmark::realtime { render_output = render_without_benchmark(options, extra_options, &block) }
61
+
62
+ other_time_consumed_during_rendering = TimeBandits.consumed - before_rendering
63
+ @view_runtime -= other_time_consumed_during_rendering
64
+
65
+ render_output
66
+ else
67
+ render_without_benchmark(options, extra_options, &block)
68
+ end
69
+ end
70
+
71
+ def perform_action_with_time_bandits
72
+ if logger
73
+ TimeBandits.reset
74
+
75
+ seconds = [ Benchmark::measure{ perform_action_without_time_bandits }.real, 0.0001 ].max
76
+
77
+ log_message = "Completed in #{sprintf("%.3f", seconds * 1000)}ms"
78
+
79
+ log_message << " ("
80
+ log_message << view_runtime
81
+ TimeBandits.time_bandits.each do |bandit|
82
+ log_message << ", #{bandit.runtime}"
83
+ end
84
+ log_message << ")"
85
+
86
+ log_message << " | #{response.status}"
87
+ log_message << " [#{complete_request_uri rescue "unknown"}]"
88
+
89
+ logger.info(log_message)
90
+ response.headers["X-Runtime"] = "#{sprintf("%.0f", seconds * 1000)}ms"
91
+ else
92
+ perform_action_without_time_bandits
93
+ end
94
+ end
95
+
96
+ def rescue_action_with_time_bandits(exception)
97
+ # HACK!
98
+ if logger && !caller.any?{|c| c =~ /perform_action_without_time_bandits/ }
99
+ TimeBandits.reset
100
+
101
+ seconds = [ Benchmark::measure{ rescue_action_without_time_bandits(exception) }.real, 0.0001 ].max
102
+
103
+ log_message = "Completed in #{sprintf("%.3f", seconds * 1000)}ms"
104
+
105
+ log_message << " ("
106
+ log_message << view_runtime
107
+ TimeBandits.time_bandits.each do |bandit|
108
+ log_message << ", #{bandit.runtime}"
109
+ end
110
+ log_message << ")"
111
+
112
+ log_message << " | #{response.status}"
113
+ log_message << " [#{complete_request_uri rescue "unknown"}]"
114
+
115
+ logger.info(log_message)
116
+ response.headers["X-Runtime"] = "#{sprintf("%.0f", seconds * 1000)}ms"
117
+ else
118
+ rescue_action_without_time_bandits(exception)
119
+ end
120
+ end
121
+
122
+ private
123
+
124
+ def view_runtime
125
+ "View: %.3f" % ((@view_runtime||0) * 1000)
126
+ end
127
+
128
+ end
129
+ end
@@ -0,0 +1,86 @@
1
+ # this file monkey patches class ActiveRecord::ConnectionAdapters::AbstractAdapter
2
+ # and the module module ActiveRecord::ConnectionAdapters::QueryCache
3
+ # to count the number of sql statements being executed.
4
+ # it needs to be adapted to each new rails version
5
+
6
+ raise "AR abstract adapter monkey patch for custom benchmarking is not compatible with your rails version" unless
7
+ %w(2.3.2 2.3.3 2.3.4 2.3.8 2.3.9 2.3.10).include?(Rails::VERSION::STRING)
8
+
9
+ module ActiveRecord
10
+ module ConnectionAdapters
11
+ class ConnectionPool
12
+ attr_reader :connections
13
+ end
14
+
15
+ class AbstractAdapter
16
+ attr_accessor :call_count, :query_cache_hits
17
+
18
+ def initialize(connection, logger = nil) #:nodoc:
19
+ @connection, @logger = connection, logger
20
+ @runtime = 0
21
+ @call_count = 0
22
+ @last_verification = 0
23
+ @query_cache_enabled = false
24
+ @query_cache_hits = 0
25
+ end
26
+
27
+ def reset_call_count
28
+ calls = @call_count
29
+ @call_count = 0
30
+ calls
31
+ end
32
+
33
+ def reset_query_cache_hits
34
+ hits = @query_cache_hits
35
+ @query_cache_hits = 0
36
+ hits
37
+ end
38
+
39
+ protected
40
+ def log(sql, name)
41
+ if block_given?
42
+ result = nil
43
+ seconds = Benchmark.realtime { result = yield }
44
+ @runtime += seconds
45
+ @call_count += 1
46
+ log_info(sql, name, seconds * 1000)
47
+ result
48
+ else
49
+ log_info(sql, name, 0)
50
+ nil
51
+ end
52
+ rescue Exception => e
53
+ # Log message and raise exception.
54
+ # Set last_verification to 0, so that connection gets verified
55
+ # upon reentering the request loop
56
+ @last_verification = 0
57
+ message = "#{e.class.name}: #{e.message}: #{sql}"
58
+ log_info(message, name, 0)
59
+ raise ActiveRecord::StatementInvalid, message
60
+ end
61
+ end
62
+
63
+ module QueryCache
64
+ private
65
+ def cache_sql(sql)
66
+ result =
67
+ if @query_cache.has_key?(sql)
68
+ @query_cache_hits += 1
69
+ log_info(sql, "CACHE", 0.0)
70
+ @query_cache[sql]
71
+ else
72
+ @query_cache[sql] = yield
73
+ end
74
+
75
+ if Array === result
76
+ result.collect { |row| row.dup }
77
+ else
78
+ result.duplicable? ? result.dup : result
79
+ end
80
+ rescue TypeError
81
+ result
82
+ end
83
+ end
84
+ end
85
+ end
86
+
@@ -0,0 +1,53 @@
1
+ # Database time consumer for Rails2. You need to add it via
2
+ #
3
+ # TimeBandits.add TimeBandits::TimeConsumers::Database.instance
4
+ #
5
+
6
+ module TimeBandits
7
+ module TimeConsumers
8
+ # provide a time consumer interface to ActiveRecord for perform_action_with_benchmark and render_with_benchmark
9
+ class Database
10
+ def initialize
11
+ @consumed = 0.0
12
+ @call_count = 0
13
+ @query_cache_hits = 0
14
+ end
15
+ private :initialize
16
+
17
+ def self.instance
18
+ @instance ||= new
19
+ end
20
+
21
+ def reset
22
+ reset_stats
23
+ @call_count = 0
24
+ @consumed = 0.0
25
+ @query_cache_hits = 0
26
+ end
27
+
28
+ def consumed
29
+ hits, calls, time = reset_stats
30
+ @query_cache_hits += hits
31
+ @call_count += calls
32
+ @consumed += time
33
+ end
34
+
35
+ def runtime
36
+ sprintf "DB: %.3f(%d,%d)", @consumed * 1000, @call_count, @query_cache_hits
37
+ end
38
+
39
+ private
40
+ def all_connections
41
+ ActiveRecord::Base.connection_handler.connection_pools.values.map{|pool| pool.connections}.flatten
42
+ end
43
+
44
+ def reset_stats
45
+ connections = all_connections
46
+ hits = connections.map{|c| c.reset_query_cache_hits}.sum
47
+ calls = connections.map{|c| c.reset_call_count}.sum
48
+ time = connections.map{|c| c.reset_runtime}.sum
49
+ [hits, calls, time]
50
+ end
51
+ end
52
+ end
53
+ end
@@ -72,14 +72,19 @@ module TimeBandits
72
72
  end
73
73
  end
74
74
 
75
+ if defined?(Rails) && Rails::VERSION::STRING >= "3.0"
76
+ GCFORMAT = "GC: %.3f(%d) | HP: %d(%d,%d,%d,%d)"
77
+ else
78
+ GCFORMAT= "GC: %.3f(%d), HP: %d(%d,%d,%d,%d)"
79
+ end
80
+
75
81
  def runtime
76
82
  heap_slots = GC.heap_slots
77
83
  heap_growth = self.heap_growth
78
84
  allocated_objects = self.allocated_objects
79
85
  allocated_size = self.allocated_size
80
- GCHacks.heap_dump if heap_growth > 0 && @@heap_dumps_enabled
81
- "GC: %.3f(%d) | HP: %d(%d,%d,%d,%d)" %
82
- [consumed_gc_time * 1000, collections, heap_growth, heap_slots, allocated_objects, allocated_size, live_data_set_size]
86
+ GCHacks.heap_dump if heap_growth > 0 && @@heap_dumps_enabled && defined?(GCHacks)
87
+ GCFORMAT % [consumed_gc_time * 1000, collections, heap_growth, heap_slots, allocated_objects, allocated_size, live_data_set_size]
83
88
  end
84
89
 
85
90
  else
@@ -1,4 +1,4 @@
1
- # a time consumer implementation for jruby, using jxm
1
+ # a time consumer implementation for jruby, using jmx
2
2
  #
3
3
  # the gc counts and times reported are summed over all the garbage collectors
4
4
  # heap_growth reflects changes in the committed size of the java heap
@@ -6,6 +6,8 @@
6
6
  # allocated_size reflects changes in the active (used) part of the java heap
7
7
  # java non-heap memory is not reported
8
8
 
9
+ require 'jmx' if defined? JRUBY_VERSION
10
+
9
11
  module TimeBandits
10
12
  module TimeConsumers
11
13
  class JMX
@@ -28,7 +30,7 @@ module TimeBandits
28
30
  def gc_time
29
31
  @collectors.to_array.map {|gc| @server[gc].collection_time}.sum
30
32
  end
31
-
33
+
32
34
  def gc_collections
33
35
  @collectors.to_array.map {|gc| @server[gc].collection_count}.sum
34
36
  end
@@ -36,7 +38,7 @@ module TimeBandits
36
38
  def heap_size
37
39
  @memory_bean.heap_memory_usage.committed
38
40
  end
39
-
41
+
40
42
  def heap_usage
41
43
  @memory_bean.heap_memory_usage.used
42
44
  end
@@ -47,7 +49,7 @@ module TimeBandits
47
49
  @heap_committed = heap_size
48
50
  @heap_used = heap_usage
49
51
  end
50
-
52
+
51
53
  def collections_delta
52
54
  gc_collections - @collections
53
55
  end
@@ -63,7 +65,7 @@ module TimeBandits
63
65
  def usage_growth
64
66
  heap_usage - @heap_used
65
67
  end
66
-
68
+
67
69
  def allocated_objects
68
70
  0
69
71
  end
@@ -1,3 +1,3 @@
1
1
  module TimeBandits
2
- VERSION = "0.0.7"
2
+ VERSION = "0.0.8"
3
3
  end
data/rails/init.rb ADDED
@@ -0,0 +1 @@
1
+ require File.expand_path('../../init.rb', __FILE__)
data/time_bandits.gemspec CHANGED
@@ -8,15 +8,15 @@ Gem::Specification.new do |s|
8
8
  s.platform = Gem::Platform::RUBY
9
9
  s.authors = ["Stefan Kaes"]
10
10
  s.email = ["skaes@railsexpress.de"]
11
- s.homepage = "https://github.com/skaes/time_bandits/tree/rails3"
11
+ s.homepage = "https://github.com/skaes/time_bandits/"
12
12
  s.summary = "Custom performance logging for Rails"
13
- s.description = "Rails 3 Completed Line on Steroids"
13
+ s.description = "Rails Completed Line on Steroids"
14
14
 
15
15
  s.files = `git ls-files`.split("\n")
16
16
  s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
17
  s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
18
  s.require_paths = ["lib"]
19
19
 
20
- s.add_runtime_dependency("activesupport", ["~> 3.0"])
20
+ s.add_runtime_dependency("activesupport", [">= 2.3.2"])
21
21
  end
22
22
 
metadata CHANGED
@@ -1,8 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: time_bandits
3
3
  version: !ruby/object:Gem::Version
4
+ hash: 15
4
5
  prerelease:
5
- version: 0.0.7
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 8
10
+ version: 0.0.8
6
11
  platform: ruby
7
12
  authors:
8
13
  - Stefan Kaes
@@ -10,7 +15,7 @@ autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
17
 
13
- date: 2011-04-05 00:00:00 +02:00
18
+ date: 2011-08-06 00:00:00 +02:00
14
19
  default_executable:
15
20
  dependencies:
16
21
  - !ruby/object:Gem::Dependency
@@ -19,12 +24,17 @@ dependencies:
19
24
  requirement: &id001 !ruby/object:Gem::Requirement
20
25
  none: false
21
26
  requirements:
22
- - - ~>
27
+ - - ">="
23
28
  - !ruby/object:Gem::Version
24
- version: "3.0"
29
+ hash: 7
30
+ segments:
31
+ - 2
32
+ - 3
33
+ - 2
34
+ version: 2.3.2
25
35
  type: :runtime
26
36
  version_requirements: *id001
27
- description: Rails 3 Completed Line on Steroids
37
+ description: Rails Completed Line on Steroids
28
38
  email:
29
39
  - skaes@railsexpress.de
30
40
  executables: []
@@ -37,24 +47,30 @@ files:
37
47
  - .gitignore
38
48
  - Gemfile
39
49
  - README.rdoc
50
+ - README_RAILS2.rdoc
40
51
  - Rakefile
41
52
  - TODO
53
+ - init.rb
42
54
  - lib/time_bandits.rb
43
55
  - lib/time_bandits/monkey_patches/action_controller.rb
56
+ - lib/time_bandits/monkey_patches/action_controller_rails2.rb
44
57
  - lib/time_bandits/monkey_patches/active_record.rb
58
+ - lib/time_bandits/monkey_patches/active_record_rails2.rb
45
59
  - lib/time_bandits/monkey_patches/memcache-client.rb
46
60
  - lib/time_bandits/monkey_patches/memcached.rb
47
61
  - lib/time_bandits/monkey_patches/rails_rack_logger.rb
48
62
  - lib/time_bandits/railtie.rb
49
63
  - lib/time_bandits/time_consumers/database.rb
64
+ - lib/time_bandits/time_consumers/database_rails2.rb
50
65
  - lib/time_bandits/time_consumers/garbage_collection.rb
51
66
  - lib/time_bandits/time_consumers/jmx.rb
52
67
  - lib/time_bandits/time_consumers/mem_cache.rb
53
68
  - lib/time_bandits/time_consumers/memcached.rb
54
69
  - lib/time_bandits/version.rb
70
+ - rails/init.rb
55
71
  - time_bandits.gemspec
56
72
  has_rdoc: true
57
- homepage: https://github.com/skaes/time_bandits/tree/rails3
73
+ homepage: https://github.com/skaes/time_bandits/
58
74
  licenses: []
59
75
 
60
76
  post_install_message:
@@ -67,17 +83,23 @@ required_ruby_version: !ruby/object:Gem::Requirement
67
83
  requirements:
68
84
  - - ">="
69
85
  - !ruby/object:Gem::Version
86
+ hash: 3
87
+ segments:
88
+ - 0
70
89
  version: "0"
71
90
  required_rubygems_version: !ruby/object:Gem::Requirement
72
91
  none: false
73
92
  requirements:
74
93
  - - ">="
75
94
  - !ruby/object:Gem::Version
95
+ hash: 3
96
+ segments:
97
+ - 0
76
98
  version: "0"
77
99
  requirements: []
78
100
 
79
101
  rubyforge_project:
80
- rubygems_version: 1.5.3
102
+ rubygems_version: 1.6.2
81
103
  signing_key:
82
104
  specification_version: 3
83
105
  summary: Custom performance logging for Rails