rails-autoscale-core 1.5.0 → 1.5.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: 3a22cddac1042235674c4791e42efaefc877d395b1f30d1be5cd41eea9f305e8
4
- data.tar.gz: 40881260d060de8799c14ce08142eb6e3d524bc5f91f36157d3a5e4879e32e47
3
+ metadata.gz: 03aadf04a101c5dfdaf9a715a25f36d3304943833c4feeba551c11645590418c
4
+ data.tar.gz: 8e46c89f87301ff458ae77640ebf1dad10abf53ffde7110448d4c6c6ffafd5c0
5
5
  SHA512:
6
- metadata.gz: 8cc88cc9824d09c1b4066d02ebf0dd8c8af4605e3d2fa2949523248494064f3f70fdf25e151674b85b6a71b3badeb7a8ddeb93c4cf00cb2d74db136f53817d49
7
- data.tar.gz: ab01d857a7a2b9c244cced61071ac265e2a07929cba1042108f01b40af9fba182f5817bd877ef727ff6c6123528a28a1170ce559495f4d9fb3bd4630efcabde0
6
+ metadata.gz: 1a754daf2618a1e9d7a7dadd773b798493ecdbbfc27882231df528170ffa44e159941bd7f52ecf1878df53e50291abd9b00aafbe8938ae3f263aa1accb4fa700
7
+ data.tar.gz: f3b11817285f7afbc3c656419d06f797d75f829ec329cd6a526ec51ea2322fb4a060e3d9fe4c827eb89e03b99fc58999d01f794308d0aead18013b81cbded9db
data/Gemfile CHANGED
@@ -4,5 +4,6 @@ gemspec name: "judoscale-ruby"
4
4
 
5
5
  gem "rake", ">= 12.3.3"
6
6
  gem "minitest"
7
+ gem "minitest-stub-const"
7
8
  gem "webmock"
8
9
  gem "debug"
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- judoscale-ruby (1.5.0)
4
+ judoscale-ruby (1.5.2)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -18,6 +18,7 @@ GEM
18
18
  irb (1.6.2)
19
19
  reline (>= 0.3.0)
20
20
  minitest (5.17.0)
21
+ minitest-stub-const (0.6)
21
22
  public_suffix (5.0.1)
22
23
  rake (13.0.6)
23
24
  reline (0.3.2)
@@ -39,6 +40,7 @@ DEPENDENCIES
39
40
  debug
40
41
  judoscale-ruby!
41
42
  minitest
43
+ minitest-stub-const
42
44
  rake (>= 12.3.3)
43
45
  webmock
44
46
 
@@ -65,7 +65,7 @@ module Judoscale
65
65
  end
66
66
 
67
67
  attr_accessor :api_base_url, :report_interval_seconds,
68
- :max_request_size_bytes, :logger, :log_tag, :current_runtime_container
68
+ :max_request_size_bytes, :logger, :log_tag, :current_runtime_container, :allow_rake_tasks
69
69
  attr_reader :log_level
70
70
 
71
71
  def initialize
@@ -77,6 +77,7 @@ module Judoscale
77
77
  @log_tag = "Judoscale"
78
78
  @max_request_size_bytes = 100_000 # ignore request payloads over 100k since they skew the queue times
79
79
  @report_interval_seconds = 10
80
+ @allow_rake_tasks = []
80
81
 
81
82
  self.log_level = ENV["JUDOSCALE_LOG_LEVEL"] || ENV["RAILS_AUTOSCALE_LOG_LEVEL"]
82
83
  @logger = ::Logger.new($stdout)
@@ -86,7 +87,9 @@ module Judoscale
86
87
  if ENV["RENDER_INSTANCE_ID"]
87
88
  instance = ENV["RENDER_INSTANCE_ID"].delete_prefix(ENV["RENDER_SERVICE_ID"]).delete_prefix("-")
88
89
  @current_runtime_container = RuntimeContainer.new instance
89
- @api_base_url ||= "https://adapter.judoscale.com/api/#{ENV["RENDER_SERVICE_ID"]}"
90
+ # Allow a custom API base URL to be set for Render (for testing)
91
+ @api_base_url ||= "https://adapter.judoscale.com/api"
92
+ @api_base_url += "/#{ENV["RENDER_SERVICE_ID"]}"
90
93
  elsif ENV["DYNO"]
91
94
  @current_runtime_container = RuntimeContainer.new ENV["DYNO"]
92
95
  elsif (metadata_uri = ENV["ECS_CONTAINER_METADATA_URI"])
@@ -12,6 +12,13 @@ module Judoscale
12
12
  sql
13
13
  end
14
14
 
