rails-healthcheck 1.1.3 → 1.4.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: 370d735adceeebed3048fbd2284ea7438c929d6837a80da08c784116d087fb8d
4
- data.tar.gz: 18e713ea4c2416c4bc57c1849de24011ba2bc3598c010927a3052814faac8f51
3
+ metadata.gz: 5a5cf78b04593281cfd2e3018a79703e07aadc3d2a4ace5cc2d972f7ad083705
4
+ data.tar.gz: d0559dc632284d6f0a7f853632998973e6f2937974b1e20606a55851e1cd7c46
5
5
  SHA512:
6
- metadata.gz: 511307f0fd44e27b7ea2f8835d1908bfbcd9eb79808b5c3b062d734a40d1f92c34d1e8b0c5c9fb46c93bdc7d824eaf1434b051ef4e412e0124ab71d8483e0c7c
7
- data.tar.gz: '073971490643f620002ae30b79dc38a01424caaf511a9de8f1d7f3a4e077c2bb2708b83d9b404cf64fb67e837e48a41403955333029baeb3eea5cc1ff114be03'
6
+ metadata.gz: c9e1c73e1314bd9731e0f81f4aa45364490e64b9fbdb3339b93506337c9778a76172347af086fe7cb834f5e5740cb63df9203968554685febaaf0e65e21c1e5b
7
+ data.tar.gz: 453b5a2ce77392ad5b1763d3e56b386d2a078c2fc3d9f950e30b673b331f1400a4f966228141de6cb2ee7a31eef09d022d68901abe2ff1e31c024867a6a13321
data/README.md CHANGED
@@ -1,19 +1,19 @@
1
1
  # [Rails::Healthcheck][gem_page]
2
2
 
3
3
  [![Gem Version][gem_version_image]][gem_version_page]
4
- [![Build Status][travis_status_image]][travis_page]
5
- [![Maintainability][code_climate_maintainability_image]][code_climate_maintainability_page]
6
- [![Test Coverage][code_climate_test_coverage_image]][code_climate_test_coverage_page]
7
4
 
8
5
  A simple way to configure a healthcheck route in Rails applications
9
6
 
10
7
  ## Table of Contents
