rails-autoscale-core 1.5.0 → 1.5.2

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