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 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.6)
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.1)
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.2)
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.3)
23
+ debugger-ruby_core_source (~> 1.2.4)
23
24
  debugger-linecache (1.2.0)
24
- debugger-ruby_core_source (1.2.3)
25
- diff-lcs (1.2.4)
26
- i18n (0.6.5)
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.3)
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 collects, analyzes and reports memory usage data of each controller action of a Rails application. The data will identify the parts of the application that are the most memory hungry, so that they can be fixed and the overall memory usage of the application be reduced.
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 engine webpage embedded in the gem.
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 HHTP request and saves the deltas per controller/action in a variety of stores.
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
- Copyright (c) 2013 Philippe Le Rohellec. See LICENSE.txt for
105
- further details.
104
+ See LICENSE.txt.
106
105
 
@@ -5,10 +5,15 @@ module MemoryTracker
5
5
  def initialize(env)
6
6
  @path = env['PATH_INFO']
7
7
 
8
- routes_env = { :method => env['REQUEST_METHOD'] }
9
- request = Rails.application.routes.recognize_path(env['REQUEST_URI'], routes_env)
10
- @controller = request[:controller]
11
- @action = request[:action]
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
@@ -10,8 +10,8 @@ module MemoryTracker
10
10
  @stats.keys.sort
11
11
  end
12
12
 
13
- def ordered_values
14
- ordered_keys.inject([]) do |vals, key|
13
+ def ordered_values(ordered_columns = ordered_keys)
14
+ ordered_columns.inject([]) do |vals, key|
15
15
  vals << @stats[key]
16
16
  vals
17
17
  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, 'ActiveSupport::BufferedLogger')
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 "##{@request.end_gcstat.ordered_keys.join(',')}"
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.end_gcstat.ordered_values.join ','
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, 'ActiveSupport::BufferedLogger')
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)
@@ -1,3 +1,3 @@
1
1
  module MemoryTracker
2
- VERSION = "1.1.1"
2
+ VERSION = "1.2.0"
3
3
  end
@@ -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
- if s.respond_to? :specification_version then
54
- s.specification_version = 4
55
-
56
- if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
57
- s.add_runtime_dependency(%q<sys-proctable>, [">= 0"])
58
- s.add_development_dependency(%q<debugger>, [">= 0"])
59
- s.add_development_dependency(%q<rspec>, ["~> 2.14.0"])
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.1.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: 1.8.25
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