Created
August 11, 2014 00:49
-
-
Save philoye/3561e112270240fe4282 to your computer and use it in GitHub Desktop.
Simple rack middleware to provide a health monitor for rails app using sidekiq, memcache, and activerecord.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module Rack | |
class Heartbeat | |
def initialize(app) | |
@app = app | |
end | |
def call(env) | |
if env['PATH_INFO'] == "/pulse" | |
@messages = [] | |
alive?(env) | |
else | |
@app.call(env) | |
end | |
end | |
private | |
def alive_response | |
if @messages.length == 0 | |
[200, {'Content-Type' => 'text/plain'}, ["OK"]] | |
else | |
[500, {'Content-Type' => 'text/plain'}, ["DEAD!\n\n#{@messages.join "\n"}"]] | |
end | |
end | |
def alive?(env) | |
database_is_up? | |
if redis_is_up? | |
sidekiq_latency_is_good? | |
sidekiq_queue_is_managable? | |
end | |
cache_is_up? | |
alive_response | |
end | |
def database_is_up? | |
begin | |
if ActiveRecord::Base.connection && ActiveRecord::Base.connection.active? | |
return true | |
else | |
@messages << 'DB: database is down' | |
return false | |
end | |
rescue | |
@messages << 'DB: database is down' | |
return false | |
end | |
end | |
def sidekiq_latency_is_good? | |
begin | |
if Sidekiq::Queue.new.latency < 30 | |
return true | |
else | |
@messages << "Sidekiq: Down! Latency is #{Sidekiq::Queue.new.latency}" | |
return false | |
end | |
rescue | |
@messages << "Sidekiq: Can't get queue latency, is redis down?" | |
return false | |
end | |
end | |
def sidekiq_queue_is_managable? | |
begin | |
if Sidekiq::Queue.new.size < 100 | |
return true | |
else | |
@messages << "Sidekiq: Queue is huge: #{Sidekiq::Queue.new.size}" | |
return false | |
end | |
rescue | |
@messages << "Sidekiq: Can't access the queue, is redis down?" | |
return false | |
end | |
end | |
def redis_is_up? | |
begin | |
if Sidekiq.redis { |conn| conn.info } | |
return true | |
else | |
@messages << "Redis: down!" | |
return false | |
end | |
rescue | |
@messages << "Redis: down!" | |
return false | |
end | |
end | |
def cache_is_up? | |
begin | |
if Rails.cache.write('__heartbeat_cache_test__', 'ok', :expires_in => 1.second) | |
return true | |
else | |
@messages << 'Cache: Memcache is disconnected.' | |
return false | |
end | |
rescue | |
@messages << 'Cache: Memcache is disconnected.' | |
return false | |
end | |
end | |
end | |
end | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment