health_check 1.1.2 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore CHANGED
@@ -17,6 +17,9 @@ test/tmp
17
17
  test/version_tmp
18
18
  tmp
19
19
 
20
+ ## RUBYMINE
21
+ .idea/
22
+
20
23
  ## MAC OS
21
24
  .DS_Store
22
25
 
@@ -35,7 +38,9 @@ tmtags
35
38
 
36
39
  ## PROJECT::SPECIFIC
37
40
  bin/
41
+ test/bin/
38
42
  railsapps/
43
+ test/*.gemfile.lock
39
44
  ,*
40
45
 
41
46
  # Local ruby version config
data/.travis.yml CHANGED
@@ -3,60 +3,71 @@ notifications:
3
3
  email:
4
4
  on_success: change
5
5
  on_failure: always
6
- rvm:
7
- - 1.8.7
8
- - 1.9.3
9
- - rbx-18mode
10
- - rbx-19mode
11
- - jruby-18mode
12
- - jruby-19mode
13
- #- jruby-head
14
- #- ruby-head
15
- - ree
6
+
16
7
  before_install:
17
- - gem update --system
8
+ - gem update --system $RUBYGEMS_VERSION
18
9
  - gem --version
19
10
  - gem install bundler
20
11
  - bundle --version
21
12
  - mkdir -p tmp/bundle
22
13
 
23
- gemfile:
24
- - rails2_3.gemfile
25
- - rails3_0.gemfile
26
- - rails3_1.gemfile
27
- - rails3_2.gemfile
28
- #- rails_edge.gemfile
29
-
30
14
  bundler_args: "--binstubs"
31
15
 
32
16
  script: ./test/test_with_railsapp
33
17
 
18
+ rvm:
19
+ - 1.8.7
20
+ - 1.9.2
21
+ - 1.9.3
22
+ - 2.0.0
23
+ - jruby-19mode
24
+ - rbx-19mode
25
+ - ree
26
+
27
+ gemfile:
28
+ - test/rails_3.2.gemfile
29
+
30
+ env:
31
+ - RUBYGEMS_VERSION=
32
+
34
33
  matrix:
35
34
  exclude:
36
- - rvm: rbx-18mode
37
- gemfile: rails2_3.gemfile
38
- - rvm: rbx-19mode
39
- gemfile: rails2_3.gemfile
40
- - rvm: jruby-18mode
41
- gemfile: rails2_3.gemfile
35
+ - rvm: 1.8.7
36
+ gemfile: test/rails_3.2.gemfile
37
+ env: RUBYGEMS_VERSION=
38
+
42
39
  - rvm: jruby-19mode
43
- gemfile: rails2_3.gemfile
44
- - rvm: jruby-head
45
- gemfile: rails2_3.gemfile
46
- - rvm: ruby-head
47
- gemfile: rails2_3.gemfile
48
- - rvm: 1.9.3
49
- gemfile: rails2_3.gemfile
40
+ gemfile: test/rails_3.2.gemfile
41
+ env: RUBYGEMS_VERSION=
42
+
43
+ include:
44
+ # rails 2.3 march 16 2009 - ruby 1.8.7
45
+ - rvm: 1.8.7
46
+ gemfile: test/rails_2.3.gemfile
47
+ env: RUBYGEMS_VERSION=1.8.25
50
48
 
49
+ # rails 3.0 aug 29 2010 - ruby 1.8.7
51
50
  - rvm: 1.8.7
52
- gemfile: rails_edge.gemfile
53
- - rvm: rbx-18mode
54
- gemfile: rails_edge.gemfile
55
- - rvm: jruby-18mode
56
- gemfile: rails_edge.gemfile
57
- - rvm: ree
58
- gemfile: rails_edge.gemfile
51
+ gemfile: test/rails_3.0.gemfile
52
+ env: RUBYGEMS_VERSION=
53
+
54
+ # rails 3.1 aug 31, 2011 - ruby 1.8.7 or 1.9.2
55
+ - rvm: 1.8.7
56
+ gemfile: test/rails_3.1.gemfile
57
+ env: RUBYGEMS_VERSION=
58
+
59
+ - rvm: 1.9.2
60
+ gemfile: test/rails_3.1.gemfile
61
+ env: RUBYGEMS_VERSION=
62
+
63
+ # rails 4.0 - in development as of 5 mar 2013 - ruby 2.0
64
+ - rvm: 2.0.0
65
+ gemfile: test/rails_4.0-beta.gemfile
66
+ env: RUBYGEMS_VERSION=
67
+
68
+ - rvm: jruby-19mode
69
+ gemfile: test/rails_3.2.gemfile
70
+ env: RUBYGEMS_VERSION=1.8.25
71
+
59
72
  allow_failures:
60
- - gemfile: rails_edge.gemfile
61
- - rvm: jruby-head
62
- - rvm: ruby-head
73
+ - gemfile: test/rails_4.0-beta.gemfile
data/CHANGELOG CHANGED
@@ -1,5 +1,9 @@
1
1
  = Change Log =
2
2
 
3
+ * 1.2.0 - The gem can now be configured, including timeouts, status codes and text returned on success
4
+ - Customn checks can be added via initializer like config.add_custom_check { CustomCheckClass.a_custom_check }
5
+ - You can now request the response to be json or xml (via url or Content-accepted header)
6
+ - reduced tests to the versions of ruby recomended for the different versions of rails
3
7
  * 1.1.2 - Change to bundler support for building gems, as jeweler gem was broken by v2.0.0 of rubygems
4
8
  * 1.1.0 - Include cache check (Thanks to https://github.com/mgomes1 ) and some changes to test setup to workaround and diagnose test failures under rvm
5
9
  * 1.0.2 - Included travis config and gemfiles used in travis tests in gem and changes to test setup so that gem test
data/README.rdoc CHANGED
@@ -1,4 +1,4 @@
1
- = health\_check gem
1
+ = health_check gem
2
2
 
3
3
  Simple health check of Rails app for use with Pingdom, NewRelic, EngineYard or uptime.openacs.org etc.
4
4
 
@@ -36,6 +36,8 @@ The email gateway is not checked unless the smtp settings have been changed.
36
36
  Specify full or include email in the list of checks to varify the smtp settings
37
37
  (eg use 127.0.0.1 instead of localhost).
38
38
 
39
+ Note: rails 4.0 also checks migrations and throws a ActiveRecord::PendingMigrationError (http error 500)
40
+
39
41
  == Installation
40
42
 
41
43
  === As a Gem from rubygems (Rails 3.0 and above)
@@ -69,6 +71,39 @@ Run the following commands from the root of your rails application
69
71
  cd vendor/plugins
70
72
  git clone git://github.com/ianheggie/health_check.git
71
73
 
74
+ == Configuration
75
+
76
+ To change the configuration of health_check, create a file `config/initializers/health_check.rb` and add a configuration block like:
77
+
78
+ HealthCheck.setup do |config|
79
+
80
+ # Text output upon success
81
+ config.success = 'success'
82
+
83
+ # Timeout in seconds used when checking smtp server
84
+ self.smtp_timeout = 30.0
85
+
86
+ # http status code used when plain text error message is output
87
+ # Set to 200 if you want your want to distinguish between partial (text does not include success) and
88
+ # total failure of rails application (http status of 500 etc)
89
+
90
+ self.http_status_for_error_text = 500
91
+
92
+ # http status code used when an error object is output (json or xml)
93
+ # Set to 200 if you want your want to distinguish between partial (healthy property == false) and
94
+ # total failure of rails application (http status of 500 etc)
95
+
96
+ self.http_status_for_error_object = 500
97
+
98
+ # Add one or more custom checks that return a blank string if ok, or an error message if there is an error
99
+ config.add_custom_check do
100
+ CustomHealthCheck.perform_check # any code that returns blank on success and non blank string upon failure
101
+ end
102
+
103
+ end
104
+
105
+ You may call add_custom_check multiple times with different tests. These tests will be included in the default list ("standard").
106
+
72
107
  == Uptime Monitoring
73
108
 
74
109
  Use a website monitoring service to check the url regularly for the word "success" (without the quotes) rather than just a 200 http status so
@@ -84,6 +119,41 @@ See
84
119
  * Engine Yard's guide - https://support.cloud.engineyard.com/entries/20996821-monitor-application-uptime (although the guide is based on fitter_happier plugin it will also work with this gem)
85
120
  * Any other montoring service that can be set to check for the word success in the test returned from a url
86
121
 
122
+ === Requesting Json and XML responses
123
+
124
+ Health_check will respond with an encoded hash object if json or xml is requested.
125
+ Either set the HTTP Accept header or append .json or .xml to the url.
126
+
127
+ The hash contains two keys:
128
+ * healthy - true if requested checks pass (boolean)
129
+ * message - text message ("success" or error message)
130
+
131
+ The following commands
132
+
133
+ curl -v localhost:3000/health_check.json
134
+ curl -v localhost:3000/health_check/email.json
135
+ curl -v -H "Accept: application/json" localhost:3000/health_check
136
+
137
+ Will return a result with Content-Type: application/json and body like:
138
+
139
+ {"healthy":true,"message":"success"}
140
+
141
+ These following commands
142
+
143
+ curl -v localhost:3000/health_check.xml
144
+ curl -v localhost:3000/health_check/migration_cache.xml
145
+ curl -v -H "Accept: text/xml" localhost:3000/health_check/cache
146
+
147
+ Will return a result with Content-Type: application/xml and body like:
148
+
149
+ <?xml version="1.0" encoding="UTF-8"?>
150
+ <hash>
151
+ <healthy type="boolean">true</healthy>
152
+ <message>success</message>
153
+ </hash>
154
+
155
+ See https://github.com/ianheggie/health_check/wiki/Ajax-Example for an Ajax example
156
+
87
157
  == Note on Patches/Pull Requests
88
158
 
89
159
  <em>Feedback welcome! Especially with suggested replacement code and corresponding tests</em>
@@ -105,11 +175,11 @@ See
105
175
 
106
176
  == Testing
107
177
 
108
- === Automated continuous integration tests
178
+ === Automated testing
109
179
 
110
180
  See Travis CI testing result: {<img src="https://travis-ci.org/ianheggie/health_check.png">}[https://travis-ci.org/ianheggie/health_check]
111
181
 
112
- Code Climate also monitors this project: {<img src="https://codeclimate.com/github/ianheggie/health_check.png" />}[https://codeclimate.com/github/ianheggie/health_check]
182
+ Code Climate also monitors this project for code quality: {<img src="https://codeclimate.com/github/ianheggie/health_check.png" />}[https://codeclimate.com/github/ianheggie/health_check]
113
183
 
114
184
  === Manual testing
115
185
 
@@ -119,7 +189,7 @@ This will require TCP port 3456 to be free.
119
189
 
120
190
  Using rbenv or rvm, install and set the version of ruby you wish to test against.
121
191
  You will need to install the bundler gem if using rbenv.
122
- See the <tt>.travis.yml</tt> file for a list of supported ruby versions.
192
+ See the <tt>.travis.yml</tt> file for the list of ruby versions that we test against.
123
193
 
124
194
  * rbenv command: <tt>rbenv shell 1.8.7-p371</tt>
125
195
  * rvm command: <tt>rvm use 1.9.3</tt>
@@ -130,26 +200,19 @@ Create a temp directory for throw away testing, and clone the health_check gem i
130
200
  cd ~/tmp
131
201
  git clone https://github.com/ianheggie/health_check.git
132
202
 
133
- All of the following commands should be run under the checked out gem
203
+ Cd to the checked out health_check directory and then run the test as follows:
134
204
 
135
205
  cd ~/tmp/health_check
136
206
 
137
- Configure which rails version you want to test against, and load the gems appropriate for the ruby version - use one of the following commands:
138
-
139
- export BUNDLE_GEMFILE=$PWD/rails2_3.gemfile
140
- export BUNDLE_GEMFILE=$PWD/rails3_0.gemfile
141
- export BUNDLE_GEMFILE=$PWD/rails3_1.gemfile
142
- export BUNDLE_GEMFILE=$PWD/rails3_2.gemfile
143
- unset BUNDLE_GEMFILE # for installed version of rails
144
-
145
- Then install the required gems, and update rbenv shims (if using rbenv)
207
+ test/test_with_railsapp
146
208
 
147
- bundle install --binstubs
148
- rbenv rehash
209
+ The script will first call `test/setup_railsapp` to setup a rails app with health_check installed and then
210
+ run up the rails server and perform veraious tests.
149
211
 
150
- Run the tests
212
+ The script `test/setup_railsapp` will prompt you for which gemfile under test you wish to use to install the appropriate rails version, and then
213
+ setup tmp/railsapp accordingly.
151
214
 
152
- bin/rake test
215
+ The command `rake test` will also launch these tests, except it cannot install the bundler and rake gems if they are missing first (unlike test/test_with_railsapp)
153
216
 
154
217
  == Copyright
155
218
 
data/config/routes.rb CHANGED
@@ -1,6 +1,8 @@
1
1
  if defined?(HealthCheck::Engine)
2
2
  Rails.application.routes.draw do
3
- match 'health_check', :to => 'health_check/health_check#index'
4
- match 'health_check/:checks', :to => 'health_check/health_check#check'
3
+ get 'health_check', :to => 'health_check/health_check#index'
4
+ get 'health_check.:format', :to => 'health_check/health_check#index'
5
+ get 'health_check/:checks', :to => 'health_check/health_check#index'
6
+ get 'health_check/:checks.:format', :to => 'health_check/health_check#index'
5
7
  end
6
8
  end
data/health_check.gemspec CHANGED
@@ -24,5 +24,5 @@ Gem::Specification.new do |gem|
24
24
  gem.add_development_dependency(%q<rake>, [">= 0.8.3"])
25
25
  gem.add_development_dependency(%q<shoulda>, ["~> 2.11.0"])
26
26
  gem.add_development_dependency(%q<sqlite3>, ["~> 1.3.7"])
27
- gem.add_development_dependency(%q<bundler>, ["~> 1.2.0"])
27
+ gem.add_development_dependency(%q<bundler>, ["~> 1.2"])
28
28
  end
data/lib/health_check.rb CHANGED
@@ -8,6 +8,34 @@ module HealthCheck
8
8
  end
9
9
  end
10
10
 
11
+ # Text output upon success
12
+ mattr_accessor :success
13
+ self.success = "success"
14
+
15
+ # Timeout in seconds used when checking smtp server
16
+ mattr_accessor :smtp_timeout
17
+ self.smtp_timeout = 30.0
18
+
19
+ # http status code used when plain text error message is output
20
+ mattr_accessor :http_status_for_error_text
21
+ self.http_status_for_error_text = 500
22
+
23
+ # http status code used when an error object is output (json or xml)
24
+ mattr_accessor :http_status_for_error_object
25
+ self.http_status_for_error_object = 500
26
+
27
+ # Array of custom check blocks
28
+ mattr_accessor :custom_checks
29
+ self.custom_checks = [ ]
30
+
31
+ def self.add_custom_check(&block)
32
+ custom_checks << block
33
+ end
34
+
35
+ def self.setup
36
+ yield self
37
+ end
38
+
11
39
  end
12
40
 
13
41
  require "health_check/version"
@@ -6,14 +6,19 @@ module ActionController
6
6
  module Routing #:nodoc:
7
7
  class RouteSet #:nodoc:
8
8
  alias_method :draw_without_health_check_routes, :draw
9
+
9
10
  def draw
10
- draw_without_health_check_routes do |map|
11
- map.connect 'health_check',
12
- :controller => 'health_check/health_check', :action => 'index'
13
- map.connect 'health_check/:checks',
14
- :controller => 'health_check/health_check', :action => 'check'
15
- yield map
16
- end
11
+ draw_without_health_check_routes do |map|
12
+ map.connect 'health_check',
13
+ :controller => 'health_check/health_check', :action => 'index'
14
+ map.connect 'health_check.:format',
15
+ :controller => 'health_check/health_check', :action => 'index'
16
+ map.connect 'health_check/:checks',
17
+ :controller => 'health_check/health_check', :action => 'index'
18
+ map.connect 'health_check/:checks.:format',
19
+ :controller => 'health_check/health_check', :action => 'index'
20
+ yield map
21
+ end
17
22
  end
18
23
  end
19
24
  end
@@ -9,26 +9,29 @@ module HealthCheck
9
9
  layout nil
10
10
 
11
11
  def index
12
- do_check('standard')
13
- end
14
-
15
- def check
16
- do_check(params[:checks])
17
- end
18
-
19
- private
20
-
21
- def do_check(checks)
12
+ checks = params[:checks] || 'standard'
22
13
  begin
23
- errors = process_checks(checks)
14
+ errors = HealthCheck::Utils.process_checks(checks)
24
15
  rescue Exception => e
25
16
  errors = e.message
26
17
  end
27
18
  if errors.blank?
28
- render :text => HealthCheck::Utils.success, :content_type => 'text/plain'
19
+ obj = { :healthy => true, :message => HealthCheck.success }
20
+ respond_to do |format|
21
+ format.html { render :text => HealthCheck.success, :content_type => 'text/plain' }
22
+ format.json { render :xml => obj.to_json }
23
+ format.xml { render :xml => obj.to_xml }
24
+ format.any { render :text => HealthCheck.success, :content_type => 'text/plain' }
25
+ end
29
26
  else
30
27
  msg = "health_check failed: #{errors}"
31
- render :text => msg, :status => 500, :content_type => 'text/plain'
28
+ obj = { :healthy => false, :message => msg }
29
+ respond_to do |format|
30
+ format.html { render :text => msg, :status => HealthCheck.http_status_for_error_text, :content_type => 'text/plain' }
31
+ format.json { render :xml => obj.to_json, :status => HealthCheck.http_status_for_error_object}
32
+ format.xml { render :xml => obj.to_xml, :status => HealthCheck.http_status_for_error_object }
33
+ format.any { render :text => msg, :status => HealthCheck.http_status_for_error_text, :content_type => 'text/plain' }
34
+ end
32
35
  # Log a single line as some uptime checkers only record that it failed, not the text returned
33
36
  if logger
34
37
  silence_level, logger.level = logger.level, @old_logger_level
@@ -38,35 +41,6 @@ module HealthCheck
38
41
  end
39
42
  end
40
43
 
41
- def process_checks(checks)
42
- errors = ''
43
- checks.split('_').each do |check|
44
- case check
45
- when 'and', 'site'
46
- # do nothing
47
- when "database"
48
- HealthCheck::Utils.get_database_version
49
- when "email"
50
- errors << HealthCheck::Utils.check_email
51
- when "migrations", "migration"
52
- database_version = HealthCheck::Utils.get_database_version
53
- migration_version = HealthCheck::Utils.get_migration_version
54
- if database_version.to_i != migration_version.to_i
55
- errors << "Current database version (#{database_version}) does not match latest migration (#{migration_version}). "
56
- end
57
- when 'cache'
58
- errors << HealthCheck::Utils.check_cache
59
- when "standard"
60
- errors << process_checks("database_migrations")
61
- errors << process_checks("email") unless HealthCheck::Utils.default_action_mailer_configuration?
62
- when "all", "full"
63
- errors << process_checks("database_migrations_email_cache")
64
- else
65
- return "invalid argument to health_test. "
66
- end
67
- end
68
- return errors
69
- end
70
44
 
71
45
  protected
72
46