rails_autoscale_agent 0.9.0.beta.4 → 0.9.0.beta.5

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: 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