judoscale-rails 1.11.0 → 1.12.0

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: 5af8c7881148adca3b0b924b30918cc0a99962c71d02c54b4ea66a19313c3845
4
- data.tar.gz: 061baca32fd8dc5f05ff67524e7147d9cb803c9a3966935ff764141215a2d382
3
+ metadata.gz: cd84a96b80ba7ac1ad9e1fbfd1150e3046c6a0985f4eb9aa947a85018d6fb11b
4
+ data.tar.gz: 6ff5e46eb8ef7733b883348cea95bdf4cb014e030993428aa7d565f21a76ddbf
5
5
  SHA512:
6
- metadata.gz: 58163866506c2ef25a3306a344f96ffa41ce83c8d3802e249b4914601e2787eb160e3509507c10bd73da6a86fbde08212547875f7239526bb3fcc95aa0da7da8
7
- data.tar.gz: 3de499c651b8744a05911834bcc40a85340ea2c4b6cbe7f480c6afd126bf5cc21996563b2e85c57109015c5f1e4a4be57fa4d2860f633891b72c84067c7b5f36
6
+ metadata.gz: fe7ed89ede18c54380c6e86d16a18f71196200f018c4c679b6a4af85b49df8f6ce096310233fecf200f3777b03ffeffc80f8fbbcaf7a0ab9b7aeb11eded5996b
7
+ data.tar.gz: 3a518c809357e5323d599982987d158368bd480ae0be3153cf82ff710d62e9485c57e367b3583a038e5a6fcfe619906777fc31d7d3366d2e5aa895ef56e82c21
@@ -3,15 +3,12 @@ require "judoscale/config"
3
3
  module Judoscale
4
4
  module Rails
5
5
  module Config
6
- attr_accessor :start_reporter_after_initialize, :rake_task_ignore_regex, :utilization_enabled, :utilization_interval
6
+ attr_accessor :start_reporter_after_initialize, :rake_task_ignore_regex
7
7
 
8
8
  def reset
9
9
  super
10
10
  @start_reporter_after_initialize = true
11
11
  @rake_task_ignore_regex = /assets:|db:/
12
-
13
- @utilization_enabled = ENV["JUDOSCALE_UTILIZATION_ENABLED"] == "true"
14
- @utilization_interval = (ENV["JUDOSCALE_UTILIZATION_INTERVAL"] || 1.0).to_f
15
12
  end
16
13
  end
17
14
 
@@ -1,16 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "rails"
4
- require "rails/railtie"
4
+ require "rails/engine"
5
5
  require "judoscale/request_middleware"
6
6
  require "judoscale/rails/config"
7
- require "judoscale/rails/utilization_middleware"
8
7
  require "judoscale/logger"
9
8
  require "judoscale/reporter"
10
9
 
11
10
  module Judoscale
12
11
  module Rails
13
- class Railtie < ::Rails::Railtie
12
+ # Inherit from `Engine`, even though we use none its specific features (yet), so we can safely rely
13
+ # on `load_config_initializers` to setup our initializers and avoid loading `config/initializers/*`
14
+ # too early, otherwise we can run into initialization order conflicts with other libraries like
15
+ # `Sentry` and `Scout`, which patch Ruby classes in different ways (`prepend` vs `alias_method`),
16
+ # and may cause `stack level too deep` errors if they are loaded too early in the init process.
17
+ class Railtie < ::Rails::Engine
14
18
  include Judoscale::Logger
15
19
 
16
20
  def in_rails_console_or_runner?
@@ -36,12 +40,6 @@ module Judoscale
36
40
  app.middleware.insert_before Rack::Runtime, RequestMiddleware
37
41
  end
38
42
 
39
- initializer "judoscale.utilization_middleware", after: :load_config_initializers do |app|
40
- if judoscale_config.utilization_enabled
41
- app.middleware.insert_before RequestMiddleware, UtilizationMiddleware, interval: judoscale_config.utilization_interval
42
- end
43
- end
44
-
45
43
  config.after_initialize do
46
44
  if in_rails_console_or_runner?
47
45
  logger.debug "No reporting since we're in a Rails console or runner process"
