autoscale 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +81 -0
  3. data/Guardfile +12 -0
  4. data/README.md +81 -0
  5. data/examples/complex.rb +39 -0
  6. data/examples/simple.rb +28 -0
  7. data/lib/autoscaler.rb +5 -0
  8. data/lib/autoscaler/binary_scaling_strategy.rb +26 -0
  9. data/lib/autoscaler/counter_cache_memory.rb +35 -0
  10. data/lib/autoscaler/counter_cache_redis.rb +50 -0
  11. data/lib/autoscaler/delayed_shutdown.rb +44 -0
  12. data/lib/autoscaler/heroku_scaler.rb +81 -0
  13. data/lib/autoscaler/ignore_scheduled_and_retrying.rb +13 -0
  14. data/lib/autoscaler/linear_scaling_strategy.rb +39 -0
  15. data/lib/autoscaler/sidekiq.rb +11 -0
  16. data/lib/autoscaler/sidekiq/activity.rb +62 -0
  17. data/lib/autoscaler/sidekiq/celluloid_monitor.rb +67 -0
  18. data/lib/autoscaler/sidekiq/client.rb +50 -0
  19. data/lib/autoscaler/sidekiq/entire_queue_system.rb +41 -0
  20. data/lib/autoscaler/sidekiq/monitor_middleware_adapter.rb +46 -0
  21. data/lib/autoscaler/sidekiq/queue_system.rb +20 -0
  22. data/lib/autoscaler/sidekiq/sleep_wait_server.rb +51 -0
  23. data/lib/autoscaler/sidekiq/specified_queue_system.rb +48 -0
  24. data/lib/autoscaler/stub_scaler.rb +25 -0
  25. data/lib/autoscaler/version.rb +4 -0
  26. data/spec/autoscaler/binary_scaling_strategy_spec.rb +19 -0
  27. data/spec/autoscaler/counter_cache_memory_spec.rb +21 -0
  28. data/spec/autoscaler/counter_cache_redis_spec.rb +49 -0
  29. data/spec/autoscaler/delayed_shutdown_spec.rb +23 -0
  30. data/spec/autoscaler/heroku_scaler_spec.rb +49 -0
  31. data/spec/autoscaler/ignore_scheduled_and_retrying_spec.rb +33 -0
  32. data/spec/autoscaler/linear_scaling_strategy_spec.rb +85 -0
  33. data/spec/autoscaler/sidekiq/activity_spec.rb +34 -0
  34. data/spec/autoscaler/sidekiq/celluloid_monitor_spec.rb +39 -0
  35. data/spec/autoscaler/sidekiq/client_spec.rb +35 -0
  36. data/spec/autoscaler/sidekiq/entire_queue_system_spec.rb +65 -0
  37. data/spec/autoscaler/sidekiq/monitor_middleware_adapter_spec.rb +16 -0
  38. data/spec/autoscaler/sidekiq/sleep_wait_server_spec.rb +45 -0
  39. data/spec/autoscaler/sidekiq/specified_queue_system_spec.rb +63 -0
  40. data/spec/spec_helper.rb +16 -0
  41. data/spec/test_system.rb +11 -0
  42. metadata +187 -0
