tunemygc 1.0.12 → 1.0.13

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5c004b858c9d84c91d9ac30f5ab02c38523e21c0
4
- data.tar.gz: 5d3267590cd9081b8d080326ea4f6d68a0c55fae
3
+ metadata.gz: b3f306241edb410736b2b01067f4904c2b49f91b
4
+ data.tar.gz: a8bc6b26e270e9dae4a864a24828d6f7352864ea
5
5
  SHA512:
6
- metadata.gz: ecf0488e21335e5951b3d45c073cf3211551ee933643a0ce04608861c017f3d80b8819aa00d72567794012976a68c41763aa1d71d1426459970ea3188f0da8d7
7
- data.tar.gz: 02a61c92b7abf6a1aa8d4a012ff4fa6dae7b657b5719ae5822c48b5cd730915921f4b157d19070086c8d4e65e4308dc52f7eff5be2a98717d7a3d13d42cfcb8b
6
+ metadata.gz: 8e58c2e51304db18732f5ba275d8b599b6c5b6cc703e9caef7e739fdea01bfadf08bae0d7b034943a5ba6475f527ee3e27ef40579250b995be0a0a795092093f
7
+ data.tar.gz: 0bd6ccde3394c560038b1e7612ede7a8e9081cc657796523dd5dbedcfba47ad356aff16404b557406b11fd3f2a6fd0aabe82b86a557549348a43ec00672d507a
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- tunemygc (1.0.6)
4
+ tunemygc (1.0.12)
5
5
  activesupport (~> 4.1)
6
6
  certified (~> 1.0, >= 1.0.0)
7
7
 
@@ -118,6 +118,7 @@ PLATFORMS
118
118
  ruby
119
119
 
120
120
  DEPENDENCIES
121
+ activejob (~> 4.2.0)
121
122
  rails
122
123
  rake (~> 10.3)
123
124
  rake-compiler (~> 0.9, >= 0.9.5)
data/README.md CHANGED
@@ -93,14 +93,18 @@ RUBY_GC_TOKEN=08de9e8822c847244b31290cedfc1d51 RUBY_GC_TUNE=1 bundle exec rails
93
93
 
94
94
  #### Advanced
95
95
 
96
- * `RUBY_GC_SPY=action_controller` (Spy on the GC for this type of processing. Either `action_controller` or `minitest`)
96
+ * `RUBY_GC_SPY=action_controller` (Spy on the GC for this type of processing. `action_controller`, `active_job` or `minitest` are supported)
97
97
 