metadata CHANGED
@@ -1,16 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: judoscale-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.11.0
4
+ version: 1.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Adam McCrea
8
8
  - Carlos Antonio da Silva
9
9
  - Jon Sullivan
10
- autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2025-04-28 00:00:00.000000000 Z
12
+ date: 1980-01-02 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: judoscale-ruby
@@ -18,14 +17,14 @@ dependencies:
18
17
  requirements:
19
18
  - - '='
20
19
  - !ruby/object:Gem::Version
21
- version: 1.11.0
20
+ version: 1.12.0
22
21
  type: :runtime
23
22
  prerelease: false
24
23
  version_requirements: !ruby/object:Gem::Requirement
25
24
  requirements:
26
25
  - - '='
27
26
  - !ruby/object:Gem::Version
28
- version: 1.11.0
27
+ version: 1.12.0
29
28
  - !ruby/object:Gem::Dependency
30
29
  name: railties
31
30
  requirement: !ruby/object:Gem::Requirement
@@ -40,7 +39,6 @@ dependencies:
40
39
  - - ">="
41
40
  - !ruby/object:Gem::Version
42
41
  version: '0'
43
- description:
44
42
  email:
45
43
  - hello@judoscale.com
46
44
  executables: []
@@ -51,7 +49,6 @@ files:
51
49
  - lib/judoscale/rails.rb
52
50
  - lib/judoscale/rails/config.rb
53
51
  - lib/judoscale/rails/railtie.rb
54
- - lib/judoscale/rails/utilization_middleware.rb
55
52
  homepage: https://judoscale.com
56
53
  licenses:
57
54
  - MIT
@@ -61,7 +58,6 @@ metadata:
61
58
  documentation_uri: https://judoscale.com/docs
62
59
  changelog_uri: https://github.com/judoscale/judoscale-ruby/blob/main/CHANGELOG.md
63
60
  source_code_uri: https://github.com/judoscale/judoscale-ruby
64
- post_install_message:
65
61
  rdoc_options: []
66
62
  require_paths:
67
63
  - lib
@@ -76,8 +72,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
76
72
  - !ruby/object:Gem::Version
77
73
  version: '0'
78
74
  requirements: []
79
- rubygems_version: 3.5.22
80
- signing_key:
75
+ rubygems_version: 3.6.9
81
76
  specification_version: 4
82
77
  summary: Autoscaling for Ruby on Rails applications.
83
78
  test_files: []
@@ -1,70 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "singleton"
4
- require "concurrent"
5
- require "judoscale/metrics_store"
6
-
7
- module Judoscale
8
- module Rails
9
- class UtilizationMiddleware
10
- def initialize(app, interval:)
11
- @app = app
12
- @interval = interval
13
- end
14
-
15
- def call(env)
16
- tracker = UtilizationTracker.instance
17
- tracker.start!(interval: @interval)
18
- tracker.incr
19
-
20
- @app.call(env)
21
- ensure
22
- tracker.decr
23
- end
24
- end
25
-
26
- class UtilizationTracker
27
- include Singleton
28
-
29
- def initialize
30
- @active_request_counter = Concurrent::AtomicFixnum.new(0)
31
- @thread_ref = Concurrent::AtomicReference.new(nil)
32
- end
33
-
34
- def start!(interval:)
35
- @thread_ref.update do |current_thread|
36
- next current_thread if current_thread&.alive?
37
-
38
- Thread.new do
39
- # Advise multi-threaded app servers to ignore this thread for the purposes of fork safety warnings.
40
- Thread.current.thread_variable_set(:fork_safe, true)
41
-
42
- loop do
43
- sleep interval
44
- track_current_state
45
- end
46
- end
47
- end
48
- end
49
-
50
- def incr
51
- @active_request_counter.increment
52
- end
53
-
54
- def decr
55
- @active_request_counter.decrement
56
- end
57
-
58
- def track_current_state
59
- active_requests = @active_request_counter.value
60
- active_processes = (active_requests > 0) ? 1 : 0
61
- time = Time.now.utc
62
-
63
- MetricsStore.instance.tap do |store|
64
- store.push :pu, active_processes, time # pu = process utilization
65
- store.push :ru, active_requests, time # ru = request utilization
66
- end
67
- end
68
- end
69
- end
70
- end