@@ -0,0 +1,16 @@
1
+ require 'spec_helper'
2
+ require 'autoscaler/sidekiq/monitor_middleware_adapter'
3
+
4
+ describe Autoscaler::Sidekiq::MonitorMiddlewareAdapter do
5
+ before do
6
+ @redis = Sidekiq.redis = REDIS
7
+ Sidekiq.redis {|c| c.flushdb }
8
+ end
9
+
10
+ let(:cut) {Autoscaler::Sidekiq::MonitorMiddlewareAdapter}
11
+ let(:scaler) {TestScaler.new(1)}
12
+ let(:server) {cut.new(scaler, 0, ['queue'])}
13
+
14
+ it('yields') {server.call(Object.new, {}, 'queue') {:foo}.should == :foo}
15
+ it('yields with a redis pool') {server.call(Object.new, {}, 'queue', Sidekiq.method(:redis)) {:foo}.should == :foo}
16
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+ require 'autoscaler/sidekiq/sleep_wait_server'
3
+
4
+ describe Autoscaler::Sidekiq::SleepWaitServer do
5
+ before do
6
+ @redis = Sidekiq.redis = REDIS
7
+ Sidekiq.redis {|c| c.flushdb }
8
+ end
9
+
10
+ let(:cut) {Autoscaler::Sidekiq::SleepWaitServer}
11
+ let(:scaler) {TestScaler.new(1)}
12
+ let(:server) {cut.new(scaler, 0, ['queue'])}
13
+
14
+ shared_examples "a sleepwait server" do
15
+ it "scales with no work" do
16
+ server.stub(:pending_work?).and_return(false)
17
+ when_run
18
+ scaler.workers.should == 0
19
+ end
20
+
21
+ it "does not scale with pending work" do
22
+ server.stub(:pending_work?).and_return(true)
23
+ when_run
24
+ scaler.workers.should == 1
25
+ end
26
+ end
27
+
28
+ describe "a middleware with no redis specified" do
29
+ it_behaves_like "a sleepwait server" do
30
+ def when_run
31
+ server.call(Object.new, {}, 'queue') {}
32
+ end
33
+ end
34
+ end
35
+
36
+ describe "a middleware with redis specified" do
37
+ it_behaves_like "a sleepwait server" do
38
+ def when_run
39
+ server.call(Object.new, {}, 'queue', Sidekiq.method(:redis)) {}
40
+ end
41
+ end
42
+ end
43
+
44
+ it('yields') {server.call(Object.new, {}, 'queue') {:foo}.should == :foo}
45
+ end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+ require 'autoscaler/sidekiq/specified_queue_system'
3
+
4
+ describe Autoscaler::Sidekiq::SpecifiedQueueSystem do
5
+ let(:cut) {Autoscaler::Sidekiq::SpecifiedQueueSystem}
6
+
7
+ before do
8
+ @redis = Sidekiq.redis = REDIS
9
+ Sidekiq.redis {|c| c.flushdb }
10
+ end
11
+
12
+ def with_work_in_set(queue, set)
13
+ payload = Sidekiq.dump_json('queue' => queue)
14
+ Sidekiq.redis { |c| c.zadd(set, (Time.now.to_f + 30.to_f).to_s, payload)}
15
+ end
16
+
17
+ def with_scheduled_work_in(queue)
18
+ with_work_in_set(queue, 'schedule')
19
+ end
20
+
21
+ def with_retry_work_in(queue)
22
+ with_work_in_set(queue, 'retry')
23
+ end
24
+
25
+ subject {cut.new(['queue'])}
26
+
27
+ it {subject.queue_names.should == ['queue']}
28
+ it {subject.workers.should == 0}
29
+
30
+ describe 'no queued work' do
31
+ it "with no work" do
32
+ subject.stub(:sidekiq_queues).and_return({'queue' => 0, 'another_queue' => 1})
33
+ subject.queued.should == 0
34
+ end
35
+
36
+ it "with scheduled work in another queue" do
37
+ with_scheduled_work_in('another_queue')
38
+ subject.scheduled.should == 0
39
+ end
40
+
41
+ it "with retry work in another queue" do
42
+ with_retry_work_in('another_queue')
43
+ subject.retrying.should == 0
44
+ end
45
+ end
46
+
47
+ describe 'with queued work' do
48
+ it "with enqueued work" do
49
+ subject.stub(:sidekiq_queues).and_return({'queue' => 1})
50
+ subject.queued.should == 1
51
+ end
52
+
53
+ it "with schedule work" do
54
+ with_scheduled_work_in('queue')
55
+ subject.scheduled.should == 1
56
+ end
57
+
58
+ it "with retry work" do
59
+ with_retry_work_in('queue')
60
+ subject.retrying.should == 1
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,16 @@
1
+ require 'sidekiq'
2
+ REDIS = Sidekiq::RedisConnection.create(:url => 'http://localhost:9736', :namespace => 'autoscaler')
3
+
4
+ RSpec.configure do |config|
5
+ config.mock_with :rspec
6
+
7
+ config.filter_run_excluding :online => true unless ENV['HEROKU_APP']
8
+ end
9
+
10
+ class TestScaler
11
+ attr_accessor :workers
12
+
13
+ def initialize(n = 0)
14
+ self.workers = n
15
+ end
16
+ end
@@ -0,0 +1,11 @@
1
+ class TestSystem
2
+ def initialize(pending, current = 0)
3
+ @pending = pending
4
+ @current = current
5
+ end
6
+
7
+ def workers; @current; end
8
+ def queued; @pending; end
9
+ def scheduled; 0; end
10
+ def retrying; 0; end
11
+ end
metadata ADDED
@@ -0,0 +1,187 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: autoscale
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.9.1
5
+ platform: ruby
6
+ authors:
7
+ - Justin Love
8
+ - Fix Peña
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2015-10-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: sidekiq
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '3'
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - "~>"
26
+ - !ruby/object:Gem::Version
27
+ version: '3'
28
+ - !ruby/object:Gem::Dependency
29
+ name: heroku-api
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '0'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ version: '0'
42
+ - !ruby/object:Gem::Dependency
43
+ name: bundler
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '0'
49
+ type: :development
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - ">="
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ - !ruby/object:Gem::Dependency
57
+ name: rspec
58
+ requirement: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - "<"
61
+ - !ruby/object:Gem::Version
62
+ version: '3'
63
+ type: :development
64
+ prerelease: false
65
+ version_requirements: !ruby/object:Gem::Requirement
66
+ requirements:
67
+ - - "<"
68
+ - !ruby/object:Gem::Version
69
+ version: '3'
70
+ - !ruby/object:Gem::Dependency
71
+ name: guard-rspec
72
+ requirement: !ruby/object:Gem::Requirement
73
+ requirements:
74
+ - - ">="
75
+ - !ruby/object:Gem::Version
76
+ version: '0'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: !ruby/object:Gem::Requirement
80
+ requirements:
81
+ - - ">="
82
+ - !ruby/object:Gem::Version
83
+ version: '0'
84
+ - !ruby/object:Gem::Dependency
85
+ name: guard-process
86
+ requirement: !ruby/object:Gem::Requirement
87
+ requirements:
88
+ - - ">="
89
+ - !ruby/object:Gem::Version
90
+ version: '0'
91
+ type: :development
92
+ prerelease: false
93
+ version_requirements: !ruby/object:Gem::Requirement
94
+ requirements:
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: '0'
98
+ description: Currently provides a Sidekiq middleware that does 0/1 scaling of Heroku
99
+ processes
100
+ email:
101
+ - git@JustinLove.name
102
+ executables: []
103
+ extensions: []
104
+ extra_rdoc_files: []
105
+ files:
106
+ - CHANGELOG.md
107
+ - Guardfile
108
+ - README.md
109
+ - examples/complex.rb
110
+ - examples/simple.rb
111
+ - lib/autoscaler.rb
112
+ - lib/autoscaler/binary_scaling_strategy.rb
113
+ - lib/autoscaler/counter_cache_memory.rb
114
+ - lib/autoscaler/counter_cache_redis.rb
115
+ - lib/autoscaler/delayed_shutdown.rb
116
+ - lib/autoscaler/heroku_scaler.rb
117
+ - lib/autoscaler/ignore_scheduled_and_retrying.rb
118
+ - lib/autoscaler/linear_scaling_strategy.rb
119
+ - lib/autoscaler/sidekiq.rb
120
+ - lib/autoscaler/sidekiq/activity.rb
121
+ - lib/autoscaler/sidekiq/celluloid_monitor.rb
122
+ - lib/autoscaler/sidekiq/client.rb
123
+ - lib/autoscaler/sidekiq/entire_queue_system.rb
124
+ - lib/autoscaler/sidekiq/monitor_middleware_adapter.rb
125
+ - lib/autoscaler/sidekiq/queue_system.rb
126
+ - lib/autoscaler/sidekiq/sleep_wait_server.rb
127
+ - lib/autoscaler/sidekiq/specified_queue_system.rb
128
+ - lib/autoscaler/stub_scaler.rb
129
+ - lib/autoscaler/version.rb
130
+ - spec/autoscaler/binary_scaling_strategy_spec.rb
131
+ - spec/autoscaler/counter_cache_memory_spec.rb
132
+ - spec/autoscaler/counter_cache_redis_spec.rb
133
+ - spec/autoscaler/delayed_shutdown_spec.rb
134
+ - spec/autoscaler/heroku_scaler_spec.rb
135
+ - spec/autoscaler/ignore_scheduled_and_retrying_spec.rb
136
+ - spec/autoscaler/linear_scaling_strategy_spec.rb
137
+ - spec/autoscaler/sidekiq/activity_spec.rb
138
+ - spec/autoscaler/sidekiq/celluloid_monitor_spec.rb
139
+ - spec/autoscaler/sidekiq/client_spec.rb
140
+ - spec/autoscaler/sidekiq/entire_queue_system_spec.rb
141
+ - spec/autoscaler/sidekiq/monitor_middleware_adapter_spec.rb
142
+ - spec/autoscaler/sidekiq/sleep_wait_server_spec.rb
143
+ - spec/autoscaler/sidekiq/specified_queue_system_spec.rb
144
+ - spec/spec_helper.rb
145
+ - spec/test_system.rb
146
+ homepage: ''
147
+ licenses: []
148
+ metadata: {}
149
+ post_install_message:
150
+ rdoc_options: []
151
+ require_paths:
152
+ - lib
153
+ required_ruby_version: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - ">="
156
+ - !ruby/object:Gem::Version
157
+ version: '0'
158
+ required_rubygems_version: !ruby/object:Gem::Requirement
159
+ requirements:
160
+ - - ">="
161
+ - !ruby/object:Gem::Version
162
+ version: '0'
163
+ requirements: []
164
+ rubyforge_project: autoscaler
165
+ rubygems_version: 2.4.5.1
166
+ signing_key:
167
+ specification_version: 4
168
+ summary: Start/stop Sidekiq workers on Heroku
169
+ test_files:
170
+ - Guardfile
171
+ - spec/autoscaler/binary_scaling_strategy_spec.rb
172
+ - spec/autoscaler/counter_cache_memory_spec.rb
173
+ - spec/autoscaler/counter_cache_redis_spec.rb
174
+ - spec/autoscaler/delayed_shutdown_spec.rb
175
+ - spec/autoscaler/heroku_scaler_spec.rb
176
+ - spec/autoscaler/ignore_scheduled_and_retrying_spec.rb
177
+ - spec/autoscaler/linear_scaling_strategy_spec.rb
178
+ - spec/autoscaler/sidekiq/activity_spec.rb
179
+ - spec/autoscaler/sidekiq/celluloid_monitor_spec.rb
180
+ - spec/autoscaler/sidekiq/client_spec.rb
181
+ - spec/autoscaler/sidekiq/entire_queue_system_spec.rb
182
+ - spec/autoscaler/sidekiq/monitor_middleware_adapter_spec.rb
183
+ - spec/autoscaler/sidekiq/sleep_wait_server_spec.rb
184
+ - spec/autoscaler/sidekiq/specified_queue_system_spec.rb
185
+ - spec/spec_helper.rb
186
+ - spec/test_system.rb
187
+ has_rdoc: