rails_autoscale_agent 0.8.1 → 0.9.0.beta.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 131a1ca49bb43913967f4ba4b919d0e1072e7209c79a8c120fb497140535d5c4
4
- data.tar.gz: a0c482dc7d1f4cc66375d2e37bdd4f5732cdf2b05095a37b93ef8a5332afff96
3
+ metadata.gz: 70253908c027308ec4d19c9b41eeed033759e6669eace3301925a65a64748447
4
+ data.tar.gz: 199e75a27f4708920b47964cbc75e2b705ddce88508c35fd614512bb9bfcfd5e
5
5
  SHA512:
6
- metadata.gz: 3af632a6c5eb3022dac82655546b483ad183c0698ce8dc04e826dbeb5fae34d2c52deb7dc8b1a504c7c206f8a998953cd80fe5592c39ba5760aa4dd72948d9c6
7
- data.tar.gz: aa8a4cea00a63a1d2e3581084cfbecdfe67ad182774a56503a43091427927da28baf54358ad12e5c218f07ff1dc237033cb2231fc3ca9da75d765a69f39e46a2
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(api_url_base)
15
- @api_url_base = api_url_base
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("#{@api_url_base}#{options.fetch(:path)}")
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 = 60 # this default will be overwritten during Reporter#register!
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
- def initialize(time, value, queue_name = nil)
6
- super time.utc, value.to_i, queue_name
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 << measurement.time.to_i.to_s
23
- result << ','
24
- result << measurement.value.to_s
25
-
26
- if measurement.queue_name
27
- result << ','
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
- logger.error ex.backtrace.join("\n")
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.api_base_url).report_metrics!(params, report.to_csv)
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.api_base_url).register_reporter!(params)
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 = @worker_adapters.map { |a| a.class.name }.join(', ')
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
- @entered_queue_at = Time.at(unix_millis.to_f / 1000)
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
- queue_time = 0 if queue_time < 0
29
- logger.debug "Collected queue_time=#{queue_time}ms request_id=#{id} request_size=#{size}"
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
- queue_time
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsAutoscaleAgent
4
- VERSION = "0.8.1"
4
+ VERSION = "0.9.0.beta.4"
5
5
  end
@@ -2,61 +2,69 @@
2
2
 
3
3
  require 'rails_autoscale_agent/logger'
4
4
 
5
- module WorkerAdapters
6
- class DelayedJob
7
- include RailsAutoscaleAgent::Logger
8
- include Singleton
5
+ module RailsAutoscaleAgent
6
+ module WorkerAdapters
7
+ class DelayedJob
8
+ include RailsAutoscaleAgent::Logger
9
+ include Singleton
9
10
 
10
- class << self
11
- attr_accessor :queues
12
- end
11
+ UNNAMED_QUEUE = '[unnamed]'
13
12
 
14
- def initialize
15
- # Track the known queues so we can continue reporting on queues that don't
16
- # currently have enqueued jobs.
17
- self.class.queues = Set.new
13
+ class << self
14
+ attr_accessor :queues
15
+ end
18
16
 
19
- install if enabled?
20
- end
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
- def enabled?
23
- defined? ::Delayed
24
- end
22
+ install if enabled?
23
+ end
25
24
 
26
- def collect!(store)
27
- log_msg = String.new('DelayedJob latency ')
28
- t = Time.now
25
+ def enabled?
26
+ defined? ::Delayed
27
+ end
29
28
 
30
- sql = 'SELECT queue, min(run_at) FROM delayed_jobs GROUP BY queue'
31
- run_at_by_queue = Hash[ActiveRecord::Base.connection.select_rows(sql)]
32
- queues = self.class.queues | run_at_by_queue.keys
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
- 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} "
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
- logger.debug log_msg
43
- end
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
- private
49
+ logger.debug log_msg unless log_msg.empty?
50
+ end
46
51
 
47
- def install
48
- plugin = Class.new(Delayed::Plugin) do
49
- require 'delayed_job'
52
+ private
50
53
 
51
- callbacks do |lifecycle|
52
- lifecycle.before(:enqueue) do |job, &block|
53
- queue = job.queue || 'default'
54
- WorkerAdapters::DelayedJob.queues.add queue
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
- Delayed::Worker.plugins << plugin
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 WorkerAdapters
7
- class Que
8
- include RailsAutoscaleAgent::Logger
9
- include Singleton
6
+ module RailsAutoscaleAgent
7
+ module WorkerAdapters
8
+ class Que
9
+ include RailsAutoscaleAgent::Logger
10
+ include Singleton
10
11
 
11
- DEFAULT_QUEUES = ['default']
12
+ UNNAMED_QUEUE = '[unnamed]'
13
+ DEFAULT_QUEUES = ['default']
12
14
 
13
- class << self
14
- attr_accessor :queues
15
- end
16
-
17
- def initialize
18
- self.class.queues = DEFAULT_QUEUES
19
- end
15
+ class << self
16
+ attr_accessor :queues
17
+ end
20
18
 
21
- def enabled?
22
- defined? ::Que
23
- end
19
+ def initialize
20
+ self.class.queues = DEFAULT_QUEUES
21
+ end
24
22
 
25
- def collect!(store)
26
- log_msg = String.new('Que latency ')
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
- logger.debug log_msg
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 WorkerAdapters
6
- class Sidekiq
7
- include RailsAutoscaleAgent::Logger
8
- include Singleton
5
+ module RailsAutoscaleAgent
6
+ module WorkerAdapters
7
+ class Sidekiq
8
+ include RailsAutoscaleAgent::Logger
9
+ include Singleton
9
10
 
10
- def enabled?
11
- require 'sidekiq/api'
12
- true
13
- rescue LoadError
14
- false
15
- end
11
+ def enabled?
12
+ require 'sidekiq/api'
13
+ true
14
+ rescue LoadError
15
+ false
16
+ end
16
17
 
17
- def collect!(store)
18
- log_msg = String.new('Sidekiq latency ')
18
+ def collect!(store)
19
+ log_msg = String.new
19
20
 
20
- ::Sidekiq::Queue.all.each do |queue|
21
- latency_ms = (queue.latency * 1000).ceil
22
- store.push latency_ms, Time.now, queue.name
23
- log_msg << "#{queue.name}=#{latency_ms} "
24
- end
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
- logger.debug log_msg
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.8.1
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-05-04 00:00:00.000000000 Z
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: '0'
222
+ version: 1.3.1
222
223
  requirements: []
223
- rubygems_version: 3.0.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