deep_health_check 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/workflows/gempush.yml +38 -0
- data/.gitignore +9 -0
- data/.rspec +2 -0
- data/.rubocop.yml +11 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +18 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/NGINX.md +44 -0
- data/README.md +33 -0
- data/Rakefile +5 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/bin/travis +12 -0
- data/deep_health_check.gemspec +36 -0
- data/lib/deep_health_check.rb +13 -0
- data/lib/deep_health_check/db_health_check.rb +42 -0
- data/lib/deep_health_check/dependency_health_check.rb +34 -0
- data/lib/deep_health_check/health_check.rb +23 -0
- data/lib/deep_health_check/health_check_builder.rb +18 -0
- data/lib/deep_health_check/http_dependency_health_check.rb +48 -0
- data/lib/deep_health_check/middleware_health_check.rb +14 -0
- data/lib/deep_health_check/tcp_dependency_health_check.rb +51 -0
- data/lib/deep_health_check/version.rb +5 -0
- metadata +180 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 837e823c90a18054f24eeb42e3079edfaed7de08d103dc66c476e5f31d237640
|
4
|
+
data.tar.gz: 94b9be499506937b5728f7f24863a7fec3ecad6ef0dcf892fca13098cd2d3af7
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1774e274f3cb5a3843629d446cd3e462d063ed9419ac0c904d1261006c4095c3338a7a08fbed249ace233270722528f6871aef8865417e31701ce8eba1e4467d
|
7
|
+
data.tar.gz: 9a7496f4e793c9b2a6a127b0276154ea14f24171c5857780f8109f00e5c56f9f1a152bce7063cc543bc8e5690bb477f4f5ebadccdb40ced497309a703f0841a0
|
@@ -0,0 +1,38 @@
|
|
1
|
+
name: Ruby Gem
|
2
|
+
|
3
|
+
on:
|
4
|
+
release:
|
5
|
+
types: [published]
|
6
|
+
|
7
|
+
jobs:
|
8
|
+
build:
|
9
|
+
name: Build + Publish
|
10
|
+
runs-on: ubuntu-latest
|
11
|
+
|
12
|
+
steps:
|
13
|
+
- uses: actions/checkout@master
|
14
|
+
- name: Set up Ruby 2.6
|
15
|
+
uses: actions/setup-ruby@v1
|
16
|
+
with:
|
17
|
+
version: 2.6.x
|
18
|
+
|
19
|
+
- name: Publish to RubyGems
|
20
|
+
run: |
|
21
|
+
mkdir -p $HOME/.gem
|
22
|
+
touch $HOME/.gem/credentials
|
23
|
+
chmod 0600 $HOME/.gem/credentials
|
24
|
+
printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
|
25
|
+
gem build *.gemspec
|
26
|
+
gem push *.gem
|
27
|
+
env:
|
28
|
+
GEM_HOST_API_KEY: ${{secrets.RUBYGEMS_AUTH_TOKEN}}
|
29
|
+
|
30
|
+
- name: Slack notification Success
|
31
|
+
if: success()
|
32
|
+
env:
|
33
|
+
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }}
|
34
|
+
uses: cemkiy/action-slacker@master
|
35
|
+
with:
|
36
|
+
channel: '#github-ci-actions'
|
37
|
+
icon_url: 'https://github.githubassets.com/images/modules/logos_page/GitHub-Mark.png'
|
38
|
+
username: 'GitHub'
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.rubocop.yml
ADDED
data/.ruby-gemset
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
deep_health_check
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.4.6
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2017 Al-waleed shihadeh
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/NGINX.md
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
# Protect Health Check endpoints using htauth credentials.
|
2
|
+
|
3
|
+
## Create htpasswd file
|
4
|
+
- Create /etc/nginx/.htpasswd. The format for this file is as follow:
|
5
|
+
|
6
|
+
```
|
7
|
+
$user:password
|
8
|
+
```
|
9
|
+
|
10
|
+
- The password can be generated using the following command.
|
11
|
+
|
12
|
+
```
|
13
|
+
$-> openssl passwd -apr1
|
14
|
+
```
|
15
|
+
|
16
|
+
- Example of the file.
|
17
|
+
|
18
|
+
```
|
19
|
+
httpauth:$apr1$LNrZDUUO$sAN3WLCm7YN6gzGjnCc85.
|
20
|
+
```
|
21
|
+
|
22
|
+
- In case you are using dockerized nginx, Update the docker file with the following command.
|
23
|
+
|
24
|
+
```
|
25
|
+
COPY ${path_to_htpasswd_file} /etc/nginx/.htpasswd
|
26
|
+
```
|
27
|
+
|
28
|
+
## Update the nginx configurations
|
29
|
+
Add the following lines to nginx confutations for each of the applications that use the health check gem. Make sure that you replace the place holders #{application} and #{port}.
|
30
|
+
|
31
|
+
```
|
32
|
+
location /${endpoint_to_be_protected} {
|
33
|
+
auth_basic "Restricted Content";
|
34
|
+
auth_basic_user_file /etc/nginx/.htpasswd;
|
35
|
+
|
36
|
+
resolver 127.0.0.11 ipv6=off;
|
37
|
+
|
38
|
+
set $target http://#{application}:#{port};
|
39
|
+
proxy_set_header Host $host;
|
40
|
+
proxy_set_header X-Real-IP $remote_addr;
|
41
|
+
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
42
|
+
proxy_pass $target;
|
43
|
+
}
|
44
|
+
```
|
data/README.md
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# HealthCheck
|
2
|
+
|
3
|
+
A simple Health status API
|
4
|
+
|
5
|
+
# Getting Started
|
6
|
+
|
7
|
+
Install gem
|
8
|
+
~~~sh
|
9
|
+
# Gemfile
|
10
|
+
gem 'deep_health_check'
|
11
|
+
~~~
|
12
|
+
|
13
|
+
Add middleware before Rails::Rack::Logger to prevent false positive response
|
14
|
+
if other middleware fails when database is down for example ActiveRecord::QueryCache
|
15
|
+
|
16
|
+
~~~sh
|
17
|
+
# config/application.rb
|
18
|
+
config.middleware.insert_after "Rails::Rack::Logger", DeepHealthCheck::MiddlewareHealthCheck
|
19
|
+
~~~
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
# Protect Health Check endpoints using htauth credentials.
|
25
|
+
Health check middleware expose the following endpoints
|
26
|
+
- /health
|
27
|
+
- /db_health
|
28
|
+
- /tcp_dependencies_health
|
29
|
+
- /http_dependencies_health
|
30
|
+
|
31
|
+
Some of these endpoints provide information about the database and system status. By Default these endpoints are not protected and are accessible publicly. To reduce the security risk introduced by exposing these endpoints, We can protect them using htauth credentials. The following page provide all the necessary steps needed to achieve this task.
|
32
|
+
|
33
|
+
[Nginx Configurations](NGINX.md)
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require 'bundler/setup'
|
5
|
+
require 'deep_health_check'
|
6
|
+
|
7
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
8
|
+
# with your gem easier. You can also use a different console, if you like.
|
9
|
+
|
10
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
11
|
+
# require "pry"
|
12
|
+
# Pry.start
|
13
|
+
|
14
|
+
require 'irb'
|
15
|
+
IRB.start
|
data/bin/setup
ADDED
data/bin/travis
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# coding: utf-8
|
4
|
+
|
5
|
+
lib = File.expand_path('../lib', __FILE__)
|
6
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
7
|
+
require 'deep_health_check/version'
|
8
|
+
|
9
|
+
Gem::Specification.new do |spec|
|
10
|
+
spec.name = 'deep_health_check'
|
11
|
+
spec.version = DeepHealthCheck::VERSION
|
12
|
+
spec.authors = ['Al-waleed shihadeh']
|
13
|
+
spec.email = ['shihadeh.dev@gmail.com']
|
14
|
+
|
15
|
+
spec.summary = 'Provides a health check API endpoint'
|
16
|
+
spec.description = 'Provides a health check API endpoint'
|
17
|
+
spec.homepage = 'https://github.com/wshihadeh/deep_health_check'
|
18
|
+
spec.license = 'MIT'
|
19
|
+
|
20
|
+
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
21
|
+
f.match(%r{^(test|spec|features)/})
|
22
|
+
end
|
23
|
+
spec.bindir = 'bin'
|
24
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
25
|
+
spec.require_paths = ['lib']
|
26
|
+
|
27
|
+
spec.add_dependency 'net-telnet'
|
28
|
+
spec.add_dependency 'faraday'
|
29
|
+
spec.add_dependency 'faraday_middleware'
|
30
|
+
|
31
|
+
spec.add_development_dependency 'bundler', '~> 2.1'
|
32
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
33
|
+
spec.add_development_dependency 'rack-test', '~> 1.1.0'
|
34
|
+
spec.add_development_dependency 'rspec', '~> 3.5.0'
|
35
|
+
spec.add_development_dependency 'rubocop', '0.78.0'
|
36
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'deep_health_check/version'
|
4
|
+
require 'deep_health_check/health_check'
|
5
|
+
require 'deep_health_check/db_health_check'
|
6
|
+
require 'deep_health_check/dependency_health_check'
|
7
|
+
require 'deep_health_check/tcp_dependency_health_check'
|
8
|
+
require 'deep_health_check/http_dependency_health_check'
|
9
|
+
require 'deep_health_check/health_check_builder'
|
10
|
+
require 'deep_health_check/middleware_health_check'
|
11
|
+
|
12
|
+
module DeepHealthCheck
|
13
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DeepHealthCheck
|
4
|
+
class DBHealthCheck < HealthCheck
|
5
|
+
def call
|
6
|
+
respose(db_active_record.merge(db_delayed_jobs))
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def respose(data)
|
12
|
+
api_health_check 200, "connected": data[:connected],
|
13
|
+
"tables": data[:tables].to_s,
|
14
|
+
"max_connection_size": data[:db_size].to_s,
|
15
|
+
"open_connection": data[:db_conn_size].to_s,
|
16
|
+
"dj_total_count": data[:dj_count].to_s,
|
17
|
+
"dj_faild_count": data[:faild_dj_count].to_s,
|
18
|
+
"dj_terminated_count": data[:terminated_count].to_s
|
19
|
+
end
|
20
|
+
|
21
|
+
def db_active_record
|
22
|
+
data = {}
|
23
|
+
data[:tables] = ActiveRecord::Base.connection.tables.count
|
24
|
+
data[:connected] = ActiveRecord::Base.connected?
|
25
|
+
data[:db_size] = ActiveRecord::Base.connection_pool.size
|
26
|
+
data[:db_conn_size] = ActiveRecord::Base.connection_pool.connections.size
|
27
|
+
data
|
28
|
+
rescue
|
29
|
+
{}
|
30
|
+
end
|
31
|
+
|
32
|
+
def db_delayed_jobs
|
33
|
+
data = {}
|
34
|
+
data[:dj_count] = Delayed::Job.count
|
35
|
+
data[:terminated_count] = Delayed::Job.where.not(failed_at: nil).count
|
36
|
+
data[:faild_dj_count] = Delayed::Job.where(failed_at: nil)
|
37
|
+
.where('attempts > 0').count
|
38
|
+
rescue
|
39
|
+
{}
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DeepHealthCheck
|
4
|
+
class DependencyHealthCheck < HealthCheck
|
5
|
+
def initialize
|
6
|
+
@type = 'abstract'
|
7
|
+
@dependencies = nil
|
8
|
+
raise 'You are trying to instantiate an abstract class!'
|
9
|
+
end
|
10
|
+
|
11
|
+
def call
|
12
|
+
return no_dependencies_response if @dependencies.nil?
|
13
|
+
api_health_check health_status_code, @dependencies
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def health_status_code
|
19
|
+
raise 'health_status_code need to implmented'
|
20
|
+
end
|
21
|
+
|
22
|
+
def no_dependencies_response
|
23
|
+
api_health_check 200, 'message': "No #{@type.upcase} dependencies defined"
|
24
|
+
end
|
25
|
+
|
26
|
+
def fetch_dependencies_from_env
|
27
|
+
dependencies = []
|
28
|
+
(0..99).each do |i|
|
29
|
+
dependencies << ENV[format("#{@type.upcase}_DEPENDENCY_%02d", i)]
|
30
|
+
end
|
31
|
+
dependencies.compact
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DeepHealthCheck
|
4
|
+
class HealthCheck
|
5
|
+
def call
|
6
|
+
api_health_check 200, 'message': 'OK'
|
7
|
+
end
|
8
|
+
|
9
|
+
private
|
10
|
+
|
11
|
+
def api_health_check(status, payload)
|
12
|
+
[status,
|
13
|
+
{ 'Content-Type' => 'application/json' },
|
14
|
+
[{
|
15
|
+
'data': {
|
16
|
+
'type': 'checker',
|
17
|
+
'id': '1',
|
18
|
+
'attributes': payload
|
19
|
+
}
|
20
|
+
}.to_json]]
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DeepHealthCheck
|
4
|
+
class HealthCheckBuilder
|
5
|
+
def self.build(check)
|
6
|
+
case check
|
7
|
+
when '/health'
|
8
|
+
HealthCheck.new
|
9
|
+
when '/db_health'
|
10
|
+
DBHealthCheck.new
|
11
|
+
when '/tcp_dependencies_health'
|
12
|
+
TCPDependencyHealthCheck.new
|
13
|
+
when '/http_dependencies_health'
|
14
|
+
HTTPDependencyHealthCheck.new
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'faraday'
|
4
|
+
require 'faraday_middleware'
|
5
|
+
|
6
|
+
module DeepHealthCheck
|
7
|
+
class HTTPDependencyHealthCheck < DependencyHealthCheck
|
8
|
+
def initialize
|
9
|
+
@type = 'http'
|
10
|
+
@dependencies = process_dependencies fetch_dependencies_from_env
|
11
|
+
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def process_dependencies(dependencies_list)
|
16
|
+
threads = dependencies_list.map do |url|
|
17
|
+
Thread.new do
|
18
|
+
{ url.to_s => http_status(url) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
threads.each(&:join)
|
23
|
+
threads.map(&:value).reduce(&:merge)
|
24
|
+
end
|
25
|
+
|
26
|
+
def health_status_code
|
27
|
+
failed = @dependencies.any? do |_name, response|
|
28
|
+
!response[:status] || response[:status] >= 300
|
29
|
+
end
|
30
|
+
failed ? 503 : 200
|
31
|
+
end
|
32
|
+
|
33
|
+
def http_status(url)
|
34
|
+
response = faraday.get url
|
35
|
+
{ status: response.status, details: response.body }
|
36
|
+
rescue RuntimeError, Faraday::Error => e
|
37
|
+
{ status: nil, details: e.inspect }
|
38
|
+
end
|
39
|
+
|
40
|
+
def faraday
|
41
|
+
Faraday.new do |builder|
|
42
|
+
builder.response :json, content_type: /\bjson$/
|
43
|
+
builder.response(:encoding) if defined?(Faraday::Encoding)
|
44
|
+
builder.adapter Faraday.default_adapter
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module DeepHealthCheck
|
4
|
+
class MiddlewareHealthCheck
|
5
|
+
def initialize(app)
|
6
|
+
@app = app
|
7
|
+
end
|
8
|
+
|
9
|
+
def call(env)
|
10
|
+
health_check = HealthCheckBuilder.build env['PATH_INFO']
|
11
|
+
health_check&.call || @app.call(env)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'net-telnet'
|
4
|
+
|
5
|
+
module DeepHealthCheck
|
6
|
+
class TCPDependencyHealthCheck < DependencyHealthCheck
|
7
|
+
def initialize
|
8
|
+
@type = 'tcp'
|
9
|
+
@dependencies = process_dependencies fetch_dependencies_from_env
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def process_dependencies(dependencies_list)
|
15
|
+
threads = dependencies_list.map do |item|
|
16
|
+
host, port = item.to_s.split(':')
|
17
|
+
Thread.new do
|
18
|
+
{ "#{host}_#{port}" => tcp_telnet_status(host, port) }
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
threads.each(&:join)
|
23
|
+
threads.map(&:value).reduce(&:merge)
|
24
|
+
end
|
25
|
+
|
26
|
+
def health_status_code
|
27
|
+
faild_count = @dependencies.select { |_k, v| v == down }.count
|
28
|
+
faild_count.zero? ? 200 : 503
|
29
|
+
end
|
30
|
+
|
31
|
+
def tcp_telnet_status(host, port)
|
32
|
+
return up if Net::Telnet.new(
|
33
|
+
'Host' => host,
|
34
|
+
'Port' => port,
|
35
|
+
'Telnetmode' => false,
|
36
|
+
'Prompt' => /^\+OK/n
|
37
|
+
)
|
38
|
+
down
|
39
|
+
rescue
|
40
|
+
down
|
41
|
+
end
|
42
|
+
|
43
|
+
def up
|
44
|
+
{ 'message': 'UP' }
|
45
|
+
end
|
46
|
+
|
47
|
+
def down
|
48
|
+
{ 'message': 'DOWN' }
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
metadata
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: deep_health_check
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Al-waleed shihadeh
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2019-12-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: net-telnet
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: faraday
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: faraday_middleware
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: bundler
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '2.1'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '2.1'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '10.0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '10.0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: rack-test
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - "~>"
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: 1.1.0
|
90
|
+
type: :development
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - "~>"
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: 1.1.0
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: rspec
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - "~>"
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: 3.5.0
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - "~>"
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: 3.5.0
|
111
|
+
- !ruby/object:Gem::Dependency
|
112
|
+
name: rubocop
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
114
|
+
requirements:
|
115
|
+
- - '='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: 0.78.0
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
requirements:
|
122
|
+
- - '='
|
123
|
+
- !ruby/object:Gem::Version
|
124
|
+
version: 0.78.0
|
125
|
+
description: Provides a health check API endpoint
|
126
|
+
email:
|
127
|
+
- shihadeh.dev@gmail.com
|
128
|
+
executables: []
|
129
|
+
extensions: []
|
130
|
+
extra_rdoc_files: []
|
131
|
+
files:
|
132
|
+
- ".github/workflows/gempush.yml"
|
133
|
+
- ".gitignore"
|
134
|
+
- ".rspec"
|
135
|
+
- ".rubocop.yml"
|
136
|
+
- ".ruby-gemset"
|
137
|
+
- ".ruby-version"
|
138
|
+
- ".travis.yml"
|
139
|
+
- Gemfile
|
140
|
+
- LICENSE.txt
|
141
|
+
- NGINX.md
|
142
|
+
- README.md
|
143
|
+
- Rakefile
|
144
|
+
- bin/console
|
145
|
+
- bin/setup
|
146
|
+
- bin/travis
|
147
|
+
- deep_health_check.gemspec
|
148
|
+
- lib/deep_health_check.rb
|
149
|
+
- lib/deep_health_check/db_health_check.rb
|
150
|
+
- lib/deep_health_check/dependency_health_check.rb
|
151
|
+
- lib/deep_health_check/health_check.rb
|
152
|
+
- lib/deep_health_check/health_check_builder.rb
|
153
|
+
- lib/deep_health_check/http_dependency_health_check.rb
|
154
|
+
- lib/deep_health_check/middleware_health_check.rb
|
155
|
+
- lib/deep_health_check/tcp_dependency_health_check.rb
|
156
|
+
- lib/deep_health_check/version.rb
|
157
|
+
homepage: https://github.com/wshihadeh/deep_health_check
|
158
|
+
licenses:
|
159
|
+
- MIT
|
160
|
+
metadata: {}
|
161
|
+
post_install_message:
|
162
|
+
rdoc_options: []
|
163
|
+
require_paths:
|
164
|
+
- lib
|
165
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
166
|
+
requirements:
|
167
|
+
- - ">="
|
168
|
+
- !ruby/object:Gem::Version
|
169
|
+
version: '0'
|
170
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
171
|
+
requirements:
|
172
|
+
- - ">="
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0'
|
175
|
+
requirements: []
|
176
|
+
rubygems_version: 3.0.3
|
177
|
+
signing_key:
|
178
|
+
specification_version: 4
|
179
|
+
summary: Provides a health check API endpoint
|
180
|
+
test_files: []
|