memory_tracker 1.1.1 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile.lock +10 -8
- data/README.md +19 -20
- data/lib/memory_tracker/env.rb +9 -4
- data/lib/memory_tracker/gc_stat.rb +2 -2
- data/lib/memory_tracker/stores/gcstat_logfile_parser.rb +31 -0
- data/lib/memory_tracker/stores/gcstat_logfile_store.rb +7 -4
- data/lib/memory_tracker/stores/url_logfile_store.rb +1 -1
- data/lib/memory_tracker/version.rb +1 -1
- data/memory_tracker.gemspec +8 -28
- data/spec/lib/stores/gcstat_logfile_parser_spec.rb +50 -0
- data/spec/spec_helper.rb +1 -0
- metadata +40 -37
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: ab14d34d93892036e9f137fd33242cdac5bdcf1c
|
4
|
+
data.tar.gz: 8c82efd9ff6680f4565778436c8305ea340ff259
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: dde284cd9242dc1a59394e5db587831478cf0936f8f570a55fe431176fa1634e80eeccefb030ee3c0da90ac3b09449e541de8a15ae75f2dfcc134964b2514404
|
7
|
+
data.tar.gz: 6299e4aa58d5bd4c30a028a0d113e3cc78efc6480f7dbd275ec776fcc1b008604645731ca8613e41cb3dce8467d5545838633f79447ac420e6b79f08c16673cf
|
data/Gemfile.lock
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
memory_tracker (1.0
|
4
|
+
memory_tracker (1.2.0)
|
5
5
|
activesupport
|
6
|
+
logfile_interval (~> 1.1.0)
|
6
7
|
sys-proctable
|
7
8
|
|
8
9
|
GEM
|
9
10
|
remote: https://rubygems.org/
|
10
11
|
specs:
|
11
|
-
activesupport (4.0.
|
12
|
+
activesupport (4.0.2)
|
12
13
|
i18n (~> 0.6, >= 0.6.4)
|
13
14
|
minitest (~> 4.2)
|
14
15
|
multi_json (~> 1.3)
|
@@ -16,15 +17,16 @@ GEM
|
|
16
17
|
tzinfo (~> 0.3.37)
|
17
18
|
atomic (1.1.14)
|
18
19
|
columnize (0.3.6)
|
19
|
-
debugger (1.6.
|
20
|
+
debugger (1.6.3)
|
20
21
|
columnize (>= 0.3.1)
|
21
22
|
debugger-linecache (~> 1.2.0)
|
22
|
-
debugger-ruby_core_source (~> 1.2.
|
23
|
+
debugger-ruby_core_source (~> 1.2.4)
|
23
24
|
debugger-linecache (1.2.0)
|
24
|
-
debugger-ruby_core_source (1.2.
|
25
|
-
diff-lcs (1.2.
|
26
|
-
i18n (0.6.
|
25
|
+
debugger-ruby_core_source (1.2.4)
|
26
|
+
diff-lcs (1.2.5)
|
27
|
+
i18n (0.6.9)
|
27
28
|
json (1.8.1)
|
29
|
+
logfile_interval (1.1.0)
|
28
30
|
minitest (4.7.5)
|
29
31
|
multi_json (1.8.2)
|
30
32
|
rdoc (3.12.2)
|
@@ -34,7 +36,7 @@ GEM
|
|
34
36
|
rspec-expectations (~> 2.14.0)
|
35
37
|
rspec-mocks (~> 2.14.0)
|
36
38
|
rspec-core (2.14.7)
|
37
|
-
rspec-expectations (2.14.
|
39
|
+
rspec-expectations (2.14.4)
|
38
40
|
diff-lcs (>= 1.1.3, < 2.0)
|
39
41
|
rspec-mocks (2.14.4)
|
40
42
|
sys-proctable (0.9.3)
|
data/README.md
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
# MemoryTracker
|
1
|
+
# MemoryTracker [![Build Status](https://travis-ci.org/plerohellec/memory_tracker.png?branch=master)](https://travis-ci.org/plerohellec/memory_tracker)
|
2
2
|
|
3
|
-
MemoryTracker
|
3
|
+
MemoryTracker finds where the memory bloat comes from in a Rails application.
|
4
4
|
|
5
5
|
# Features
|
6
6
|
* Collect stats on each controller action memory consumption.
|
7
|
-
* Display stats on every controller action of the application in a
|
7
|
+
* Display stats on every controller action of the application in a web page (the dashboard) embedded in the gem.
|
8
8
|
|
9
9
|
# Dashboard
|
10
10
|
## Screenshot
|
@@ -19,9 +19,18 @@ That's where the collected statistics are displayed.
|
|
19
19
|
* Controller actions that have a "total_allocated_object" value N times higher than the average.
|
20
20
|
* Controller actions that trigger the garbage collector frequently. That the "count" value in the dashboard.
|
21
21
|
|
22
|
+
# Enabling MemoryTracker
|
23
|
+
Add it to your Gemfile:
|
24
|
+
```ruby
|
25
|
+
gem 'memory_tracker'
|
26
|
+
```
|
27
|
+
To get access to the MemoryTracker UI and see the stats, the engine must be mounted at config/routes.rb
|
28
|
+
```ruby
|
29
|
+
mount MemoryTracker::Engine => "/memtracker"
|
30
|
+
```
|
22
31
|
|
23
|
-
# How?
|
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
|
32
|
+
# How does it work?
|
33
|
+
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 HTTP request and saves the deltas per controller/action in one or more stores.
|
25
34
|
|
26
35
|
MemoryTracker is implemented as a Rails engine and reports its statistics in a web page served by the application where it's embedded. The report currently includes data from the InMemoryStore.
|
27
36
|
|
@@ -59,22 +68,11 @@ test:
|
|
59
68
|
<<: *defaults
|
60
69
|
```
|
61
70
|
|
62
|
-
# Enabling MemoryTracker
|
63
|
-
Add it to your Gemfile:
|
64
|
-
```ruby
|
65
|
-
gem 'memory_tracker'
|
66
|
-
```
|
67
|
-
To get access to the MemoryTracker UI and see the stats, the engine must be mounted at config/routes.rb
|
68
|
-
```ruby
|
69
|
-
mount MemoryTracker::Engine => "/memtracker"
|
70
|
-
```
|
71
|
-
Once the app is running, go to /memtracker to review the list of controller actions.
|
72
|
-
|
73
71
|
# Requirements
|
74
72
|
The gem has been tested and is compatible with:
|
75
73
|
* Ruby 2.0
|
76
74
|
* Ruby 1.9 but 1.9 GC.stat does not include the total_allocated_object number so its value remains at 0 in MemoryTracker.
|
77
|
-
* Rails 3.2
|
75
|
+
* Rails 3.2, Rails 4.0
|
78
76
|
|
79
77
|
# Tips
|
80
78
|
* Ruby processes rarely leak memory. Instead they allocate memory whenever they need it and never release it. This memory is not lost, it's still available to the process that allocated it but it's unavailable for all other processes in the system.
|
@@ -87,7 +85,6 @@ The gem has been tested and is compatible with:
|
|
87
85
|
# Coming soon
|
88
86
|
* Redis store.
|
89
87
|
* Store and report the most expensive URLs.
|
90
|
-
* Support for Rails 4 (it might already work, it's just not been tested yet).
|
91
88
|
|
92
89
|
# Contributing to memory_tracker
|
93
90
|
|
@@ -99,8 +96,10 @@ The gem has been tested and is compatible with:
|
|
99
96
|
* Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
|
100
97
|
* Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
|
101
98
|
|
99
|
+
# References
|
100
|
+
* [Demystifying the Ruby GC](http://samsaffron.com/archive/2013/11/22/demystifying-the-ruby-gc)
|
101
|
+
|
102
102
|
# Copyright
|
103
103
|
|
104
|
-
|
105
|
-
further details.
|
104
|
+
See LICENSE.txt.
|
106
105
|
|
data/lib/memory_tracker/env.rb
CHANGED
@@ -5,10 +5,15 @@ module MemoryTracker
|
|
5
5
|
def initialize(env)
|
6
6
|
@path = env['PATH_INFO']
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
8
|
+
begin
|
9
|
+
routes_env = { :method => env['REQUEST_METHOD'] }
|
10
|
+
request = Rails.application.routes.recognize_path(env['REQUEST_PATH'], routes_env)
|
11
|
+
@controller = request[:controller]
|
12
|
+
@action = request[:action]
|
13
|
+
rescue ActionController::RoutingError
|
14
|
+
@controller = 'unknown'
|
15
|
+
@action = 'unknown'
|
16
|
+
end
|
12
17
|
end
|
13
18
|
end
|
14
19
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'logfile_interval'
|
2
|
+
|
3
|
+
module MemoryTracker
|
4
|
+
module Stores
|
5
|
+
class GcstatLogfileParser < LogfileInterval::LineParser::Base
|
6
|
+
# Line format:
|
7
|
+
# timestamp,action,count,heap_final_num,heap_free_num,heap_increment,heap_length,heap_live_num,heap_used,rss,total_allocated_object,total_freed_object,vsize
|
8
|
+
|
9
|
+
|
10
|
+
set_regex /^(\d+),(\w+#\w+),(\d+),(\d+),(\d+),(\d+),(\d+),(\d+),(\d+),([\d\.]+),(\d+),(\d+),([\d\.]+)$/
|
11
|
+
|
12
|
+
add_column :name => :timestamp, :pos => 1, :aggregator => :timestamp
|
13
|
+
add_column :name => :action, :pos => 2, :aggregator => :count, :group_by => :action
|
14
|
+
add_column :name => :count, :pos => 3, :aggregator => :average, :conversion => :integer
|
15
|
+
# add_column :name => :heap_final_num, :pos => 4, :aggregator => :average, :conversion => :integer
|
16
|
+
# add_column :name => :heap_free_num, :pos => 5, :aggregator => :average, :conversion => :integer
|
17
|
+
# add_column :name => :heap_increment, :pos => 6, :aggregator => :average, :conversion => :integer
|
18
|
+
# add_column :name => :heap_length, :pos => 7, :aggregator => :average, :conversion => :integer
|
19
|
+
# add_column :name => :heap_live_num, :pos => 8, :aggregator => :average, :conversion => :integer
|
20
|
+
add_column :name => :heap_used, :pos => 9, :aggregator => :average, :conversion => :integer
|
21
|
+
add_column :name => :rss, :pos => 10, :aggregator => :delta, :conversion => :float, :group_by => :action
|
22
|
+
add_column :name => :total_allocated_object, :pos => 11, :aggregator => :average, :conversion => :integer
|
23
|
+
# add_column :name => :total_freed_object, :pos => 12, :aggregator => :average, :conversion => :integer
|
24
|
+
add_column :name => :vsize, :pos => 13, :aggregator => :delta, :conversion => :float, :group_by => :action
|
25
|
+
|
26
|
+
def time
|
27
|
+
Time.at(self.timestamp.to_i)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -3,8 +3,10 @@ module MemoryTracker
|
|
3
3
|
class GcstatLogfileStore < Base
|
4
4
|
register_store :gcstat_logfile
|
5
5
|
|
6
|
+
COLUMNS = [ :count, :heap_final_num, :heap_free_num, :heap_increment, :heap_length, :heap_live_num, :heap_used, :rss, :total_allocated_object, :total_freed_object, :vsize ]
|
7
|
+
|
6
8
|
def initialize(opts)
|
7
|
-
logger_class = opts.fetch(:logger_class, '
|
9
|
+
logger_class = opts.fetch(:logger_class, 'Logger')
|
8
10
|
filename = opts.fetch(:filename, "#{Rails.root}/log/memtracker_gcstat.log")
|
9
11
|
|
10
12
|
@logger = logger_class.constantize.new(filename)
|
@@ -25,15 +27,16 @@ module MemoryTracker
|
|
25
27
|
private
|
26
28
|
|
27
29
|
def write_header
|
28
|
-
@logger.info "##{
|
30
|
+
@logger.info "##{COLUMNS.join(',')}"
|
29
31
|
end
|
30
32
|
|
31
33
|
def write_request_log
|
32
|
-
@logger.info logline
|
34
|
+
@logger.info "#{Time.now.to_i},#{logline}"
|
33
35
|
end
|
34
36
|
|
35
37
|
def logline
|
36
|
-
@request.
|
38
|
+
logline = "#{@request.controller}##{@request.action},"
|
39
|
+
logline << @request.end_gcstat.ordered_values(COLUMNS).join(',')
|
37
40
|
end
|
38
41
|
end
|
39
42
|
end
|
@@ -4,7 +4,7 @@ module MemoryTracker
|
|
4
4
|
register_store :url_logfile
|
5
5
|
|
6
6
|
def initialize(opts)
|
7
|
-
logger_class = opts.fetch(:logger_class, '
|
7
|
+
logger_class = opts.fetch(:logger_class, 'Logger')
|
8
8
|
filename = opts.fetch(:filename, "#{Rails.root}/log/memtracker_urls.log")
|
9
9
|
|
10
10
|
@logger = logger_class.constantize.new(filename)
|
data/memory_tracker.gemspec
CHANGED
@@ -38,6 +38,7 @@ Gem::Specification.new do |s|
|
|
38
38
|
"lib/memory_tracker/memory_tracker.rb",
|
39
39
|
"lib/memory_tracker/middleware.rb",
|
40
40
|
"lib/memory_tracker/request.rb",
|
41
|
+
"lib/memory_tracker/stores/gcstat_logfile_parser.rb",
|
41
42
|
"lib/memory_tracker/stores/gcstat_logfile_store.rb",
|
42
43
|
"lib/memory_tracker/stores/in_memory_store.rb",
|
43
44
|
"lib/memory_tracker/stores/url_logfile_store.rb",
|
@@ -50,32 +51,11 @@ Gem::Specification.new do |s|
|
|
50
51
|
s.licenses = ["MIT"]
|
51
52
|
s.rubygems_version = "2.0.3"
|
52
53
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
61
|
-
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
62
|
-
s.add_dependency('activesupport')
|
63
|
-
|
64
|
-
else
|
65
|
-
s.add_dependency(%q<sys-proctable>, [">= 0"])
|
66
|
-
s.add_dependency(%q<debugger>, [">= 0"])
|
67
|
-
s.add_dependency(%q<rspec>, ["~> 2.14.0"])
|
68
|
-
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
69
|
-
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
70
|
-
s.add_dependency('activesupport')
|
71
|
-
|
72
|
-
end
|
73
|
-
else
|
74
|
-
s.add_dependency(%q<sys-proctable>, [">= 0"])
|
75
|
-
s.add_dependency(%q<debugger>, [">= 0"])
|
76
|
-
s.add_dependency(%q<rspec>, ["~> 2.14.0"])
|
77
|
-
s.add_dependency(%q<rdoc>, ["~> 3.12"])
|
78
|
-
s.add_dependency(%q<bundler>, ["~> 1.0"])
|
79
|
-
s.add_dependency('activesupport')
|
80
|
-
end
|
54
|
+
s.add_runtime_dependency(%q<sys-proctable>, [">= 0"])
|
55
|
+
s.add_runtime_dependency(%q<logfile_interval>, ["~>1.1.0"])
|
56
|
+
s.add_runtime_dependency(%q<activesupport>)
|
57
|
+
s.add_development_dependency(%q<debugger>, [">= 0"])
|
58
|
+
s.add_development_dependency(%q<rspec>, ["~> 2.14.0"])
|
59
|
+
s.add_development_dependency(%q<rdoc>, ["~> 3.12"])
|
60
|
+
s.add_development_dependency(%q<bundler>, ["~> 1.0"])
|
81
61
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
GCSTAT_LOGFILE_DATA = <<LINES
|
4
|
+
1386125780,posts#index,49,0,63777,571,1431,349791,860,88.055808,1686477,1336686,269.484032
|
5
|
+
1386125782,posts#show,50,0,108615,517,1431,325083,914,90.218496,1770275,1445192,271.48287999999997
|
6
|
+
1386125784,posts#show,51,0,108361,513,1431,272900,918,90.759168,1826445,1553545,272.15871999999996
|
7
|
+
1386125785,posts#index,52,0,103229,513,1431,287439,918,90.759168,1917742,1630303,272.15871999999996
|
8
|
+
1386125787,posts#index,52,0,103386,513,1431,372228,918,91.29983999999999,2002688,1630460,272.78950399999997
|
9
|
+
1386125789,posts#index,54,0,101731,495,1431,289801,936,92.577792,2109945,1820144,273.77664
|
10
|
+
1386125792,posts#show,54,0,101731,495,1431,375282,936,92.577792,2195426,1820144,273.77664
|
11
|
+
1386125794,posts#show,55,0,123765,441,1431,324209,990,94.949376,2267943,1943734,276.271104
|
12
|
+
LINES
|
13
|
+
|
14
|
+
module MemoryTracker
|
15
|
+
module Stores
|
16
|
+
describe GcstatLogfileParser do
|
17
|
+
before :each do
|
18
|
+
@lines = GCSTAT_LOGFILE_DATA.split("\n")
|
19
|
+
@parser = GcstatLogfileParser
|
20
|
+
|
21
|
+
expectation = LogfileInterval::Logfile.any_instance.should_receive(:each_line)
|
22
|
+
@lines.reverse.each { |line| expectation.and_yield(line) }
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'iterates over each line' do
|
26
|
+
logfile_iterator = LogfileInterval::Logfile.new('foo', @parser)
|
27
|
+
result_lines = []
|
28
|
+
logfile_iterator.each_line do |line|
|
29
|
+
result_lines << line
|
30
|
+
end
|
31
|
+
|
32
|
+
result_lines.count.should == 8
|
33
|
+
result_lines.first.should == @lines.last
|
34
|
+
result_lines.last.should == @lines.first
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'iterates over each parsed line' do
|
38
|
+
logfile_iterator = LogfileInterval::Logfile.new('foo', @parser)
|
39
|
+
records = []
|
40
|
+
logfile_iterator.each_parsed_line do |record|
|
41
|
+
records << record
|
42
|
+
end
|
43
|
+
|
44
|
+
records.count.should == 8
|
45
|
+
records.first.count.should == @lines.last.split(',')[2].to_i
|
46
|
+
records.last.count.should == @lines.first.split(',')[2].to_i
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -14,6 +14,7 @@ require 'memory_tracker/stores/base'
|
|
14
14
|
require 'memory_tracker/stores/loader'
|
15
15
|
require 'memory_tracker/stores/in_memory_store'
|
16
16
|
require 'memory_tracker/stores/gcstat_logfile_store'
|
17
|
+
require 'memory_tracker/stores/gcstat_logfile_parser'
|
17
18
|
require 'memory_tracker/stores/url_logfile_store'
|
18
19
|
|
19
20
|
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: memory_tracker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
5
|
-
prerelease:
|
4
|
+
version: 1.2.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Philippe Le Rohellec
|
@@ -14,39 +13,62 @@ dependencies:
|
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: sys-proctable
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - '>='
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :runtime
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - '>='
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: logfile_interval
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 1.1.0
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 1.1.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: activesupport
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '>='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '>='
|
28
53
|
- !ruby/object:Gem::Version
|
29
54
|
version: '0'
|
30
55
|
- !ruby/object:Gem::Dependency
|
31
56
|
name: debugger
|
32
57
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
58
|
requirements:
|
35
|
-
- -
|
59
|
+
- - '>='
|
36
60
|
- !ruby/object:Gem::Version
|
37
61
|
version: '0'
|
38
62
|
type: :development
|
39
63
|
prerelease: false
|
40
64
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
65
|
requirements:
|
43
|
-
- -
|
66
|
+
- - '>='
|
44
67
|
- !ruby/object:Gem::Version
|
45
68
|
version: '0'
|
46
69
|
- !ruby/object:Gem::Dependency
|
47
70
|
name: rspec
|
48
71
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
72
|
requirements:
|
51
73
|
- - ~>
|
52
74
|
- !ruby/object:Gem::Version
|
@@ -54,7 +76,6 @@ dependencies:
|
|
54
76
|
type: :development
|
55
77
|
prerelease: false
|
56
78
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
79
|
requirements:
|
59
80
|
- - ~>
|
60
81
|
- !ruby/object:Gem::Version
|
@@ -62,7 +83,6 @@ dependencies:
|
|
62
83
|
- !ruby/object:Gem::Dependency
|
63
84
|
name: rdoc
|
64
85
|
requirement: !ruby/object:Gem::Requirement
|
65
|
-
none: false
|
66
86
|
requirements:
|
67
87
|
- - ~>
|
68
88
|
- !ruby/object:Gem::Version
|
@@ -70,7 +90,6 @@ dependencies:
|
|
70
90
|
type: :development
|
71
91
|
prerelease: false
|
72
92
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
-
none: false
|
74
93
|
requirements:
|
75
94
|
- - ~>
|
76
95
|
- !ruby/object:Gem::Version
|
@@ -78,7 +97,6 @@ dependencies:
|
|
78
97
|
- !ruby/object:Gem::Dependency
|
79
98
|
name: bundler
|
80
99
|
requirement: !ruby/object:Gem::Requirement
|
81
|
-
none: false
|
82
100
|
requirements:
|
83
101
|
- - ~>
|
84
102
|
- !ruby/object:Gem::Version
|
@@ -86,27 +104,10 @@ dependencies:
|
|
86
104
|
type: :development
|
87
105
|
prerelease: false
|
88
106
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
-
none: false
|
90
107
|
requirements:
|
91
108
|
- - ~>
|
92
109
|
- !ruby/object:Gem::Version
|
93
110
|
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'
|
110
111
|
description: Collect and analyze memory usage data for each individual Rails action
|
111
112
|
controller.
|
112
113
|
email: philippe@lerohellec.com
|
@@ -135,6 +136,7 @@ files:
|
|
135
136
|
- lib/memory_tracker/memory_tracker.rb
|
136
137
|
- lib/memory_tracker/middleware.rb
|
137
138
|
- lib/memory_tracker/request.rb
|
139
|
+
- lib/memory_tracker/stores/gcstat_logfile_parser.rb
|
138
140
|
- lib/memory_tracker/stores/gcstat_logfile_store.rb
|
139
141
|
- lib/memory_tracker/stores/in_memory_store.rb
|
140
142
|
- lib/memory_tracker/stores/url_logfile_store.rb
|
@@ -146,30 +148,30 @@ files:
|
|
146
148
|
- spec/lib/stores/in_memory_store_spec.rb
|
147
149
|
- spec/lib/stores/loader_spec.rb
|
148
150
|
- spec/lib/stores/url_logfile_store_spec.rb
|
151
|
+
- spec/lib/stores/gcstat_logfile_parser_spec.rb
|
149
152
|
- spec/lib/request_spec.rb
|
150
153
|
- spec/lib/memory_tracker_spec.rb
|
151
154
|
homepage: http://github.com/plerohellec/memory_tracker
|
152
155
|
licenses:
|
153
156
|
- MIT
|
157
|
+
metadata: {}
|
154
158
|
post_install_message:
|
155
159
|
rdoc_options: []
|
156
160
|
require_paths:
|
157
161
|
- lib
|
158
162
|
required_ruby_version: !ruby/object:Gem::Requirement
|
159
|
-
none: false
|
160
163
|
requirements:
|
161
|
-
- -
|
164
|
+
- - '>='
|
162
165
|
- !ruby/object:Gem::Version
|
163
166
|
version: '0'
|
164
167
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
165
|
-
none: false
|
166
168
|
requirements:
|
167
|
-
- -
|
169
|
+
- - '>='
|
168
170
|
- !ruby/object:Gem::Version
|
169
171
|
version: '0'
|
170
172
|
requirements: []
|
171
173
|
rubyforge_project:
|
172
|
-
rubygems_version:
|
174
|
+
rubygems_version: 2.0.3
|
173
175
|
signing_key:
|
174
176
|
specification_version: 4
|
175
177
|
summary: Rails memory allocations tracker
|
@@ -179,5 +181,6 @@ test_files:
|
|
179
181
|
- spec/lib/stores/in_memory_store_spec.rb
|
180
182
|
- spec/lib/stores/loader_spec.rb
|
181
183
|
- spec/lib/stores/url_logfile_store_spec.rb
|
184
|
+
- spec/lib/stores/gcstat_logfile_parser_spec.rb
|
182
185
|
- spec/lib/request_spec.rb
|
183
186
|
- spec/lib/memory_tracker_spec.rb
|