kubernetes-health 3.10.1 → 3.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 +4 -4
- data/README.md +27 -7
- data/config/initializers/enable_rack_on_sidekiq.rb +1 -1
- data/lib/kubernetes/health/config.rb +11 -1
- data/lib/kubernetes/health/{lock_on_migrate.rake → lock_on_rake.rake} +2 -3
- data/lib/kubernetes/health/rack_on_rake.rake +10 -0
- data/lib/kubernetes/health/{rack_on_migrate.rb → rack_on_rake.rb} +2 -2
- data/lib/kubernetes/health/railtie.rb +4 -2
- data/lib/kubernetes/health/version.rb +1 -1
- data/lib/puma/kubernetes/app.rb +3 -1
- data/lib/puma/plugin/kubernetes.rb +1 -1
- metadata +5 -5
- data/lib/kubernetes/health/rack_on_migrate.rake +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9db3c40048a1127229efee6653df4da36ef6d38ef1b57ab51677073fecdede0d
|
4
|
+
data.tar.gz: 12402ee8b8e151cb4c5992d63fc37607f6ae7ae070e6e8fb57862825ec0b7146
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 598d564124cc3ff32b959538f4e3d9d9863c058ece7eadc9dd37fccfbdd4fe1010b503382a24d319d690c87a12bf3a81f8b1c7717ddb3ae954d7c9f242a7db0b
|
7
|
+
data.tar.gz: 8c8bd4f687f964583cb2390bd7c43f141173bb8273a47fed82269e4829a36c43a92bcfa681e5c13e104be2488c905f65361714e1ca4e46e6e38a89406e2e210d
|
data/README.md
CHANGED
@@ -16,7 +16,7 @@ This gem open a HTTP port for monitoring your rails app while it is running Migr
|
|
16
16
|
Add this line to your application's Gemfile:
|
17
17
|
|
18
18
|
```ruby
|
19
|
-
gem 'kubernetes-health', '~> 3.
|
19
|
+
gem 'kubernetes-health', '~> 3.7'
|
20
20
|
```
|
21
21
|
|
22
22
|
## Enabling puma plugin
|
@@ -50,7 +50,7 @@ In Kubernetes you need to configure your deployment `readinessProbe` and `livene
|
|
50
50
|
|
51
51
|
Setting `failureThreshold` is import to avoid problems when app finish migrates and is starting the web process.
|
52
52
|
|
53
|
-
## Enabling
|
53
|
+
## Enabling liveness/readiness routes while `rake db:migrate` runs
|
54
54
|
|
55
55
|
Your Dockerfile's entry script needs to run migrates before start your web app.
|
56
56
|
|
@@ -62,9 +62,28 @@ or add in your `application.rb`.
|
|
62
62
|
# default: false
|
63
63
|
Kubernetes::Health::Config.enable_rack_on_migrate = true
|
64
64
|
```
|
65
|
-
The defined port at `config/puma.rb` will be used.
|
65
|
+
The defined port at `config/puma.rb` will be used but can be overrided by `KUBERNETES_HEALTH_METRICS_PORT` env var.
|
66
66
|
|
67
|
-
## Enabling
|
67
|
+
## Enabling liveness/readiness routes while any `rake` tasks runs
|
68
|
+
|
69
|
+
If you need to run another rake tasks than `db:migrate`, like `assets:precompile`, you can enable the monitoring routes by this way:
|
70
|
+
|
71
|
+
Add a `rake` file enhancing the original task by using `kubernetes_health:rack_on_rake` task. For example:
|
72
|
+
|
73
|
+
```
|
74
|
+
# File: lib/tasks/kubernetes_health_enable_rack_on_assets_precompile.rake
|
75
|
+
Rake::Task['assets:precompile'].enhance(['kubernetes_health:rack_on_rake'])
|
76
|
+
```
|
77
|
+
|
78
|
+
```
|
79
|
+
# File: lib/tasks/kubernetes_health_enable_rack_on_assets_clobber.rake
|
80
|
+
Rake::Task['assets:clobber'].enhance(['kubernetes_health:rack_on_rake'])
|
81
|
+
```
|
82
|
+
|
83
|
+
I do recomend doing some check to make it only enables in K8S environment.
|
84
|
+
The defined port at `config/puma.rb` will be used but can be overrided by `KUBERNETES_HEALTH_METRICS_PORT` env var.
|
85
|
+
|
86
|
+
## Enabling liveness/readiness routes for `sidekiq`
|
68
87
|
|
69
88
|
Add `KUBERNETES_HEALTH_ENABLE_RACK_ON_SIDEKIQ=true` environment variable.
|
70
89
|
|
@@ -74,10 +93,11 @@ or add in your `application.rb`.
|
|
74
93
|
# default: false
|
75
94
|
Kubernetes::Health::Config.enable_rack_on_sidekiq = true
|
76
95
|
```
|
77
|
-
The defined port at `config/puma.rb` will be used.
|
96
|
+
The defined port at `config/puma.rb` will be used but can be overrided by `KUBERNETES_HEALTH_METRICS_PORT` env var.
|
78
97
|
|
79
|
-
### How `rake
|
98
|
+
### How `rake` and `sidekiq` monitoring works
|
80
99
|
It will run a RACK server for `/_readiness`, `/_liveness` and `/_metrics`.
|
100
|
+
The liveness route will respond using `200` but readiness `503`.
|
81
101
|
|
82
102
|
## Avoiding migrations running in parallel and making kubernetes happy.
|
83
103
|
Rails already avoid migrations running in parallel, but it raise exceptions. This gem will just wait for other migrations without exit.
|
@@ -97,7 +117,7 @@ Kubernetes::Health::Config.enable_lock_on_migrate = true
|
|
97
117
|
By default it is working for PostgreSQL, but you can customize it using a lambda:
|
98
118
|
```
|
99
119
|
Kubernetes::Health::Config.lock_or_wait = lambda {
|
100
|
-
|
120
|
+
ActiveRecord::Base.connection.execute "SET lock_timeout TO '3600s'; SELECT pg_advisory_lock(123456789123456789);"
|
101
121
|
}
|
102
122
|
|
103
123
|
Kubernetes::Health::Config.unlock = lambda {
|
@@ -2,6 +2,6 @@ require 'kubernetes/health/rack_on_sidekiq'
|
|
2
2
|
|
3
3
|
if Kubernetes::Health::Config.enable_rack_on_sidekiq && Kubernetes::Health::SidekiqOptionsResolver[:concurrency].positive?
|
4
4
|
Thread.new do
|
5
|
-
Rack::Handler.
|
5
|
+
Rack::Handler::WEBrick.run Kubernetes::Health::RackOnSidekiq.new, { Port: Kubernetes::Health::Config.metrics_port }
|
6
6
|
end
|
7
7
|
end
|
@@ -1,8 +1,10 @@
|
|
1
1
|
module Kubernetes
|
2
2
|
module Health
|
3
3
|
class Config
|
4
|
+
METRICS_PORT_FROM_PUMA_CONFIG = File.read(File.join(Rails.root, 'config', 'puma.rb')).match(/kubernetes_url\s.+:(?<metrics_port>\d+)/)['metrics_port'] rescue nil
|
4
5
|
@@live_if = lambda { true }
|
5
6
|
@@ready_if = lambda { true }
|
7
|
+
@@metrics_port = ENV['KUBERNETES_HEALTH_METRICS_PORT'] || METRICS_PORT_FROM_PUMA_CONFIG || 9393
|
6
8
|
@@enable_lock_on_migrate = [true, 'true'].include? ENV['KUBERNETES_HEALTH_ENABLE_LOCK_ON_MIGRATE']
|
7
9
|
@@enable_rack_on_migrate = [true, 'true'].include? ENV['KUBERNETES_HEALTH_ENABLE_RACK_ON_MIGRATE']
|
8
10
|
@@enable_rack_on_sidekiq = [true, 'true'].include? ENV['KUBERNETES_HEALTH_ENABLE_RACK_ON_SIDEKIQ']
|
@@ -15,7 +17,7 @@ module Kubernetes
|
|
15
17
|
Rails.logger.debug "Kubernetes Health - Request: Path: #{req.path_info} / Params: #{req.params} / HTTP Code: #{http_code}\n#{content}" rescue nil
|
16
18
|
}
|
17
19
|
|
18
|
-
@@lock_or_wait = lambda { ActiveRecord::Base.connection.execute '
|
20
|
+
@@lock_or_wait = lambda { ActiveRecord::Base.connection.execute "SET lock_timeout TO '3600s'; SELECT pg_advisory_lock(123456789123456789);" }
|
19
21
|
@@unlock = lambda { ActiveRecord::Base.connection.execute 'select pg_advisory_unlock(123456789123456789);' }
|
20
22
|
|
21
23
|
def self.lock_or_wait
|
@@ -113,6 +115,14 @@ module Kubernetes
|
|
113
115
|
def self.response_format=(value)
|
114
116
|
@@response_format = value
|
115
117
|
end
|
118
|
+
|
119
|
+
def self.metrics_port
|
120
|
+
@@metrics_port
|
121
|
+
end
|
122
|
+
|
123
|
+
def self.metrics_port=(value)
|
124
|
+
@@metrics_port = value
|
125
|
+
end
|
116
126
|
end
|
117
127
|
end
|
118
128
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
namespace :kubernetes_health do
|
2
|
-
task :
|
2
|
+
task :lock_on_rake do
|
3
3
|
Rails.logger.info "Kubernetes Health: Lock on Migrate - Locking or waiting started."
|
4
4
|
Kubernetes::Health::Config.lock_or_wait.call
|
5
5
|
Rails.logger.info "Kubernetes Health: Lock on Migrate - Locking or waiting finished."
|
@@ -9,5 +9,4 @@ namespace :kubernetes_health do
|
|
9
9
|
Rails.logger.info "Kubernetes Health: Lock on Migrate - Unlocking finished."
|
10
10
|
}
|
11
11
|
end
|
12
|
-
end
|
13
|
-
Rake::Task['db:migrate'].enhance(['kubernetes_health:lock_on_migrate'])
|
12
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
require 'rack'
|
2
|
+
require "kubernetes/health/rack_on_rake"
|
3
|
+
|
4
|
+
namespace :kubernetes_health do
|
5
|
+
task :rack_on_rake do
|
6
|
+
Thread.new do
|
7
|
+
Rack::Handler::WEBrick.run Kubernetes::Health::RackOnRake.new, { Port: Kubernetes::Health::Config.metrics_port }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
@@ -1,6 +1,6 @@
|
|
1
1
|
module Kubernetes
|
2
2
|
module Health
|
3
|
-
class
|
3
|
+
class RackOnRake
|
4
4
|
def call(env)
|
5
5
|
req = ::Rack::Request.new(env)
|
6
6
|
case req.path_info
|
@@ -11,7 +11,7 @@ module Kubernetes
|
|
11
11
|
else
|
12
12
|
http_code = 404
|
13
13
|
end
|
14
|
-
::Kubernetes::Health::Config.request_log_callback.call(req, http_code)
|
14
|
+
::Kubernetes::Health::Config.request_log_callback.call(req, http_code, '')
|
15
15
|
[http_code, {}, []]
|
16
16
|
end
|
17
17
|
end
|
@@ -2,8 +2,10 @@ module Kubernetes
|
|
2
2
|
module Health
|
3
3
|
class Railtie < Rails::Railtie
|
4
4
|
rake_tasks do
|
5
|
-
load 'kubernetes/health/
|
6
|
-
load 'kubernetes/health/
|
5
|
+
load 'kubernetes/health/rack_on_rake.rake'
|
6
|
+
load 'kubernetes/health/lock_on_rake.rake'
|
7
|
+
Rake::Task['db:migrate'].enhance(['kubernetes_health:rack_on_rake']) if Kubernetes::Health::Config.enable_rack_on_migrate
|
8
|
+
Rake::Task['db:migrate'].enhance(['kubernetes_health:lock_on_rake']) if Kubernetes::Health::Config.enable_lock_on_migrate
|
7
9
|
end
|
8
10
|
end
|
9
11
|
end
|
data/lib/puma/kubernetes/app.rb
CHANGED
@@ -54,7 +54,9 @@ module Puma
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def generate_extended_puma_stats
|
57
|
-
|
57
|
+
return {} if @launcher.nil?
|
58
|
+
|
59
|
+
puma_stats = @launcher.stats
|
58
60
|
# On puma <= 4 puma_stats is a String
|
59
61
|
puma_stats = JSON.parse(puma_stats, symbolize_names: true) unless puma_stats.is_a?(Hash)
|
60
62
|
# Including usage stats.
|
@@ -3,7 +3,7 @@ require 'puma/kubernetes/dsl'
|
|
3
3
|
Puma::Plugin.create do
|
4
4
|
# rubocop:disable Kubernetes/MethodLength, Kubernetes/AbcSize
|
5
5
|
def start(launcher)
|
6
|
-
str = launcher.options[:kubernetes_url] ||
|
6
|
+
str = launcher.options[:kubernetes_url] || "tcp://0.0.0.0:#{Kubernetes::Health::Config.metrics_port}"
|
7
7
|
|
8
8
|
require 'puma/kubernetes/app'
|
9
9
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kubernetes-health
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.12.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wagner Caixeta
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-02-
|
11
|
+
date: 2024-02-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -140,9 +140,9 @@ files:
|
|
140
140
|
- lib/kubernetes/health.rb
|
141
141
|
- lib/kubernetes/health/config.rb
|
142
142
|
- lib/kubernetes/health/engine.rb
|
143
|
-
- lib/kubernetes/health/
|
144
|
-
- lib/kubernetes/health/
|
145
|
-
- lib/kubernetes/health/
|
143
|
+
- lib/kubernetes/health/lock_on_rake.rake
|
144
|
+
- lib/kubernetes/health/rack_on_rake.rake
|
145
|
+
- lib/kubernetes/health/rack_on_rake.rb
|
146
146
|
- lib/kubernetes/health/rack_on_sidekiq.rb
|
147
147
|
- lib/kubernetes/health/railtie.rb
|
148
148
|
- lib/kubernetes/health/sidekiq_options_resolver.rb
|
@@ -1,11 +0,0 @@
|
|
1
|
-
require 'rack'
|
2
|
-
require "kubernetes/health/rack_on_migrate"
|
3
|
-
|
4
|
-
namespace :kubernetes_health do
|
5
|
-
task :rack_on_migrate do
|
6
|
-
Thread.new do
|
7
|
-
Rack::Handler.default.run Kubernetes::Health::RackOnMigrate.new
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
Rake::Task['db:migrate'].enhance(['kubernetes_health:rack_on_migrate'])
|