Operations Routes

This library provides a Rails plugin and a piece of Rack middleware for monitoring application status. When using with a Rails application, the plugin is preferred, but the middleware is available for use in non-Rails Rack applications.

Note: Previous versions of this library were available as the gem operations_middleware and included only the middleware portion.

Installation

To include it in a Rails application, install the plugin:

script/plugin install git://github.com/primedia/ops_routes.git

Then add the following minimum configuration to config/initializers/ops_routes.rb:

OpsRoutes.config do |ops|
  ops.file_root = RAILS_ROOT
end

To include it in a Sinatra application, install the gem ops_routes then add the following to your app:

require 'ops_routes/middleware'
use OpsRoutes::Middleware do |ops|
  ops.file_root = File.dirname(__FILE__)
end

Version Page

This will provide a page at /ops/version which shows, in development mode, the current git branch and last commit SHA. In all other modes, it shows the same information, but taken from the contents of VERSION and REVISION files in the file_root directory. If you are deploying with Capistrano, the REVISION file will be created for you. If you want the VERSION file, you’ll need to add that to your project or your Capistrano scripts.

Heartbeat Page

It also provides a simple page at /ops/heartbeat which returns a 200 ‘OK’ as long as the application is running.

The application name is taken from the file_root option. If that folder is a Capistrano timestamped release, it goes up 2 additional levels for the name, stripping .com from the end of the directory if necessary. If this logic does not get the correct application name, it can be set manually in the configuration block:

ops.app_name = 'Custom Application Name'

Adding Custom Heartbeats

Additionally, you can specify custom heartbeat monitoring pages as follows:

ops.add_heartbeat :mysql do
  conn = ActiveRecord::Base.connection
  migrations = conn.select_all("SELECT COUNT(1) FROM schema_migrations;") 
  conn.disconnect!
end

The mysql example shown above would be accessed at ops/heartbeat/mysql. The heartbeat page will return a 200 ‘OK’ as long as the provided block does not raise an error. If an error is raised or the heartbeat does not exist, a 500 will be returned instead.

Configuration Page

The third provided page is /ops/configuration which is designed to let you check that the environment-specific configuration variables used by your app are set to the correct values. This is especially useful if production options are set using file replacement or modification during the deploy process.

If you add any sensitive information to this page, make sure to hide it from outside access!

To add a configuration section, specify it as follows:

ops.add_configuration section :action_controller do
  { :consider_all_requests_local => Rails.configuration.consider_all_requests_local,
    :perform_caching => Rails.configuration.perform_caching }
end

This example will add a section to the /ops/configuration page called ‘action_controiller’. Each time the configuration page is requested, the block provided for the section will be called. This means the current values for your configuration options will be shown, even if they change while the app is running. The block is expected to return a hash of key/value pairs to be displayed.

Note on Patches/Pull Requests

  • Fork the project.

  • Make your feature addition or bug fix.

  • Add tests for it. This is important so I don’t break it in a future version unintentionally.

  • Commit, do not mess with rakefile, version, or history. (if you want to have your own version, that is fine but bump version in a commit by itself I can ignore when I pull)

  • Send me a pull request. Bonus points for topic branches.

Copyright © 2010 PRIMEDIA Inc. See LICENSE for details.