kubernetes-health 3.11.0 → 3.12.1
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 +29 -9
- data/lib/kubernetes/health/config.rb +1 -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} +1 -1
- data/lib/kubernetes/health/railtie.rb +4 -2
- data/lib/kubernetes/health/version.rb +1 -1
- data/lib/puma/kubernetes/app.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: 3f1527d74312ef1d4c77095b8ee8c87f65dee6308e6340a697cee5bcedfe40f2
|
4
|
+
data.tar.gz: 1671089c58d3f7ba73e015a830e2622b324216a21ef25e9a7dc86d1b21527aa5
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a4b6ad22f24f40d719ab62cf1b14d45c9e4030d899a0370e774d5deface1ebfebfe13feea5047b4c12de09cdf3b4421f05f58165bd086dbc8755f941755c3459
|
7
|
+
data.tar.gz: e35f96cbfc2a13a5c49ce2d6e98d1e9c51bdb660e81ce3990d0481a2d7e3a7793dcf349579b1994555d255e22d7f0d63b54f08194bec8d518f662090a26924f1
|
data/README.md
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
# Kubernetes::Health
|
2
|
-
This gem
|
2
|
+
This gem opens a dedicated HTTP port to allow Kubernetes to monitor your Rails app while it is running migrations, Rake tasks, Sidekiq, or Puma.
|
3
3
|
|
4
4
|
# Features
|
5
5
|
- Puma and Sidekiq metrics for autoscaling.
|
6
|
-
- Prometheus and JSON metrics
|
6
|
+
- Prometheus and JSON metrics.
|
7
7
|
- add routes `/_readiness`, `/_liveness` on Rails Stack.
|
8
8
|
- add routes `/_readiness`, `/_liveness` and `/_metrics` as a puma plugin at another port to avoid problems when your app get busy. (code copied from `puma-metrics` gem).
|
9
9
|
- add routes `/_readiness` and `/_liveness` while `rake db:migrate` runs. (optional)
|
10
|
-
- add routes `/
|
10
|
+
- add routes `/_metrics` while `sidekiq` runs. (optional)
|
11
11
|
- add support to avoid parallel running of `rake db:migrate` while keep kubernetes waiting (PostgreSQL required).
|
12
12
|
- allow custom checks for `/_readiness` and `/_liveness`.
|
13
13
|
|
@@ -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
|
|
@@ -64,7 +64,26 @@ Kubernetes::Health::Config.enable_rack_on_migrate = true
|
|
64
64
|
```
|
65
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 recommend doing some checks to make it only enabled in the 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
|
|
@@ -76,11 +95,12 @@ Kubernetes::Health::Config.enable_rack_on_sidekiq = true
|
|
76
95
|
```
|
77
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
|
80
|
-
It will run a
|
98
|
+
### How `rake` and `sidekiq` monitoring works
|
99
|
+
It will run a rack server for `/_readiness`, `/_liveness` and `/_metrics` for rake and `/_metrics` for Sidekiq.
|
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
|
-
Rails already avoid migrations running in parallel, but it
|
103
|
+
Rails already avoid migrations running in parallel, but it raises exceptions. This gem will just wait for other migrations without exit.
|
84
104
|
If you enable `rack_on_migrate` together with this, kubernetes will just wait, avoiding erros.
|
85
105
|
|
86
106
|
|
@@ -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 {
|
@@ -17,7 +17,7 @@ module Kubernetes
|
|
17
17
|
Rails.logger.debug "Kubernetes Health - Request: Path: #{req.path_info} / Params: #{req.params} / HTTP Code: #{http_code}\n#{content}" rescue nil
|
18
18
|
}
|
19
19
|
|
20
|
-
@@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);" }
|
21
21
|
@@unlock = lambda { ActiveRecord::Base.connection.execute 'select pg_advisory_unlock(123456789123456789);' }
|
22
22
|
|
23
23
|
def self.lock_or_wait
|
@@ -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
|
@@ -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
@@ -22,7 +22,7 @@ module Puma
|
|
22
22
|
case req.path_info
|
23
23
|
when ::Kubernetes::Health::Config.route_liveness
|
24
24
|
i_am_live = ::Kubernetes::Health::Config.live_if.arity.zero? ? ::Kubernetes::Health::Config.live_if.call : ::Kubernetes::Health::Config.live_if.call(req.params)
|
25
|
-
http_code =
|
25
|
+
http_code = i_am_live ? 200 : 503
|
26
26
|
when ::Kubernetes::Health::Config.route_readiness
|
27
27
|
i_am_ready = ::Kubernetes::Health::Config.ready_if.arity.zero? ? ::Kubernetes::Health::Config.ready_if.call : ::Kubernetes::Health::Config.ready_if.call(req.params)
|
28
28
|
http_code = puma_already_started?(extended_puma_stats) && i_am_ready ? 200 : 503
|
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.1
|
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::WEBrick.run Kubernetes::Health::RackOnMigrate.new, { Port: Kubernetes::Health::Config.metrics_port }
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
Rake::Task['db:migrate'].enhance(['kubernetes_health:rack_on_migrate'])
|