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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 70253908c027308ec4d19c9b41eeed033759e6669eace3301925a65a64748447
4
- data.tar.gz: 199e75a27f4708920b47964cbc75e2b705ddce88508c35fd614512bb9bfcfd5e
3
+ metadata.gz: f151c5012b2d2a5bb76f17ed4b4ee7f8f751ef9657c7f4b9d42d4d86fda7c654
4
+ data.tar.gz: 4773c138b97d723aa44f803ccb504facdf4c619995122296561933b5363d8910
5
5
  SHA512:
6
- metadata.gz: af5043f8402b40c15b5efe0be205e0e4c6107b8d05ea7126ccfa445c28679567c7e0f15e2a01eb2b7e107c95d3802543c48f428c31f70be823953173cd903ae1
7
- data.tar.gz: 1fcfa15d0c76a8f1abf38653890d6b2157fd2e4edfc2ac072eb198897ab09029ea3f1c83ee11620e13a1a07a379695d7913c5bed89ce51e1907451367e61b1df
6
+ metadata.gz: 432f9ea93f5c722f286a0bec54f22c477583f0b0501cff64498f2d710fdd5e3f674753443d017ab43cefc04d0b8b2263227554992e84f023b13074392d004e15
7
+ data.tar.gz: 1ba59eb800d04044e78e2c5462fe373dc4d81e1b14de72d4a41f3454acf4a4a0739067f8371ad2d31372badf2c222dffc0b13c2ef0c01e542d12d218a6c1981f
@@ -6,7 +6,8 @@
6
6
  {
7
7
  "label": "test: all",
8
8
  "group": "test",
9
- "command": "rspec",
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": "rspec",
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": "rspec",
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RailsAutoscaleAgent
4
- VERSION = "0.9.0.beta.4"
4
+ VERSION = "0.9.0.beta.5"
5
5
  end
@@ -8,63 +8,50 @@ module RailsAutoscaleAgent
8
8
  include RailsAutoscaleAgent::Logger
9
9
  include Singleton
10
10
 
11
- UNNAMED_QUEUE = '[unnamed]'
11
+ attr_writer :queues
12
12
 
13
- class << self
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
- # currently have enqueued jobs.
20
- self.class.queues = Set.new
21
-
22
- install if enabled?
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
- db_time = t.strftime('%Y-%m-%d %H:%M:%S')
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
- queues = self.class.queues | run_at_by_queue.keys
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
- run_at = Time.parse(run_at) if run_at.is_a?(String)
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
- UNNAMED_QUEUE = '[unnamed]'
13
- DEFAULT_QUEUES = ['default']
11
+ attr_writer :queues
14
12
 
15
- class << self
16
- attr_accessor :queues
17
- end
18
-
19
- def initialize
20
- self.class.queues = DEFAULT_QUEUES
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? ::Que
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.class.queues |= run_at_by_queue.keys
41
+ self.queues |= run_at_by_queue.keys
35
42
 
36
- self.class.queues.each do |queue|
43
+ queues.each do |queue|
37
44
  run_at = run_at_by_queue[queue]
38
- run_at = Time.parse(run_at) if run_at.is_a?(String)
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
- ::Resque.queues.each do |queue|
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
- ::Sidekiq::Queue.all.each do |queue|
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
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-17 00:00:00.000000000 Z
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