our-eel-hacks 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/our-eel-hacks/autoscaler.rb +22 -8
- data/lib/our-eel-hacks/defer/celluloid.rb +13 -0
- data/lib/our-eel-hacks/defer/event-machine.rb +1 -1
- data/lib/our-eel-hacks/middleware.rb +9 -0
- data/lib/our-eel-hacks/sidekiq.rb +2 -2
- data/spec/autoscaler.rb +21 -10
- data/spec_help/cassettes/OurEelHacks_Autoscaler.yml +334 -65
- metadata +9 -8
@@ -1,6 +1,13 @@
|
|
1
1
|
require 'heroku'
|
2
2
|
|
3
3
|
module OurEelHacks
|
4
|
+
class NullLogger
|
5
|
+
def debug; end
|
6
|
+
def info; end
|
7
|
+
def warn; end
|
8
|
+
def fatal; end
|
9
|
+
end
|
10
|
+
|
4
11
|
class Autoscaler
|
5
12
|
class << self
|
6
13
|
def get_instance(flavor)
|
@@ -75,12 +82,7 @@ module OurEelHacks
|
|
75
82
|
@upper_limits = UpperLimit.new(30, 50)
|
76
83
|
@soft_duration = 500
|
77
84
|
@scaling_frequency = 200
|
78
|
-
@logger =
|
79
|
-
end
|
80
|
-
|
81
|
-
def log(msg)
|
82
|
-
return if @logger.nil
|
83
|
-
@logger.info(msg)
|
85
|
+
@logger = NullLogger.new
|
84
86
|
end
|
85
87
|
|
86
88
|
def configure
|
@@ -109,14 +111,17 @@ module OurEelHacks
|
|
109
111
|
end
|
110
112
|
|
111
113
|
def scale(metric)
|
114
|
+
logger.debug{ "Scaling request for #{@ps_type}: metric is: #{metric}" }
|
112
115
|
moment = Time.now
|
113
116
|
if elapsed(last_scaled, moment) < scaling_frequency
|
117
|
+
logger.debug{ "Not scaling: elapsed #{elapsed(last_scaled, moment)} less than configured #{scaling_frequency}" }
|
114
118
|
return
|
115
119
|
end
|
116
120
|
|
117
121
|
target_dynos = target_scale(metric, moment)
|
118
122
|
|
119
123
|
target_dynos = [[target_dynos, max_dynos].min, min_dynos].max
|
124
|
+
logger.debug{ "Target dynos at: #{min_dynos}/#{target_dynos}/#{max_dynos} (vs. current: #{@dynos})" }
|
120
125
|
|
121
126
|
set_dynos(target_dynos)
|
122
127
|
|
@@ -191,8 +196,17 @@ module OurEelHacks
|
|
191
196
|
end
|
192
197
|
|
193
198
|
def set_dynos(count)
|
194
|
-
|
195
|
-
|
199
|
+
if count == dynos
|
200
|
+
logger.debug{ "Not scaling: #{count} ?= #{dynos}" }
|
201
|
+
return
|
202
|
+
end
|
203
|
+
|
204
|
+
if not (stable = dynos_stable?)
|
205
|
+
logger.debug{ "Not scaling: dynos not stable (iow: not all #{ps_type} dynos are up)" }
|
206
|
+
return
|
207
|
+
end
|
208
|
+
logger.info{ "Scaling from #{dynos} to #{count} dynos for #{ps_type}" }
|
209
|
+
heroku.ps_scale(app_name, :type => ps_type, :qty => count)
|
196
210
|
@last_scaled = Time.now
|
197
211
|
end
|
198
212
|
end
|
@@ -9,7 +9,16 @@ module OurEelHacks
|
|
9
9
|
protected
|
10
10
|
|
11
11
|
def autoscale(metric)
|
12
|
+
now = Time.now
|
13
|
+
if @scaling_at.nil? or (now - @scaling_at) > 60
|
14
|
+
@scaling_at = now
|
15
|
+
trigger_scaling(metric)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def trigger_scaling(metric)
|
12
20
|
Autoscaler.instance_for(@flavor).scale(metric)
|
21
|
+
@scaling_at = nil
|
13
22
|
end
|
14
23
|
end
|
15
24
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
require 'our-eel-hacks/middleware'
|
2
|
-
require 'our-eel-hacks/defer/
|
2
|
+
require 'our-eel-hacks/defer/celluloid'
|
3
3
|
|
4
4
|
module OurEelHacks
|
5
5
|
class Sidekiq < Middleware
|
6
|
-
include Defer::
|
6
|
+
include Defer::Celluloid
|
7
7
|
def initialize(flavor=:sidekiq)
|
8
8
|
super
|
9
9
|
end
|
data/spec/autoscaler.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
require 'our-eel-hacks/rack'
|
3
|
+
require 'logger'
|
3
4
|
|
4
5
|
describe OurEelHacks::Autoscaler do
|
5
6
|
before :each do
|
@@ -52,6 +53,10 @@ describe OurEelHacks::Autoscaler do
|
|
52
53
|
Time.stub!(:now).and_return(Time.at(starting_time, millis))
|
53
54
|
end
|
54
55
|
|
56
|
+
let :logger do
|
57
|
+
Logger.new($stdout).tap{|lgr| lgr.level = Logger::INFO }
|
58
|
+
end
|
59
|
+
|
55
60
|
let :autoscaler do
|
56
61
|
time_adjust(0)
|
57
62
|
OurEelHacks::Autoscaler.new.tap do |test|
|
@@ -67,16 +72,22 @@ describe OurEelHacks::Autoscaler do
|
|
67
72
|
|
68
73
|
test.upper_limits.soft = 30
|
69
74
|
test.upper_limits.hard = 50
|
75
|
+
|
76
|
+
#test.logger = logger
|
70
77
|
end
|
71
78
|
end
|
72
79
|
end
|
73
80
|
|
81
|
+
let :heroku do
|
82
|
+
autoscaler.heroku
|
83
|
+
end
|
84
|
+
|
74
85
|
it "should get a count of dynos at start" do
|
75
86
|
autoscaler.dynos.should == 3 #happens to be the number of web dynos right now
|
76
87
|
end
|
77
88
|
|
78
89
|
before :each do
|
79
|
-
|
90
|
+
heroku.stub!(:ps_scale)
|
80
91
|
time_adjust(0)
|
81
92
|
autoscaler.scale(ideal_value)
|
82
93
|
end
|
@@ -86,14 +97,14 @@ describe OurEelHacks::Autoscaler do
|
|
86
97
|
it "should not scale too soon" do
|
87
98
|
time_adjust(scaling_freq - 5)
|
88
99
|
|
89
|
-
|
100
|
+
heroku.should_not_receive(:ps_scale)
|
90
101
|
autoscaler.scale(hard_high)
|
91
102
|
end
|
92
103
|
|
93
104
|
it "should scale up if time has elapsed and hard limit exceeded" do
|
94
105
|
time_adjust(scaling_freq + 5)
|
95
106
|
|
96
|
-
|
107
|
+
heroku.should_receive(:ps_scale).with(app_name, hash_including(:qty => 4))
|
97
108
|
autoscaler.scale(hard_high)
|
98
109
|
end
|
99
110
|
end
|
@@ -104,7 +115,7 @@ describe OurEelHacks::Autoscaler do
|
|
104
115
|
end
|
105
116
|
|
106
117
|
it "should scale down if hard lower limit exceeded" do
|
107
|
-
|
118
|
+
heroku.should_receive(:ps_scale).with(app_name, hash_including(:qty => 2))
|
108
119
|
autoscaler.scale(hard_low)
|
109
120
|
end
|
110
121
|
end
|
@@ -118,7 +129,7 @@ describe OurEelHacks::Autoscaler do
|
|
118
129
|
describe "if soft_duration hasn't elapsed" do
|
119
130
|
before :each do
|
120
131
|
time_adjust((scaling_freq * 2) + soft_dur - 5)
|
121
|
-
|
132
|
+
heroku.should_not_receive(:ps_scale)
|
122
133
|
end
|
123
134
|
|
124
135
|
it "should not scale up" do
|
@@ -136,12 +147,12 @@ describe OurEelHacks::Autoscaler do
|
|
136
147
|
end
|
137
148
|
|
138
149
|
it "should scale up if above upper soft limit" do
|
139
|
-
|
150
|
+
heroku.should_receive(:ps_scale).with(app_name, hash_including(:qty => 4))
|
140
151
|
autoscaler.scale(soft_high)
|
141
152
|
end
|
142
153
|
|
143
154
|
it "should not scale down if below lower soft limit" do
|
144
|
-
|
155
|
+
heroku.should_not_receive(:ps_scale)
|
145
156
|
autoscaler.scale(soft_low)
|
146
157
|
end
|
147
158
|
end
|
@@ -156,7 +167,7 @@ describe OurEelHacks::Autoscaler do
|
|
156
167
|
describe "if soft_duration hasn't elapsed" do
|
157
168
|
before :each do
|
158
169
|
time_adjust(scaling_freq * 2 + soft_dur - 5)
|
159
|
-
|
170
|
+
heroku.should_not_receive(:ps_scale)
|
160
171
|
end
|
161
172
|
|
162
173
|
it "should not scale up" do
|
@@ -174,12 +185,12 @@ describe OurEelHacks::Autoscaler do
|
|
174
185
|
end
|
175
186
|
|
176
187
|
it "should not scale up even if above upper soft limit" do
|
177
|
-
|
188
|
+
heroku.should_not_receive(:ps_scale)
|
178
189
|
autoscaler.scale(soft_high)
|
179
190
|
end
|
180
191
|
|
181
192
|
it "should scale down if below lower soft limit" do
|
182
|
-
|
193
|
+
heroku.should_receive(:ps_scale).with(app_name, hash_including(:qty => 2))
|
183
194
|
autoscaler.scale(soft_low)
|
184
195
|
end
|
185
196
|
end
|
@@ -29,7 +29,7 @@ http_interactions:
|
|
29
29
|
server:
|
30
30
|
- nginx
|
31
31
|
date:
|
32
|
-
-
|
32
|
+
- Mon, 07 May 2012 19:52:48 GMT
|
33
33
|
content-type:
|
34
34
|
- application/xml; charset=utf-8
|
35
35
|
connection:
|
@@ -39,7 +39,7 @@ http_interactions:
|
|
39
39
|
etag:
|
40
40
|
- ! '"e32026fbb1ab6519a01cf80025f08660"'
|
41
41
|
x-runtime:
|
42
|
-
- '
|
42
|
+
- '281'
|
43
43
|
content-length:
|
44
44
|
- '871'
|
45
45
|
cache-control:
|
@@ -48,19 +48,86 @@ http_interactions:
|
|
48
48
|
- max-age=500
|
49
49
|
body:
|
50
50
|
encoding: US-ASCII
|
51
|
-
string: !
|
52
|
-
type=\"datetime\">2012-02-26T21:42:49-08:00</created-at>\n
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
51
|
+
string: !str
|
52
|
+
str: ! "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<app>\n <created-at type=\"datetime\">2012-02-26T21:42:49-08:00</created-at>\n
|
53
|
+
\ <dynos type=\"integer\">0</dynos>\n <name>sbmp</name>\n <repo-size type=\"integer\">220864512</repo-size>\n
|
54
|
+
\ <requested-stack nil=\"true\"></requested-stack>\n <slug-size type=\"integer\">85061632</slug-size>\n
|
55
|
+
\ <stack>cedar</stack>\n <workers type=\"integer\">0</workers>\n <create-status
|
56
|
+
type=\"symbol\">complete</create-status>\n <repo-migrate-status type=\"symbol\">complete</repo-migrate-status>\n
|
57
|
+
\ <buildpack-provided-description>Ruby/Rails</buildpack-provided-description>\n
|
58
|
+
\ <id>app3049118@heroku.com</id>\n <domain_name>sbmp.herokuapp.com</domain_name>\n
|
59
|
+
\ <owner>aws@salesbump.com</owner>\n <web_url>http://sbmp.herokuapp.com/</web_url>\n
|
60
|
+
\ <git_url>git@heroku.com:sbmp.git</git_url>\n <database_size></database_size>\n
|
61
|
+
\ <stateless-codex>true</stateless-codex>\n</app>\n"
|
62
|
+
net_http_res: &79789840 !ruby/object:Net::HTTPOK
|
63
|
+
http_version: '1.0'
|
64
|
+
code: '200'
|
65
|
+
message: OK
|
66
|
+
header:
|
67
|
+
server:
|
68
|
+
- nginx
|
69
|
+
date:
|
70
|
+
- Mon, 07 May 2012 19:52:48 GMT
|
71
|
+
content-type:
|
72
|
+
- application/xml; charset=utf-8
|
73
|
+
connection:
|
74
|
+
- keep-alive
|
75
|
+
status:
|
76
|
+
- 200 OK
|
77
|
+
etag:
|
78
|
+
- ! '"e32026fbb1ab6519a01cf80025f08660"'
|
79
|
+
x-runtime:
|
80
|
+
- '281'
|
81
|
+
content-length:
|
82
|
+
- '871'
|
83
|
+
cache-control:
|
84
|
+
- private, max-age=0, must-revalidate
|
85
|
+
strict-transport-security:
|
86
|
+
- max-age=500
|
87
|
+
body: !str
|
88
|
+
str: ! "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<app>\n <created-at
|
89
|
+
type=\"datetime\">2012-02-26T21:42:49-08:00</created-at>\n <dynos type=\"integer\">0</dynos>\n
|
90
|
+
\ <name>sbmp</name>\n <repo-size type=\"integer\">220864512</repo-size>\n
|
91
|
+
\ <requested-stack nil=\"true\"></requested-stack>\n <slug-size type=\"integer\">85061632</slug-size>\n
|
92
|
+
\ <stack>cedar</stack>\n <workers type=\"integer\">0</workers>\n <create-status
|
93
|
+
type=\"symbol\">complete</create-status>\n <repo-migrate-status type=\"symbol\">complete</repo-migrate-status>\n
|
94
|
+
\ <buildpack-provided-description>Ruby/Rails</buildpack-provided-description>\n
|
95
|
+
\ <id>app3049118@heroku.com</id>\n <domain_name>sbmp.herokuapp.com</domain_name>\n
|
96
|
+
\ <owner>aws@salesbump.com</owner>\n <web_url>http://sbmp.herokuapp.com/</web_url>\n
|
97
|
+
\ <git_url>git@heroku.com:sbmp.git</git_url>\n <database_size></database_size>\n
|
98
|
+
\ <stateless-codex>true</stateless-codex>\n</app>\n"
|
99
|
+
net_http_res: *79789840
|
100
|
+
args: &79674040
|
101
|
+
:verify_ssl: 1
|
102
|
+
:ssl_ca_file: /home/judson/ruby/bundle-paths/rails3/lib/ruby/1.9.1/gems/heroku-2.25.0/data/cacert.pem
|
103
|
+
:user: ''
|
104
|
+
:password: FakeApiKey
|
105
|
+
:method: :get
|
106
|
+
:url: https://api.heroku.com/apps/sbmp
|
107
|
+
:headers:
|
108
|
+
X-Heroku-API-Version: '2'
|
109
|
+
User-Agent: heroku-gem/2.25.0
|
110
|
+
X-Ruby-Version: 1.9.3
|
111
|
+
X-Ruby-Platform: i686-linux
|
112
|
+
code: 200
|
113
|
+
headers: &79786080
|
114
|
+
:server: nginx
|
115
|
+
:date: Mon, 07 May 2012 19:52:48 GMT
|
116
|
+
:content_type: application/xml; charset=utf-8
|
117
|
+
:connection: keep-alive
|
118
|
+
:status: 200 OK
|
119
|
+
:etag: ! '"e32026fbb1ab6519a01cf80025f08660"'
|
120
|
+
:x_runtime: '281'
|
121
|
+
:content_length: '871'
|
122
|
+
:cache_control: private, max-age=0, must-revalidate
|
123
|
+
:strict_transport_security: max-age=500
|
124
|
+
read: true
|
125
|
+
__read_body_previously_called: true
|
126
|
+
args: *79674040
|
127
|
+
code: 200
|
128
|
+
headers: *79786080
|
62
129
|
http_version: '1.1'
|
63
|
-
recorded_at:
|
130
|
+
recorded_at: Mon, 07 May 2012 19:50:42 GMT
|
64
131
|
- request:
|
65
132
|
method: get
|
66
133
|
uri: https://:FakeApiKey@api.heroku.com/apps/sbmp/collaborators
|
@@ -90,7 +157,7 @@ http_interactions:
|
|
90
157
|
server:
|
91
158
|
- nginx
|
92
159
|
date:
|
93
|
-
-
|
160
|
+
- Mon, 07 May 2012 19:52:48 GMT
|
94
161
|
content-type:
|
95
162
|
- application/xml; charset=utf-8
|
96
163
|
connection:
|
@@ -100,7 +167,7 @@ http_interactions:
|
|
100
167
|
etag:
|
101
168
|
- ! '"89032632d1ae99be4cc6bc10767a1adc"'
|
102
169
|
x-runtime:
|
103
|
-
- '
|
170
|
+
- '23'
|
104
171
|
content-length:
|
105
172
|
- '270'
|
106
173
|
cache-control:
|
@@ -109,12 +176,73 @@ http_interactions:
|
|
109
176
|
- max-age=500
|
110
177
|
body:
|
111
178
|
encoding: US-ASCII
|
112
|
-
string: !
|
113
|
-
\
|
114
|
-
|
115
|
-
|
179
|
+
string: !str
|
180
|
+
str: ! "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<collaborators>\n <collaborator>\n
|
181
|
+
\ <email>aws@salesbump.com</email>\n <access>edit</access>\n </collaborator>\n
|
182
|
+
\ <collaborator>\n <email>judson@lrdesign.com</email>\n <access>edit</access>\n
|
183
|
+
\ </collaborator>\n</collaborators>\n"
|
184
|
+
net_http_res: &79863770 !ruby/object:Net::HTTPOK
|
185
|
+
http_version: '1.0'
|
186
|
+
code: '200'
|
187
|
+
message: OK
|
188
|
+
header:
|
189
|
+
server:
|
190
|
+
- nginx
|
191
|
+
date:
|
192
|
+
- Mon, 07 May 2012 19:52:48 GMT
|
193
|
+
content-type:
|
194
|
+
- application/xml; charset=utf-8
|
195
|
+
connection:
|
196
|
+
- keep-alive
|
197
|
+
status:
|
198
|
+
- 200 OK
|
199
|
+
etag:
|
200
|
+
- ! '"89032632d1ae99be4cc6bc10767a1adc"'
|
201
|
+
x-runtime:
|
202
|
+
- '23'
|
203
|
+
content-length:
|
204
|
+
- '270'
|
205
|
+
cache-control:
|
206
|
+
- private, max-age=0, must-revalidate
|
207
|
+
strict-transport-security:
|
208
|
+
- max-age=500
|
209
|
+
body: !str
|
210
|
+
str: ! "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<collaborators>\n
|
211
|
+
\ <collaborator>\n <email>aws@salesbump.com</email>\n <access>edit</access>\n
|
212
|
+
\ </collaborator>\n <collaborator>\n <email>judson@lrdesign.com</email>\n
|
213
|
+
\ <access>edit</access>\n </collaborator>\n</collaborators>\n"
|
214
|
+
net_http_res: *79863770
|
215
|
+
args: &79839720
|
216
|
+
:verify_ssl: 1
|
217
|
+
:ssl_ca_file: /home/judson/ruby/bundle-paths/rails3/lib/ruby/1.9.1/gems/heroku-2.25.0/data/cacert.pem
|
218
|
+
:user: ''
|
219
|
+
:password: FakeApiKey
|
220
|
+
:method: :get
|
221
|
+
:url: https://api.heroku.com/apps/sbmp/collaborators
|
222
|
+
:headers:
|
223
|
+
X-Heroku-API-Version: '2'
|
224
|
+
User-Agent: heroku-gem/2.25.0
|
225
|
+
X-Ruby-Version: 1.9.3
|
226
|
+
X-Ruby-Platform: i686-linux
|
227
|
+
code: 200
|
228
|
+
headers: &79860560
|
229
|
+
:server: nginx
|
230
|
+
:date: Mon, 07 May 2012 19:52:48 GMT
|
231
|
+
:content_type: application/xml; charset=utf-8
|
232
|
+
:connection: keep-alive
|
233
|
+
:status: 200 OK
|
234
|
+
:etag: ! '"89032632d1ae99be4cc6bc10767a1adc"'
|
235
|
+
:x_runtime: '23'
|
236
|
+
:content_length: '270'
|
237
|
+
:cache_control: private, max-age=0, must-revalidate
|
238
|
+
:strict_transport_security: max-age=500
|
239
|
+
read: true
|
240
|
+
__read_body_previously_called: true
|
241
|
+
args: *79839720
|
242
|
+
code: 200
|
243
|
+
headers: *79860560
|
116
244
|
http_version: '1.1'
|
117
|
-
recorded_at:
|
245
|
+
recorded_at: Mon, 07 May 2012 19:50:42 GMT
|
118
246
|
- request:
|
119
247
|
method: get
|
120
248
|
uri: https://:FakeApiKey@api.heroku.com/apps/sbmp/addons
|
@@ -144,7 +272,7 @@ http_interactions:
|
|
144
272
|
server:
|
145
273
|
- nginx
|
146
274
|
date:
|
147
|
-
-
|
275
|
+
- Mon, 07 May 2012 19:52:49 GMT
|
148
276
|
content-type:
|
149
277
|
- application/json; charset=utf-8
|
150
278
|
connection:
|
@@ -154,7 +282,7 @@ http_interactions:
|
|
154
282
|
etag:
|
155
283
|
- ! '"3af6412d378895e01d969c520cc169c5"'
|
156
284
|
x-runtime:
|
157
|
-
- '
|
285
|
+
- '54'
|
158
286
|
content-length:
|
159
287
|
- '818'
|
160
288
|
cache-control:
|
@@ -163,13 +291,76 @@ http_interactions:
|
|
163
291
|
- max-age=500
|
164
292
|
body:
|
165
293
|
encoding: US-ASCII
|
166
|
-
string: !
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
294
|
+
string: !str
|
295
|
+
str: ! '[{"beta":false,"attachable":false,"configured":"mysql2://sbmpdev:sbmpdev2244@dev.c2wvnyihe8jq.us-east-1.rds.amazonaws.com/sbmp","url":"http://devcenter.heroku.com/articles/amazon_rds","state":"public","name":"amazon_rds","description":"Amazon
|
296
|
+
RDS","price":{"cents":0,"unit":"month"}},{"beta":false,"attachable":false,"configured":true,"url":null,"state":"public","name":"redistogo:medium","description":"Redis
|
297
|
+
To Go Medium","price":{"cents":11000,"unit":"month"}},{"beta":false,"attachable":false,"configured":true,"url":null,"state":"public","name":"sendgrid:starter","description":"SendGrid
|
298
|
+
Starter","price":{"cents":0,"unit":"month"}},{"beta":false,"attachable":false,"configured":true,"url":null,"state":"public","name":"shared-database:5mb","description":"Shared
|
299
|
+
Database 5MB","price":{"cents":0,"unit":"month"}}]'
|
300
|
+
net_http_res: &79913860 !ruby/object:Net::HTTPOK
|
301
|
+
http_version: '1.0'
|
302
|
+
code: '200'
|
303
|
+
message: OK
|
304
|
+
header:
|
305
|
+
server:
|
306
|
+
- nginx
|
307
|
+
date:
|
308
|
+
- Mon, 07 May 2012 19:52:49 GMT
|
309
|
+
content-type:
|
310
|
+
- application/json; charset=utf-8
|
311
|
+
connection:
|
312
|
+
- keep-alive
|
313
|
+
status:
|
314
|
+
- 200 OK
|
315
|
+
etag:
|
316
|
+
- ! '"3af6412d378895e01d969c520cc169c5"'
|
317
|
+
x-runtime:
|
318
|
+
- '54'
|
319
|
+
content-length:
|
320
|
+
- '818'
|
321
|
+
cache-control:
|
322
|
+
- private, max-age=0, must-revalidate
|
323
|
+
strict-transport-security:
|
324
|
+
- max-age=500
|
325
|
+
body: !str
|
326
|
+
str: ! '[{"beta":false,"attachable":false,"configured":"mysql2://sbmpdev:sbmpdev2244@dev.c2wvnyihe8jq.us-east-1.rds.amazonaws.com/sbmp","url":"http://devcenter.heroku.com/articles/amazon_rds","state":"public","name":"amazon_rds","description":"Amazon
|
327
|
+
RDS","price":{"cents":0,"unit":"month"}},{"beta":false,"attachable":false,"configured":true,"url":null,"state":"public","name":"redistogo:medium","description":"Redis
|
328
|
+
To Go Medium","price":{"cents":11000,"unit":"month"}},{"beta":false,"attachable":false,"configured":true,"url":null,"state":"public","name":"sendgrid:starter","description":"SendGrid
|
329
|
+
Starter","price":{"cents":0,"unit":"month"}},{"beta":false,"attachable":false,"configured":true,"url":null,"state":"public","name":"shared-database:5mb","description":"Shared
|
330
|
+
Database 5MB","price":{"cents":0,"unit":"month"}}]'
|
331
|
+
net_http_res: *79913860
|
332
|
+
args: &79890530
|
333
|
+
:verify_ssl: 1
|
334
|
+
:ssl_ca_file: /home/judson/ruby/bundle-paths/rails3/lib/ruby/1.9.1/gems/heroku-2.25.0/data/cacert.pem
|
335
|
+
:user: ''
|
336
|
+
:password: FakeApiKey
|
337
|
+
:method: :get
|
338
|
+
:url: https://api.heroku.com/apps/sbmp/addons
|
339
|
+
:headers:
|
340
|
+
X-Heroku-API-Version: '2'
|
341
|
+
User-Agent: heroku-gem/2.25.0
|
342
|
+
X-Ruby-Version: 1.9.3
|
343
|
+
X-Ruby-Platform: i686-linux
|
344
|
+
:accept: application/json
|
345
|
+
code: 200
|
346
|
+
headers: &79927450
|
347
|
+
:server: nginx
|
348
|
+
:date: Mon, 07 May 2012 19:52:49 GMT
|
349
|
+
:content_type: application/json; charset=utf-8
|
350
|
+
:connection: keep-alive
|
351
|
+
:status: 200 OK
|
352
|
+
:etag: ! '"3af6412d378895e01d969c520cc169c5"'
|
353
|
+
:x_runtime: '54'
|
354
|
+
:content_length: '818'
|
355
|
+
:cache_control: private, max-age=0, must-revalidate
|
356
|
+
:strict_transport_security: max-age=500
|
357
|
+
read: true
|
358
|
+
__read_body_previously_called: true
|
359
|
+
args: *79890530
|
360
|
+
code: 200
|
361
|
+
headers: *79927450
|
171
362
|
http_version: '1.1'
|
172
|
-
recorded_at:
|
363
|
+
recorded_at: Mon, 07 May 2012 19:50:42 GMT
|
173
364
|
- request:
|
174
365
|
method: get
|
175
366
|
uri: https://:FakeApiKey@api.heroku.com/apps/sbmp/ps
|
@@ -202,7 +393,7 @@ http_interactions:
|
|
202
393
|
bmdpbng=
|
203
394
|
!binary "ZGF0ZQ==":
|
204
395
|
- !binary |-
|
205
|
-
|
396
|
+
TW9uLCAwNyBNYXkgMjAxMiAxOTo1Mjo1MCBHTVQ=
|
206
397
|
!binary "Y29udGVudC10eXBl":
|
207
398
|
- !binary |-
|
208
399
|
YXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOA==
|
@@ -217,10 +408,10 @@ http_interactions:
|
|
217
408
|
MjAwIE9L
|
218
409
|
!binary "ZXRhZw==":
|
219
410
|
- !binary |-
|
220
|
-
|
411
|
+
IjE2YWY5NTFmMjk3ZTYwMzBiMTUwZmZlNDM3M2UwY2VjIg==
|
221
412
|
!binary "eC1ydW50aW1l":
|
222
413
|
- !binary |-
|
223
|
-
|
414
|
+
OTY=
|
224
415
|
!binary "Y2FjaGUtY29udHJvbA==":
|
225
416
|
- !binary |-
|
226
417
|
cHJpdmF0ZSwgbWF4LWFnZT0wLCBtdXN0LXJldmFsaWRhdGU=
|
@@ -233,17 +424,18 @@ http_interactions:
|
|
233
424
|
body:
|
234
425
|
encoding: ASCII-8BIT
|
235
426
|
string: !binary |-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
427
|
+
H4sIAAAAAAAAA7yUy07DMBBFf8WyWKbUjzpx/BNUiB1CkZtMaNTECbZTKIh/
|
428
|
+
x2YBq0L6UOTV3LHH9tHcefzArh2fscKirmVJZKEBcpxgPQyF0R2EjNt0Q1DG
|
429
|
+
oalCtOI5yYiQQSn7rtMmipvRVC0geIMSWd20Djmwe7DIbxuDFgO6Wd/dP8Sy
|
430
|
+
pW96E06MseRg+xKcC+ErbG5pUCyYCt73/eiK0bZYmbFtEwytHhyEiySlqyzB
|
431
|
+
/jDEh61drOi9LrcxWevWQSwK3h8K57WH74tQ3VvE2DZs/hVD4K02ronvgarQ
|
432
|
+
PsiMULYkYklSRFeKEcUYWoTfEvyZnA5qxUgqJLk+KPY/qEzmgp0Hip4MSqRK
|
433
|
+
ZJeAEjKs7Cgo11Swa17QokRU/sWmtzuwU/ookykl8+ARijDF84vxHDfciXgm
|
434
|
+
dI8klNK5bMYzxeUFeHJJpUzT69uMTwEl8nS2eZQrzs8HlYqcCJ5dzWZT8IQJ
|
435
|
+
OFsfkeC0nz56+gIAAP//AwBcT1uH2QYAAA==
|
244
436
|
http_version: !binary |-
|
245
437
|
MS4x
|
246
|
-
recorded_at:
|
438
|
+
recorded_at: Mon, 07 May 2012 19:50:42 GMT
|
247
439
|
- request:
|
248
440
|
method: get
|
249
441
|
uri: https://:FakeApiKey@api.heroku.com/apps/sbmp/ps
|
@@ -276,7 +468,7 @@ http_interactions:
|
|
276
468
|
bmdpbng=
|
277
469
|
!binary "ZGF0ZQ==":
|
278
470
|
- !binary |-
|
279
|
-
|
471
|
+
TW9uLCAwNyBNYXkgMjAxMiAxOTo1Mzo0NCBHTVQ=
|
280
472
|
!binary "Y29udGVudC10eXBl":
|
281
473
|
- !binary |-
|
282
474
|
YXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOA==
|
@@ -291,10 +483,10 @@ http_interactions:
|
|
291
483
|
MjAwIE9L
|
292
484
|
!binary "ZXRhZw==":
|
293
485
|
- !binary |-
|
294
|
-
|
486
|
+
IjI4MTBmZDg5NWFkODQyMTk5YTBkM2FjMDE5ODY2ZDlkIg==
|
295
487
|
!binary "eC1ydW50aW1l":
|
296
488
|
- !binary |-
|
297
|
-
|
489
|
+
MTAy
|
298
490
|
!binary "Y2FjaGUtY29udHJvbA==":
|
299
491
|
- !binary |-
|
300
492
|
cHJpdmF0ZSwgbWF4LWFnZT0wLCBtdXN0LXJldmFsaWRhdGU=
|
@@ -307,17 +499,18 @@ http_interactions:
|
|
307
499
|
body:
|
308
500
|
encoding: ASCII-8BIT
|
309
501
|
string: !binary |-
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
+
|
502
|
+
H4sIAAAAAAAAA7yUy07DMBBFf8WyWKZ07NSO45+gQuwQitxkQqPmhe0UCuLf
|
503
|
+
cVjAqpA+FHk118kd52SuHz+oq4dnqqkoS5WDygxiSiNq+j5rTYNhx22aPihD
|
504
|
+
XxWhWsUpJCBUUPKuaUw7ipuhLWok+IY5saaqHXFo92iJ31YtWfTkZn13/zDa
|
505
|
+
5r7q2vDGMFr2tsvRuVC+4uaWBcViW+D7vhtcNtia6nao64hibXqHoZFiHFhE
|
506
|
+
/aEfD7Z2o6P3Jt+Om6WpHY6m6P0hc954/G5Eys4Szrfh4V8xFN6a1lXjebDI
|
507
|
+
jA9yMOdLEEuQhK00B805WYSvBfoZnQ5qxUEKBdcHxf8HlaQAyXmg2MmghNQi
|
508
|
+
uQSUUGElR0G5qsBd9UIWOWHqLzad3aGdMkeJknI1Dx6hges4vRjP8cCdiGfC
|
509
|
+
9ChgUs4VszjRsboAT6qYCr/z+jGLp4CSAma7j1Idx+eDkiIFESdXi9kUPJwx
|
510
|
+
MRceCEn7maOnLwAAAP//AwCjlgWN2QYAAA==
|
318
511
|
http_version: !binary |-
|
319
512
|
MS4x
|
320
|
-
recorded_at:
|
513
|
+
recorded_at: Mon, 07 May 2012 19:51:38 GMT
|
321
514
|
- request:
|
322
515
|
method: get
|
323
516
|
uri: https://:FakeApiKey@api.heroku.com/apps/sbmp/ps
|
@@ -350,7 +543,7 @@ http_interactions:
|
|
350
543
|
bmdpbng=
|
351
544
|
!binary "ZGF0ZQ==":
|
352
545
|
- !binary |-
|
353
|
-
|
546
|
+
TW9uLCAwNyBNYXkgMjAxMiAxOTo1Mzo0NSBHTVQ=
|
354
547
|
!binary "Y29udGVudC10eXBl":
|
355
548
|
- !binary |-
|
356
549
|
YXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOA==
|
@@ -365,10 +558,10 @@ http_interactions:
|
|
365
558
|
MjAwIE9L
|
366
559
|
!binary "ZXRhZw==":
|
367
560
|
- !binary |-
|
368
|
-
|
561
|
+
ImQ0MWNmNzhkNzFjZjdmZmI5NjZhOTcyZGQwMDM5NWY3Ig==
|
369
562
|
!binary "eC1ydW50aW1l":
|
370
563
|
- !binary |-
|
371
|
-
|
564
|
+
MTAy
|
372
565
|
!binary "Y2FjaGUtY29udHJvbA==":
|
373
566
|
- !binary |-
|
374
567
|
cHJpdmF0ZSwgbWF4LWFnZT0wLCBtdXN0LXJldmFsaWRhdGU=
|
@@ -381,15 +574,91 @@ http_interactions:
|
|
381
574
|
body:
|
382
575
|
encoding: ASCII-8BIT
|
383
576
|
string: !binary |-
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
577
|
+
H4sIAAAAAAAAA7yU207EIBCGX4UQL7vuQBdKeQk3xjtjGradus32JNDV1fju
|
578
|
+
Ui/0arV7SMPV/MAMfMzP4wd19fBMNRVlqXJQmUFMaURN32etaTDMuE3TB2Xo
|
579
|
+
qyJEqziFBIQKSt41jWlHcTO0RY0E3zAn1lS1Iw7tHi3x26oli57crO/uH8a0
|
580
|
+
ua+6NuwYxpS97XJ0LoSvuLllQbHYFvi+7waXDbamuh3qOqJYm95hKKQYBx5R
|
581
|
+
f+jHg63dmNF7k2/HydLUDsek6P0hc954/C5Eys4Szrdh8a8YAm9N66rxPFhk
|
582
|
+
xgeZA+NLEEuQhK00B805WYTbAv2MTge14iCFguuD4v+DSlIAdR4odjIoIbVI
|
583
|
+
LgElVBjJUVCuKnBXvZBFTpj6i01nd2in9FGipBTz4BEauI7Ti/EcN9yJeCZ0
|
584
|
+
jwImk7lsFic6VhfgSRVT4Tmvb7N4Cigp2Gz/Uarj+HxQUqQg4uRqNpuChzMm
|
585
|
+
58IDwWk/ffT0BQAA//8DALTDAA/ZBgAA
|
392
586
|
http_version: !binary |-
|
393
587
|
MS4x
|
394
|
-
recorded_at:
|
588
|
+
recorded_at: Mon, 07 May 2012 19:51:39 GMT
|
589
|
+
- request:
|
590
|
+
method: get
|
591
|
+
uri: https://:FakeApiKey@api.heroku.com/apps/sbmp/ps
|
592
|
+
body:
|
593
|
+
encoding: US-ASCII
|
594
|
+
string: ''
|
595
|
+
headers:
|
596
|
+
accept:
|
597
|
+
- application/json
|
598
|
+
accept-encoding:
|
599
|
+
- gzip, deflate
|
600
|
+
x-heroku-api-version:
|
601
|
+
- '2'
|
602
|
+
user-agent:
|
603
|
+
- heroku-gem/2.25.0
|
604
|
+
x-ruby-version:
|
605
|
+
- 1.9.3
|
606
|
+
x-ruby-platform:
|
607
|
+
- i686-linux
|
608
|
+
authorization:
|
609
|
+
- Basic OjYzMWJiYjJhYWI1NjhkOTNmMTk3Mzc1MDY5NjM0N2Y3ZjlmZWE4ZjY=
|
610
|
+
response:
|
611
|
+
status:
|
612
|
+
code: 200
|
613
|
+
message: !binary |-
|
614
|
+
T0s=
|
615
|
+
headers:
|
616
|
+
!binary "c2VydmVy":
|
617
|
+
- !binary |-
|
618
|
+
bmdpbng=
|
619
|
+
!binary "ZGF0ZQ==":
|
620
|
+
- !binary |-
|
621
|
+
TW9uLCAwNyBNYXkgMjAxMiAxOTo1Mzo0NiBHTVQ=
|
622
|
+
!binary "Y29udGVudC10eXBl":
|
623
|
+
- !binary |-
|
624
|
+
YXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOA==
|
625
|
+
!binary "dHJhbnNmZXItZW5jb2Rpbmc=":
|
626
|
+
- !binary |-
|
627
|
+
Y2h1bmtlZA==
|
628
|
+
!binary "Y29ubmVjdGlvbg==":
|
629
|
+
- !binary |-
|
630
|
+
a2VlcC1hbGl2ZQ==
|
631
|
+
!binary "c3RhdHVz":
|
632
|
+
- !binary |-
|
633
|
+
MjAwIE9L
|
634
|
+
!binary "ZXRhZw==":
|
635
|
+
- !binary |-
|
636
|
+
IjU3ODQzZDZhNWJkMTk1NjZjNmU4YWYzNTFkZjI0NTNmIg==
|
637
|
+
!binary "eC1ydW50aW1l":
|
638
|
+
- !binary |-
|
639
|
+
OTc=
|
640
|
+
!binary "Y2FjaGUtY29udHJvbA==":
|
641
|
+
- !binary |-
|
642
|
+
cHJpdmF0ZSwgbWF4LWFnZT0wLCBtdXN0LXJldmFsaWRhdGU=
|
643
|
+
!binary "c3RyaWN0LXRyYW5zcG9ydC1zZWN1cml0eQ==":
|
644
|
+
- !binary |-
|
645
|
+
bWF4LWFnZT01MDA=
|
646
|
+
!binary "Y29udGVudC1lbmNvZGluZw==":
|
647
|
+
- !binary |-
|
648
|
+
Z3ppcA==
|
649
|
+
body:
|
650
|
+
encoding: ASCII-8BIT
|
651
|
+
string: !binary |-
|
652
|
+
H4sIAAAAAAAAA7yU204DIRCGX4UQL7d2gMKyvISN8c6YDd2d2k33JLDVanx3
|
653
|
+
WS/0qro9pOFqfmAGPubn8YP6enimhsr1Whegc4uY0YTavs9b22Cc8aumj8rQ
|
654
|
+
V2WMFiKDFKSOStE1jW1HcTW0ZY0E37Agzla1Jx7dDh0Jm6ols57cLO/uH8a0
|
655
|
+
Rai6Nu4YxpS96wr0PoavuLplUXHYlvi+6wafD66mph3qOqFY295jLKQZB5HQ
|
656
|
+
sO/Hgy39mDEEW2zGybWtPY5JMYR97oMN+F2IrDtHON/Exb9iDIKzra/G82CZ
|
657
|
+
2xBlDozPQc5BEbYwHAznZBZvC/QzOR7UgoOSGi4Piv8PKs0A9Gmg2NGgpDIy
|
658
|
+
PQeU1HGkB0H5qsRt9UJmBWH6Lzad26Kb0kepVkpdB480wI3IzsZz2HBH4pnQ
|
659
|
+
PRqYOrF7jreZSI3QZ+DJNNPxOS9vMzEFlJL8av9RZoQ4HZSSGUiRXsxmU/Bw
|
660
|
+
xtJr4YHotJ8+evoCAAD//wMAXgb+4tkGAAA=
|
661
|
+
http_version: !binary |-
|
662
|
+
MS4x
|
663
|
+
recorded_at: Mon, 07 May 2012 19:51:39 GMT
|
395
664
|
recorded_with: VCR 2.1.1
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: our-eel-hacks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-07 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: corundum
|
16
|
-
requirement: &
|
16
|
+
requirement: &79604900 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,10 +21,10 @@ dependencies:
|
|
21
21
|
version: 0.0.1
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *79604900
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: heroku
|
27
|
-
requirement: &
|
27
|
+
requirement: &79747270 !ruby/object:Gem::Requirement
|
28
28
|
none: false
|
29
29
|
requirements:
|
30
30
|
- - ! '>'
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
- 0
|
35
35
|
type: :runtime
|
36
36
|
prerelease: false
|
37
|
-
version_requirements: *
|
37
|
+
version_requirements: *79747270
|
38
38
|
description: ! " Middleware for Rack and Sidekiq to scale heroku.\n\n A heroku process
|
39
39
|
knows everything it needs in order to scale itself. A little configuration, and
|
40
40
|
you're set.\n"
|
@@ -47,6 +47,7 @@ files:
|
|
47
47
|
- lib/our-eel-hacks/autoscaler.rb
|
48
48
|
- lib/our-eel-hacks/rack.rb
|
49
49
|
- lib/our-eel-hacks/defer/event-machine.rb
|
50
|
+
- lib/our-eel-hacks/defer/celluloid.rb
|
50
51
|
- lib/our-eel-hacks/sidekiq.rb
|
51
52
|
- lib/our-eel-hacks/middleware.rb
|
52
53
|
- spec/autoscaler.rb
|
@@ -65,7 +66,7 @@ rdoc_options:
|
|
65
66
|
- --main
|
66
67
|
- doc/README
|
67
68
|
- --title
|
68
|
-
- our-eel-hacks-0.0.
|
69
|
+
- our-eel-hacks-0.0.2 RDoc
|
69
70
|
require_paths:
|
70
71
|
- lib/
|
71
72
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -76,7 +77,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
76
77
|
version: '0'
|
77
78
|
segments:
|
78
79
|
- 0
|
79
|
-
hash:
|
80
|
+
hash: -1065536863
|
80
81
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
82
|
none: false
|
82
83
|
requirements:
|