rails_autoscale_agent 0.8.1 → 0.9.0.beta.4
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.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/rails_autoscale_agent/autoscale_api.rb +12 -3
- data/lib/rails_autoscale_agent/config.rb +7 -3
- data/lib/rails_autoscale_agent/logger.rb +1 -1
- data/lib/rails_autoscale_agent/measurement.rb +5 -3
- data/lib/rails_autoscale_agent/registration.rb +3 -1
- data/lib/rails_autoscale_agent/report.rb +6 -8
- data/lib/rails_autoscale_agent/reporter.rb +8 -8
- data/lib/rails_autoscale_agent/request.rb +16 -11
- data/lib/rails_autoscale_agent/store.rb +2 -2
- data/lib/rails_autoscale_agent/version.rb +1 -1
- data/lib/rails_autoscale_agent/worker_adapters/delayed_job.rb +49 -41
- data/lib/rails_autoscale_agent/worker_adapters/que.rb +36 -31
- data/lib/rails_autoscale_agent/worker_adapters/resque.rb +32 -0
- data/lib/rails_autoscale_agent/worker_adapters/sidekiq.rb +22 -18
- metadata +6 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70253908c027308ec4d19c9b41eeed033759e6669eace3301925a65a64748447
|
4
|
+
data.tar.gz: 199e75a27f4708920b47964cbc75e2b705ddce88508c35fd614512bb9bfcfd5e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: af5043f8402b40c15b5efe0be205e0e4c6107b8d05ea7126ccfa445c28679567c7e0f15e2a01eb2b7e107c95d3802543c48f428c31f70be823953173cd903ae1
|
7
|
+
data.tar.gz: 1fcfa15d0c76a8f1abf38653890d6b2157fd2e4edfc2ac072eb198897ab09029ea3f1c83ee11620e13a1a07a379695d7913c5bed89ce51e1907451367e61b1df
|
data/README.md
CHANGED
@@ -74,7 +74,7 @@ Reach out to help@railsautoscale.com if you run into any other problems.
|
|
74
74
|
|
75
75
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
76
76
|
|
77
|
-
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
77
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, commit it, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
78
78
|
|
79
79
|
## Contributing
|
80
80
|
|
@@ -11,8 +11,8 @@ module RailsAutoscaleAgent
|
|
11
11
|
|
12
12
|
SUCCESS = 'success'
|
13
13
|
|
14
|
-
def initialize(
|
15
|
-
@
|
14
|
+
def initialize(config)
|
15
|
+
@config = config
|
16
16
|
end
|
17
17
|
|
18
18
|
def report_metrics!(report_params, timings_csv)
|
@@ -24,6 +24,10 @@ module RailsAutoscaleAgent
|
|
24
24
|
post_json '/registrations', registration: registration_params
|
25
25
|
end
|
26
26
|
|
27
|
+
def report_exception!(ex)
|
28
|
+
post_json '/exceptions', message: ex.inspect, backtrace: ex.backtrace.join("\n")
|
29
|
+
end
|
30
|
+
|
27
31
|
private
|
28
32
|
|
29
33
|
def post_json(path, data)
|
@@ -37,9 +41,14 @@ module RailsAutoscaleAgent
|
|
37
41
|
end
|
38
42
|
|
39
43
|
def post_raw(options)
|
40
|
-
uri = URI.parse("#{@
|
44
|
+
uri = URI.parse("#{@config.api_base_url}#{options.fetch(:path)}")
|
41
45
|
ssl = uri.scheme == 'https'
|
42
46
|
|
47
|
+
if @config.dev_mode
|
48
|
+
logger.debug "[DEV_MODE] Skipping request to #{uri}"
|
49
|
+
return SuccessResponse.new('{}')
|
50
|
+
end
|
51
|
+
|
43
52
|
response = Net::HTTP.start(uri.host, uri.port, use_ssl: ssl) do |http|
|
44
53
|
request = Net::HTTP::Post.new(uri.request_uri, options[:headers] || {})
|
45
54
|
request.body = options.fetch(:body)
|
@@ -7,26 +7,29 @@ module RailsAutoscaleAgent
|
|
7
7
|
include Singleton
|
8
8
|
|
9
9
|
attr_accessor :report_interval, :logger, :api_base_url, :max_request_size,
|
10
|
-
:dyno, :pid, :addon_name, :worker_adapters
|
10
|
+
:dyno, :pid, :addon_name, :worker_adapters, :dev_mode
|
11
11
|
|
12
12
|
def initialize
|
13
13
|
require 'rails_autoscale_agent/worker_adapters/sidekiq'
|
14
14
|
require 'rails_autoscale_agent/worker_adapters/delayed_job'
|
15
15
|
require 'rails_autoscale_agent/worker_adapters/que'
|
16
|
+
require 'rails_autoscale_agent/worker_adapters/resque'
|
16
17
|
@worker_adapters = [
|
17
18
|
WorkerAdapters::Sidekiq.instance,
|
18
19
|
WorkerAdapters::DelayedJob.instance,
|
19
20
|
WorkerAdapters::Que.instance,
|
21
|
+
WorkerAdapters::Resque.instance,
|
20
22
|
]
|
21
23
|
|
22
24
|
# Allow the add-on name to be configured - needed for testing
|
23
25
|
@addon_name = ENV['RAILS_AUTOSCALE_ADDON'] || 'RAILS_AUTOSCALE'
|
24
26
|
@api_base_url = ENV["#{@addon_name}_URL"]
|
27
|
+
@dev_mode = ENV['RAILS_AUTOSCALE_DEV'] == 'true'
|
25
28
|
@pid = Process.pid
|
26
29
|
@max_request_size = 100_000 # ignore request payloads over 100k since they skew the queue times
|
27
|
-
@report_interval =
|
30
|
+
@report_interval = 10 # this default will be overwritten during Reporter#register!
|
28
31
|
@logger ||= defined?(Rails) ? Rails.logger : ::Logger.new(STDOUT)
|
29
|
-
@dyno = ENV['DYNO']
|
32
|
+
@dyno = @dev_mode ? 'dev.1' : ENV['DYNO']
|
30
33
|
end
|
31
34
|
|
32
35
|
def to_s
|
@@ -37,5 +40,6 @@ module RailsAutoscaleAgent
|
|
37
40
|
@max_request_size
|
38
41
|
end
|
39
42
|
|
43
|
+
alias_method :dev_mode?, :dev_mode
|
40
44
|
end
|
41
45
|
end
|
@@ -24,7 +24,7 @@ module RailsAutoscaleAgent
|
|
24
24
|
# to DEBUG level in production).
|
25
25
|
# This uses a separate logger so that RAILS_AUTOSCALE_DEBUG
|
26
26
|
# shows debug logs regardless of Rails log level.
|
27
|
-
debug_logger.debug tag(msg) if ENV['RAILS_AUTOSCALE_DEBUG'] == 'true'
|
27
|
+
debug_logger.debug tag(msg) if ENV['RAILS_AUTOSCALE_DEBUG'] == 'true' || Config.instance.dev_mode?
|
28
28
|
end
|
29
29
|
|
30
30
|
private
|
@@ -1,9 +1,11 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module RailsAutoscaleAgent
|
4
|
-
class Measurement < Struct.new(:time, :value, :queue_name)
|
5
|
-
|
6
|
-
|
4
|
+
class Measurement < Struct.new(:time, :value, :queue_name, :metric)
|
5
|
+
# No queue_name is assumed to be a web request measurement
|
6
|
+
# Metrics: qt = queue time (default), qd = queue depth (needed for Resque support)
|
7
|
+
def initialize(time, value, queue_name = nil, metric = nil)
|
8
|
+
super time.utc, value.to_i, queue_name, metric
|
7
9
|
end
|
8
10
|
end
|
9
11
|
end
|
@@ -3,7 +3,7 @@
|
|
3
3
|
require 'rails_autoscale_agent/version'
|
4
4
|
|
5
5
|
module RailsAutoscaleAgent
|
6
|
-
class Registration < Struct.new(:config)
|
6
|
+
class Registration < Struct.new(:config, :worker_adapters)
|
7
7
|
|
8
8
|
def to_params
|
9
9
|
{
|
@@ -12,6 +12,8 @@ module RailsAutoscaleAgent
|
|
12
12
|
ruby_version: RUBY_VERSION,
|
13
13
|
rails_version: defined?(Rails) && Rails.version,
|
14
14
|
gem_version: VERSION,
|
15
|
+
# example: { worker_adapters: 'Sidekiq,Que' }
|
16
|
+
worker_adapters: worker_adapters.map { |o| o.class.name.split('::').last }.join(','),
|
15
17
|
}
|
16
18
|
end
|
17
19
|
end
|
@@ -19,14 +19,12 @@ module RailsAutoscaleAgent
|
|
19
19
|
def to_csv
|
20
20
|
String.new.tap do |result|
|
21
21
|
@measurements.each do |measurement|
|
22
|
-
result <<
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
result << measurement.queue_name
|
29
|
-
end
|
22
|
+
result << [
|
23
|
+
measurement.time.to_i,
|
24
|
+
measurement.value,
|
25
|
+
measurement.queue_name,
|
26
|
+
measurement.metric,
|
27
|
+
].join(',')
|
30
28
|
|
31
29
|
result << "\n"
|
32
30
|
end
|
@@ -21,14 +21,14 @@ module RailsAutoscaleAgent
|
|
21
21
|
@started = true
|
22
22
|
@worker_adapters = config.worker_adapters.select(&:enabled?)
|
23
23
|
|
24
|
-
if !config.api_base_url
|
24
|
+
if !config.api_base_url && !config.dev_mode?
|
25
25
|
logger.info "Reporter not started: #{config.addon_name}_URL is not set"
|
26
26
|
return
|
27
27
|
end
|
28
28
|
|
29
29
|
Thread.new do
|
30
30
|
loop do
|
31
|
-
register!(config) unless @registered
|
31
|
+
register!(config, @worker_adapters) unless @registered
|
32
32
|
|
33
33
|
# Stagger reporting to spread out reports from many processes
|
34
34
|
multiplier = 1 - (rand / 4) # between 0.75 and 1.0
|
@@ -41,7 +41,7 @@ module RailsAutoscaleAgent
|
|
41
41
|
# Exceptions in threads other than the main thread will fail silently
|
42
42
|
# https://ruby-doc.org/core-2.2.0/Thread.html#class-Thread-label-Exception+handling
|
43
43
|
logger.error "Reporter error: #{ex.inspect}"
|
44
|
-
|
44
|
+
AutoscaleApi.new(config.api_base_url).report_exception!(ex)
|
45
45
|
end
|
46
46
|
end
|
47
47
|
end
|
@@ -58,7 +58,7 @@ module RailsAutoscaleAgent
|
|
58
58
|
logger.info "Reporting #{report.measurements.size} measurements"
|
59
59
|
|
60
60
|
params = report.to_params(config)
|
61
|
-
result = AutoscaleApi.new(config
|
61
|
+
result = AutoscaleApi.new(config).report_metrics!(params, report.to_csv)
|
62
62
|
|
63
63
|
case result
|
64
64
|
when AutoscaleApi::SuccessResponse
|
@@ -71,16 +71,16 @@ module RailsAutoscaleAgent
|
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
-
def register!(config)
|
75
|
-
params = Registration.new(config).to_params
|
76
|
-
result = AutoscaleApi.new(config
|
74
|
+
def register!(config, worker_adapters)
|
75
|
+
params = Registration.new(config, worker_adapters).to_params
|
76
|
+
result = AutoscaleApi.new(config).register_reporter!(params)
|
77
77
|
|
78
78
|
case result
|
79
79
|
when AutoscaleApi::SuccessResponse
|
80
80
|
@registered = true
|
81
81
|
config.report_interval = result.data['report_interval'] if result.data['report_interval']
|
82
82
|
config.max_request_size = result.data['max_request_size'] if result.data['max_request_size']
|
83
|
-
worker_adapters_msg =
|
83
|
+
worker_adapters_msg = worker_adapters.map { |a| a.class.name }.join(', ')
|
84
84
|
logger.info "Reporter starting, will report every #{config.report_interval} seconds or so. Worker adapters: [#{worker_adapters_msg}]"
|
85
85
|
when AutoscaleApi::FailureResponse
|
86
86
|
logger.error "Reporter failed to register: #{result.failure_message}"
|
@@ -4,17 +4,17 @@ module RailsAutoscaleAgent
|
|
4
4
|
class Request
|
5
5
|
include Logger
|
6
6
|
|
7
|
-
attr_reader :id, :entered_queue_at, :path, :method, :size
|
8
|
-
|
9
7
|
def initialize(env, config)
|
10
8
|
@config = config
|
11
9
|
@id = env['HTTP_X_REQUEST_ID']
|
12
|
-
@path = env['PATH_INFO']
|
13
|
-
@method = env['REQUEST_METHOD'].downcase
|
14
10
|
@size = env['rack.input'].respond_to?(:size) ? env['rack.input'].size : 0
|
11
|
+
@request_body_wait = env['puma.request_body_wait'].to_i
|
15
12
|
|
16
|
-
if unix_millis = env['HTTP_X_REQUEST_START']
|
17
|
-
|
13
|
+
@entered_queue_at = if unix_millis = env['HTTP_X_REQUEST_START']
|
14
|
+
Time.at(unix_millis.to_f / 1000)
|
15
|
+
elsif config.dev_mode?
|
16
|
+
# In dev mode, fake a queue time of 0-1000ms
|
17
|
+
Time.now - rand + @request_body_wait
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -23,12 +23,17 @@ module RailsAutoscaleAgent
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def queue_time
|
26
|
-
if entered_queue_at
|
27
|
-
queue_time = ((Time.now - entered_queue_at) * 1000).to_i
|
28
|
-
|
29
|
-
|
26
|
+
if @entered_queue_at
|
27
|
+
queue_time = ((Time.now - @entered_queue_at) * 1000).to_i
|
28
|
+
|
29
|
+
# Subtract the time Puma spent waiting on the request body. It's irrelevant to capacity-related queue time.
|
30
|
+
# Without this, slow clients and large request payloads will skew queue time.
|
31
|
+
queue_time -= @request_body_wait
|
32
|
+
|
33
|
+
logger.debug "Request queue_time=#{queue_time}ms body_wait=#{@request_body_wait}ms request_id=#{@id} size=#{@size}"
|
30
34
|
|
31
|
-
|
35
|
+
# Safeguard against negative queue times (should not happen in practice)
|
36
|
+
queue_time > 0 ? queue_time : 0
|
32
37
|
end
|
33
38
|
end
|
34
39
|
end
|
@@ -15,8 +15,8 @@ module RailsAutoscaleAgent
|
|
15
15
|
@measurements = []
|
16
16
|
end
|
17
17
|
|
18
|
-
def push(value, time = Time.now, queue_name = nil)
|
19
|
-
@measurements << Measurement.new(time, value, queue_name)
|
18
|
+
def push(value, time = Time.now, queue_name = nil, metric = nil)
|
19
|
+
@measurements << Measurement.new(time, value, queue_name, metric)
|
20
20
|
end
|
21
21
|
|
22
22
|
def pop_report
|
@@ -2,61 +2,69 @@
|
|
2
2
|
|
3
3
|
require 'rails_autoscale_agent/logger'
|
4
4
|
|
5
|
-
module
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
module RailsAutoscaleAgent
|
6
|
+
module WorkerAdapters
|
7
|
+
class DelayedJob
|
8
|
+
include RailsAutoscaleAgent::Logger
|
9
|
+
include Singleton
|
9
10
|
|
10
|
-
|
11
|
-
attr_accessor :queues
|
12
|
-
end
|
11
|
+
UNNAMED_QUEUE = '[unnamed]'
|
13
12
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
self.class.queues = Set.new
|
13
|
+
class << self
|
14
|
+
attr_accessor :queues
|
15
|
+
end
|
18
16
|
|
19
|
-
|
20
|
-
|
17
|
+
def initialize
|
18
|
+
# Track the known queues so we can continue reporting on queues that don't
|
19
|
+
# currently have enqueued jobs.
|
20
|
+
self.class.queues = Set.new
|
21
21
|
|
22
|
-
|
23
|
-
|
24
|
-
end
|
22
|
+
install if enabled?
|
23
|
+
end
|
25
24
|
|
26
|
-
|
27
|
-
|
28
|
-
|
25
|
+
def enabled?
|
26
|
+
defined? ::Delayed
|
27
|
+
end
|
29
28
|
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
def collect!(store)
|
30
|
+
log_msg = String.new
|
31
|
+
t = Time.now.utc
|
32
|
+
db_time = t.strftime('%Y-%m-%d %H:%M:%S')
|
33
33
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
store.push latency_ms, t, queue
|
39
|
-
log_msg << "#{queue}=#{latency_ms} "
|
40
|
-
end
|
34
|
+
# Ignore failed jobs (they skew latency measurement due to the original run_at)
|
35
|
+
sql = "SELECT queue, min(run_at) FROM delayed_jobs WHERE run_at < '#{db_time}' AND locked_at IS NULL AND failed_at IS NULL GROUP BY queue"
|
36
|
+
run_at_by_queue = Hash[ActiveRecord::Base.connection.select_rows(sql)]
|
37
|
+
queues = self.class.queues | run_at_by_queue.keys
|
41
38
|
|
42
|
-
|
43
|
-
|
39
|
+
queues.each do |queue|
|
40
|
+
run_at = run_at_by_queue[queue]
|
41
|
+
run_at = Time.parse(run_at) if run_at.is_a?(String)
|
42
|
+
latency_ms = run_at ? ((t - run_at)*1000).ceil : 0
|
43
|
+
|
44
|
+
queue = UNNAMED_QUEUE if queue.nil? || queue.empty?
|
45
|
+
store.push latency_ms, t, queue
|
46
|
+
log_msg << "dj.#{queue}=#{latency_ms} "
|
47
|
+
end
|
44
48
|
|
45
|
-
|
49
|
+
logger.debug log_msg unless log_msg.empty?
|
50
|
+
end
|
46
51
|
|
47
|
-
|
48
|
-
plugin = Class.new(Delayed::Plugin) do
|
49
|
-
require 'delayed_job'
|
52
|
+
private
|
50
53
|
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
54
|
+
def install
|
55
|
+
plugin = Class.new(Delayed::Plugin) do
|
56
|
+
require 'delayed_job'
|
57
|
+
|
58
|
+
callbacks do |lifecycle|
|
59
|
+
lifecycle.before(:enqueue) do |job, &block|
|
60
|
+
queue = job.queue || 'default'
|
61
|
+
WorkerAdapters::DelayedJob.queues.add queue
|
62
|
+
end
|
55
63
|
end
|
56
64
|
end
|
57
|
-
end
|
58
65
|
|
59
|
-
|
66
|
+
Delayed::Worker.plugins << plugin
|
67
|
+
end
|
60
68
|
end
|
61
69
|
end
|
62
70
|
end
|
@@ -3,43 +3,48 @@
|
|
3
3
|
require 'rails_autoscale_agent/logger'
|
4
4
|
require 'time'
|
5
5
|
|
6
|
-
module
|
7
|
-
|
8
|
-
|
9
|
-
|
6
|
+
module RailsAutoscaleAgent
|
7
|
+
module WorkerAdapters
|
8
|
+
class Que
|
9
|
+
include RailsAutoscaleAgent::Logger
|
10
|
+
include Singleton
|
10
11
|
|
11
|
-
|
12
|
+
UNNAMED_QUEUE = '[unnamed]'
|
13
|
+
DEFAULT_QUEUES = ['default']
|
12
14
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
def initialize
|
18
|
-
self.class.queues = DEFAULT_QUEUES
|
19
|
-
end
|
15
|
+
class << self
|
16
|
+
attr_accessor :queues
|
17
|
+
end
|
20
18
|
|
21
|
-
|
22
|
-
|
23
|
-
|
19
|
+
def initialize
|
20
|
+
self.class.queues = DEFAULT_QUEUES
|
21
|
+
end
|
24
22
|
|
25
|
-
|
26
|
-
|
27
|
-
t = Time.now
|
28
|
-
|
29
|
-
# Ignore failed jobs (they skew latency measurement due to the original run_at)
|
30
|
-
sql = 'SELECT queue, min(run_at) FROM que_jobs WHERE error_count = 0 GROUP BY queue'
|
31
|
-
run_at_by_queue = Hash[ActiveRecord::Base.connection.select_rows(sql)]
|
32
|
-
self.class.queues |= run_at_by_queue.keys
|
33
|
-
|
34
|
-
self.class.queues.each do |queue|
|
35
|
-
run_at = run_at_by_queue[queue]
|
36
|
-
run_at = Time.parse(run_at) if run_at.is_a?(String)
|
37
|
-
latency_ms = run_at ? ((t - run_at)*1000).ceil : 0
|
38
|
-
store.push latency_ms, t, queue
|
39
|
-
log_msg << "#{queue}=#{latency_ms} "
|
23
|
+
def enabled?
|
24
|
+
defined? ::Que
|
40
25
|
end
|
41
26
|
|
42
|
-
|
27
|
+
def collect!(store)
|
28
|
+
log_msg = String.new
|
29
|
+
t = Time.now
|
30
|
+
|
31
|
+
# Ignore failed jobs (they skew latency measurement due to the original run_at)
|
32
|
+
sql = 'SELECT queue, min(run_at) FROM que_jobs WHERE error_count = 0 GROUP BY queue'
|
33
|
+
run_at_by_queue = Hash[ActiveRecord::Base.connection.select_rows(sql)]
|
34
|
+
self.class.queues |= run_at_by_queue.keys
|
35
|
+
|
36
|
+
self.class.queues.each do |queue|
|
37
|
+
run_at = run_at_by_queue[queue]
|
38
|
+
run_at = Time.parse(run_at) if run_at.is_a?(String)
|
39
|
+
latency_ms = run_at ? ((t - run_at)*1000).ceil : 0
|
40
|
+
|
41
|
+
queue = UNNAMED_QUEUE if queue.nil? || queue.empty?
|
42
|
+
store.push latency_ms, t, queue
|
43
|
+
log_msg << "que.#{queue}=#{latency_ms} "
|
44
|
+
end
|
45
|
+
|
46
|
+
logger.debug log_msg unless log_msg.empty?
|
47
|
+
end
|
43
48
|
end
|
44
49
|
end
|
45
50
|
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'rails_autoscale_agent/logger'
|
4
|
+
|
5
|
+
module RailsAutoscaleAgent
|
6
|
+
module WorkerAdapters
|
7
|
+
class Resque
|
8
|
+
include RailsAutoscaleAgent::Logger
|
9
|
+
include Singleton
|
10
|
+
|
11
|
+
def enabled?
|
12
|
+
require 'resque'
|
13
|
+
true
|
14
|
+
rescue LoadError
|
15
|
+
false
|
16
|
+
end
|
17
|
+
|
18
|
+
def collect!(store)
|
19
|
+
log_msg = String.new
|
20
|
+
|
21
|
+
::Resque.queues.each do |queue|
|
22
|
+
next if queue.nil? || queue.empty?
|
23
|
+
depth = ::Resque.size(queue)
|
24
|
+
store.push depth, Time.now, queue, :qd
|
25
|
+
log_msg << "resque-qd.#{queue}=#{depth} "
|
26
|
+
end
|
27
|
+
|
28
|
+
logger.debug log_msg
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -2,28 +2,32 @@
|
|
2
2
|
|
3
3
|
require 'rails_autoscale_agent/logger'
|
4
4
|
|
5
|
-
module
|
6
|
-
|
7
|
-
|
8
|
-
|
5
|
+
module RailsAutoscaleAgent
|
6
|
+
module WorkerAdapters
|
7
|
+
class Sidekiq
|
8
|
+
include RailsAutoscaleAgent::Logger
|
9
|
+
include Singleton
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
11
|
+
def enabled?
|
12
|
+
require 'sidekiq/api'
|
13
|
+
true
|
14
|
+
rescue LoadError
|
15
|
+
false
|
16
|
+
end
|
16
17
|
|
17
|
-
|
18
|
-
|
18
|
+
def collect!(store)
|
19
|
+
log_msg = String.new
|
19
20
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
::Sidekiq::Queue.all.each do |queue|
|
22
|
+
latency_ms = (queue.latency * 1000).ceil
|
23
|
+
depth = queue.size
|
24
|
+
store.push latency_ms, Time.now, queue.name, :qt
|
25
|
+
store.push depth, Time.now, queue.name, :qd
|
26
|
+
log_msg << "sidekiq-qt.#{queue.name}=#{latency_ms} sidekiq-qd.#{queue.name}=#{depth} "
|
27
|
+
end
|
25
28
|
|
26
|
-
|
29
|
+
logger.debug log_msg
|
30
|
+
end
|
27
31
|
end
|
28
32
|
end
|
29
33
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_autoscale_agent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0.beta.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adam McCrea
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -198,6 +198,7 @@ files:
|
|
198
198
|
- lib/rails_autoscale_agent/version.rb
|
199
199
|
- lib/rails_autoscale_agent/worker_adapters/delayed_job.rb
|
200
200
|
- lib/rails_autoscale_agent/worker_adapters/que.rb
|
201
|
+
- lib/rails_autoscale_agent/worker_adapters/resque.rb
|
201
202
|
- lib/rails_autoscale_agent/worker_adapters/sidekiq.rb
|
202
203
|
- log/.gitkeep
|
203
204
|
- rails_autoscale_agent.gemspec
|
@@ -216,11 +217,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
216
217
|
version: '0'
|
217
218
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
218
219
|
requirements:
|
219
|
-
- - "
|
220
|
+
- - ">"
|
220
221
|
- !ruby/object:Gem::Version
|
221
|
-
version:
|
222
|
+
version: 1.3.1
|
222
223
|
requirements: []
|
223
|
-
rubygems_version: 3.
|
224
|
+
rubygems_version: 3.1.4
|
224
225
|
signing_key:
|
225
226
|
specification_version: 4
|
226
227
|
summary: This gem works with the Rails Autoscale Heroku add-on to automatically scale
|