rails_autoscale_agent 0.7.0 → 0.10.2

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: 355209571af7f1f6c5fbe38ed112a2936903afcdd9cff56b9c68531be45c8d5e
4
- data.tar.gz: 9855ff92fcc103546a4fe3115942b4e94e0c5e3e626d6b14b26c1eeab0953bc8
3
+ metadata.gz: fd7549c359dd5f45dbd5d44113c04413685c0cabc12836c1a88559404104ea8b
4
+ data.tar.gz: b193f06500d2d281e22b2684364e2aad7107dcd1713f8e30d98f2cc3a814a99f
5
5
  SHA512:
6
- metadata.gz: 1e76f3c52649b97c5919ce06170414e0d4f2642bf133f781ee3e54e842f77e0264c37f625e1f4c1c681ce79aec162bb7749d133a663e7d580cfc5385813f591b
7
- data.tar.gz: c312bfb9654d06c25be2bda4da119e74e547fc24f0b71cd412fdeef63665154b37bf013beaae9ad1c4fb169469c0bff4cc0a601942bbe845bb739708ecc0d426
6
+ metadata.gz: 0ecc593e4d6a404bbeb0d082047c87511e5be55daa77169a4159f0a96c8bc1bd7c5b78e09e712ec90119e0198c615849331de9b8ff1fd48e3f2ecf631e8395a5
7
+ data.tar.gz: b4802270f5a2ac21f5c8fee31c200dcd2fee5b8771591a3b9c9eb21b1a716ec59e56e24e958afbbc8ea5aa49670e0bf62dc64ad8d3670f8cb4ff7126afaf6f4f
@@ -0,0 +1,85 @@
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": "bundle",
10
+ "args": ["exec", "rspec"],
11
+ "runOptions": {
12
+ "reevaluateOnRerun": false
13
+ },
14
+ "problemMatcher": {
15
+ "owner": "ruby",
16
+ "fileLocation": ["relative", "${workspaceRoot}"],
17
+ "severity": "error",
18
+ "pattern": [
19
+ {
20
+ "regexp": "^\\s{7}(.*)$",
21
+ "message": 1
22
+ },
23
+ {
24
+ "regexp": "^\\s+#\\s(\\./.*):(\\d+):(in.*)$",
25
+ "file": 1,
26
+ "line": 2,
27
+ "code": 3
28
+ }
29
+ ]
30
+ }
31
+ },
32
+ {
33
+ "label": "test: file",
34
+ "group": "test",
35
+ "command": "bundle",
36
+ "args": ["exec", "rspec", "${relativeFile}"],
37
+ "runOptions": {
38
+ "reevaluateOnRerun": false
39
+ },
40
+ "problemMatcher": {
41
+ "owner": "ruby",
42
+ "fileLocation": ["relative", "${workspaceRoot}"],
43
+ "severity": "error",
44
+ "pattern": [
45
+ {
46
+ "regexp": "^\\s{7}(.*)$",
47
+ "message": 1
48
+ },
49
+ {
50
+ "regexp": "^\\s+#\\s(\\./.*):(\\d+):(in.*)$",
51
+ "file": 1,
52
+ "line": 2,
53
+ "code": 3
54
+ }
55
+ ]
56
+ }
57
+ },
58
+ {
59
+ "label": "test: line",
60
+ "group": "test",
61
+ "command": "bundle",
62
+ "args": ["exec", "rspec", "${relativeFile}:${lineNumber}"],
63
+ "runOptions": {
64
+ "reevaluateOnRerun": false
65
+ },
66
+ "problemMatcher": {
67
+ "owner": "ruby",
68
+ "fileLocation": ["relative", "${workspaceRoot}"],
69
+ "severity": "error",
70
+ "pattern": [
71
+ {
72
+ "regexp": "^\\s{7}(.*)$",
73
+ "message": 1
74
+ },
75
+ {
76
+ "regexp": "^\\s+#\\s(\\./.*):(\\d+):(in.*)$",
77
+ "file": 1,
78
+ "line": 2,
79
+ "code": 3
80
+ }
81
+ ]
82
+ }
83
+ }
84
+ ]
85
+ }
@@ -0,0 +1,115 @@
1
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
2
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
3
+
4
+ ## [Unreleased](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.10.2...master)
5
+
6
+ No currently unreleased changes.
7
+
8
+ ## [0.10.2](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.10.1...v0.10.2) - 2021-01-12
9
+
10
+ ### Changed
11
+
12
+ - Loosen Ruby constraint to allow Ruby 3. ([#36](https://github.com/adamlogic/rails_autoscale_agent/pull/36))
13
+
14
+ ## [0.10.1](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.9.1...v0.10.1) - 2021-01-03
15
+
16
+ ### Added
17
+
18
+ - Add support for [long-running jobs](https://railsautoscale.com/docs/long-running-jobs/) in Sidekiq and Delayed Job.
19
+ - Handle x-request-start measured in seconds (instead of milliseconds) to support nginx buildpack ([cd092f3](https://github.com/adamlogic/rails_autoscale_agent/commit/cd092f38718abf5ffaea866bcae7831d4c910ffd))
20
+ - Override worker adapter config via env var ([75dd06b](https://github.com/adamlogic/rails_autoscale_agent/commit/75dd06b2a7ff4eeab829eec24d503dc067c8fe32))
21
+
22
+ ### Changed
23
+
24
+ - Require Ruby 2.5 or newer. ([b033050](https://github.com/adamlogic/rails_autoscale_agent/commit/b033050b7f9d4d7f1e50dbd780cf0e1822249268))
25
+ - Only report worker metrics from web.1 to avoid redundant data. ([d5d5fa8](https://github.com/adamlogic/rails_autoscale_agent/commit/d5d5fa87fb4d7d046832a64edde9ed0c3a6ec75f))
26
+ - Don't collect worker metrics for an unreasonable number of queues. ([a9358af](https://github.com/adamlogic/rails_autoscale_agent/commit/a9358af74a29a941d1f1d60a0222077dafd5ce08))
27
+
28
+ ### Fixed
29
+
30
+ - Avoid holding onto database connections (DJ & Que only). ([3919ca5](https://github.com/adamlogic/rails_autoscale_agent/commit/3919ca54420cafa82abf9f8cd251569f9637482b))
31
+ - Better error handling for worker adapters. ([190786e](https://github.com/adamlogic/rails_autoscale_agent/commit/190786e4a910d41e394a3129aac1d23b594dbd9b))
32
+ - Don't collect metrics of the reporter isn't running. Avoids memory bloat. ([247c322](https://github.com/adamlogic/rails_autoscale_agent/commit/247c322cffc625a8c6b2395080a048ffb94e7f3b))
33
+
34
+ ## [0.10.0](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.9.1...v0.10.0) - 2021-01-03 [YANKED]
35
+
36
+ _I released the wrong branch 🤦‍♂️_
37
+
38
+ ## [0.9.1](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.9.0...v0.9.1) - 2020-07-29
39
+
40
+ ### Fixed
41
+
42
+ - Fix a bug in error handling. ([3018542](https://github.com/adamlogic/rails_autoscale_agent/commit/3018542cd046fc4e1bd6e7da86e72a6aa2d50a8f))
43
+ - Remove unintentional Rails dependency.
44
+
45
+ ## [0.9.0](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.8.3...v0.9.0) - 2020-07-12
46
+
47
+ ### Added
48
+
49
+ - Add support for Resque workers.
50
+ - Add dev mode for working on the agent gem itself. ([47e3fca](https://github.com/adamlogic/rails_autoscale_agent/commit/47e3fca5b788f48567a345d9cab3a26b9cd87693))
51
+ - Report agent exceptions to Rails Autoscale.
52
+
53
+ ### Changed
54
+
55
+ - Adjust queue time metric to exclude time waiting for large request bodies. ([#25](https://github.com/adamlogic/rails_autoscale_agent/pull/25))
56
+ - Que and DJ jobs without a queue name will be included in the "default" queue metrics.
57
+
58
+ ### Fixed
59
+
60
+ - Multiple fixes to the Delayed Job SQL query.
61
+
62
+ ## [0.8.3](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.8.2...v0.8.3) - 2020-05-26
63
+
64
+ ### Fixed
65
+
66
+ - Ignored failed job in Delayed Job adapter. ([fa72fc2](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.8.2...v0.8.3))
67
+
68
+ ## [0.8.2](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.8.1...v0.8.2) - 2020-05-22
69
+
70
+ ### Fixed
71
+
72
+ - Ignore worker metrics from unnamed queues (DJ & Que only). These metrics were being lumped with web metrics. ([#21](https://github.com/adamlogic/rails_autoscale_agent/pull/21))
73
+
74
+ ## [0.8.1](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.8.0...v0.8.1) - 2020-05-04
75
+
76
+ ### Fixed
77
+
78
+ - Ignore failed jobs in Que adapter. ([#18](https://github.com/adamlogic/rails_autoscale_agent/pull/18))
79
+
80
+ ## [0.8.0](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.7.0...v0.8.0) - 2020-03-21
81
+
82
+ ### Added
83
+
84
+ - Add support for Delayed Job ([#14](https://github.com/adamlogic/rails_autoscale_agent/pull/14))
85
+ - Add support for Que ([#15](https://github.com/adamlogic/rails_autoscale_agent/pull/15))
86
+
87
+ ## [0.7.0](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.6.3...v0.7.0) - 2019-12-04
88
+
89
+ ### Added
90
+
91
+ - Make worker adapters configurable. ([012d937](https://github.com/adamlogic/rails_autoscale_agent/commit/012d9379296763f5e42df95f05b066fe82ab0051))
92
+
93
+ ## [0.6.3](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.6.2...v0.6.3) - 2019-06-25
94
+
95
+ ### Fixed
96
+
97
+ - Fix issues with logging.
98
+
99
+ ## [0.6.2](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.6.1...v0.6.2) - 2019-06-22
100
+
101
+ ### Fixed
102
+
103
+ - Fix issues with logging.
104
+
105
+ ## [0.6.1](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.6.0...v0.6.1) - 2019-05-06
106
+
107
+ ### Fixed
108
+
109
+ - Don't assume Sidekiq is present.
110
+
111
+ ## [0.6.0](https://github.com/adamlogic/rails_autoscale_agent/compare/v0.4.1...v0.6.0) - 2019-05-03
112
+
113
+ ### Added
114
+
115
+ - Add support for autoscaling Sidekiq.
data/Gemfile CHANGED
@@ -1,4 +1,16 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Specify your gem's dependencies in rails_autoscale_agent.gemspec
4
3
  gemspec
4
+
5
+ gem "rake", ">= 12.3.3"
6
+ gem "rspec", ">= 3.0"
7
+ gem "vcr", ">= 3.0"
8
+ gem "webmock"
9
+ gem "pry-byebug"
10
+ gem "sidekiq", ">= 5.0"
11
+ gem "delayed_job"
12
+ gem "delayed_job_active_record"
13
+ gem "que"
14
+ gem "resque"
15
+ gem "activesupport"
16
+ gem "sqlite3", platforms: :ruby
data/README.md CHANGED
@@ -2,11 +2,12 @@
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
 
9
- Tested with Rails versions 3.2 and higher and Ruby versions 1.9.3 and higher.
9
+ - Rack-based app
10
+ - Ruby 2.5 or newer
10
11
 
11
12
  ## Getting Started
12
13
 
@@ -22,15 +23,7 @@ The agent will only communicate with Rails Autoscale if a `RAILS_AUTOSCALE_URL`
22
23
 
23
24
  ## Non-Rails Rack apps
24
25
 
25
- You'll need to insert the `RailsAutoscaleAgent::Middleware` manually. Insert it before `Rack::Runtime` to ensure accuracy of request queue timings.
26
-
27
- ## Changing the logger
28
-
29
- If you wish to use a different logger you can set it on the configuration object:
30
-
31
- ```ruby
32
- RailsAutoscaleAgent::Config.instance.logger = MyLogger.new
33
- ```
26
+ You'll need to `require 'rails_autoscale_agent/middleware'` and insert the `RailsAutoscaleAgent::Middleware` manually. Insert it before `Rack::Runtime` to ensure accuracy of request queue timings.
34
27
 
35
28
  ## What data is collected?
36
29
 
@@ -43,29 +36,84 @@ The middleware agent runs in its own thread so your web requests are not impacte
43
36
  - PID
44
37
  - Collection of queue time measurements (time and milliseconds)
45
38
 
46
- Rails Autoscale processes and stores this information in order to power the autoscaling algorithm and dashboard visualizations.
39
+ Rails Autoscale aggregates and stores this information to power the autoscaling algorithm and dashboard visualizations.
47
40
 
48
- ## Troubleshooting
41
+ ## Configuration
42
+
43
+ Most Rails Autoscale configurations are handled via the settings page on your Rails Autoscale dashboard, but there a few ways you can directly change the behavior of the agent via environment variables:
44
+
45
+ - `RAILS_AUTOSCALE_DEBUG` - Enables debug logging. See more in the [logging](#logging) section below.
46
+ - `RAILS_AUTOSCALE_WORKER_ADAPTER` - Overrides the available worker adapters. See more in the [worker adapters](#worker_adapters) section below.
47
+ - `RAILS_AUTOSCALE_LONG_JOBS` - Enables reporting for active workers. See [Handling Long-Running Background Jobs](https://railsautoscale.com/docs/long-running-jobs/) in the Rails Autoscale docs for more.
48
+
49
+ ## Worker adapters
50
+
51
+ Rails Autoscale supports autoscaling worker dynos. Out of the box, four job backends are supported: Sidekiq, Resque, Delayed Job, and Que. The agent will automatically enable the appropriate worker adapter based on what you have installed in your app.
52
+
53
+ In some scenarios you might want to override this behavior. Let's say you have both Sidekiq and Resque installed 🤷‍♂️, but you only want Rails Autoscale to collect metrics for Sidekiq. Here's how you'd override that:
54
+
55
+ ```
56
+ heroku config:add RAILS_AUTOSCALE_WORKER_ADAPTER=sidekiq
57
+ ```
58
+
59
+ You can also disable collection of worker metrics altogether:
60
+
61
+ ```
62
+ heroku config:add RAILS_AUTOSCALE_WORKER_ADAPTER=""
63
+ ```
64
+
65
+ It's also possible to write a custom worker adapter. See [these docs](https://railsautoscale.com/docs/custom-worker-adapter/) for details.
49
66
 
50
- If your logger supports tagged logging (as the Rails logger does by default), all log output from this gem is prefixed with "[RailsAutoscale]".
67
+ ## Troubleshooting
51
68
 
52
- Once installed, you should see something like this in development:
69
+ Once installed, you should see something like this in your development log:
53
70
 
54
71
  > [RailsAutoscale] Reporter not started: RAILS_AUTOSCALE_URL is not set
55
72
 
56
- In production, you should see something like this:
73
+ In production, run `heroku logs -t | grep RailsAutoscale`, and you should see something like this:
57
74
 
58
75
  > [RailsAutoscale] Reporter starting, will report every 15 seconds
59
76
 
60
77
  If you don't see either of these, try running `bundle` again and restarting your Rails application.
61
78
 
79
+ You can see more detailed (debug) logging by setting `RAILS_AUTOSCALE_DEBUG` on your Heroku app:
80
+
81
+ ```
82
+ heroku config:add RAILS_AUTOSCALE_DEBUG=true
83
+ ```
84
+
85
+ See more in the [logging](#logging) section below.
86
+
62
87
  Reach out to help@railsautoscale.com if you run into any other problems.
63
88
 
89
+ ## Logging
90
+
91
+ The Rails logger is used by default.
92
+ If you wish to use a different logger you can set it on the configuration object:
93
+
94
+ ```ruby
95
+ # config/initializers/rails_autoscale_agent.rb
96
+ RailsAutoscaleAgent::Config.instance.logger = MyLogger.new
97
+ ```
98
+
99
+ Debug logs are silenced by default because Rails apps default to a DEBUG log level in production, and this gem has _very_ chatty debug logs. If you want to see the debug logs, set `RAILS_AUTOSCALE_DEBUG` on your Heroku app:
100
+
101
+ ```
102
+ heroku config:add RAILS_AUTOSCALE_DEBUG=true
103
+ ```
104
+
105
+ If you find the gem too chatty even without this, you can quiet it down further:
106
+
107
+ ```ruby
108
+ # config/initializers/rails_autoscale_agent.rb
109
+ RailsAutoscaleAgent::Config.instance.quiet = true
110
+ ```
111
+
64
112
  ## Development
65
113
 
66
114
  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.
67
115
 
68
- 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).
116
+ 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).
69
117
 
70
118
  ## Contributing
71
119
 
@@ -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)
@@ -50,7 +59,7 @@ module RailsAutoscaleAgent
50
59
 
51
60
  case response.code.to_i
52
61
  when 200...300 then SuccessResponse.new(response.body)
53
- else FailureResponse.new(response.message)
62
+ else FailureResponse.new([response.code, response.message].join(' - '))
54
63
  end
55
64
  end
56
65
 
@@ -4,32 +4,53 @@ require 'singleton'
4
4
 
5
5
  module RailsAutoscaleAgent
6
6
  class Config
7
+ DEFAULT_WORKER_ADAPTERS = 'sidekiq,delayed_job,que,resque'
8
+
7
9
  include Singleton
8
10
 
9
11
  attr_accessor :report_interval, :logger, :api_base_url, :max_request_size,
10
- :dyno, :pid, :addon_name, :worker_adapters
12
+ :dyno, :addon_name, :worker_adapters, :dev_mode, :debug, :quiet,
13
+ :track_long_running_jobs,
14
+
15
+ # legacy configs, no longer used
16
+ :sidekiq_latency_for_active_jobs, :latency_for_active_jobs
11
17
 
12
18
  def initialize
19
+ @worker_adapters = prepare_worker_adapters
20
+
13
21
  # Allow the add-on name to be configured - needed for testing
14
22
  @addon_name = ENV['RAILS_AUTOSCALE_ADDON'] || 'RAILS_AUTOSCALE'
15
23
  @api_base_url = ENV["#{@addon_name}_URL"]
16
- @pid = Process.pid
24
+ @dev_mode = ENV['RAILS_AUTOSCALE_DEV'] == 'true'
25
+ @debug = dev_mode? || ENV['RAILS_AUTOSCALE_DEBUG'] == 'true'
26
+ @track_long_running_jobs = ENV['RAILS_AUTOSCALE_LONG_JOBS'] == 'true'
17
27
  @max_request_size = 100_000 # ignore request payloads over 100k since they skew the queue times
18
- @report_interval = 60 # this default will be overwritten during Reporter#register!
28
+ @report_interval = 10 # this default will be overwritten during Reporter#register!
19
29
  @logger ||= defined?(Rails) ? Rails.logger : ::Logger.new(STDOUT)
20
- @dyno = ENV['DYNO']
21
- @worker_adapters = [
22
- WorkerAdapters::Sidekiq.new,
23
- ]
30
+ @dyno = dev_mode? ? 'dev.1' : ENV['DYNO']
24
31
  end
25
32
 
26
33
  def to_s
27
- "#{@dyno}##{@pid}"
34
+ "#{@dyno}##{Process.pid}"
28
35
  end
29
36
 
30
37
  def ignore_large_requests?
31
38
  @max_request_size
32
39
  end
33
40
 
41
+ alias_method :dev_mode?, :dev_mode
42
+ alias_method :debug?, :debug
43
+ alias_method :quiet?, :quiet
44
+
45
+ private
46
+
47
+ def prepare_worker_adapters
48
+ adapter_names = (ENV['RAILS_AUTOSCALE_WORKER_ADAPTER'] || DEFAULT_WORKER_ADAPTERS).split(',')
49
+ adapter_names.map do |adapter_name|
50
+ require "rails_autoscale_agent/worker_adapters/#{adapter_name}"
51
+ adapter_constant_name = adapter_name.capitalize.gsub(/(?:_)(.)/i) { $1.upcase }
52
+ WorkerAdapters.const_get(adapter_constant_name).instance
53
+ end
54
+ end
34
55
  end
35
56
  end