Skip to content

Instantly share code, notes, and snippets.

@philoye
Created August 11, 2014 00:49
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save philoye/3561e112270240fe4282 to your computer and use it in GitHub Desktop.
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.
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