rails_autoscale_agent 0.9.0.beta.4 → 0.9.0.beta.5
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/.vscode/tasks.json +6 -5
- data/Gemfile +13 -1
- data/lib/rails_autoscale_agent/version.rb +1 -1
- data/lib/rails_autoscale_agent/worker_adapters/delayed_job.rb +21 -34
- data/lib/rails_autoscale_agent/worker_adapters/que.rb +24 -17
- data/lib/rails_autoscale_agent/worker_adapters/resque.rb +12 -1
- data/lib/rails_autoscale_agent/worker_adapters/sidekiq.rb +18 -1
- data/rails_autoscale_agent.gemspec +0 -12
- metadata +3 -157
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f151c5012b2d2a5bb76f17ed4b4ee7f8f751ef9657c7f4b9d42d4d86fda7c654
|
4
|
+
data.tar.gz: 4773c138b97d723aa44f803ccb504facdf4c619995122296561933b5363d8910
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 432f9ea93f5c722f286a0bec54f22c477583f0b0501cff64498f2d710fdd5e3f674753443d017ab43cefc04d0b8b2263227554992e84f023b13074392d004e15
|
7
|
+
data.tar.gz: 1ba59eb800d04044e78e2c5462fe373dc4d81e1b14de72d4a41f3454acf4a4a0739067f8371ad2d31372badf2c222dffc0b13c2ef0c01e542d12d218a6c1981f
|
data/.vscode/tasks.json
CHANGED
@@ -6,7 +6,8 @@
|
|
6
6
|
{
|
7
7
|
"label": "test: all",
|
8
8
|
"group": "test",
|
9
|
-
"command": "
|
9
|
+
"command": "bundle",
|
10
|
+
"args": ["exec", "rspec"],
|
10
11
|
"runOptions": {
|
11
12
|
"reevaluateOnRerun": false
|
12
13
|
},
|
@@ -31,8 +32,8 @@
|
|
31
32
|
{
|
32
33
|
"label": "test: file",
|
33
34
|
"group": "test",
|
34
|
-
"command": "
|
35
|
-
"args": ["${relativeFile}"],
|
35
|
+
"command": "bundle",
|
36
|
+
"args": ["exec", "rspec", "${relativeFile}"],
|
36
37
|
"runOptions": {
|
37
38
|
"reevaluateOnRerun": false
|
38
39
|
},
|
@@ -57,8 +58,8 @@
|
|
57
58
|
{
|
58
59
|
"label": "test: line",
|
59
60
|
"group": "test",
|
60
|
-
"command": "
|
61
|
-
"args": ["${relativeFile}:${lineNumber}"],
|
61
|
+
"command": "bundle",
|
62
|
+
"args": ["exec", "rspec", "${relativeFile}:${lineNumber}"],
|
62
63
|
"runOptions": {
|
63
64
|
"reevaluateOnRerun": false
|
64
65
|
},
|
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
|
@@ -8,63 +8,50 @@ module RailsAutoscaleAgent
|
|
8
8
|
include RailsAutoscaleAgent::Logger
|
9
9
|
include Singleton
|
10
10
|
|
11
|
-
|
11
|
+
attr_writer :queues
|
12
12
|
|
13
|
-
|
14
|
-
attr_accessor :queues
|
15
|
-
end
|
16
|
-
|
17
|
-
def initialize
|
13
|
+
def queues
|
18
14
|
# Track the known queues so we can continue reporting on queues that don't
|
19
|
-
#
|
20
|
-
|
21
|
-
|
22
|
-
|
15
|
+
# have enqueued jobs at the time of reporting.
|
16
|
+
# Assume a "default" queue so we always report *something*, even when nothing
|
17
|
+
# is enqueued.
|
18
|
+
@queues ||= Set.new(['default'])
|
23
19
|
end
|
24
20
|
|
25
21
|
def enabled?
|
26
|
-
defined? ::Delayed
|
22
|
+
if defined?(::Delayed::Job) && defined?(::Delayed::Backend::ActiveRecord)
|
23
|
+
logger.info "DelayedJob enabled (#{::ActiveRecord::Base.default_timezone})"
|
24
|
+
true
|
25
|
+
end
|
27
26
|
end
|
28
27
|
|
29
28
|
def collect!(store)
|
30
29
|
log_msg = String.new
|
31
30
|
t = Time.now.utc
|
32
|
-
|
31
|
+
sql = <<~SQL
|
32
|
+
SELECT COALESCE(queue, 'default'), min(run_at)
|
33
|
+
FROM delayed_jobs
|
34
|
+
WHERE locked_at IS NULL
|
35
|
+
AND failed_at IS NULL
|
36
|
+
GROUP BY queue
|
37
|
+
SQL
|
33
38
|
|
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
39
|
run_at_by_queue = Hash[ActiveRecord::Base.connection.select_rows(sql)]
|
37
|
-
|
40
|
+
self.queues |= run_at_by_queue.keys
|
38
41
|
|
39
42
|
queues.each do |queue|
|
40
43
|
run_at = run_at_by_queue[queue]
|
41
|
-
|
44
|
+
# DateTime.parse assumes a UTC string
|
45
|
+
run_at = DateTime.parse(run_at) if run_at.is_a?(String)
|
42
46
|
latency_ms = run_at ? ((t - run_at)*1000).ceil : 0
|
47
|
+
latency_ms = 0 if latency_ms < 0
|
43
48
|
|
44
|
-
queue = UNNAMED_QUEUE if queue.nil? || queue.empty?
|
45
49
|
store.push latency_ms, t, queue
|
46
50
|
log_msg << "dj.#{queue}=#{latency_ms} "
|
47
51
|
end
|
48
52
|
|
49
53
|
logger.debug log_msg unless log_msg.empty?
|
50
54
|
end
|
51
|
-
|
52
|
-
private
|
53
|
-
|
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
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
Delayed::Worker.plugins << plugin
|
67
|
-
end
|
68
55
|
end
|
69
56
|
end
|
70
57
|
end
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'rails_autoscale_agent/logger'
|
4
|
-
require 'time'
|
5
4
|
|
6
5
|
module RailsAutoscaleAgent
|
7
6
|
module WorkerAdapters
|
@@ -9,36 +8,44 @@ module RailsAutoscaleAgent
|
|
9
8
|
include RailsAutoscaleAgent::Logger
|
10
9
|
include Singleton
|
11
10
|
|
12
|
-
|
13
|
-
DEFAULT_QUEUES = ['default']
|
11
|
+
attr_writer :queues
|
14
12
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
13
|
+
def queues
|
14
|
+
# Track the known queues so we can continue reporting on queues that don't
|
15
|
+
# have enqueued jobs at the time of reporting.
|
16
|
+
# Assume a "default" queue so we always report *something*, even when nothing
|
17
|
+
# is enqueued.
|
18
|
+
@queues ||= Set.new(['default'])
|
21
19
|
end
|
22
20
|
|
23
21
|
def enabled?
|
24
|
-
defined?
|
22
|
+
if defined?(::Que)
|
23
|
+
logger.info "Que enabled (#{::ActiveRecord::Base.default_timezone})"
|
24
|
+
true
|
25
|
+
end
|
25
26
|
end
|
26
27
|
|
27
28
|
def collect!(store)
|
28
29
|
log_msg = String.new
|
29
|
-
t = Time.now
|
30
|
+
t = Time.now.utc
|
31
|
+
sql = <<~SQL
|
32
|
+
SELECT queue, min(run_at)
|
33
|
+
FROM que_jobs
|
34
|
+
WHERE finished_at IS NULL
|
35
|
+
AND expired_at IS NULL
|
36
|
+
AND error_count = 0
|
37
|
+
GROUP BY 1
|
38
|
+
SQL
|
30
39
|
|
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
40
|
run_at_by_queue = Hash[ActiveRecord::Base.connection.select_rows(sql)]
|
34
|
-
self.
|
41
|
+
self.queues |= run_at_by_queue.keys
|
35
42
|
|
36
|
-
|
43
|
+
queues.each do |queue|
|
37
44
|
run_at = run_at_by_queue[queue]
|
38
|
-
run_at =
|
45
|
+
run_at = DateTime.parse(run_at) if run_at.is_a?(String)
|
39
46
|
latency_ms = run_at ? ((t - run_at)*1000).ceil : 0
|
47
|
+
latency_ms = 0 if latency_ms < 0
|
40
48
|
|
41
|
-
queue = UNNAMED_QUEUE if queue.nil? || queue.empty?
|
42
49
|
store.push latency_ms, t, queue
|
43
50
|
log_msg << "que.#{queue}=#{latency_ms} "
|
44
51
|
end
|
@@ -8,8 +8,15 @@ module RailsAutoscaleAgent
|
|
8
8
|
include RailsAutoscaleAgent::Logger
|
9
9
|
include Singleton
|
10
10
|
|
11
|
+
attr_writer :queues
|
12
|
+
|
13
|
+
def queues
|
14
|
+
@queues ||= ['default']
|
15
|
+
end
|
16
|
+
|
11
17
|
def enabled?
|
12
18
|
require 'resque'
|
19
|
+
logger.info "Resque enabled"
|
13
20
|
true
|
14
21
|
rescue LoadError
|
15
22
|
false
|
@@ -18,7 +25,11 @@ module RailsAutoscaleAgent
|
|
18
25
|
def collect!(store)
|
19
26
|
log_msg = String.new
|
20
27
|
|
21
|
-
|
28
|
+
# Ensure we continue to collect metrics for known queue names, even when nothing is
|
29
|
+
# enqueued at the time. Without this, it will appears that the agent is no longer reporting.
|
30
|
+
self.queues |= ::Resque.queues
|
31
|
+
|
32
|
+
queues.each do |queue|
|
22
33
|
next if queue.nil? || queue.empty?
|
23
34
|
depth = ::Resque.size(queue)
|
24
35
|
store.push depth, Time.now, queue, :qd
|
@@ -8,8 +8,15 @@ module RailsAutoscaleAgent
|
|
8
8
|
include RailsAutoscaleAgent::Logger
|
9
9
|
include Singleton
|
10
10
|
|
11
|
+
attr_writer :known_queue_names
|
12
|
+
|
13
|
+
def known_queue_names
|
14
|
+
@known_queue_names ||= ['default']
|
15
|
+
end
|
16
|
+
|
11
17
|
def enabled?
|
12
18
|
require 'sidekiq/api'
|
19
|
+
logger.info "Sidekiq enabled"
|
13
20
|
true
|
14
21
|
rescue LoadError
|
15
22
|
false
|
@@ -17,8 +24,18 @@ module RailsAutoscaleAgent
|
|
17
24
|
|
18
25
|
def collect!(store)
|
19
26
|
log_msg = String.new
|
27
|
+
queues_by_name = ::Sidekiq::Queue.all.each_with_object({}) do |queue, obj|
|
28
|
+
obj[queue.name] = queue
|
29
|
+
end
|
30
|
+
|
31
|
+
# Ensure we continue to collect metrics for known queue names, even when nothing is
|
32
|
+
# enqueued at the time. Without this, it will appears that the agent is no longer reporting.
|
33
|
+
known_queue_names.each do |queue_name|
|
34
|
+
queues_by_name[queue_name] ||= ::Sidekiq::Queue.new(queue_name)
|
35
|
+
end
|
36
|
+
self.known_queue_names = queues_by_name.keys
|
20
37
|
|
21
|
-
|
38
|
+
queues_by_name.each do |queue_name, queue|
|
22
39
|
latency_ms = (queue.latency * 1000).ceil
|
23
40
|
depth = queue.size
|
24
41
|
store.push latency_ms, Time.now, queue.name, :qt
|
@@ -15,16 +15,4 @@ Gem::Specification.new do |spec|
|
|
15
15
|
|
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
|
-
|
19
|
-
spec.add_development_dependency "bundler", "~> 2.0"
|
20
|
-
spec.add_development_dependency "rake", "~> 12.3.3"
|
21
|
-
spec.add_development_dependency "rspec", "~> 3.0"
|
22
|
-
spec.add_development_dependency "vcr", "~> 3.0"
|
23
|
-
spec.add_development_dependency "webmock"
|
24
|
-
spec.add_development_dependency "pry"
|
25
|
-
spec.add_development_dependency "pry-byebug"
|
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"
|
30
18
|
end
|
metadata
CHANGED
@@ -1,169 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_autoscale_agent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.0.beta.
|
4
|
+
version: 0.9.0.beta.5
|
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-06-
|
12
|
-
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: bundler
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '2.0'
|
20
|
-
type: :development
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: '2.0'
|
27
|
-
- !ruby/object:Gem::Dependency
|
28
|
-
name: rake
|
29
|
-
requirement: !ruby/object:Gem::Requirement
|
30
|
-
requirements:
|
31
|
-
- - "~>"
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: 12.3.3
|
34
|
-
type: :development
|
35
|
-
prerelease: false
|
36
|
-
version_requirements: !ruby/object:Gem::Requirement
|
37
|
-
requirements:
|
38
|
-
- - "~>"
|
39
|
-
- !ruby/object:Gem::Version
|
40
|
-
version: 12.3.3
|
41
|
-
- !ruby/object:Gem::Dependency
|
42
|
-
name: rspec
|
43
|
-
requirement: !ruby/object:Gem::Requirement
|
44
|
-
requirements:
|
45
|
-
- - "~>"
|
46
|
-
- !ruby/object:Gem::Version
|
47
|
-
version: '3.0'
|
48
|
-
type: :development
|
49
|
-
prerelease: false
|
50
|
-
version_requirements: !ruby/object:Gem::Requirement
|
51
|
-
requirements:
|
52
|
-
- - "~>"
|
53
|
-
- !ruby/object:Gem::Version
|
54
|
-
version: '3.0'
|
55
|
-
- !ruby/object:Gem::Dependency
|
56
|
-
name: vcr
|
57
|
-
requirement: !ruby/object:Gem::Requirement
|
58
|
-
requirements:
|
59
|
-
- - "~>"
|
60
|
-
- !ruby/object:Gem::Version
|
61
|
-
version: '3.0'
|
62
|
-
type: :development
|
63
|
-
prerelease: false
|
64
|
-
version_requirements: !ruby/object:Gem::Requirement
|
65
|
-
requirements:
|
66
|
-
- - "~>"
|
67
|
-
- !ruby/object:Gem::Version
|
68
|
-
version: '3.0'
|
69
|
-
- !ruby/object:Gem::Dependency
|
70
|
-
name: webmock
|
71
|
-
requirement: !ruby/object:Gem::Requirement
|
72
|
-
requirements:
|
73
|
-
- - ">="
|
74
|
-
- !ruby/object:Gem::Version
|
75
|
-
version: '0'
|
76
|
-
type: :development
|
77
|
-
prerelease: false
|
78
|
-
version_requirements: !ruby/object:Gem::Requirement
|
79
|
-
requirements:
|
80
|
-
- - ">="
|
81
|
-
- !ruby/object:Gem::Version
|
82
|
-
version: '0'
|
83
|
-
- !ruby/object:Gem::Dependency
|
84
|
-
name: pry
|
85
|
-
requirement: !ruby/object:Gem::Requirement
|
86
|
-
requirements:
|
87
|
-
- - ">="
|
88
|
-
- !ruby/object:Gem::Version
|
89
|
-
version: '0'
|
90
|
-
type: :development
|
91
|
-
prerelease: false
|
92
|
-
version_requirements: !ruby/object:Gem::Requirement
|
93
|
-
requirements:
|
94
|
-
- - ">="
|
95
|
-
- !ruby/object:Gem::Version
|
96
|
-
version: '0'
|
97
|
-
- !ruby/object:Gem::Dependency
|
98
|
-
name: pry-byebug
|
99
|
-
requirement: !ruby/object:Gem::Requirement
|
100
|
-
requirements:
|
101
|
-
- - ">="
|
102
|
-
- !ruby/object:Gem::Version
|
103
|
-
version: '0'
|
104
|
-
type: :development
|
105
|
-
prerelease: false
|
106
|
-
version_requirements: !ruby/object:Gem::Requirement
|
107
|
-
requirements:
|
108
|
-
- - ">="
|
109
|
-
- !ruby/object:Gem::Version
|
110
|
-
version: '0'
|
111
|
-
- !ruby/object:Gem::Dependency
|
112
|
-
name: sidekiq
|
113
|
-
requirement: !ruby/object:Gem::Requirement
|
114
|
-
requirements:
|
115
|
-
- - "~>"
|
116
|
-
- !ruby/object:Gem::Version
|
117
|
-
version: '5.0'
|
118
|
-
type: :development
|
119
|
-
prerelease: false
|
120
|
-
version_requirements: !ruby/object:Gem::Requirement
|
121
|
-
requirements:
|
122
|
-
- - "~>"
|
123
|
-
- !ruby/object:Gem::Version
|
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'
|
11
|
+
date: 2020-06-28 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
167
13
|
description:
|
168
14
|
email:
|
169
15
|
- adam@adamlogic.com
|