kubernetes-health 2.1.0 → 2.2.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: 8d1704a677ece777beeb57a3e9ad5f7db63afd78bbf00a58161aa3353aeb8a59
4
- data.tar.gz: 73dc70adb7d1019e0b3c9c9fc0a4b2456feb655118f88216050f464a221c9003
3
+ metadata.gz: 4425830e42d12960033f406ddb4e3da9d33e7d4f2836362cfad272b2aefa7aee
4
+ data.tar.gz: 72ea97e57b9100f0e465abf1e1e17168a8706f8eeb85f9d14b3e4f5d5660d6ed
5
5
  SHA512:
6
- metadata.gz: 8e534c0c28212798cc15a7311b4a6d0b7b6e04721c573abaf34442becaabea4d451a2ca80af3f7fcf1081305a500df48ae9360db3ea39e73e87a9d473754cc53
7
- data.tar.gz: cb924de9d60c20f32d27d14c4e30a60e5992932e6a8c204be03fbfc1c0ec4c95f5af8827e45632ff12093532ab993c78d7b63a380994fac28ec094f974dcc2a7
6
+ metadata.gz: 779947240739615102d287539e8f9542c1e73c2af1c5cc4d2d11d2760c866b5b6669d4482a881518844d028be4e53e930549d80b41bbfb6af3136ea6207ad84f
7
+ data.tar.gz: 16127f3a04957449a1c731ff2649e5b480b88486c1d2d94d572c80c162cfdd802e05c8db36a722b7435624d4b604d5d4deae151281702468182cc3a2b95390ed
data/README.md CHANGED
@@ -5,14 +5,15 @@ This gem allows kubernetes monitoring your app while it is running migrates and
5
5
  # Features
6
6
  - add routes `/_readiness` and `/_liveness` on rails stack by default.
7
7
  - allow custom checks for `/_readiness` and `/_liveness` on rails stack.
8
- - add routes `/_readiness` and `/_liveness` while `rake db:migrate` runs. (optional).
8
+ - add routes `/_readiness` and `/_liveness` while `rake db:migrate` runs. (optional)
9
+ - add support to avoid parallel running of `rake db:migrate` while keep kubernetes waiting. (optional)
9
10
 
10
11
  ## Installation
11
12
 
12
13
  Add this line to your application's Gemfile:
13
14
 
14
15
  ```ruby
15
- gem 'kubernetes-health', '~> 2.0'
16
+ gem 'kubernetes-health', '~> 2.1'
16
17
  ```
17
18
 
18
19
  ## Enabling monitoring while `rake db:migrate` runs
@@ -24,8 +25,8 @@ Add `KUBERNETES_HEALTH_ENABLE_RACK_ON_MIGRATE=true` environment variable.
24
25
  or add in your `application.rb`.
25
26
 
26
27
  ```
27
- # default: false
28
- Kubernetes::Health::Config.enable_rack_on_migrate = true
28
+ # default: false
29
+ Kubernetes::Health::Config.enable_rack_on_migrate = true
29
30
  ```
30
31
 
31
32
  In Kubernetes you need to configure your deployment `readinessProbe` like this:
