-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathheroku_autoscaler_worker.rb
45 lines (39 loc) · 1.94 KB
/
heroku_autoscaler_worker.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
require 'sidekiq/api'
class HerokuAutoscalerWorker
include Sidekiq::Worker
sidekiq_options retry: false, queue: 'critical'
MINIMUM_NUMBER_OF_DYNOS = ENV['AUTOSCALER_MIN_DYNOS']&.to_i || 1
MAXIMUM_NUMBER_OF_DYNOS = ENV['AUTOSCALER_MAX_DYNOS']&.to_i || 5
SCALEUP_DELAY = 2.minutes.to_i
SCALE_DOWN_THRESHOLD = ENV['AUTOSCALER_SCALE_DOWN_THRESHOLD']&.to_i || 0
def perform
return unless ENV['HEROKU_OAUTH_TOKEN'] && ENV['HEROKU_APP_NAME']
heroku = PlatformAPI.connect_oauth(ENV['HEROKU_OAUTH_TOKEN'])
info = heroku.formation.info(ENV['HEROKU_APP_NAME'], 'worker')
return unless info
number_of_dynos = info['quantity']
queue_latency = Sidekiq::Queue.new.latency
jobs_in_queue = Sidekiq::Queue.new.size
puts "HerokuAutoscaler: #{number_of_dynos} dynos, queue latency #{queue_latency}, #{jobs_in_queue} jobs"
if jobs_in_queue <= SCALE_DOWN_THRESHOLD
last_unempty_timestamp = RedisStore.last_unempty_workqueue_timestamp
if last_unempty_timestamp && (Time.current - Time.zone.at(last_unempty_timestamp) >= 10.minutes) && number_of_dynos > MINIMUM_NUMBER_OF_DYNOS
new_quantity = number_of_dynos - 1
heroku.formation.update(ENV['HEROKU_APP_NAME'], 'worker', {"quantity" => new_quantity})
puts "HerokuAutoscaler: Scaled down to #{new_quantity} dynos"
# Reset counter
RedisStore.update_last_unempty_workqueue_timestamp
end
else
if queue_latency > 15
if number_of_dynos < MAXIMUM_NUMBER_OF_DYNOS && (!RedisStore.last_scaleup_timestamp || RedisStore.last_scaleup_timestamp < Time.current.to_i - SCALEUP_DELAY)
new_quantity = number_of_dynos + 1
heroku.formation.update(ENV['HEROKU_APP_NAME'], 'worker', {"quantity" => new_quantity})
puts "HerokuAutoscaler: Scaled up to #{new_quantity} dynos"
RedisStore.update_last_scaleup_timestamp
end
end
RedisStore.update_last_unempty_workqueue_timestamp
end
end
end