memory_tracker 1.0.6 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Gemfile +0 -3
- data/Gemfile.lock +21 -41
- data/README.md +38 -3
- data/app/views/memory_tracker/dashboards/index.html.erb +1 -1
- data/lib/memory_tracker/engine.rb +26 -3
- data/lib/memory_tracker/memory_tracker.rb +3 -16
- data/lib/memory_tracker/stores/gcstat_logfile_store.rb +8 -7
- data/lib/memory_tracker/stores/in_memory_store.rb +6 -6
- data/lib/memory_tracker/stores/url_logfile_store.rb +7 -7
- data/lib/memory_tracker/version.rb +1 -1
- data/memory_tracker.gemspec +3 -0
- data/spec/lib/stores/gcstat_logfile_store_spec.rb +6 -2
- data/spec/lib/stores/in_memory_store_spec.rb +3 -3
- data/spec/lib/stores/loader_spec.rb +28 -0
- data/spec/lib/stores/url_logfile_store_spec.rb +6 -2
- data/spec/spec_helper.rb +10 -0
- metadata +39 -9
- checksums.yaml +0 -7
data/Gemfile
CHANGED
@@ -5,9 +5,6 @@ source "https://rubygems.org"
|
|
5
5
|
# development dependencies will be added by default to the :development group.
|
6
6
|
gemspec
|
7
7
|
|
8
|
-
# jquery-rails is used by the dummy application
|
9
|
-
gem "jquery-rails"
|
10
|
-
|
11
8
|
# Declare any dependencies that are still in development here instead of in
|
12
9
|
# your gemspec. These might include edge Rails or gems from your path or
|
13
10
|
# Git. Remember to move these dependencies to your gemspec before releasing
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,20 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
memory_tracker (1.0.6)
|
5
|
+
activesupport
|
6
|
+
sys-proctable
|
7
|
+
|
1
8
|
GEM
|
2
|
-
remote:
|
9
|
+
remote: https://rubygems.org/
|
3
10
|
specs:
|
4
|
-
|
5
|
-
|
11
|
+
activesupport (4.0.1)
|
12
|
+
i18n (~> 0.6, >= 0.6.4)
|
13
|
+
minitest (~> 4.2)
|
14
|
+
multi_json (~> 1.3)
|
15
|
+
thread_safe (~> 0.1)
|
16
|
+
tzinfo (~> 0.3.37)
|
17
|
+
atomic (1.1.14)
|
6
18
|
columnize (0.3.6)
|
7
19
|
debugger (1.6.2)
|
8
20
|
columnize (>= 0.3.1)
|
@@ -11,44 +23,10 @@ GEM
|
|
11
23
|
debugger-linecache (1.2.0)
|
12
24
|
debugger-ruby_core_source (1.2.3)
|
13
25
|
diff-lcs (1.2.4)
|
14
|
-
|
15
|
-
multipart-post (~> 1.2.0)
|
16
|
-
git (1.2.6)
|
17
|
-
github_api (0.10.1)
|
18
|
-
addressable
|
19
|
-
faraday (~> 0.8.1)
|
20
|
-
hashie (>= 1.2)
|
21
|
-
multi_json (~> 1.4)
|
22
|
-
nokogiri (~> 1.5.2)
|
23
|
-
oauth2
|
24
|
-
hashie (2.0.5)
|
25
|
-
highline (1.6.20)
|
26
|
-
httpauth (0.2.0)
|
27
|
-
jeweler (1.8.8)
|
28
|
-
builder
|
29
|
-
bundler (~> 1.0)
|
30
|
-
git (>= 1.2.5)
|
31
|
-
github_api (= 0.10.1)
|
32
|
-
highline (>= 1.6.15)
|
33
|
-
nokogiri (= 1.5.10)
|
34
|
-
rake
|
35
|
-
rdoc
|
26
|
+
i18n (0.6.5)
|
36
27
|
json (1.8.1)
|
37
|
-
|
38
|
-
multi_json (>= 1.5)
|
28
|
+
minitest (4.7.5)
|
39
29
|
multi_json (1.8.2)
|
40
|
-
multi_xml (0.5.5)
|
41
|
-
multipart-post (1.2.0)
|
42
|
-
nokogiri (1.5.10)
|
43
|
-
oauth2 (0.9.2)
|
44
|
-
faraday (~> 0.8)
|
45
|
-
httpauth (~> 0.2)
|
46
|
-
jwt (~> 0.1.4)
|
47
|
-
multi_json (~> 1.0)
|
48
|
-
multi_xml (~> 0.5)
|
49
|
-
rack (~> 1.2)
|
50
|
-
rack (1.5.2)
|
51
|
-
rake (10.1.0)
|
52
30
|
rdoc (3.12.2)
|
53
31
|
json (~> 1.4)
|
54
32
|
rspec (2.14.1)
|
@@ -60,6 +38,9 @@ GEM
|
|
60
38
|
diff-lcs (>= 1.1.3, < 2.0)
|
61
39
|
rspec-mocks (2.14.4)
|
62
40
|
sys-proctable (0.9.3)
|
41
|
+
thread_safe (0.1.3)
|
42
|
+
atomic
|
43
|
+
tzinfo (0.3.38)
|
63
44
|
|
64
45
|
PLATFORMS
|
65
46
|
ruby
|
@@ -67,7 +48,6 @@ PLATFORMS
|
|
67
48
|
DEPENDENCIES
|
68
49
|
bundler (~> 1.0)
|
69
50
|
debugger
|
70
|
-
|
51
|
+
memory_tracker!
|
71
52
|
rdoc (~> 3.12)
|
72
53
|
rspec (~> 2.14.0)
|
73
|
-
sys-proctable
|
data/README.md
CHANGED
@@ -7,8 +7,18 @@ MemoryTracker collects, analyzes and reports memory usage data of each controlle
|
|
7
7
|
* Display stats on every controller action of the application in a engine webpage embedded in the gem.
|
8
8
|
|
9
9
|
# Dashboard
|
10
|
+
## Screenshot
|
10
11
|
The dashboard is at /memtracker in the host application (but you need to mount the engine in the app first, see below).
|
11
|
-
|
12
|
+
|
13
|
+
[Dashboard snapshot](https://raw.github.com/plerohellec/memory_tracker/master/docs/memory_tracker_dashboard.png)
|
14
|
+
|
15
|
+
That's where the collected statistics are displayed.
|
16
|
+
|
17
|
+
## What to look for?
|
18
|
+
* Controller actions that have a non zero "heap used" value. Those actions required more memory than was available in the currently allocated heaps.
|
19
|
+
* Controller actions that have a "total_allocated_object" value N times higher than the average.
|
20
|
+
* Controller actions that trigger the garbage collector frequently. That the "count" value in the dashboard.
|
21
|
+
|
12
22
|
|
13
23
|
# How?
|
14
24
|
MemoryTracker uses system memory data and Ruby garbage collector statistics to find the memory currently used by The Rails processes, how many objects were allocated in Ruby heaps, how many heaps were created and how many times the garbage collector ran. The MemoryTracker middleware captures the data before and after each HHTP request and saves the deltas per controller/action in a variety of stores.
|
@@ -20,10 +30,34 @@ MemoryTracker currently comes with 3 stores.
|
|
20
30
|
|
21
31
|
* The InMemoryStore keeps counters in memory for the process where it runs. This store in itself uses very little memory as it only keeps a set of counters per controller/action in the application. Since it doesn't do any IO, it is also extremely fast. The data is immediately available without any need for a background aggregation tasks.
|
22
32
|
|
23
|
-
* The GcStatLogfile store simply
|
33
|
+
* The GcStatLogfile store simply writes memory stats to a log file called '#{Rails.root}/log/memtracker_gcstat.log' after each HTTP request.
|
24
34
|
|
25
35
|
* The UrlLogfileStore also stores data in a log file ('#{Rails.root}/log/memtracker_urls.log') but instead of writing the raw memory data, it records the URL that was requested along with the memory deltas between the current request and the previous one. It also highlights the urls where the deltas were the greatest. It's sometimes interesting to browse through this file URLs that are particularly greedy.
|
26
36
|
|
37
|
+
# Config file
|
38
|
+
[memory_tracker.yml](https://github.com/plerohellec/memory_tracker/blob/master/config/memory_tracker.yml)
|
39
|
+
|
40
|
+
The config file is optional. If you choose to write one, place it in "#{Rails.root}/config".
|
41
|
+
In the absence of a custom config file, memory_tracker will fallback to the file linked above in the gem.
|
42
|
+
|
43
|
+
By creating you own config file, you can choose which stores are enabled and tune them. By default all stores are enabled. Here is a sample config file that enables only the InMemoryStore with a 4 hour long data window:
|
44
|
+
|
45
|
+
```yml
|
46
|
+
defaults: &defaults
|
47
|
+
stores:
|
48
|
+
- name: memory
|
49
|
+
window_length: 14400
|
50
|
+
|
51
|
+
|
52
|
+
production:
|
53
|
+
<<: *defaults
|
54
|
+
|
55
|
+
development:
|
56
|
+
<<: *defaults
|
57
|
+
|
58
|
+
test:
|
59
|
+
<<: *defaults
|
60
|
+
```
|
27
61
|
|
28
62
|
# Enabling MemoryTracker
|
29
63
|
Add it to your Gemfile:
|
@@ -39,6 +73,7 @@ Once the app is running, go to /memtracker to review the list of controller acti
|
|
39
73
|
# Requirements
|
40
74
|
The gem has been tested and is compatible with:
|
41
75
|
* Ruby 2.0
|
76
|
+
* Ruby 1.9 but 1.9 GC.stat does not include the total_allocated_object number so its value remains at 0 in MemoryTracker.
|
42
77
|
* Rails 3.2
|
43
78
|
|
44
79
|
# Tips
|
@@ -52,7 +87,7 @@ The gem has been tested and is compatible with:
|
|
52
87
|
# Coming soon
|
53
88
|
* Redis store.
|
54
89
|
* Store and report the most expensive URLs.
|
55
|
-
* Support for
|
90
|
+
* Support for Rails 4 (it might already work, it's just not been tested yet).
|
56
91
|
|
57
92
|
# Contributing to memory_tracker
|
58
93
|
|
@@ -5,17 +5,40 @@ module MemoryTracker
|
|
5
5
|
engine_base_dir = File.expand_path("../../..", __FILE__)
|
6
6
|
app_base_dir = File.expand_path("../../../app", __FILE__)
|
7
7
|
lib_base_dir = File.expand_path("../../../lib", __FILE__)
|
8
|
+
config_base_dir = File.expand_path("../../../config", __FILE__)
|
8
9
|
|
9
10
|
config.autoload_paths << lib_base_dir
|
10
11
|
|
12
|
+
|
13
|
+
initializer "memory_tracker.load_config" do |app|
|
14
|
+
app_config_file_path = "#{app.root}/config/memory_tracker.yml"
|
15
|
+
gem_config_file_path = "#{config_base_dir}/memory_tracker.yml"
|
16
|
+
if File.exist?(app_config_file_path)
|
17
|
+
config_file_path = app_config_file_path
|
18
|
+
elsif File.exist?(gem_config_file_path)
|
19
|
+
config_file_path = gem_config_file_path
|
20
|
+
end
|
21
|
+
|
22
|
+
if config_file_path
|
23
|
+
Rails.logger.debug "Reading #{config_file_path}"
|
24
|
+
config = YAML.load_file(config_file_path)
|
25
|
+
config = config.fetch(Rails.env) { raise "#{Rails.env} environment key is missing from #{config_file_path}" }
|
26
|
+
MemoryTracker.instance.config = ActiveSupport::HashWithIndifferentAccess.new(config)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
11
30
|
initializer "memory_tracker.add_middleware" do |app|
|
12
31
|
app.middleware.use MemoryTracker::Middleware
|
13
32
|
end
|
14
33
|
|
15
34
|
initializer "memory_tracker.setup_stores" do |app|
|
16
|
-
MemoryTracker.instance.
|
17
|
-
|
18
|
-
|
35
|
+
if MemoryTracker.instance.config
|
36
|
+
MemoryTracker.instance.config[:stores].each do |store|
|
37
|
+
Stores::Loader.enable_store(MemoryTracker.instance, store)
|
38
|
+
end
|
39
|
+
else
|
40
|
+
Stores::Loader.enable_all(MemoryTracker.instance)
|
41
|
+
end
|
19
42
|
end
|
20
43
|
end
|
21
44
|
end
|
@@ -3,12 +3,12 @@ module MemoryTracker
|
|
3
3
|
include Singleton
|
4
4
|
include Enumerable
|
5
5
|
|
6
|
-
attr_accessor :
|
7
|
-
|
6
|
+
attr_accessor :config
|
7
|
+
|
8
8
|
def stores
|
9
9
|
@stores ||= {}
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
def add_store(store)
|
13
13
|
stores[store.name] = store
|
14
14
|
end
|
@@ -29,19 +29,6 @@ module MemoryTracker
|
|
29
29
|
stores[store_name].stats
|
30
30
|
end
|
31
31
|
|
32
|
-
def self.track_block(*args)
|
33
|
-
self.instance.track_block(*args)
|
34
|
-
end
|
35
|
-
|
36
|
-
def track_block(name, &block)
|
37
|
-
raise ArgumentError unless block_given?
|
38
|
-
before = GC.stat
|
39
|
-
ret = yield
|
40
|
-
after = GC.stat
|
41
|
-
gcstat_logger.debug "gcstat diff for #{name}: #{GcStat.gcdiff(before, after)}"
|
42
|
-
ret
|
43
|
-
end
|
44
|
-
|
45
32
|
private
|
46
33
|
|
47
34
|
def each_store
|
@@ -1,13 +1,14 @@
|
|
1
1
|
module MemoryTracker
|
2
2
|
module Stores
|
3
|
-
class GcstatLogfileStore
|
4
|
-
|
5
|
-
@logger = logger_class.new(logfile_path)
|
6
|
-
@num_lines = 0
|
7
|
-
end
|
3
|
+
class GcstatLogfileStore < Base
|
4
|
+
register_store :gcstat_logfile
|
8
5
|
|
9
|
-
def
|
10
|
-
:
|
6
|
+
def initialize(opts)
|
7
|
+
logger_class = opts.fetch(:logger_class, 'ActiveSupport::BufferedLogger')
|
8
|
+
filename = opts.fetch(:filename, "#{Rails.root}/log/memtracker_gcstat.log")
|
9
|
+
|
10
|
+
@logger = logger_class.constantize.new(filename)
|
11
|
+
@num_lines = 0
|
11
12
|
end
|
12
13
|
|
13
14
|
def push(request)
|
@@ -1,16 +1,16 @@
|
|
1
1
|
module MemoryTracker
|
2
2
|
module Stores
|
3
3
|
module InMemoryStore
|
4
|
-
class Manager
|
5
|
-
|
6
|
-
|
4
|
+
class Manager < Base
|
5
|
+
register_store :memory
|
6
|
+
|
7
|
+
def initialize(opts = {})
|
8
|
+
@length = opts.fetch(:window_length, 60*60*4)
|
9
|
+
|
7
10
|
@window1 = StatInterval.new(Time.now - @length/2, @length)
|
8
11
|
@window2 = StatInterval.new(Time.now, @length)
|
9
12
|
end
|
10
13
|
|
11
|
-
def name
|
12
|
-
:memory
|
13
|
-
end
|
14
14
|
|
15
15
|
def push(request)
|
16
16
|
rotate_windows
|
@@ -1,17 +1,17 @@
|
|
1
1
|
module MemoryTracker
|
2
2
|
module Stores
|
3
|
-
class UrlLogfileStore
|
4
|
-
|
5
|
-
|
6
|
-
|
3
|
+
class UrlLogfileStore < Base
|
4
|
+
register_store :url_logfile
|
5
|
+
|
6
|
+
def initialize(opts)
|
7
|
+
logger_class = opts.fetch(:logger_class, 'ActiveSupport::BufferedLogger')
|
8
|
+
filename = opts.fetch(:filename, "#{Rails.root}/log/memtracker_urls.log")
|
7
9
|
|
8
|
-
|
9
|
-
:url_logfile
|
10
|
+
@logger = logger_class.constantize.new(filename)
|
10
11
|
end
|
11
12
|
|
12
13
|
def push(request)
|
13
14
|
@request = request
|
14
|
-
|
15
15
|
write_request_log
|
16
16
|
end
|
17
17
|
|
data/memory_tracker.gemspec
CHANGED
@@ -57,6 +57,7 @@ Gem::Specification.new do |s|
|
|
57
57
|
s.add_development_dependency(%q<rspec>, ["~> 2.14.0"])
|
58
58
|
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
59
59
|
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
60
|
+
s.add_dependency('activesupport')
|
60
61
|
|
61
62
|
else
|
62
63
|
s.add_dependency(%q<sys-proctable>, [">= 0"])
|
@@ -64,6 +65,7 @@ Gem::Specification.new do |s|
|
|
64
65
|
s.add_dependency(%q<rspec>, ["~> 2.14.0"])
|
65
66
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
66
67
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
68
|
+
s.add_dependency('activesupport')
|
67
69
|
|
68
70
|
end
|
69
71
|
else
|
@@ -72,5 +74,6 @@ Gem::Specification.new do |s|
|
|
72
74
|
s.add_dependency(%q<rspec>, ["~> 2.14.0"])
|
73
75
|
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
74
76
|
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
77
|
+
s.add_dependency('activesupport')
|
75
78
|
end
|
76
79
|
end
|
@@ -1,10 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
1
3
|
module MemoryTracker
|
2
4
|
module Stores
|
3
5
|
describe GcstatLogfileStore do
|
4
6
|
before :each do
|
5
|
-
|
7
|
+
logger_class_name = double("logger_class_name")
|
8
|
+
logger_class = double("logger_class")
|
9
|
+
allow(logger_class_name).to receive(:constantize) { logger_class }
|
6
10
|
allow(logger_class).to receive(:new)
|
7
|
-
@logstore = GcstatLogfileStore.new
|
11
|
+
@logstore = GcstatLogfileStore.new(:logger_class => logger_class_name, :filename => "foo/log")
|
8
12
|
end
|
9
13
|
|
10
14
|
it 'implements the store role' do
|
@@ -38,13 +38,13 @@ module MemoryTracker
|
|
38
38
|
end
|
39
39
|
|
40
40
|
it 'should respond to name' do
|
41
|
-
manager = Manager.new(60)
|
41
|
+
manager = Manager.new(:window_length => 60)
|
42
42
|
manager.should respond_to(:name)
|
43
43
|
end
|
44
44
|
|
45
45
|
it 'should return stats from older window' do
|
46
46
|
Time.stub(:now).and_return(start_time)
|
47
|
-
manager = Manager.new(60)
|
47
|
+
manager = Manager.new(:window_length => 60)
|
48
48
|
request = Request.new(@env)
|
49
49
|
stub_gcstat_delta('Boat', 'sail')
|
50
50
|
manager.push(request.close)
|
@@ -64,7 +64,7 @@ module MemoryTracker
|
|
64
64
|
|
65
65
|
it 'should rotate windows' do
|
66
66
|
Time.stub(:now).and_return(start_time)
|
67
|
-
manager = Manager.new(60)
|
67
|
+
manager = Manager.new(:window_length => 60)
|
68
68
|
request = Request.new(@env)
|
69
69
|
stub_gcstat_delta('Boat', 'sail')
|
70
70
|
manager.push(request.close)
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module MemoryTracker
|
4
|
+
module Stores
|
5
|
+
describe Loader do
|
6
|
+
context :register_store do
|
7
|
+
it 'should record stores by name' do
|
8
|
+
store_class = double('my_store_class')
|
9
|
+
Loader.register_store :my_store, store_class
|
10
|
+
Loader.store_classes.should include(:my_store)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
context :enable_store do
|
15
|
+
it 'should send add_store to memory_tracker' do
|
16
|
+
store_class = double('my_store_class')
|
17
|
+
store = double('my_store')
|
18
|
+
allow(store_class).to receive(:new) { store }
|
19
|
+
memory_tracker = double('memory_tracker')
|
20
|
+
memory_tracker.should_receive(:add_store).with(store)
|
21
|
+
|
22
|
+
Loader.register_store :my_store, store_class
|
23
|
+
Loader.enable_store(memory_tracker, :name => :my_store)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,10 +1,14 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
1
3
|
module MemoryTracker
|
2
4
|
module Stores
|
3
5
|
describe UrlLogfileStore do
|
4
6
|
before :each do
|
5
|
-
|
7
|
+
logger_class_name = double("logger_class_name")
|
8
|
+
logger_class = double("logger_class")
|
9
|
+
allow(logger_class_name).to receive(:constantize) { logger_class }
|
6
10
|
allow(logger_class).to receive(:new)
|
7
|
-
@logstore = UrlLogfileStore.new
|
11
|
+
@logstore = UrlLogfileStore.new(:logger_class => logger_class_name, :filename => "foo/log")
|
8
12
|
end
|
9
13
|
|
10
14
|
it 'implements the store role' do
|
data/spec/spec_helper.rb
CHANGED
@@ -3,12 +3,15 @@ $LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
3
3
|
|
4
4
|
require 'singleton'
|
5
5
|
|
6
|
+
require 'active_support/core_ext'
|
6
7
|
require 'rspec'
|
7
8
|
require 'sys/proctable'
|
8
9
|
require 'memory_tracker'
|
9
10
|
require 'memory_tracker/gc_stat'
|
10
11
|
require 'memory_tracker/request'
|
11
12
|
require 'memory_tracker/memory_tracker'
|
13
|
+
require 'memory_tracker/stores/base'
|
14
|
+
require 'memory_tracker/stores/loader'
|
12
15
|
require 'memory_tracker/stores/in_memory_store'
|
13
16
|
require 'memory_tracker/stores/gcstat_logfile_store'
|
14
17
|
require 'memory_tracker/stores/url_logfile_store'
|
@@ -33,3 +36,10 @@ RSpec.configure do |config|
|
|
33
36
|
# config.mock_with :rr
|
34
37
|
# config.mock_with :rspec
|
35
38
|
end
|
39
|
+
|
40
|
+
class Rails
|
41
|
+
def self.root
|
42
|
+
''
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
metadata
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: memory_tracker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0
|
4
|
+
version: 1.1.0
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Philippe Le Rohellec
|
@@ -13,34 +14,39 @@ dependencies:
|
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: sys-proctable
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
|
-
- - '>='
|
19
|
+
- - ! '>='
|
18
20
|
- !ruby/object:Gem::Version
|
19
21
|
version: '0'
|
20
22
|
type: :runtime
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
|
-
- - '>='
|
27
|
+
- - ! '>='
|
25
28
|
- !ruby/object:Gem::Version
|
26
29
|
version: '0'
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: debugger
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
|
-
- - '>='
|
35
|
+
- - ! '>='
|
32
36
|
- !ruby/object:Gem::Version
|
33
37
|
version: '0'
|
34
38
|
type: :development
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
|
-
- - '>='
|
43
|
+
- - ! '>='
|
39
44
|
- !ruby/object:Gem::Version
|
40
45
|
version: '0'
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: rspec
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
51
|
- - ~>
|
46
52
|
- !ruby/object:Gem::Version
|
@@ -48,6 +54,7 @@ dependencies:
|
|
48
54
|
type: :development
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
59
|
- - ~>
|
53
60
|
- !ruby/object:Gem::Version
|
@@ -55,6 +62,7 @@ dependencies:
|
|
55
62
|
- !ruby/object:Gem::Dependency
|
56
63
|
name: rdoc
|
57
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
58
66
|
requirements:
|
59
67
|
- - ~>
|
60
68
|
- !ruby/object:Gem::Version
|
@@ -62,6 +70,7 @@ dependencies:
|
|
62
70
|
type: :development
|
63
71
|
prerelease: false
|
64
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
65
74
|
requirements:
|
66
75
|
- - ~>
|
67
76
|
- !ruby/object:Gem::Version
|
@@ -69,6 +78,7 @@ dependencies:
|
|
69
78
|
- !ruby/object:Gem::Dependency
|
70
79
|
name: bundler
|
71
80
|
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
72
82
|
requirements:
|
73
83
|
- - ~>
|
74
84
|
- !ruby/object:Gem::Version
|
@@ -76,10 +86,27 @@ dependencies:
|
|
76
86
|
type: :development
|
77
87
|
prerelease: false
|
78
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
79
90
|
requirements:
|
80
91
|
- - ~>
|
81
92
|
- !ruby/object:Gem::Version
|
82
93
|
version: '1.0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: activesupport
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :runtime
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
83
110
|
description: Collect and analyze memory usage data for each individual Rails action
|
84
111
|
controller.
|
85
112
|
email: philippe@lerohellec.com
|
@@ -115,30 +142,32 @@ files:
|
|
115
142
|
- spec/spec_helper.rb
|
116
143
|
- spec/lib/stores/gcstat_logfile_store_spec.rb
|
117
144
|
- spec/lib/stores/in_memory_store_spec.rb
|
145
|
+
- spec/lib/stores/loader_spec.rb
|
118
146
|
- spec/lib/stores/url_logfile_store_spec.rb
|
119
147
|
- spec/lib/request_spec.rb
|
120
148
|
- spec/lib/memory_tracker_spec.rb
|
121
149
|
homepage: http://github.com/plerohellec/memory_tracker
|
122
150
|
licenses:
|
123
151
|
- MIT
|
124
|
-
metadata: {}
|
125
152
|
post_install_message:
|
126
153
|
rdoc_options: []
|
127
154
|
require_paths:
|
128
155
|
- lib
|
129
156
|
required_ruby_version: !ruby/object:Gem::Requirement
|
157
|
+
none: false
|
130
158
|
requirements:
|
131
|
-
- - '>='
|
159
|
+
- - ! '>='
|
132
160
|
- !ruby/object:Gem::Version
|
133
161
|
version: '0'
|
134
162
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
163
|
+
none: false
|
135
164
|
requirements:
|
136
|
-
- - '>='
|
165
|
+
- - ! '>='
|
137
166
|
- !ruby/object:Gem::Version
|
138
167
|
version: '0'
|
139
168
|
requirements: []
|
140
169
|
rubyforge_project:
|
141
|
-
rubygems_version:
|
170
|
+
rubygems_version: 1.8.25
|
142
171
|
signing_key:
|
143
172
|
specification_version: 4
|
144
173
|
summary: Rails memory allocations tracker
|
@@ -146,6 +175,7 @@ test_files:
|
|
146
175
|
- spec/spec_helper.rb
|
147
176
|
- spec/lib/stores/gcstat_logfile_store_spec.rb
|
148
177
|
- spec/lib/stores/in_memory_store_spec.rb
|
178
|
+
- spec/lib/stores/loader_spec.rb
|
149
179
|
- spec/lib/stores/url_logfile_store_spec.rb
|
150
180
|
- spec/lib/request_spec.rb
|
151
181
|
- spec/lib/memory_tracker_spec.rb
|
checksums.yaml
DELETED
@@ -1,7 +0,0 @@
|
|
1
|
-
---
|
2
|
-
SHA1:
|
3
|
-
metadata.gz: adeca7dfc23c7e1fc6ba5c3411ed54639ca30b87
|
4
|
-
data.tar.gz: b94c7d23aa9f03912cdc4be6c025860428e97aa7
|
5
|
-
SHA512:
|
6
|
-
metadata.gz: 67c83299b9e960365b3a8429402b2b05f63c8b4baeb589ceef5385d2f24c63be1d3d285629b35f718a3c0bac93953e88a65d732c31d73df6cae1498a126a6f22
|
7
|
-
data.tar.gz: d7d17859238f52bfac1cb69a4c00761444f64a08f339bed9c0c7c45f941edc5db05e6b058e1f9c9f2008ccb771b9b547e5f07da9a9ce7dbe68dcb85dda65c0a7
|