@@ -46,7 +47,30 @@ In Kubernetes you need to configure your deployment `readinessProbe` like this:
46
47
  ```
47
48
 
48
49
  ### How `rake db:migrate` monitoring works
49
- It will run a RACK server for `/_readiness` and `/_liveness` routes while a `rake db:migrate` is running.
50
+ It will run a RACK server for `/_readiness` and `/_liveness` routes while `rake db:migrate` is running.
51
+
52
+ ## Avoid `rake db:migrate` parallel running.
53
+
54
+ Add `KUBERNETES_HEALTH_ENABLE_LOCK_ON_MIGRATE=true` environment variable.
55
+
56
+ or add in your `application.rb`.
57
+
58
+ ```
59
+ # default: false
60
+ Kubernetes::Health::Config.enable_lock_on_migrate = true
61
+ ```
62
+
63
+ ### Customizing locking
64
+ By default it is working for PostgreSQL, but you can customize it using a lambda:
65
+ ```
66
+ Kubernetes::Health::Config.lock_or_wait = lambda {
67
+ ActiveRecord::Base.connection.execute 'select pg_advisory_lock(123456789123456789);'
68
+ }
69
+
70
+ Kubernetes::Health::Config.unlock = lambda {
71
+ ActiveRecord::Base.connection.execute 'select pg_advisory_unlock(123456789123456789);'
72
+ }
73
+ ```
50
74
 
51
75
  ## Customizing checks
52
76
 
@@ -29,4 +29,6 @@ Gem::Specification.new do |spec|
29
29
  spec.add_development_dependency "bundler", "~> 1.14"
30
30
  spec.add_development_dependency "rake", "~> 10.0"
31
31
  spec.add_development_dependency "rspec", "~> 3.0"
32
+ spec.add_dependency "rack"
33
+ spec.add_dependency "rails"
32
34
  end
@@ -3,9 +3,36 @@ module Kubernetes
3
3
  class Config
4
4
  @@live_if = lambda { true }
5
5
  @@ready_if = lambda { true }
6
+ @@enable_lock_on_migrate = ActiveRecord::Type::Boolean.new.cast(ENV['KUBERNETES_HEALTH_ENABLE_LOCK_ON_MIGRATE']) || false
6
7
  @@enable_rack_on_migrate = ActiveRecord::Type::Boolean.new.cast(ENV['KUBERNETES_HEALTH_ENABLE_RACK_ON_MIGRATE']) || false
7
8
  @@route_liveness = '/_liveness'
8
9
  @@route_readiness = '/_readiness'
10
+ @@lock_or_wait = lambda { ActiveRecord::Base.connection.execute 'select pg_advisory_lock(123456789123456789);' }
11
+ @@unlock = lambda { ActiveRecord::Base.connection.execute 'select pg_advisory_unlock(123456789123456789);' }
12
+
13
+ def self.lock_or_wait
14
+ @@lock_or_wait
15
+ end
16
+
17
+ def self.lock_or_wait=(value)
18
+ @@lock_or_wait = value
19
+ end
20
+
21
+ def self.unlock
22
+ @@unlock
23
+ end
24
+
25
+ def self.unlock=(value)
26
+ @@unlock = value
27
+ end
28
+
29
+ def self.enable_lock_on_migrate
30
+ @@enable_lock_on_migrate
31
+ end
32
+
33
+ def self.enable_lock_on_migrate=(value)
34
+ @@enable_lock_on_migrate = value
35
+ end
9
36
 
10
37
  def self.enable_rack_on_migrate
11
38
  @@enable_rack_on_migrate
@@ -46,6 +73,7 @@ module Kubernetes
46
73
  def self.ready_if=(value)
47
74
  @@ready_if = value
48
75
  end
76
+
49
77
  end
50
78
  end
51
79
  end
@@ -0,0 +1,13 @@
1
+ namespace :kubernetes_health do
2
+ task :lock_on_migrate do
3
+ Rails.logger.info "Kubernetes Health: Lock on Migrate - Locking or waiting started."
4
+ Kubernetes::Health::Config.lock_or_wait.call
5
+ Rails.logger.info "Kubernetes Health: Lock on Migrate - Locking or waiting finished."
6
+ at_exit {
7
+ Rails.logger.info "Kubernetes Health: Lock on Migrate - Unlocking started."
8
+ Kubernetes::Health::Config.unlock.call
9
+ Rails.logger.info "Kubernetes Health: Lock on Migrate - Unlocking finished."
10
+ }
11
+ end
12
+ end
13
+ Rake::Task['db:migrate'].enhance(['kubernetes_health:lock_on_migrate'])
@@ -1,21 +1,10 @@
1
+ require 'rack'
2
+ require "kubernetes/health/rack_on_migrate"
1
3
  namespace :kubernetes_health do
2
- task :before_migrate do
4
+ task :rack_on_migrate do
3
5
  Thread.new {
4
- require 'rack'
5
- Rack::Handler.default.run ->(env) {
6
- req = Rack::Request.new(env)
7
- case req.path_info
8
- when Kubernetes::Health::Config.route_readiness
9
- http_code = 503
10
- when Kubernetes::Health::Config.route_liveness
11
- http_code = 200
12
- else
13
- http_code = 404
14
- end
15
- Rails.logger.info "Kubernetes Health: Rack on Migrate - Path: #{req.path_info} / Params: #{req.params} / HTTP Code: #{http_code}"
16
- [http_code, {}, []]
17
- }
6
+ Rack::Handler.default.run Kubernetes::Health::RackOnMigrate.new
18
7
  }
19
8
  end
20
9
  end
21
- Rake::Task['db:migrate'].enhance(['kubernetes_health:before_migrate'])
10
+ Rake::Task['db:migrate'].enhance(['kubernetes_health:rack_on_migrate'])
@@ -0,0 +1,19 @@
1
+ module Kubernetes
2
+ module Health
3
+ class RackOnMigrate
4
+ def call(env)
5
+ req = Rack::Request.new(env)
6
+ case req.path_info
7
+ when Kubernetes::Health::Config.route_readiness
8
+ http_code = 503
9
+ when Kubernetes::Health::Config.route_liveness
10
+ http_code = 200
11
+ else
12
+ http_code = 404
13
+ end
14
+ Rails.logger.info "Kubernetes Health: Rack on Migrate - Request: Path: #{req.path_info} / Params: #{req.params} / HTTP Code: #{http_code}"
15
+ [http_code, {}, []]
16
+ end
17
+ end
18
+ end
19
+ end
@@ -3,6 +3,7 @@ module Kubernetes
3
3
  class Railtie < Rails::Railtie
4
4
  rake_tasks do
5
5
  load 'kubernetes/health/rack_on_migrate.rake' if Kubernetes::Health::Config.enable_rack_on_migrate
6
+ load 'kubernetes/health/lock_on_migrate.rake' if Kubernetes::Health::Config.enable_lock_on_migrate
6
7
  end
7
8
  end
8
9
  end
@@ -1,5 +1,5 @@
1
1
  module Kubernetes
2
2
  module Health
3
- VERSION = "2.1.0"
3
+ VERSION = "2.2.0"
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kubernetes-health
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Wagner Caixeta
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rack
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rails
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
55
83
  description: "\n This gem allows kubernetes monitoring your app while it is running
56
84
  migrates and after it started.\n Features:\n * add routes /_readiness and
57
85
  /_liveness on rails stack by default;\n * allow custom checks for /_readiness
@@ -77,7 +105,9 @@ files:
77
105
  - lib/kubernetes/health.rb
78
106
  - lib/kubernetes/health/config.rb
79
107
  - lib/kubernetes/health/engine.rb
108
+ - lib/kubernetes/health/lock_on_migrate.rake
80
109
  - lib/kubernetes/health/rack_on_migrate.rake
110
+ - lib/kubernetes/health/rack_on_migrate.rb
81
111
  - lib/kubernetes/health/railtie.rb
82
112
  - lib/kubernetes/health/version.rb
83
113
  homepage: https://github.com/platbr/kubernetes-health