Redmon
Simple sinatra based dashboard for redis. After seeing the fnordmetric project I was inspired to write this. Some of the ideas there have be carried over here.
Watch your redis server live.
Interact with redis using a familiar cli interface.
Dynamically update your server configuration.
Installation
Redmon is available as a RubyGem:
gem install redmon
Usage
$ redmon -h
Usage: /Users/sean/codez/steelThread/redmon/vendor/ruby/1.9.1/bin/redmon (options)
-a, --address ADDRESS The thin bind address for the app (default: 0.0.0.0)
-n, --namespace NAMESPACE The root Redis namespace (default: redmon)
-l, --lifespan MINUTES Lifespan(in minutes) for polled data (default: 30)
-i, --interval SECS Poll interval in secs for the worker (default: 10)
-p, --port PORT The thin bind port for the app (default: 4567)
-r, --redis URL The Redis url for monitor (default: redis://127.0.0.1:6379)
-B, --base-url BASE_URL Base URL to mount the app on (default: '')
-s, --secure CREDENTIALS Use basic auth. Colon separated credentials, eg admin:admin.
--no-app Do not run the web app to present stats
--no-worker Do not run a worker to collect the stats
$ redmon
>> Thin web server (v1.3.1 codename Triple Espresso)
>> Maximum connections set to 1024
>> Listening on 0.0.0.0:4567, CTRL+C to stop
[12-03-10 15:49:40] listening on http#0.0.0.0:4567
If you want to simulate a weak load on redis
$ ruby load_sim.rb
Open your browser to 0.0.0.0:4567
Using in a Rails application
Add to Gemfile:
gem 'redmon', require: false
Mount redmon in config/routes.rb:
mount Redmon::App => '/redmon'
Create a config/initializers/redmon.rb file:
require 'redmon/config'
require 'redmon/redis'
require 'redmon/app'
#
# Optional config overrides
#
Redmon.configure do |config|
config.redis_url = 'redis://127.0.0.1:6379'
config.namespace = 'redmon'
end
This will mount the Redmon application to the /redmon path.
Stats worker
The worker that gathers the Redis info stats will not be started when Redmon is mounted like this. In order to get a EventMachine worker running inside your Rails app you can try this Railtie based approach. If you are using a system to execute background tasks in your app (like Sidekiq, Resque, or Delayed Job), you can write your own worker to update the info stats.
A simple worker for Sidekiq looks like this:
class RedmonWorker
include Sidekiq::Worker
def perform
worker = Redmon::Worker.new
worker.record_stats
worker.cleanup_old_stats
ensure
self.class.perform_in Redmon.config.poll_interval.seconds
end
end
Once enqueued, the worker updates the stats and automatically enqueues itself to be performed again after the defined poll interval.
Using with another Sinatra application
Create/Edit config.ru:
require './app.rb'
require 'redmon'
map '/' do
run Sinatra::Application
end
map '/redmon' do
if EM.reactor_running?
Redmon::Worker.new.run!
else
fork do
trap('INT') { EM.stop }
trap('TERM') { EM.stop }
EM.run { Redmon::Worker.new.run! }
end
end
run Redmon::App
end
In order to configure Redmon use this code in your app.rb file:
Redmon.configure do |config|
config.redis_url = 'redis://127.0.0.1:6379'
config.namespace = 'redmon'
end
This will mount the Redmon application to the /redmon path.
Using Standalone with Nginx
Note that -B BASE_URL
is totally optional, it's just provided in the case that you want to mount
Redmon on a different URL.
Create a config for your daemon monitoring tool of choice (supervisord is awesome, btw...):
[program:redmon]
directory = /var/empty
command = /usr/local/bin/redmon -B /path/to/redmon -a 0.0.0.0 -p 3000 -r redis://127.0.0.1:6379
autostart = true
autorestart = true
redirect_stderr = true
Use your daemon tool to run the app:
supervisorctl reload # This will automatically pick up and run new supervisor configs.
Add the proxying config to nginx:
location /path/to/redmon {
rewrite /path/to/redmon$ /path/to/redmon/ permanent;
rewrite /path/to/redmon/(.*(?:\.(css|js))) /$1 break; # Only need this if you mounted Redmon elsewhere.
proxy_pass http://127.0.0.1:3000;
include proxy_params;
proxy_buffering off;
}
License
Copyright (c) 2012 Sean McDaniel
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to use, copy and modify copies of the Software, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.