-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscaler.rb
57 lines (49 loc) · 1.76 KB
/
scaler.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
46
47
48
49
50
51
52
53
54
55
56
57
require 'bundler/setup'
Bundler.require
require './lib/librato_wrapper'
require './lib/heroku_wrapper'
require './lib/sidekiq_wrapper'
require './lib/new_relic_wrapper'
module Scaler
extend self
def stats_workers
heroku = HerokuWrapper.new('sv-stats', range: 1..12)
sidekiq = SidekiqWrapper.new('stats', queues: %w[stats stats-slow])
historic = sidekiq.historic(5)
n = heroku.ps_n(:worker)
if historic.sum == 0
n -= 1
elsif historic.sum > 2500 && historic[-1] > historic[-2]
n += 1
end
heroku.ps_scale(:worker, n)
end
def my_workers
heroku = HerokuWrapper.new('sv-my', range: 1..4)
sidekiq = SidekiqWrapper.new('stats', queues: %w[my my-high my-loader my-low my-mailer])
heroku.ps_scale(:worker, sidekiq.size > 100 ? heroku.range.max : heroku.range.min)
end
def data_webs
new_relic = NewRelicWrapper.new(1898958) # data.sv.app
heroku = HerokuWrapper.new('sv-data', range: 2..5)
heroku.ps_scale(:web, (new_relic.throughput / 2500.0).ceil)
end
def scout_workers
heroku = HerokuWrapper.new('sv-scout')
sidekiq = SidekiqWrapper.new('scout', queues: %w[scout])
heroku.ps_scale(:worker, sidekiq.size > 0 ? 1 : 0)
end
def www_workers
heroku = HerokuWrapper.new('sv-www')
sidekiq = SidekiqWrapper.new('www', queues: %w[www])
heroku.ps_scale(:worker, sidekiq.size > 0 ? 1 : 0)
end
end
module Clockwork
every(30.seconds, 'Stats workers') { Scaler.stats_workers }
every(15.seconds, 'My workers') { Scaler.my_workers }
every(30.seconds, 'Data webs') { Scaler.data_webs }
every(30.seconds, 'Scout workers') { Scaler.scout_workers }
every(30.seconds, 'Www workers') { Scaler.www_workers }
every(1.minute, 'Librato Metrics') { LibratoWrapper.instance.submit }
end