8
+
11
9
  - [Getting started](#getting-started)
12
10
  - [Installation](#installation)
13
11
  - [Settings](#settings)
14
- - [Verbose Errors](#verbose-errors)
12
+ - [Custom Response](#custom-response)
13
+ - [Verbose](#verbose)
15
14
  - [Ignoring logs](#ignoring-logs)
16
15
  - [Lograge](#lograge)
16
+ - [Datadog](#datadog)
17
17
  - [Requests Examples](#requests-examples)
18
18
  - [Contributing](#contributing)
19
19
  - [License](#license)
@@ -34,7 +34,7 @@ and run the command bellow to create the initializer:
34
34
  rails generate healthcheck:install
35
35
  ```
36
36
 
37
- ## Settings
37
+ ### Settings
38
38
 
39
39
  You can set the settings in the initializer file (_config/initializers/healthcheck.rb_):
40
40
 
@@ -48,41 +48,81 @@ Healthcheck.configure do |config|
48
48
  config.route = '/healthcheck'
49
49
  config.method = :get
50
50
 
51
+ # -- Custom Response --
52
+ # config.custom = lambda { |controller, checker|
53
+ # return controller.render(plain: 'Everything is awesome!') unless checker.errored?
54
+ # controller.verbose? ? controller.verbose_error(checker) : controller.head_error
55
+ # }
56
+
51
57
  # -- Checks --
52
- # config.add_check :database, -> { ActiveRecord::Base.connection.execute('select 1') }
53
- # config.add_check :migrations,-> { ActiveRecord::Migration.check_pending! }
54
- # config.add_check :cache, -> { Rails.cache.read('some_key') }
58
+ # config.add_check :database, -> { ActiveRecord::Base.connection.execute('select 1') }
59
+ # config.add_check :migrations, -> { ActiveRecord::Migration.check_pending! }
60
+ # config.add_check :cache, -> { Rails.cache.read('some_key') }
55
61
  # config.add_check :environments, -> { Dotenv.require_keys('ENV_NAME', 'ANOTHER_ENV') }
56
62
  end
57
63
  ```
58
64
 
59
- ### Verbose Errors
65
+ ### Custom Response
66
+
67
+ You can override the configs `success`, `error` and `verbose` and write your custom behaviour for the healthcheck api using the field `custom` in the initializer:
68
+
69
+ ```ruby
70
+ Healthcheck.configure do |config|
71
+ # ...
72
+
73
+ # -- Custom Response --
74
+ config.custom = lambda { |controller, checker|
75
+ controller.render json: { field_name: 'my custom field value' } unless checker.errored?
76
+ ...
77
+ }
78
+
79
+ # ...
80
+ end
81
+ ```
82
+
83
+ Pass a `lambda` or `proc` receiving the params `controller` and `checker` to use it correctly. To use checker, you can see the avialable methods [here][checker_url] and [how][healthcheck_controller_url] it is implemented on HealthcheckController.
84
+
85
+ ### Verbose
86
+
87
+ You can enable verbose responses setting `config.verbose = true`.
88
+
89
+ - On success
90
+
91
+ ```json
92
+ {
93
+ "code": 200,
94
+ "status": {
95
+ "migrations": "OK",
96
+ "environments": "OK"
97
+ }
98
+ }
99
+ ```
60
100
 
61
- When happen an error and verbose is enabled (`config.verbose = true`), the response will be like this:
101
+ - On error
62
102
 
63
103
  ```json
64
104
  {
65
- "code": 503,
66
- "errors": [
67
- {
68
- "name": "migrations",
69
- "exception": "ActiveRecord::PendingMigrationError",
70
- "message": "Migrations are pending. To resolve this issue, run: bin/rails db:migrate RAILS_ENV=production"
71
- },
72
- {
73
- "name": "environments",
74
- "exception": "Dotenv::MissingKeys",
75
- "message": "Missing required configuration key: [\"RAILS_ENV\"]"
76
- }
77
- ]
105
+ "code": 503,
106
+ "errors": [
107
+ {
108
+ "name": "migrations",
109
+ "exception": "ActiveRecord::PendingMigrationError",
110
+ "message": "Migrations are pending. To resolve this issue, run: bin/rails db:migrate RAILS_ENV=production"
111
+ },
112
+ {
113
+ "name": "environments",
114
+ "exception": "Dotenv::MissingKeys",
115
+ "message": "Missing required configuration key: [\"RAILS_ENV\"]"
116
+ }
117
+ ]
78
118
  }
79
119
  ```
80
120
 
81
121
  ## Ignoring logs
82
122
 
83
- ### Lograge
123
+ If you want to ignore Healthcheck request logs, you can use these options:
84
124
 
85
- If you are using [Lograge](https://github.com/roidrage/lograge) you can ignore Healthcheck logs using this code:
125
+ ### [Lograge](https://github.com/roidrage/lograge)
86
126
 
87
127
  ```ruby
88
128
  # config/environments/production.rb
@@ -93,6 +133,18 @@ Rails.application.configure do
93
133
  end
94
134
  ```
95
135
 
136
+ ### [Datadog](https://github.com/roidrage/lograge)
137
+
138
+ ```ruby
139
+ # config/environments/production.rb
140
+
141
+ filter = Datadog::Pipeline::SpanFilter.new do |span|
142
+ span.name == 'rack.request' && span.get_tag('http.url') == Healthcheck.configuration.route
143
+ end
144
+
145
+ Datadog::Pipeline.before_flush(filter)
146
+ ```
147
+
96
148
  ### Requests Examples
97
149
 
98
150
  - Success
@@ -101,54 +153,22 @@ end
101
153
  curl -i localhost:3000/healthcheck
102
154
 
103
155
  HTTP/1.1 200 OK
104
- X-Frame-Options: SAMEORIGIN
105
- X-XSS-Protection: 1; mode=block
106
- X-Content-Type-Options: nosniff
107
- X-Download-Options: noopen
108
- X-Permitted-Cross-Domain-Policies: none
109
- Referrer-Policy: strict-origin-when-cross-origin
110
- Content-Type: text/html
111
- Cache-Control: no-cache
112
- X-Request-Id: cbc9fdd0-8090-4927-b061-1e82bcf2e039
113
- X-Runtime: 0.003599
114
- Transfer-Encoding: chunked
115
156
  ```
116
157
 
117
158
  - Error
159
+
118
160
  ```shell
119
161
  curl -i localhost:3000/healthcheck
120
162
 
121
163
  HTTP/1.1 503 Service Unavailable
122
- X-Frame-Options: SAMEORIGIN
123
- X-XSS-Protection: 1; mode=block
124
- X-Content-Type-Options: nosniff
125
- X-Download-Options: noopen
126
- X-Permitted-Cross-Domain-Policies: none
127
- Referrer-Policy: strict-origin-when-cross-origin
128
- Content-Type: text/html
129
- Cache-Control: no-cache
130
- X-Request-Id: e07eb20f-7d32-4f1a-86ad-32403de2b19a
131
- X-Runtime: 0.033772
132
- Transfer-Encoding: chunked
133
164
  ```
134
165
 
135
166
  - Error (Verbose)
167
+
136
168
  ```shell
137
169
  curl -i localhost:3000/healthcheck
138
170
 
139
171
  HTTP/1.1 503 Service Unavailable
140
- X-Frame-Options: SAMEORIGIN
141
- X-XSS-Protection: 1; mode=block
142
- X-Content-Type-Options: nosniff
143
- X-Download-Options: noopen
144
- X-Permitted-Cross-Domain-Policies: none
145
- Referrer-Policy: strict-origin-when-cross-origin
146
- Content-Type: application/json; charset=utf-8
147
- Cache-Control: no-cache
148
- X-Request-Id: 8fa5e69a-bfe3-4bbc-875b-ce86f4269467
149
- X-Runtime: 0.019992
150
- Transfer-Encoding: chunked
151
-
152
172
  {"code":503,"errors":[{"name":"zero_division","exception":"ZeroDivisionError","message":"divided by 0"}]}
153
173
  ```
154
174
 
@@ -172,11 +192,7 @@ Everyone interacting in the Rails::Healthcheck project’s codebases, issue trac
172
192
  [code_of_conduct_page]: https://github.com/linqueta/rails-healthcheck/blob/master/CODE_OF_CONDUCT.md
173
193
  [mit_license_page]: https://opensource.org/licenses/MIT
174
194
  [contributor_convenant_page]: http://contributor-covenant.org
175
- [travis_status_image]: https://travis-ci.org/linqueta/rails-healthcheck.svg?branch=master
176
- [travis_page]: https://travis-ci.org/linqueta/rails-healthcheck
177
- [code_climate_maintainability_image]: https://api.codeclimate.com/v1/badges/670d851a6c06f77fa36e/maintainability
178
- [code_climate_maintainability_page]: https://codeclimate.com/github/linqueta/rails-healthcheck/maintainability
179
- [code_climate_test_coverage_image]: https://api.codeclimate.com/v1/badges/670d851a6c06f77fa36e/test_coverage
180
- [code_climate_test_coverage_page]: https://codeclimate.com/github/linqueta/rails-healthcheck/test_coverage
181
195
  [gem_version_image]: https://badge.fury.io/rb/rails-healthcheck.svg
182
- [gem_version_page]: https://rubygems.org/gems/rails-healthcheck
196
+ [gem_version_page]: https://badge.fury.io/rb/rails-healthcheck
197
+ [checker_url]: https://github.com/linqueta/rails-healthcheck/blob/master/lib/healthcheck/checker.rb
198
+ [healthcheck_controller_url]: https://github.com/linqueta/rails-healthcheck/blob/master/app/controllers/healthcheck/healthchecks_controller.rb
@@ -1,31 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'action_controller/railtie'
4
+
4
5
  module Healthcheck
5
6
  class HealthchecksController < ActionController::Base
6
7
  def check
7
- checker = Healthcheck.check
8
- return head Healthcheck.configuration.success unless checker.errored?
9
-
10
- verbose? ? verbose_error(checker) : head_error
11
- end
12
-
13
- private
8
+ return Healthcheck.custom!(self) if Healthcheck.custom?
14
9
 
15
- def head_error
16
- head(Healthcheck.configuration.error)
17
- end
18
-
19
- def verbose_error(checker)
20
- render status: Healthcheck.configuration.error,
21
- json: {
22
- code: Healthcheck.configuration.error,
23
- errors: checker.errors.as_json
24
- }
25
- end
26
-
27
- def verbose?
28
- Healthcheck.configuration.verbose
10
+ checker = Healthcheck.check
11
+ response = if checker.errored?
12
+ Healthcheck::Response::Error.new(self, checker)
13
+ else
14
+ Healthcheck::Response::Success.new(self, checker)
15
+ end
16
+ response.execute!
29
17
  end
30
18
  end
31
19
  end
@@ -18,10 +18,16 @@ module Healthcheck
18
18
  config.route = '/healthcheck'
19
19
  config.method = :get
20
20
 
21
+ # -- Custom Response --
22
+ # config.custom = lambda { |controller, checker|
23
+ # return controller.render(plain: 'Everything is awesome!') unless checker.errored?
24
+ # controller.verbose? ? controller.verbose_error(checker) : controller.head_error
25
+ # }
26
+
21
27
  # -- Checks --
22
- # config.add_check :database, -> { ActiveRecord::Base.connection.execute('select 1') }
23
- # config.add_check :migrations,-> { ActiveRecord::Migration.check_pending! }
24
- # config.add_check :cache, -> { Rails.cache.read('some_key') }
28
+ # config.add_check :database, -> { ActiveRecord::Base.connection.execute('select 1') }
29
+ # config.add_check :migrations, -> { ActiveRecord::Migration.check_pending! }
30
+ # config.add_check :cache, -> { Rails.cache.read('some_key') }
25
31
  # config.add_check :environments, -> { Dotenv.require_keys('ENV_NAME', 'ANOTHER_ENV') }
26
32
  end
27
33
  HEALTHCHECK_INITIALIZER_TEXT
data/lib/healthcheck.rb CHANGED
@@ -8,6 +8,10 @@ require 'healthcheck/error'
8
8
  require 'healthcheck/router'
9
9
  require 'healthcheck/engine'
10
10
 
11
+ require 'healthcheck/response/base'
12
+ require 'healthcheck/response/success'
13
+ require 'healthcheck/response/error'
14
+
11
15
  module Healthcheck
12
16
  CONTROLLER_ACTION = 'Healthcheck::HealthchecksController#check'
13
17
 
@@ -22,10 +26,18 @@ module Healthcheck
22
26
  end
23
27
 
24
28
  def routes(router)
25
- Healthcheck::Router.mount(router)
29
+ Router.mount(router)
26
30
  end
27
31
 
28
32
  def check
29
- Healthcheck::Checker.new.tap(&:check)
33
+ Checker.new.tap(&:check)
34
+ end
35
+
36
+ def custom!(controller)
37
+ configuration.custom.call(controller, check)
38
+ end
39
+
40
+ def custom?
41
+ configuration.custom
30
42
  end
31
43
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Healthcheck
4
4
  class Configuration
5
- SETTINGS = %i[success error verbose route method checks].freeze
5
+ SETTINGS = %i[success error verbose route method checks custom].freeze
6
6
 
7
7
  attr_accessor(*SETTINGS)
8
8
 
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Healthcheck
4
+ module Response
5
+ class Base
6
+ def initialize(controller, checker)
7
+ @controller = controller
8
+ @checker = checker
9
+ @configuration = Healthcheck.configuration
10
+ end
11
+
12
+ def execute!
13
+ verbose? ? @controller.render(verbose) : @controller.head(status)
14
+ end
15
+
16
+ private
17
+
18
+ def verbose?
19
+ @configuration.verbose
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Healthcheck
4
+ module Response
5
+ class Error < Base
6
+ def verbose
7
+ {
8
+ status: Healthcheck.configuration.error,
9
+ json: {
10
+ code: Healthcheck.configuration.error,
11
+ errors: @checker.errors.as_json
12
+ }
13
+ }
14
+ end
15
+
16
+ def status
17
+ @configuration.error
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Healthcheck
4
+ module Response
5
+ class Success < Base
6
+ def verbose
7
+ {
8
+ status: @configuration.success,
9
+ json: {
10
+ code: @configuration.success,
11
+ status: @configuration.checks.each_with_object({}) { |check, obj| obj[check.name] = 'OK' }
12
+ }
13
+ }
14
+ end
15
+
16
+ def status
17
+ @configuration.success
18
+ end
19
+ end
20
+ end
21
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Healthcheck
4
- VERSION = '1.1.3'
4
+ VERSION = '1.4.0'
5
5
  end
metadata CHANGED
@@ -1,17 +1,31 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-healthcheck
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - linqueta
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-17 00:00:00.000000000 Z
11
+ date: 2021-05-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
- name: rails
14
+ name: actionpack
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: railties
15
29
  requirement: !ruby/object:Gem::Requirement
16
30
  requirements:
17
31
  - - ">="
@@ -44,14 +58,14 @@ dependencies:
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '10.0'
61
+ version: '13.0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '10.0'
68
+ version: '13.0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: rspec-rails
57
71
  requirement: !ruby/object:Gem::Requirement
@@ -98,16 +112,16 @@ dependencies:
98
112
  name: simplecov
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - ">="
115
+ - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: 0.17.0
117
+ version: 0.17.1
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
- - - ">="
122
+ - - "~>"
109
123
  - !ruby/object:Gem::Version
110
- version: 0.17.0
124
+ version: 0.17.1
111
125
  - !ruby/object:Gem::Dependency
112
126
  name: simplecov-console
113
127
  requirement: !ruby/object:Gem::Requirement
@@ -152,6 +166,9 @@ files:
152
166
  - lib/healthcheck/configuration.rb
153
167
  - lib/healthcheck/engine.rb
154
168
  - lib/healthcheck/error.rb
169
+ - lib/healthcheck/response/base.rb
170
+ - lib/healthcheck/response/error.rb
171
+ - lib/healthcheck/response/success.rb
155
172
  - lib/healthcheck/router.rb
156
173
  - lib/healthcheck/version.rb
157
174
  - lib/rails-healthcheck.rb
@@ -159,7 +176,7 @@ homepage: https://github.com/linqueta/rails-healthcheck
159
176
  licenses:
160
177
  - MIT
161
178
  metadata: {}
162
- post_install_message:
179
+ post_install_message:
163
180
  rdoc_options: []
164
181
  require_paths:
165
182
  - lib
@@ -175,7 +192,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
175
192
  version: '0'
176
193
  requirements: []
177
194
  rubygems_version: 3.1.2
178
- signing_key:
195
+ signing_key:
179
196
  specification_version: 4
180
197
  summary: Healthcheck route for a Rails application
181
198
  test_files: []