98
- Defines what type of processing you would like to sample for GC activity. An Action Controller spy is the default, but [minitest](https://github.com/seattlerb/minitest) is also supported as an experimental feature.
98
+ Defines what type of processing you would like to sample for GC activity. An Action Controller spy is the default, but [ActiveJob](https://github.com/rails/rails/tree/master/activejob) and [minitest](https://github.com/seattlerb/minitest) are also supported as experimental features.
99
99
 
100
100
  * `RUBY_GC_TUNE_REQUESTS=x` (a numeric value eg. `200`)
101
101
 
102
102
  Controls the interposer lifetime for sampling Rails requests. It will enable itself, then remove request instrumentation after the specified number of requests. A good minimum ballpark sample set would be 200.
103
103
 
104
+ * `RUBY_GC_TUNE_JOBS=x` (a numeric value eg. `200`)
105
+
106
+ Controls the interposer lifetime for sampling ActiveJob jobs. It will enable itself, then remove job instrumentation after the specified number of jobs were processed. A good minimum ballpark sample set would be 200.
107
+
104
108
  * `RUBY_GC_TUNE_TESTS=x` (a numeric value eg. `200`)
105
109
 
106
110
  Controls the interposer lifetime for sampling a [minitest](https://github.com/seattlerb/minitest) based test suite. It will enable itself, then remove request instrumentation after the specified number of tests has been run. A good minimum ballpark sample set would be 200.
@@ -4,5 +4,6 @@ module TuneMyGc
4
4
  module Spies
5
5
  autoload :ActionController, 'tunemygc/spies/action_controller'
6
6
  autoload :Minitest, 'tunemygc/spies/minitest'
7
+ autoload :ActiveJob, 'tunemygc/spies/active_job'
7
8
  end
8
9
  end
@@ -1,6 +1,21 @@
1
1
  # encoding: utf-8
2
2
 
3
- require 'tunemygc/request_subscriber'
3
+ require 'tunemygc/subscriber'
4
+
5
+ module TuneMyGc
6
+ class StartRequestSubscriber < Subscriber
7
+ def start(name, id, payload)
8
+ TuneMyGc.snapshot(:PROCESSING_STARTED)
9
+ end
10
+ end
11
+
12
+ class EndRequestSubscriber < Subscriber
13
+ def finish(name, id, payload)
14
+ TuneMyGc.snapshot(:PROCESSING_ENDED)
15
+ TuneMyGc.interposer.check_uninstall
16
+ end
17
+ end
18
+ end
4
19
 
5
20
  module TuneMyGc
6
21
  module Spies
@@ -15,10 +30,8 @@ module TuneMyGc
15
30
 
16
31
  def install
17
32
  @subscriptions << ActiveSupport::Notifications.subscribe(/^start_processing.action_controller$/, TuneMyGc::StartRequestSubscriber.new)
18
- TuneMyGc.log "hooked: start_processing.action_controller"
19
-
20
33
  @subscriptions << ActiveSupport::Notifications.subscribe(/^process_action.action_controller$/, TuneMyGc::EndRequestSubscriber.new)
21
- TuneMyGc.log "hooked: process_action.action_controller"
34
+ TuneMyGc.log "hooked: action_controller"
22
35
  end
23
36
 
24
37
  def uninstall
@@ -26,7 +39,7 @@ module TuneMyGc
26
39
  TuneMyGc.log "uninstalled GC tracepoint"
27
40
  @subscriptions.each{|s| ActiveSupport::Notifications.unsubscribe(s) }
28
41
  @subscriptions.clear
29
- TuneMyGc.log "cleared ActiveSupport subscriptions"
42
+ TuneMyGc.log "uninstalled action_controller spy"
30
43
  end
31
44
 
32
45
  def check_uninstall
@@ -0,0 +1,70 @@
1
+ # encoding: utf-8
2
+
3
+ require 'active_job'
4
+
5
+ module TuneMyGc
6
+ module Spies
7
+ class ActiveJob
8
+ def initialize
9
+ @jobs_processed = 0
10
+ @jobs_limit = nil
11
+ end
12
+
13
+ def install
14
+ ::ActiveJob::Base.__send__(:include, hooks_module)
15
+ TuneMyGc.log "hooked: active_job"
16
+ end
17
+
18
+ def uninstall
19
+ TuneMyGc.uninstall_gc_tracepoint
20
+ TuneMyGc.log "uninstalled GC tracepoint"
21
+ ::ActiveJob::Base.__send__(:include, disabled_hooks_module)
22
+ TuneMyGc.log "uninstalled active_job spy"
23
+ end
24
+
25
+ def check_uninstall
26
+ if ENV["RUBY_GC_TUNE_JOBS"]
27
+ @jobs_limit ||= Integer(ENV["RUBY_GC_TUNE_JOBS"])
28
+ @jobs_processed += 1
29
+ if @jobs_processed == @jobs_limit
30
+ uninstall
31
+ TuneMyGc.log "kamikaze after #{@jobs_processed} of #{@jobs_limit} jobs"
32
+ end
33
+ end
34
+ end
35
+
36
+ def hooks_module
37
+ Module.new do
38
+ def self.included(base)
39
+ base.around_perform :tunemygc_perform_job
40
+ end
41
+
42
+ def tunemygc_perform_job(*args)
43
+ tunemygc_before_perform
44
+ yield
45
+ tunemygc_after_perform
46
+ end
47
+
48
+ def tunemygc_before_perform
49
+ TuneMyGc.snapshot(:PROCESSING_STARTED)
50
+ end
51
+
52
+ def tunemygc_after_perform
53
+ TuneMyGc.snapshot(:PROCESSING_ENDED)
54
+ TuneMyGc.interposer.check_uninstall
55
+ end
56
+ end
57
+ end
58
+
59
+ def disabled_hooks_module
60
+ Module.new do
61
+ def tunemygc_before_perform
62
+ end
63
+
64
+ def tunemygc_after_perform
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -1,5 +1,5 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module TuneMyGc
4
- VERSION = "1.0.12"
4
+ VERSION = "1.0.13"
5
5
  end
data/test/helper.rb CHANGED
@@ -22,24 +22,4 @@ class TuneMyGcTestCase < Minitest::Test
22
22
  GC.stress = false
23
23
  end
24
24
  end
25
-
26
- def process_tunemygc_request(path = '/test')
27
- ActiveSupport::Notifications.instrument('start_processing.action_controller', path: path) {}
28
- ActiveSupport::Notifications.instrument('process_action.action_controller', path: path) {}
29
- end
30
-
31
- def run_tunemygc_test
32
- MinitestSandboxTest.new("test_minitest_spy").run
33
- end
34
25
  end
35
-
36
- # for Minitest spy
37
- class MinitestSandboxTest < MiniTest::Unit::TestCase
38
- def setup
39
- @value = 123
40
- end
41
-
42
- def test_minitest_spy
43
- assert_equal 123, @value
44
- end
45
- end
@@ -77,4 +77,9 @@ class TestActionControllerInterposer < TuneMyGcTestCase
77
77
  ensure
78
78
  ENV.delete("RUBY_GC_TUNE_REQUESTS")
79
79
  end
80
+
81
+ def process_tunemygc_request(path = '/test')
82
+ ActiveSupport::Notifications.instrument('start_processing.action_controller', path: path) {}
83
+ ActiveSupport::Notifications.instrument('process_action.action_controller', path: path) {}
84
+ end
80
85
  end
@@ -0,0 +1,89 @@
1
+ # encoding: utf-8
2
+
3
+ require File.join(File.dirname(__FILE__), 'helper')
4
+ require 'active_job'
5
+
6
+ class TuneMyGcJob < ActiveJob::Base
7
+ def perform
8
+ end
9
+ end
10
+
11
+ class TestActiveJobInterposer < TuneMyGcTestCase
12
+ def setup
13
+ TuneMyGc.interposer.uninstall
14
+ end
15
+
16
+ def teardown
17
+ TuneMyGc.interposer = TuneMyGc::Interposer.new(:ActionController)
18
+ end
19
+
20
+ def test_init
21
+ TuneMyGc.interposer = TuneMyGc::Interposer.new(:ActiveJob)
22
+ interposer = TuneMyGc.interposer
23
+ assert !interposer.installed
24
+ end
25
+
26
+ def test_install_uninstall
27
+ TuneMyGc.interposer = TuneMyGc::Interposer.new(:ActiveJob)
28
+ interposer = TuneMyGc.interposer
29
+ interposer.install
30
+ interposer.on_initialized
31
+ assert interposer.installed
32
+ assert_nil interposer.install
33
+
34
+ interposer.uninstall
35
+ end
36
+
37
+ def test_gc_hooks
38
+ TuneMyGc.interposer = TuneMyGc::Interposer.new(:ActiveJob)
39
+ interposer = TuneMyGc.interposer
40
+ interposer.install
41
+ TuneMyGc.interposer.on_initialized
42
+
43
+ GC.start(full_mark: true, immediate_sweep: false)
44
+ GC.start(full_mark: true, immediate_sweep: true)
45
+
46
+ stages = []
47
+
48
+ while !TuneMyGc.snapshotter.empty?
49
+ stages << TuneMyGc.snapshotter.deq
50
+ end
51
+
52
+ # Account for incremental GC on 2.2
53
+ cycles = [:GC_CYCLE_STARTED, :GC_CYCLE_ENTERED]
54
+
55
+ assert stages.any?{|s| cycles.include?(s[3]) }
56
+
57
+ interposer.uninstall
58
+ end
59
+
60
+ def test_tests_limit
61
+ TuneMyGc.interposer = TuneMyGc::Interposer.new(:ActiveJob)
62
+ interposer = TuneMyGc.interposer
63
+ interposer.install
64
+ TuneMyGc.interposer.on_initialized
65
+
66
+ ENV["RUBY_GC_TUNE_JOBS"] = "2"
67
+
68
+ run_tunemygc_job
69
+ run_tunemygc_job
70
+
71
+ stages = []
72
+
73
+ while !TuneMyGc.snapshotter.empty?
74
+ stages << TuneMyGc.snapshotter.deq
75
+ end
76
+
77
+ cycles = [:PROCESSING_STARTED]
78
+
79
+ assert stages.any?{|s| cycles.include?(s[3]) }
80
+
81
+ interposer.uninstall
82
+ ensure
83
+ ENV.delete("RUBY_GC_TUNE_TESTS")
84
+ end
85
+
86
+ def run_tunemygc_job
87
+ TuneMyGcJob.new.perform_now
88
+ end
89
+ end
@@ -2,6 +2,16 @@
2
2
 
3
3
  require File.join(File.dirname(__FILE__), 'helper')
4
4
 
5
+ class MinitestSandboxTest < MiniTest::Unit::TestCase
6
+ def setup
7
+ @value = 123
8
+ end
9
+
10
+ def test_minitest_spy
11
+ assert_equal 123, @value
12
+ end
13
+ end
14
+
5
15
  class TestMinitestInterposer < TuneMyGcTestCase
6
16
  def setup
7
17
  TuneMyGc.interposer.uninstall
@@ -76,4 +86,8 @@ class TestMinitestInterposer < TuneMyGcTestCase
76
86
  ensure
77
87
  ENV.delete("RUBY_GC_TUNE_TESTS")
78
88
  end
89
+
90
+ def run_tunemygc_test
91
+ MinitestSandboxTest.new("test_minitest_spy").run
92
+ end
79
93
  end
data/tunemygc.gemspec CHANGED
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
26
26
 
27
27
  Run this setup command from your application root to register your application with the `https://tunemygc.com` service:
28
28
 
29
- bundle exec tunemygc -r your@email.address
29
+ $ bundle exec tunemygc -r your@email.address
30
30
 
31
31
  You should get back a token reference to identify this Rails app:
32
32
 
@@ -34,7 +34,7 @@ Gem::Specification.new do |s|
34
34
 
35
35
  Then sample your Rails app for tuning:
36
36
 
37
- RUBY_GC_TOKEN=08de9e8822c847244b31290cedfc1d32 RUBY_GC_TUNE=1 bundle exec rails s
37
+ $ RUBY_GC_TOKEN=08de9e8822c847244b31290cedfc1d32 RUBY_GC_TUNE=1 bundle exec rails s
38
38
 
39
39
  We require a valid email address as a canonical reference for tuner tokens for your applications.
40
40
 
@@ -47,4 +47,5 @@ eos
47
47
  s.add_development_dependency('rake', '~> 10.3')
48
48
  s.add_development_dependency('rake-compiler', '~> 0.9', '>= 0.9.5')
49
49
  s.add_development_dependency('webmock', '~> 1.2', '>= 1.2.0')
50
+ s.add_development_dependency('activejob', '~> 4.2.0')
50
51
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tunemygc
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.12
4
+ version: 1.0.13
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bear Metal
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-02-11 00:00:00.000000000 Z
11
+ date: 2015-02-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -98,6 +98,20 @@ dependencies:
98
98
  - - ">="
99
99
  - !ruby/object:Gem::Version
100
100
  version: 1.2.0
101
+ - !ruby/object:Gem::Dependency
102
+ name: activejob
103
+ requirement: !ruby/object:Gem::Requirement
104
+ requirements:
105
+ - - "~>"
106
+ - !ruby/object:Gem::Version
107
+ version: 4.2.0
108
+ type: :development
109
+ prerelease: false
110
+ version_requirements: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: 4.2.0
101
115
  description: Agent for the GC tuning webservice https://www.tunemygc.com - optimal
102
116
  settings for throughput and memory usage of Rails applications
103
117
  email:
@@ -127,10 +141,10 @@ files:
127
141
  - lib/tunemygc/configurator.rb
128
142
  - lib/tunemygc/interposer.rb
129
143
  - lib/tunemygc/railtie.rb
130
- - lib/tunemygc/request_subscriber.rb
131
144
  - lib/tunemygc/snapshotter.rb
132
145
  - lib/tunemygc/spies.rb
133
146
  - lib/tunemygc/spies/action_controller.rb
147
+ - lib/tunemygc/spies/active_job.rb
134
148
  - lib/tunemygc/spies/minitest.rb
135
149
  - lib/tunemygc/subscriber.rb
136
150
  - lib/tunemygc/syncer.rb
@@ -138,6 +152,7 @@ files:
138
152
  - test/fixtures.rb
139
153
  - test/helper.rb
140
154
  - test/test_action_controller_interposer.rb
155
+ - test/test_activejob_interposer.rb
141
156
  - test/test_agent.rb
142
157
  - test/test_minitest_interposer.rb
143
158
  - test/test_railtie.rb
@@ -153,7 +168,7 @@ post_install_message: |2
153
168
 
154
169
  Run this setup command from your application root to register your application with the `https://tunemygc.com` service:
155
170
 
156
- bundle exec tunemygc -r your@email.address
171
+ $ bundle exec tunemygc -r your@email.address
157
172
 
158
173
  You should get back a token reference to identify this Rails app:
159
174
 
@@ -161,7 +176,7 @@ post_install_message: |2
161
176
 
162
177
  Then sample your Rails app for tuning:
163
178
 
164
- RUBY_GC_TOKEN=08de9e8822c847244b31290cedfc1d32 RUBY_GC_TUNE=1 bundle exec rails s
179
+ $ RUBY_GC_TOKEN=08de9e8822c847244b31290cedfc1d32 RUBY_GC_TUNE=1 bundle exec rails s
165
180
 
166
181
  We require a valid email address as a canonical reference for tuner tokens for your applications.
167
182
 
@@ -190,6 +205,7 @@ test_files:
190
205
  - test/fixtures.rb
191
206
  - test/helper.rb
192
207
  - test/test_action_controller_interposer.rb
208
+ - test/test_activejob_interposer.rb
193
209
  - test/test_agent.rb
194
210
  - test/test_minitest_interposer.rb
195
211
  - test/test_railtie.rb
@@ -1,18 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'tunemygc/subscriber'
4
-
5
- module TuneMyGc
6
- class StartRequestSubscriber < Subscriber
7
- def start(name, id, payload)
8
- TuneMyGc.snapshot(:PROCESSING_STARTED)
9
- end
10
- end
11
-
12
- class EndRequestSubscriber < Subscriber
13
- def finish(name, id, payload)
14
- TuneMyGc.snapshot(:PROCESSING_ENDED)
15
- TuneMyGc.interposer.check_uninstall
16
- end
17
- end
18
- end