kubernetes-health 3.5.0 → 3.6.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b35fdf1eae585364a30777a0f0c8d67210ab99d97c492c33ea7e9c5a71b7d01c
4
- data.tar.gz: a4b4f532380c9295e6077d4aba889abb9a17c36889a713d7e84d864b8f9c8e6d
3
+ metadata.gz: 6f0b091b68d3acd2e69b0e2e259ad841eef9b5030ae7f7a8a404f7d0535722c7
4
+ data.tar.gz: 2ab614dc570e2b8202533101566a4eb0f6aca71ad2490d27ac10d4739e9cc322
5
5
  SHA512:
6
- metadata.gz: 67cd817d32945e1f17f0b9363c393a408df9aec7352af14567d52a7562eab4969719b637f3c7acf3870595951f33a292ba9855c863b70bc125705f2b9f813ef1
7
- data.tar.gz: ca42a6d7350435fb33c40521e4e2c72f2046af6fda5c634b3b4994960b8dea4af93d0015b037e80344559149ce329673dccdee6156baf9cabb98607f87519a6a
6
+ metadata.gz: 26068d438952f640c22b9e7ce3d416aeec53fd32bec73013de08c4037ad1183619dd13cd8f23fe1561d2a57f191272a895138b9cb0279bc90fa41cba309d8d2a
7
+ data.tar.gz: 5c89c1531a8f10b858ba3bcd7626fe7d34fc308bde57bb0ba56fbd26e45e85b50caa72332186e4ce2e04c4e50a17c26226dabb0a7d13738eea02acdd9805491f
data/README.md CHANGED
@@ -1,21 +1,22 @@
1
1
  # Kubernetes::Health
2
-
3
- This gem allows kubernetes monitoring your app while it is running migrates and after it starts.
2
+ This gem open a HTTP port for monitoring your rails app while it is running Migrates, Sidekiq and Puma.
4
3
 
5
4
  # Features
6
- - add routes `/_readiness`, `/_liveness` on rails stack.
7
- - add routes `/_readiness`, `/_liveness` and `/_metrics` as a puma plugin.
8
- - metrics are prometheus compatible (code copied from `puma-metrics` gem) or json.
9
- - allow custom checks for `/_readiness` and `/_liveness`.
5
+ - Puma and Sidekiq metrics for autoscaling.
6
+ - Prometheus and JSON metrics (tested using https://github.com/zalando-incubator/kube-metrics-adapter and JSON format).
7
+ - add routes `/_readiness`, `/_liveness` on Rails Stack.
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).
10
9
  - add routes `/_readiness` and `/_liveness` while `rake db:migrate` runs. (optional)
11
- - add support to avoid parallel running of `rake db:migrate` while keep kubernetes waiting. (optional)
12
-
10
+ - add routes `/_readiness` and `/_liveness` while `sidekiq` runs. (optional)
11
+ - add support to avoid parallel running of `rake db:migrate` while keep kubernetes waiting (PostgreSQL required).
12
+ - allow custom checks for `/_readiness` and `/_liveness`.
13
+
13
14
  ## Installation
14
15
 
15
16
  Add this line to your application's Gemfile:
16
17
 
17
18
  ```ruby
18
- gem 'kubernetes-health', '~> 3.5'
19
+ gem 'kubernetes-health', '~> 3.6'
19
20
  ```
20
21
 
21
22
  ## Enabling puma plugin
@@ -48,6 +49,7 @@ In Kubernetes you need to configure your deployment `readinessProbe` and `livene
48
49
  ```
49
50
 
50
51
  Setting `failureThreshold` is import to avoid problems when app finish migrates and is starting the web process.
52
+
51
53
  ## Enabling monitoring while `rake db:migrate` runs
52
54
 
53
55
  Your Dockerfile's entry script needs to run migrates before start your web app.
@@ -60,9 +62,22 @@ or add in your `application.rb`.
60
62
  # default: false
61
63
  Kubernetes::Health::Config.enable_rack_on_migrate = true
62
64
  ```
65
+ The defined port at `config/puma.rb` will be used.
66
+
67
+ ## Enabling monitoring for `sidekiq`
68
+
69
+ Add `KUBERNETES_HEALTH_ENABLE_RACK_ON_SIDEKIQ=true` environment variable.
70
+
71
+ or add in your `application.rb`.
72
+
73
+ ```
74
+ # default: false
75
+ Kubernetes::Health::Config.enable_rack_on_sidekiq = true
76
+ ```
77
+ The defined port at `config/puma.rb` will be used.
63
78
 
64
- ### How `rake db:migrate` monitoring works
65
- It will run a RACK server for `/_readiness` and `/_liveness` routes while `rake db:migrate` is running.
79
+ ### How `rake db:migrate` and `sidekiq` monitoring works
80
+ It will run a RACK server for `/_readiness`, `/_liveness` and `/_metrics`.
66
81
 
67
82
  ## Avoiding migrations running in parallel and making kubernetes happy.
68
83
  Rails already avoid migrations running in parallel, but it raise exceptions. This gem will just wait for other migrations without exit.
data/Rakefile CHANGED
@@ -12,7 +12,7 @@ task :server do
12
12
  require 'puma'
13
13
  require 'puma/configuration'
14
14
  require 'puma/events'
15
- require 'puma/plugin/kubernetes.rb'
15
+ require 'puma/plugin/kubernetes'
16
16
 
17
17
  configuration = Puma::Configuration.new do |config|
18
18
  config.bind 'tcp://127.0.0.1:0'
@@ -0,0 +1,7 @@
1
+ require 'kubernetes/health/rack_on_sidekiq'
2
+
3
+ if Kubernetes::Health::Config.enable_rack_on_sidekiq && Sidekiq.options[:concurrency].positive?
4
+ Thread.new do
5
+ Rack::Handler.default.run Kubernetes::Health::RackOnSidekiq.new
6
+ end
7
+ end
@@ -5,6 +5,7 @@ module Kubernetes
5
5
  @@ready_if = lambda { true }
6
6
  @@enable_lock_on_migrate = [true, 'true'].include? ENV['KUBERNETES_HEALTH_ENABLE_LOCK_ON_MIGRATE']
7
7
  @@enable_rack_on_migrate = [true, 'true'].include? ENV['KUBERNETES_HEALTH_ENABLE_RACK_ON_MIGRATE']
8
+ @@enable_rack_on_sidekiq = [true, 'true'].include? ENV['KUBERNETES_HEALTH_ENABLE_RACK_ON_SIDEKIQ']
8
9
  @@route_liveness = '/_liveness'
9
10
  @@route_readiness = '/_readiness'
10
11
  @@route_metrics = '/_metrics'
@@ -57,6 +58,14 @@ module Kubernetes
57
58
  @@enable_rack_on_migrate = value
58
59
  end
59
60
 
61
+ def self.enable_rack_on_sidekiq
62
+ @@enable_rack_on_sidekiq
63
+ end
64
+
65
+ def self.enable_rack_on_sidekiq=(value)
66
+ @@enable_rack_on_sidekiq = value
67
+ end
68
+
60
69
  def self.route_metrics
61
70
  @@route_metrics
62
71
  end
@@ -1,10 +1,11 @@
1
1
  require 'rack'
2
2
  require "kubernetes/health/rack_on_migrate"
3
+
3
4
  namespace :kubernetes_health do
4
5
  task :rack_on_migrate do
5
- Thread.new {
6
+ Thread.new do
6
7
  Rack::Handler.default.run Kubernetes::Health::RackOnMigrate.new
7
- }
8
+ end
8
9
  end
9
10
  end
10
11
  Rake::Task['db:migrate'].enhance(['kubernetes_health:rack_on_migrate'])
@@ -0,0 +1,57 @@
1
+ require 'rack'
2
+ require 'prometheus/client'
3
+ require 'prometheus/client/formats/text'
4
+
5
+ module Kubernetes
6
+ module Health
7
+ class RackOnSidekiq
8
+ def call(env)
9
+ req = ::Rack::Request.new(env)
10
+ content = ''
11
+ type = ::Kubernetes::Health::Config.response_format == 'json' ? { 'Content-Type' => 'application/json' } : { 'Content-Type' => 'text/plain' }
12
+ case req.path_info
13
+ when Kubernetes::Health::Config.route_metrics
14
+ http_code = 200
15
+
16
+ @sidekiq_metrics = sidekiq_metrics
17
+
18
+ if ::Kubernetes::Health::Config.response_format == 'json'
19
+ content = @sidekiq_metrics.to_json
20
+ else
21
+ prometheus_registry.get(:sidekiq_capacity).set({}, @sidekiq_metrics[:sidekiq_capacity])
22
+ prometheus_registry.get(:sidekiq_busy).set({}, @sidekiq_metrics[:sidekiq_busy])
23
+ prometheus_registry.get(:sidekiq_usage).set({}, @sidekiq_metrics[:sidekiq_usage])
24
+ content = Prometheus::Client::Formats::Text.marshal(prometheus_registry)
25
+ end
26
+ else
27
+ http_code = 404
28
+ end
29
+ ::Kubernetes::Health::Config.request_log_callback.call(req, http_code, content)
30
+
31
+ [http_code, type, [content]]
32
+ end
33
+
34
+ def prometheus_registry
35
+ return @prometheus_registry if @prometheus_registry
36
+
37
+ @prometheus_registry = Prometheus::Client.registry
38
+ @prometheus_registry.gauge(:sidekiq_capacity, 'Sidekiq Threads Number', index: 0)
39
+ @prometheus_registry.gauge(:sidekiq_busy, 'Sidekiq Busy Threads', index: 0)
40
+ @prometheus_registry.gauge(:sidekiq_usage, 'Result of sidekiq_busy/sidekiq_capacity', index: 0)
41
+ @prometheus_registry
42
+ end
43
+
44
+ def sidekiq_metrics
45
+ sidekiq_info = Sidekiq::ProcessSet.new.to_a.filter { |p| p.identity == Sidekiq.options[:identity] }
46
+
47
+ stats = {
48
+ sidekiq_capacity: Sidekiq.options[:concurrency],
49
+ sidekiq_busy: sidekiq_info.size.zero? ? 0 : sidekiq_info[0]['busy']
50
+ }
51
+
52
+ stats[:sidekiq_usage] = (stats[:sidekiq_busy] / stats[:sidekiq_capacity].to_f).round(2)
53
+ stats
54
+ end
55
+ end
56
+ end
57
+ end
@@ -1,5 +1,5 @@
1
1
  module Kubernetes
2
2
  module Health
3
- VERSION = "3.5.0"
3
+ VERSION = '3.6.0'.freeze
4
4
  end
5
5
  end
@@ -1,4 +1,4 @@
1
- require "kubernetes/health/config"
1
+ require 'kubernetes/health/config'
2
2
  require 'prometheus/client/formats/text'
3
3
  require 'puma/kubernetes/parser'
4
4
  require 'rack'
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.5.0
4
+ version: 3.6.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: 2022-01-08 00:00:00.000000000 Z
11
+ date: 2022-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -128,6 +128,7 @@ files:
128
128
  - app/controllers/kubernetes/health_controller.rb
129
129
  - bin/console
130
130
  - bin/setup
131
+ - config/initializers/enable_rack_on_sidekiq.rb
131
132
  - config/routes.rb
132
133
  - kubernetes-health.gemspec
133
134
  - lib/kubernetes/health.rb
@@ -136,6 +137,7 @@ files:
136
137
  - lib/kubernetes/health/lock_on_migrate.rake
137
138
  - lib/kubernetes/health/rack_on_migrate.rake
138
139
  - lib/kubernetes/health/rack_on_migrate.rb
140
+ - lib/kubernetes/health/rack_on_sidekiq.rb
139
141
  - lib/kubernetes/health/railtie.rb
140
142
  - lib/kubernetes/health/version.rb
141
143
  - lib/puma/kubernetes/app.rb