health-monitor-rails 0.0.1
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.
- data/README.md +98 -0
- data/Rakefile +22 -0
- data/app/controllers/health_controller.rb +22 -0
- data/config/routes.rb +5 -0
- data/lib/health-monitor-rails.rb +4 -0
- data/lib/health_monitor/configuration.rb +9 -0
- data/lib/health_monitor/engine.rb +5 -0
- data/lib/health_monitor/monitor.rb +27 -0
- data/lib/health_monitor/providers/cache.rb +14 -0
- data/lib/health_monitor/providers/database.rb +15 -0
- data/lib/health_monitor/providers/redis.rb +21 -0
- data/lib/health_monitor/providers/sidekiq.rb +15 -0
- data/lib/health_monitor/version.rb +3 -0
- metadata +227 -0
data/README.md
ADDED
@@ -0,0 +1,98 @@
|
|
1
|
+
# health-monitor-rails
|
2
|
+
|
3
|
+
[](http://badge.fury.io/rb/health-monitor-rails)
|
4
|
+
[](https://travis-ci.org/lbeder/health-monitor-rails)
|
5
|
+
[](https://gemnasium.com/lbeder/health-monitor-rails)
|
6
|
+
[](https://coveralls.io/r/lbeder/health-monitor-rails)
|
7
|
+
|
8
|
+
This is a health monitoring Rails mountable plug-in, which checks various services (db, cache, sidekiq, redis, etc.).
|
9
|
+
|
10
|
+
Mounting this gem will add a '/check' route to your application, which can be used for health monitoring the application and its various services.
|
11
|
+
|
12
|
+
## Setup
|
13
|
+
|
14
|
+
If you are using bundler add health-monitor-rails to your Gemfile:
|
15
|
+
|
16
|
+
```ruby
|
17
|
+
gem 'health-monitor-rails'
|
18
|
+
```
|
19
|
+
|
20
|
+
Then run:
|
21
|
+
|
22
|
+
```bash
|
23
|
+
$ bundle install
|
24
|
+
```
|
25
|
+
|
26
|
+
Otherwise install the gem:
|
27
|
+
|
28
|
+
```bash
|
29
|
+
$ gem install health-monitor-rails
|
30
|
+
```
|
31
|
+
|
32
|
+
## Usage
|
33
|
+
You can mount this inside your app routes by adding this to config/routes.rb:
|
34
|
+
|
35
|
+
```ruby
|
36
|
+
mount HealthMonitor::Engine => '/health'
|
37
|
+
```
|
38
|
+
|
39
|
+
## Supported service providers
|
40
|
+
The following services are currently supported:
|
41
|
+
* DB
|
42
|
+
* Cache
|
43
|
+
* Redis
|
44
|
+
* Sidekiq
|
45
|
+
|
46
|
+
## Configuration
|
47
|
+
|
48
|
+
### Adding providers
|
49
|
+
By default, only the database check is enabled. You can add more service providers from an initializer:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
HealthMonitor.configure do |config|
|
53
|
+
config.providers += [:cache, :redis, :sidekiq]
|
54
|
+
end
|
55
|
+
```
|
56
|
+
|
57
|
+
You can also override the list with a custom set of providers:
|
58
|
+
```ruby
|
59
|
+
HealthMonitor.configure do |config|
|
60
|
+
config.providers = [:sidekiq]
|
61
|
+
end
|
62
|
+
```
|
63
|
+
|
64
|
+
### Adding a custom error callback
|
65
|
+
If you need to perform any additional error handling (for example, for additional error reporting), you can configure a custom error callback:
|
66
|
+
|
67
|
+
```ruby
|
68
|
+
HealthMonitor.configure do |config|
|
69
|
+
config.error_callback = proc do |e|
|
70
|
+
logger.error "Health check failed with: #{e.message}"
|
71
|
+
|
72
|
+
Raven.capture_exception(e)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
```
|
76
|
+
|
77
|
+
## License
|
78
|
+
|
79
|
+
The MIT License (MIT)
|
80
|
+
|
81
|
+
Copyright (c) 2014
|
82
|
+
|
83
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
84
|
+
this software and associated documentation files (the "Software"), to deal in
|
85
|
+
the Software without restriction, including without limitation the rights to
|
86
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
87
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
88
|
+
subject to the following conditions:
|
89
|
+
|
90
|
+
The above copyright notice and this permission notice shall be included in all
|
91
|
+
copies or substantial portions of the Software.
|
92
|
+
|
93
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
94
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
95
|
+
FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
96
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
97
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
98
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/Rakefile
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
|
8
|
+
APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
|
9
|
+
load 'rails/tasks/engine.rake'
|
10
|
+
|
11
|
+
Bundler::GemHelper.install_tasks
|
12
|
+
|
13
|
+
require 'rspec/core/rake_task'
|
14
|
+
|
15
|
+
Rake::TestTask.new(:test) do |t|
|
16
|
+
t.libs << 'lib'
|
17
|
+
t.libs << 'test'
|
18
|
+
t.pattern = 'test/**/*_test.rb'
|
19
|
+
t.verbose = false
|
20
|
+
end
|
21
|
+
|
22
|
+
task default: :test
|
@@ -0,0 +1,22 @@
|
|
1
|
+
class HealthController < ActionController::Base
|
2
|
+
layout nil
|
3
|
+
|
4
|
+
# GET /health/check
|
5
|
+
def check
|
6
|
+
HealthMonitor.check!
|
7
|
+
|
8
|
+
render text: "Healh check has passed: #{Time.now.to_s(:db)}\n"
|
9
|
+
rescue Exception => e
|
10
|
+
render text: "Healh check has failed: #{Time.now.to_s(:db)}, error: #{e.message}\n",
|
11
|
+
:status => :service_unavailable
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
def process_with_silence(*args)
|
16
|
+
logger.quietly do
|
17
|
+
process_without_silence(*args)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
alias_method_chain :process, :silence
|
22
|
+
end
|
data/config/routes.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'health_monitor/configuration'
|
2
|
+
|
3
|
+
module HealthMonitor
|
4
|
+
extend self
|
5
|
+
|
6
|
+
attr_accessor :configuration
|
7
|
+
|
8
|
+
def configure
|
9
|
+
self.configuration ||= Configuration.new
|
10
|
+
|
11
|
+
yield configuration if block_given?
|
12
|
+
end
|
13
|
+
|
14
|
+
def check!
|
15
|
+
configuration.providers.each do |provider|
|
16
|
+
require "health_monitor/providers/#{provider}"
|
17
|
+
|
18
|
+
monitor = "HealthMonitor::Providers::#{provider.capitalize}".constantize.new
|
19
|
+
monitor.check!
|
20
|
+
end
|
21
|
+
rescue Exception => e
|
22
|
+
configuration.error_callback.call(e) if configuration.error_callback
|
23
|
+
raise
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
HealthMonitor.configure
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module HealthMonitor
|
2
|
+
module Providers
|
3
|
+
class Cache
|
4
|
+
def check!
|
5
|
+
time = Time.now.to_s
|
6
|
+
|
7
|
+
Rails.cache.write(:health, time)
|
8
|
+
fetched = Rails.cache.read(:health)
|
9
|
+
|
10
|
+
raise "different values (now: #{time}, fetched: #{fetched}" if fetched != time
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module HealthMonitor
|
2
|
+
module Providers
|
3
|
+
class DBException < StandardError; end
|
4
|
+
|
5
|
+
class Database
|
6
|
+
def check!
|
7
|
+
# Check connection to the DB:
|
8
|
+
query = 'SELECT version FROM schema_migrations'
|
9
|
+
ActiveRecord::Base.connection.select_value(query).to_i
|
10
|
+
rescue => e
|
11
|
+
raise DBException.new(e.message)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'redis/namespace'
|
2
|
+
|
3
|
+
module HealthMonitor
|
4
|
+
module Providers
|
5
|
+
class RedisException < StandardError; end
|
6
|
+
|
7
|
+
class Redis
|
8
|
+
def check!
|
9
|
+
time = Time.now.to_s(:db)
|
10
|
+
|
11
|
+
r = ::Redis.new
|
12
|
+
r.set(:health, time)
|
13
|
+
fetched = r.get(:health)
|
14
|
+
|
15
|
+
raise "different values (now: #{time}, fetched: #{fetched}" if fetched != time
|
16
|
+
rescue => e
|
17
|
+
raise RedisException.new(e.message)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'sidekiq'
|
2
|
+
|
3
|
+
module HealthMonitor
|
4
|
+
module Providers
|
5
|
+
class SidekiqException < StandardError; end
|
6
|
+
|
7
|
+
class Sidekiq
|
8
|
+
def check!
|
9
|
+
::Sidekiq::Workers.new.size
|
10
|
+
rescue => e
|
11
|
+
raise SidekiqException.new(e.message)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
metadata
ADDED
@@ -0,0 +1,227 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: health-monitor-rails
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Leonid Beder
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-02-09 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rails
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '3.2'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '3.2'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: sqlite3
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :development
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rspec-rails
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ! '>='
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ! '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: database_cleaner
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: spork
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :development
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
- !ruby/object:Gem::Dependency
|
95
|
+
name: pry
|
96
|
+
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ! '>='
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '0'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ! '>='
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '0'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: coveralls
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ! '>='
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '0'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ! '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: rake
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: rediska
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
146
|
+
requirements:
|
147
|
+
- - ! '>='
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: '0'
|
150
|
+
type: :development
|
151
|
+
prerelease: false
|
152
|
+
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
154
|
+
requirements:
|
155
|
+
- - ! '>='
|
156
|
+
- !ruby/object:Gem::Version
|
157
|
+
version: '0'
|
158
|
+
- !ruby/object:Gem::Dependency
|
159
|
+
name: sidekiq
|
160
|
+
requirement: !ruby/object:Gem::Requirement
|
161
|
+
none: false
|
162
|
+
requirements:
|
163
|
+
- - ! '>='
|
164
|
+
- !ruby/object:Gem::Version
|
165
|
+
version: '0'
|
166
|
+
type: :development
|
167
|
+
prerelease: false
|
168
|
+
version_requirements: !ruby/object:Gem::Requirement
|
169
|
+
none: false
|
170
|
+
requirements:
|
171
|
+
- - ! '>='
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: '0'
|
174
|
+
description: Health monitoring Rails plug-in, which checks various services (db, cache,
|
175
|
+
sidekiq, redis, etc.).
|
176
|
+
email:
|
177
|
+
- leonid.beder@gmail.com
|
178
|
+
executables: []
|
179
|
+
extensions: []
|
180
|
+
extra_rdoc_files: []
|
181
|
+
files:
|
182
|
+
- app/controllers/health_controller.rb
|
183
|
+
- config/routes.rb
|
184
|
+
- lib/health-monitor-rails.rb
|
185
|
+
- lib/health_monitor/configuration.rb
|
186
|
+
- lib/health_monitor/engine.rb
|
187
|
+
- lib/health_monitor/monitor.rb
|
188
|
+
- lib/health_monitor/providers/cache.rb
|
189
|
+
- lib/health_monitor/providers/database.rb
|
190
|
+
- lib/health_monitor/providers/redis.rb
|
191
|
+
- lib/health_monitor/providers/sidekiq.rb
|
192
|
+
- lib/health_monitor/version.rb
|
193
|
+
- Rakefile
|
194
|
+
- README.md
|
195
|
+
homepage: https://github.com/lbeder/health-monitor-rails
|
196
|
+
licenses:
|
197
|
+
- MIT
|
198
|
+
post_install_message:
|
199
|
+
rdoc_options: []
|
200
|
+
require_paths:
|
201
|
+
- lib
|
202
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
203
|
+
none: false
|
204
|
+
requirements:
|
205
|
+
- - ! '>='
|
206
|
+
- !ruby/object:Gem::Version
|
207
|
+
version: '0'
|
208
|
+
segments:
|
209
|
+
- 0
|
210
|
+
hash: -2918892546612586905
|
211
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
212
|
+
none: false
|
213
|
+
requirements:
|
214
|
+
- - ! '>='
|
215
|
+
- !ruby/object:Gem::Version
|
216
|
+
version: '0'
|
217
|
+
segments:
|
218
|
+
- 0
|
219
|
+
hash: -2918892546612586905
|
220
|
+
requirements: []
|
221
|
+
rubyforge_project:
|
222
|
+
rubygems_version: 1.8.25
|
223
|
+
signing_key:
|
224
|
+
specification_version: 3
|
225
|
+
summary: Health monitoring Rails plug-in, which checks various services (db, cache,
|
226
|
+
sidekiq, redis, etc.)
|
227
|
+
test_files: []
|