15
+ # This will respect a multiple-database setup, unlike the `table_exists?` method.
16
+ def self.table_exists_for_model?(model)
17
+ model.connection.schema_cache.data_source_exists?(model.table_name)
18
+ rescue ActiveRecord::NoDatabaseError
19
+ false
20
+ end
21
+
15
22
  def self.table_exists?(table_name)
16
23
  ::ActiveRecord::Base.connection.table_exists?(table_name)
17
24
  rescue ActiveRecord::NoDatabaseError
@@ -9,7 +9,7 @@ module Judoscale
9
9
  include Judoscale::Logger
10
10
 
11
11
  def self.collect?(config)
12
- !config.current_runtime_container.redundant_instance? && adapter_config.enabled
12
+ super && !config.current_runtime_container.redundant_instance? && adapter_config.enabled
13
13
  end
14
14
 
15
15
  def self.adapter_name
@@ -3,11 +3,23 @@
3
3
  module Judoscale
4
4
  class MetricsCollector
5
5
  def self.collect?(config)
6
- true
6
+ in_rake_task = defined?(::Rake) && Rake.respond_to?(:application) && Rake.application.top_level_tasks.any?
7
+ in_generator = defined?(::Rails::Command::GenerateCommand)
8
+
9
+ !in_generator && (!in_rake_task || in_whitelisted_rake_tasks?(config.allow_rake_tasks))
7
10
  end
8
11
 
9
12
  def collect
10
13
  []
11
14
  end
15
+
16
+ def self.in_whitelisted_rake_tasks?(allowed_rake_tasks)
17
+ # Get the tasks that were invoked from the command line.
18
+ tasks = Rake.application.top_level_tasks
19
+
20
+ allowed_rake_tasks.any? do |task_regex|
21
+ tasks.any? { |task| task =~ task_regex }
22
+ end
23
+ end
12
24
  end
13
25
  end
@@ -20,23 +20,26 @@ module Judoscale
20
20
  @pid = Process.pid
21
21
 
22
22
  if !config.api_base_url
23
- logger.debug "Reporter not started: JUDOSCALE_URL is not set"
23
+ logger.debug "Set api_base_url to enable metrics reporting"
24
24
  return
25
25
  end
26
26
 
27
- enabled_adapters = adapters.select { |adapter|
28
- adapter.metrics_collector.nil? || adapter.metrics_collector.collect?(config)
27
+ enabled_adapters, skipped_adapters = adapters.partition { |adapter|
28
+ if adapter.metrics_collector&.collect?(config)
29
+ adapter.enabled = true
30
+ end
29
31
  }
30
32
  metrics_collectors_classes = enabled_adapters.map(&:metrics_collector)
31
- metrics_collectors_classes.compact!
33
+ adapters_msg = enabled_adapters.map(&:identifier).concat(
34
+ skipped_adapters.map { |adapter| "#{adapter.identifier}[skipped]" }
35
+ ).join(", ")
32
36
 
33
37
  if metrics_collectors_classes.empty?
34
- logger.debug "Reporter not started: no metrics need to be collected in this process"
38
+ logger.debug "No metrics need to be collected (adapters: #{adapters_msg})"
35
39
  return
36
40
  end
37
41
 
38
- adapters_msg = enabled_adapters.map(&:identifier).join(", ")
39
- logger.info "Reporter starting, will report every #{config.report_interval_seconds} seconds or so. Adapters: [#{adapters_msg}]"
42
+ logger.info "Reporter starting, will report every ~#{config.report_interval_seconds} seconds (adapters: #{adapters_msg})"
40
43
 
41
44
  metrics_collectors = metrics_collectors_classes.map(&:new)
42
45
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Judoscale
4
- VERSION = "1.5.0"
4
+ VERSION = "1.5.2"
5
5
  end
@@ -20,9 +20,18 @@ module Judoscale
20
20
  attr_reader :adapters
21
21
  end
22
22
 
23
- Adapter = Struct.new(:identifier, :adapter_info, :metrics_collector) do
23
+ class Adapter < Struct.new(:identifier, :adapter_info, :metrics_collector)
24
+ attr_accessor :enabled
25
+
26
+ def initialize(identifier, adapter_info, metrics_collector)
27
+ super
28
+ self.enabled = false
29
+ end
30
+
24
31
  def as_json
25
- {identifier => adapter_info}
32
+ {
33
+ identifier => adapter_info.merge(enabled: enabled)
34
+ }
26
35
  end
27
36
  end
28
37
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-autoscale-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 1.5.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam McCrea
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2023-07-21 00:00:00.000000000 Z
13
+ date: 2023-08-10 00:00:00.000000000 Z
14
14
  dependencies: []
15
15
  description:
16
16
  email: