README.md in http_health_check-0.2.1 vs README.md in http_health_check-0.3.0

- old
+ new

@@ -1,15 +1,19 @@ # HttpHealthCheck [![Gem Version](https://badge.fury.io/rb/http_health_check.svg)](https://badge.fury.io/rb/http_health_check) +HttpHealthCheck is a tiny framework for building health check for your application components. It provides a set of built-in checkers (a.k.a. probes) and utilities for building your own. + +HttpHealthCheck is built with kubernetes health probes in mind, but it can be used with http health checker. + ## Installation Add this line to your application's Gemfile: ```ruby -gem 'http_health_check', '~> 0.2.1' +gem 'http_health_check', '~> 0.3.0' ``` And then execute: $ bundle install @@ -43,10 +47,95 @@ super end end ``` +### Karafka ~> 1.4 + +Ruby-kafka probe is disabled by default as it requires app-specific configuration to work properly. Example usage with karafka framework: + +```ruby +# ./karafka.rb + +class KarafkaApp < Karafka::App + # ... + # karafka app configuration + # ... +end + +KarafkaApp.boot! + +HttpHealthCheck.run_server_async( + port: 5555, + rack_app: HttpHealthCheck::RackApp.configure do |c| + c.probe '/readiness/karafka', HttpHealthCheck::Probes::RubyKafka.new( + consumer_groups: KarafkaApp.consumer_groups.map(&:id), + # default heartbeat interval is 3 seconds, but we want to give it + # an ability to skip a few before failing the probe + heartbeat_interval_sec: 10, + # includes a list of topics and partitions into response for every consumer thread. false by default + verbose: false + ) + end +) +``` + +Ruby kafka probe supports multi-threaded setups, i.e. if you are using karafka and you define multiple blocks with the same consumer group like + +```ruby +class KarafkaApp < Karafka::App + consumer_groups.draw do + consumer_group 'foo' do + # ... + end + end + + consumer_groups.draw do + consumer_group 'foo' do + # ... + end + end +end + +KarafkaApp.consumer_groups.map(&:id) +# => ['foo', 'foo'] +``` + +ruby-kafka probe will count heartbeats from multiple threads. + +### Kubernetes deployment example + +```yaml +apiVersion: apps/v1 +kind: Deployment +metadata: + name: sidekiq +spec: + replicas: 1 + selector: + matchLabels: + app: sidekiq + template: + metadata: + labels: + app: sidekiq + spec: + containers: + - name: sidekiq + image: my-app:latest + livenessProbe: + httpGet: + path: /liveness + port: 5555 + scheme: HTTP + readinessProbe: + httpGet: + path: /readiness/sidekiq + port: 5555 + scheme: HTTP +``` + ### Changing global configuration ```ruby HttpHealthCheck.configure do |c| # add probe with any callable class @@ -55,11 +144,11 @@ # or with block c.probe '/health/fake' do |_env| [200, {}, ['OK']] end - # optionally add builtin probes + # optionally add built-in probes HttpHealthCheck.add_builtin_probes(c) # optionally override fallback (route not found) handler c.fallback_handler do |env| [404, {}, ['not found :(']] @@ -81,11 +170,11 @@ ### Writing your own probes Probes are built around [HttpHealthCheck::Probe](./lib/http_health_check/probe.rb) mixin. Every probe defines **probe** method which receives [rack env](https://www.rubydoc.info/gems/rack/Rack/Request/Env) and should return [HttpHealthCheck::Probe::Result](./lib/http_health_check/probe/result.rb) or rack-compatible response (status-headers-body tuple). -Probe-mixin provides convenience methods `probe_ok` and `probe_error` for creating [HttpHealthCheck::Probe::Result](./lib/http_health_check/probe/result.rb) instance. Both of them accept optional metadata hash that will be added to response body. +Probe-mixin provides convenience methods `probe_ok` and `probe_error` for creating [HttpHealthCheck::Probe::Result](./lib/http_health_check/probe/result.rb) instance. Both of them accept optional metadata hash that will be added to the response body. Any exception (StandardError) will be captured and converted into error-result. ```ruby class MyProbe include HttpHealthCheck::Probe @@ -103,35 +192,49 @@ HttpHealthCheck.configure do |config| config.probe '/readiness/my_service', MyProbe.new end ``` -### Builtin probes +### Built-in probes #### [Sidekiq](./lib/http_health_check/probes/sidekiq.rb) Sidekiq probe ensures that sidekiq is ready by checking redis is available and writable. It uses sidekiq's redis connection pool to avoid spinning up extra connections. -Be aware, that this approach does not cover issues with sidekiq being stuck processing slow/endless jobs. Such cases are nearly impossible to cover without false-positive alerts. +Be aware that this approach does not cover issues with sidekiq being stuck processing slow/endless jobs. Such cases are nearly impossible to cover without false-positive alerts. ```ruby HttpHealthCheck.configure do |config| config.probe '/readiness/delayed_job', HttpHealthCheck::Probes::Sidekiq.new end ``` #### [DelayedJob](./lib/http_health_check/probes/delayed_job.rb) (active record) Delayed Job probe is intended to work with [active record backend](https://github.com/collectiveidea/delayed_job_active_record). -It checks DelayedJob is healthy by enqueuing an empty job which will be deleted right after insertion. This allows us to be sure that underlying database is connectable and writable. -Be aware, that by enqueuing a new job with every health check we are incrementing primary key sequence. +It checks DelayedJob is healthy by enqueuing an empty job which will be deleted right after insertion. This allows us to be sure that the underlying database is connectable and writable. +Be aware that by enqueuing a new job with every health check, we are incrementing the primary key sequence. ```ruby HttpHealthCheck.configure do |config| config.probe '/readiness/delayed_job', HttpHealthCheck::Probes::DelayedJob.new end ``` +#### [ruby-kafka](./lib/http_health_check/probes/ruby_kafka.rb) + +ruby-kafka probe is expected to be configured with consumer groups list. It subscribes to ruby-kafka's `heartbeat.consumer.kafka` ActiveSupport notification and tracks heartbeats for every given consumer group. +It expects a heartbeat every `:heartbeat_interval_sec` (10 seconds by default). + +```ruby +heartbeat_app = HttpHealthCheck::RackApp.configure do |c| + c.probe '/readiness/kafka', HttpHealthCheck::Probes::Karafka.new( + consumer_groups: ['consumer-one', 'consumer-two'], + heartbeat_interval_sec: 42 + ) +end +``` + ## Development After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment. Some specs require redis to be run. You can use your own installation or start one via docker-compose. @@ -139,15 +242,15 @@ docker-compose up redis ``` ## Deployment -Every new (git) tag will be built and deployed automatically via gitlab CI pipeline. We recommend using [bump2version](https://github.com/c4urself/bump2version) to tag new releases. - 1. Update changelog and git add it 2. ```sh bump2version patch --allow-dirty ``` 3. git push && git push --tags +4. gem build +5. gem push http_health_check-x.x.x.gem