lib/rapporteur/load_check.rb
require "ffi"
require "rapporteur"
module Rapporteur
module Checks
LoadCheckEngine = Class.new(Rails::Engine)
class LoadCheck
extend FFI::Library
ffi_lib FFI::Library::LIBC
attach_function :getloadavg, [:pointer, :int], :int
attach_function :strerror, [:int], :string
private_class_method :getloadavg, :strerror
DEFAULT_TOLERANCE = 8.0
def initialize(tolerance=DEFAULT_TOLERANCE)
@tolerance = tolerance
end
def call(checker)
loadavg = self.class.current_load
if loadavg > @tolerance
checker.add_error(:load, :excessive, :tolerance => @tolerance, :value => loadavg)
checker.halt!
else
checker.add_message(:load, loadavg)
end
end
def self.call(checker)
new.call(checker)
end
def self.current_load
loadavg = FFI::MemoryPointer.new(:double, 1)
if getloadavg(loadavg, 1) == -1
raise SystemCallError, "getloadavg() - #{strerror(FFI.errno)}"
end
loadavg.read_double
end
end
end
end