rails_autoscale_agent 0.6.3 → 0.8.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 152d6241b81f0efb42554a0a4ec1c842754cc4ad7cfc3dbf50a406695e59311c
4
- data.tar.gz: 3deac83a1ab16e6e79c4f3d2fd1887ae8a71823516b254978fe479c7e00ea541
3
+ metadata.gz: 3924fc840320be8327c183e1cb54055d8516d2fefee1cffbfa7092da39b05985
4
+ data.tar.gz: abd81e6c4c2dc3a65be7c426dda8742ec92b7c29c47a71eeb2566731436ce4e6
5
5
  SHA512:
6
- metadata.gz: 488c42d09b52e2cd5c9c7fee3d5c63b2fc3e7398cc1321d85e897478e9ab28407e17c2a0b12b5741178fcf618bb1b8aa6decb53b55823ab6e461d6f5cdf3095c
7
- data.tar.gz: 61952a1aa625b25da6580a85300c7f3feaf6b5fe56b26eebbb9294e5ff3a9f53a9c6a4952bfab39a17089df8d67cd3c746786b3fa0d117c9ce8f0b9e27b12a4d
6
+ metadata.gz: 4867868c9e9e707d9e4afe46f20d19f600a87b26aabf5a96f4ad8ff91698d00b08f8a0566ef20fe8f3f1c036c9220b1034a92c70280a4cf29a6d5b5a728b4105
7
+ data.tar.gz: e2fbbc4afa90c0c636dddb3172d1164108e984f4c550739df552cd185a8a51d7255ff354debc658ecfa893fb4f87f53e6c298bfe4dddf2aa35615f7636e64420
@@ -1 +1 @@
1
- 2.5.0
1
+ 2.6.5
@@ -0,0 +1,84 @@
1
+ {
2
+ // See https://go.microsoft.com/fwlink/?LinkId=733558
3
+ // for the documentation about the tasks.json format
4
+ "version": "2.0.0",
5
+ "tasks": [
6
+ {
7
+ "label": "test: all",
8
+ "group": "test",
9
+ "command": "rspec",
10
+ "runOptions": {
11
+ "reevaluateOnRerun": false
12
+ },
13
+ "problemMatcher": {
14
+ "owner": "ruby",
15
+ "fileLocation": ["relative", "${workspaceRoot}"],
16
+ "severity": "error",
17
+ "pattern": [
18
+ {
19
+ "regexp": "^\\s{7}(.*)$",
20
+ "message": 1
21
+ },
22
+ {
23
+ "regexp": "^\\s+#\\s(\\./.*):(\\d+):(in.*)$",
24
+ "file": 1,
25
+ "line": 2,
26
+ "code": 3
27
+ }
28
+ ]
29
+ }
30
+ },
31
+ {
32
+ "label": "test: file",
33
+ "group": "test",
34
+ "command": "rspec",
35
+ "args": ["${relativeFile}"],
36
+ "runOptions": {
37
+ "reevaluateOnRerun": false
38
+ },
39
+ "problemMatcher": {
40
+ "owner": "ruby",
41
+ "fileLocation": ["relative", "${workspaceRoot}"],
42
+ "severity": "error",
43
+ "pattern": [
44
+ {
45
+ "regexp": "^\\s{7}(.*)$",
46
+ "message": 1
47
+ },
48
+ {
49
+ "regexp": "^\\s+#\\s(\\./.*):(\\d+):(in.*)$",
50
+ "file": 1,
51
+ "line": 2,
52
+ "code": 3
53
+ }
54
+ ]
55
+ }
56
+ },
57
+ {
58
+ "label": "test: line",
59
+ "group": "test",
60
+ "command": "rspec",
61
+ "args": ["${relativeFile}:${lineNumber}"],
62
+ "runOptions": {
63
+ "reevaluateOnRerun": false
64
+ },
65
+ "problemMatcher": {
66
+ "owner": "ruby",
67
+ "fileLocation": ["relative", "${workspaceRoot}"],
68
+ "severity": "error",
69
+ "pattern": [
70
+ {
71
+ "regexp": "^\\s{7}(.*)$",
72
+ "message": 1
73
+ },
74
+ {
75
+ "regexp": "^\\s+#\\s(\\./.*):(\\d+):(in.*)$",
76
+ "file": 1,
77
+ "line": 2,
78
+ "code": 3
79
+ }
80
+ ]
81
+ }
82
+ }
83
+ ]
84
+ }
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![Build Status](https://travis-ci.org/adamlogic/rails_autoscale_agent.svg?branch=master)](https://travis-ci.org/adamlogic/rails_autoscale_agent)
4
4
 
5
- This gem works together with the [Rails Autoscale](https://railsautoscale.com) Heroku add-on to automatically scale your web dynos as needed. It gathers a minimal set of metrics for each request, and periodically posts this data asynchronously to the Rails Autoscale service.
5
+ This gem works together with the [Rails Autoscale](https://railsautoscale.com) Heroku add-on to automatically scale your web and worker dynos as needed. It gathers a minimal set of metrics for each request (and job queue), and periodically posts this data asynchronously to the Rails Autoscale service.
6
6
 
7
7
  ## Requirements
8
8
 
@@ -26,9 +26,11 @@ You'll need to insert the `RailsAutoscaleAgent::Middleware` manually. Insert it
26
26
 
27
27
  ## Changing the logger
28
28
 
29
+ The Rails logger is used by default.
29
30
  If you wish to use a different logger you can set it on the configuration object:
30
31
 
31
32
  ```ruby
33
+ # config/initializers/rails_autoscale_agent.rb
32
34
  RailsAutoscaleAgent::Config.instance.logger = MyLogger.new
33
35
  ```
34
36
 
@@ -43,22 +45,29 @@ The middleware agent runs in its own thread so your web requests are not impacte
43
45
  - PID
44
46
  - Collection of queue time measurements (time and milliseconds)
45
47
 
46
- Rails Autoscale processes and stores this information in order to power the autoscaling algorithm and dashboard visualizations.
48
+ Rails Autoscale aggregates and stores this information to power the autoscaling algorithm and dashboard visualizations.
47
49
 
48
50
  ## Troubleshooting
49
51
 
50
- If your logger supports tagged logging (as the Rails logger does by default), all log output from this gem is prefixed with "[RailsAutoscale]".
51
-
52
- Once installed, you should see something like this in development:
52
+ Once installed, you should see something like this in your development log:
53
53
 
54
54
  > [RailsAutoscale] Reporter not started: RAILS_AUTOSCALE_URL is not set
55
55
 
56
- In production, you should see something like this:
56
+ In production, run `heroku logs -t | grep RailsAutoscale`, and you should see something like this:
57
57
 
58
58
  > [RailsAutoscale] Reporter starting, will report every 15 seconds
59
59
 
60
60
  If you don't see either of these, try running `bundle` again and restarting your Rails application.
61
61
 
62
+ You can see more detailed (debug) logging by setting the `RAILS_AUTOSCALE_DEBUG` env var on your Heroku app:
63
+
64
+ ```
65
+ heroku config:add RAILS_AUTOSCALE_DEBUG=true
66
+ ```
67
+
68
+ Debug logs are silenced by default because Rails apps default to a DEBUG log level in production,
69
+ and these can get very noisy with this gem.
70
+
62
71
  Reach out to help@railsautoscale.com if you run into any other problems.
63
72
 
64
73
  ## Development
@@ -7,9 +7,18 @@ 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
10
+ :dyno, :pid, :addon_name, :worker_adapters
11
11
 
12
12
  def initialize
13
+ require 'rails_autoscale_agent/worker_adapters/sidekiq'
14
+ require 'rails_autoscale_agent/worker_adapters/delayed_job'
15
+ require 'rails_autoscale_agent/worker_adapters/que'
16
+ @worker_adapters = [
17
+ WorkerAdapters::Sidekiq.instance,
18
+ WorkerAdapters::DelayedJob.instance,
19
+ WorkerAdapters::Que.instance,
20
+ ]
21
+
13
22
  # Allow the add-on name to be configured - needed for testing
14
23
  @addon_name = ENV['RAILS_AUTOSCALE_ADDON'] || 'RAILS_AUTOSCALE'
15
24
  @api_base_url = ENV["#{@addon_name}_URL"]
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'active_support/core_ext/module/delegation'
4
3
  require 'rails_autoscale_agent/config'
4
+ require 'logger'
5
5
 
6
6
  module RailsAutoscaleAgent
7
7
  module Logger
@@ -11,23 +11,30 @@ module RailsAutoscaleAgent
11
11
  end
12
12
 
13
13
  class LoggerProxy < Struct.new(:logger)
14
- def tagged(*tags, &block)
15
- if logger.respond_to?(:tagged)
16
- logger.tagged *tags, &block
17
- else
18
- # NOTE: Quack like ActiveSupport::TaggedLogging, but don't reimplement
19
- yield self
14
+ TAG = '[RailsAutoscale]'
15
+
16
+ %w[info warn error].each do |name|
17
+ define_method name do |msg|
18
+ logger.send name, tag(msg)
20
19
  end
21
20
  end
22
21
 
23
- def debug(*args)
24
- # Rails logger defaults to DEBUG level in production, but I don't want
25
- # to be chatty by default.
26
- logger.debug(*args) if ENV['RAILS_AUTOSCALE_LOG_LEVEL'] == 'DEBUG'
22
+ def debug(msg)
23
+ # Silence debug logs by default to avoiding being overly chatty (Rails logger defaults
24
+ # to DEBUG level in production).
25
+ # This uses a separate logger so that RAILS_AUTOSCALE_DEBUG
26
+ # shows debug logs regardless of Rails log level.
27
+ debug_logger.debug tag(msg) if ENV['RAILS_AUTOSCALE_DEBUG'] == 'true'
28
+ end
29
+
30
+ private
31
+
32
+ def debug_logger
33
+ @debug_loggers ||= ::Logger.new(STDOUT)
27
34
  end
28
35
 
29
- def method_missing(name, *args, &block)
30
- logger.send name, *args, &block
36
+ def tag(msg)
37
+ "#{TAG} #{msg}"
31
38
  end
32
39
  end
33
40
  end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'rails_autoscale_agent/logger'
4
3
  require 'rails_autoscale_agent/store'
5
4
  require 'rails_autoscale_agent/reporter'
6
5
  require 'rails_autoscale_agent/config'
@@ -8,25 +7,21 @@ require 'rails_autoscale_agent/request'
8
7
 
9
8
  module RailsAutoscaleAgent
10
9
  class Middleware
11
- include Logger
12
-
13
10
  def initialize(app)
14
11
  @app = app
15
12
  end
16
13
 
17
14
  def call(env)
18
- logger.tagged 'RailsAutoscale' do
19
- config = Config.instance
20
- request = Request.new(env, config)
15
+ config = Config.instance
16
+ request = Request.new(env, config)
21
17
 
22
- store = Store.instance
23
- Reporter.start(config, store)
18
+ store = Store.instance
19
+ Reporter.start(config, store)
24
20
 
25
- if !request.ignore? && queue_time = request.queue_time
26
- # NOTE: Expose queue time to the app
27
- env['queue_time'] = queue_time
28
- store.push queue_time
29
- end
21
+ if !request.ignore? && queue_time = request.queue_time
22
+ # NOTE: Expose queue time to the app
23
+ env['queue_time'] = queue_time
24
+ store.push queue_time
30
25
  end
31
26
 
32
27
  @app.call(env)
@@ -1,10 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'rails_autoscale_agent/middleware'
4
+ require 'rails_autoscale_agent/logger'
4
5
 
5
6
  module RailsAutoscaleAgent
6
7
  class Railtie < Rails::Railtie
8
+ include Logger
9
+
7
10
  initializer "rails_autoscale_agent.middleware" do |app|
11
+ logger.info "Preparing middleware"
8
12
  app.middleware.insert_before Rack::Runtime, Middleware
9
13
  end
10
14
  end
@@ -5,7 +5,6 @@ require 'rails_autoscale_agent/logger'
5
5
  require 'rails_autoscale_agent/autoscale_api'
6
6
  require 'rails_autoscale_agent/time_rounder'
7
7
  require 'rails_autoscale_agent/registration'
8
- require 'rails_autoscale_agent/worker_adapters/sidekiq'
9
8
 
10
9
  # Reporter wakes up every minute to send metrics to the RailsAutoscale API
11
10
 
@@ -14,17 +13,13 @@ module RailsAutoscaleAgent
14
13
  include Singleton
15
14
  include Logger
16
15
 
17
- WORKER_ADAPTERS = [
18
- WorkerAdapters::Sidekiq.new,
19
- ]
20
-
21
16
  def self.start(config, store)
22
17
  instance.start!(config, store) unless instance.started?
23
18
  end
24
19
 
25
20
  def start!(config, store)
26
21
  @started = true
27
- @worker_adapters = WORKER_ADAPTERS.select(&:enabled?)
22
+ @worker_adapters = config.worker_adapters.select(&:enabled?)
28
23
 
29
24
  if !config.api_base_url
30
25
  logger.info "Reporter not started: #{config.addon_name}_URL is not set"
@@ -32,23 +27,21 @@ module RailsAutoscaleAgent
32
27
  end
33
28
 
34
29
  Thread.new do
35
- logger.tagged 'RailsAutoscale' do
36
- register!(config)
37
-
38
- loop do
39
- # Stagger reporting to spread out reports from many processes
40
- multiplier = 1 - (rand / 4) # between 0.75 and 1.0
41
- sleep config.report_interval * multiplier
42
-
43
- begin
44
- @worker_adapters.map { |a| a.collect!(store) }
45
- report!(config, store)
46
- rescue => ex
47
- # Exceptions in threads other than the main thread will fail silently
48
- # https://ruby-doc.org/core-2.2.0/Thread.html#class-Thread-label-Exception+handling
49
- logger.error "Reporter error: #{ex.inspect}"
50
- logger.error ex.backtrace.join("\n")
51
- end
30
+ loop do
31
+ register!(config) unless @registered
32
+
33
+ # Stagger reporting to spread out reports from many processes
34
+ multiplier = 1 - (rand / 4) # between 0.75 and 1.0
35
+ sleep config.report_interval * multiplier
36
+
37
+ begin
38
+ @worker_adapters.map { |a| a.collect!(store) }
39
+ report!(config, store)
40
+ rescue => ex
41
+ # Exceptions in threads other than the main thread will fail silently
42
+ # https://ruby-doc.org/core-2.2.0/Thread.html#class-Thread-label-Exception+handling
43
+ logger.error "Reporter error: #{ex.inspect}"
44
+ logger.error ex.backtrace.join("\n")
52
45
  end
53
46
  end
54
47
  end
@@ -84,13 +77,14 @@ module RailsAutoscaleAgent
84
77
 
85
78
  case result
86
79
  when AutoscaleApi::SuccessResponse
80
+ @registered = true
87
81
  config.report_interval = result.data['report_interval'] if result.data['report_interval']
88
82
  config.max_request_size = result.data['max_request_size'] if result.data['max_request_size']
89
- logger.info "Reporter starting, will report every #{config.report_interval} seconds or so"
83
+ worker_adapters_msg = @worker_adapters.map { |a| a.class.name }.join(', ')
84
+ logger.info "Reporter starting, will report every #{config.report_interval} seconds or so. Worker adapters: [#{worker_adapters_msg}]"
90
85
  when AutoscaleApi::FailureResponse
91
86
  logger.error "Reporter failed to register: #{result.failure_message}"
92
87
  end
93
88
  end
94
-
95
89
  end
96
90
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsAutoscaleAgent
4
- VERSION = "0.6.3"
4
+ VERSION = "0.8.3"
5
5
  end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_autoscale_agent/logger'
4
+
5
+ module WorkerAdapters
6
+ class DelayedJob
7
+ include RailsAutoscaleAgent::Logger
8
+ include Singleton
9
+
10
+ class << self
11
+ attr_accessor :queues
12
+ end
13
+
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
18
+
19
+ install if enabled?
20
+ end
21
+
22
+ def enabled?
23
+ defined? ::Delayed
24
+ end
25
+
26
+ def collect!(store)
27
+ log_msg = String.new('DelayedJob latency ')
28
+ t = Time.now
29
+
30
+ # Ignore failed jobs (they skew latency measurement due to the original run_at)
31
+ sql = 'SELECT queue, min(run_at) FROM delayed_jobs WHERE attempts = 0 GROUP BY queue'
32
+ run_at_by_queue = Hash[ActiveRecord::Base.connection.select_rows(sql)]
33
+ queues = self.class.queues | run_at_by_queue.keys
34
+
35
+ queues.each do |queue|
36
+ next if queue.nil? || queue.empty?
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
+ store.push latency_ms, t, queue
41
+ log_msg << "#{queue}=#{latency_ms} "
42
+ end
43
+
44
+ logger.debug log_msg
45
+ end
46
+
47
+ private
48
+
49
+ def install
50
+ plugin = Class.new(Delayed::Plugin) do
51
+ require 'delayed_job'
52
+
53
+ callbacks do |lifecycle|
54
+ lifecycle.before(:enqueue) do |job, &block|
55
+ queue = job.queue || 'default'
56
+ WorkerAdapters::DelayedJob.queues.add queue
57
+ end
58
+ end
59
+ end
60
+
61
+ Delayed::Worker.plugins << plugin
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,46 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_autoscale_agent/logger'
4
+ require 'time'
5
+
6
+ module WorkerAdapters
7
+ class Que
8
+ include RailsAutoscaleAgent::Logger
9
+ include Singleton
10
+
11
+ DEFAULT_QUEUES = ['default']
12
+
13
+ class << self
14
+ attr_accessor :queues
15
+ end
16
+
17
+ def initialize
18
+ self.class.queues = DEFAULT_QUEUES
19
+ end
20
+
21
+ def enabled?
22
+ defined? ::Que
23
+ end
24
+
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
+ next if queue.nil? || queue.empty?
36
+ run_at = run_at_by_queue[queue]
37
+ run_at = Time.parse(run_at) if run_at.is_a?(String)
38
+ latency_ms = run_at ? ((t - run_at)*1000).ceil : 0
39
+ store.push latency_ms, t, queue
40
+ log_msg << "#{queue}=#{latency_ms} "
41
+ end
42
+
43
+ logger.debug log_msg
44
+ end
45
+ end
46
+ end
@@ -5,6 +5,7 @@ require 'rails_autoscale_agent/logger'
5
5
  module WorkerAdapters
6
6
  class Sidekiq
7
7
  include RailsAutoscaleAgent::Logger
8
+ include Singleton
8
9
 
9
10
  def enabled?
10
11
  require 'sidekiq/api'
@@ -13,7 +14,6 @@ module WorkerAdapters
13
14
  false
14
15
  end
15
16
 
16
- # TODO: specs
17
17
  def collect!(store)
18
18
  log_msg = String.new('Sidekiq latency ')
19
19
 
@@ -16,14 +16,15 @@ Gem::Specification.new do |spec|
16
16
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
17
  spec.require_paths = ["lib"]
18
18
 
19
- spec.add_dependency "activesupport", ">= 3.2"
20
-
21
19
  spec.add_development_dependency "bundler", "~> 2.0"
22
- spec.add_development_dependency "rake", "~> 10.0"
20
+ spec.add_development_dependency "rake", "~> 12.3.3"
23
21
  spec.add_development_dependency "rspec", "~> 3.0"
24
22
  spec.add_development_dependency "vcr", "~> 3.0"
25
23
  spec.add_development_dependency "webmock"
26
24
  spec.add_development_dependency "pry"
27
25
  spec.add_development_dependency "pry-byebug"
28
26
  spec.add_development_dependency "sidekiq", "~> 5.0"
27
+ spec.add_development_dependency "delayed_job"
28
+ spec.add_development_dependency "que"
29
+ spec.add_development_dependency "activesupport"
29
30
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails_autoscale_agent
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.3
4
+ version: 0.8.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam McCrea
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-06-25 00:00:00.000000000 Z
11
+ date: 2020-05-26 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: activesupport
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '3.2'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '3.2'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: bundler
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -44,14 +30,14 @@ dependencies:
44
30
  requirements:
45
31
  - - "~>"
46
32
  - !ruby/object:Gem::Version
47
- version: '10.0'
33
+ version: 12.3.3
48
34
  type: :development
49
35
  prerelease: false
50
36
  version_requirements: !ruby/object:Gem::Requirement
51
37
  requirements:
52
38
  - - "~>"
53
39
  - !ruby/object:Gem::Version
54
- version: '10.0'
40
+ version: 12.3.3
55
41
  - !ruby/object:Gem::Dependency
56
42
  name: rspec
57
43
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +122,48 @@ dependencies:
136
122
  - - "~>"
137
123
  - !ruby/object:Gem::Version
138
124
  version: '5.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: delayed_job
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: que
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: activesupport
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
139
167
  description:
140
168
  email:
141
169
  - adam@adamlogic.com
@@ -147,6 +175,7 @@ files:
147
175
  - ".rspec"
148
176
  - ".ruby-version"
149
177
  - ".travis.yml"
178
+ - ".vscode/tasks.json"
150
179
  - Gemfile
151
180
  - LICENSE.txt
152
181
  - README.md
@@ -167,6 +196,8 @@ files:
167
196
  - lib/rails_autoscale_agent/store.rb
168
197
  - lib/rails_autoscale_agent/time_rounder.rb
169
198
  - lib/rails_autoscale_agent/version.rb
199
+ - lib/rails_autoscale_agent/worker_adapters/delayed_job.rb
200
+ - lib/rails_autoscale_agent/worker_adapters/que.rb
170
201
  - lib/rails_autoscale_agent/worker_adapters/sidekiq.rb
171
202
  - log/.gitkeep
172
203
  - rails_autoscale_agent.gemspec
@@ -189,8 +220,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
189
220
  - !ruby/object:Gem::Version
190
221
  version: '0'
191
222
  requirements: []
192
- rubyforge_project:
193
- rubygems_version: 2.7.3
223
+ rubygems_version: 3.0.3
194
224
  signing_key:
195
225
  specification_version: 4
196
226
  summary: This gem works with the Rails Autoscale Heroku add-on to automatically scale