class Riemann::Tools::AgedProcessMonitor

Public Class Methods

new() click to toggle source
# File bin/riemann-aged-process-monitor, line 16
def initialize
  if opts[:username]
    userid = get_uid opts[:username]
    process_uid_select  = -> proc { proc.uid == userid }
  end

  if opts[:process]
    process_name_select = -> proc { proc.name =~ /#{opts[:process]}/ }
  end

  @age_flag = convert_age opts[:age]
  process_age_select  = -> proc { File.exists?("/proc/#{proc.pid}") && (Time.now - File.ctime("/proc/#{proc.pid}")) > @age_flag }

  @selects = [ process_uid_select, process_age_select, process_name_select ].compact
end

Public Instance Methods

convert_age(age_string) click to toggle source
# File bin/riemann-aged-process-monitor, line 40
def convert_age age_string
  age_string_regex = /^(\d+)([s|m|h|d]{1})$/
  values = age_string.match(age_string_regex)
  raise "Invalid age string - must follow convention of a number followed by indicator - s[econds], m[inutes], h[hours], d[days]" unless values

  conversion = { 's' => 1, 'm' => 60, 'h' => 3600, 'd' => 86400}
  values[1].to_i * conversion[values[2]]
end
description(processes) click to toggle source

Since: Jan 01, 2015 -> command foobar

# File bin/riemann-aged-process-monitor, line 50
def description processes
  desc = processes.count > 0 ? "The following processes were found:\n" : "No processes were found that exceed @age_flag"
  processes.each do |proc|
    desc << "  Since: #{File.ctime("/proc/#{proc.pid}").asctime} -> #{proc.cmdline}\n"
  end
  desc
end
get_uid(username) click to toggle source
# File bin/riemann-aged-process-monitor, line 32
def get_uid username
  begin
    Etc.getpwnam(username).uid
  rescue ArgumentError => e
    raise "Username provided [#{username}] is invalid"
  end
end
tick() click to toggle source
# File bin/riemann-aged-process-monitor, line 58
def tick
  processes = ProcTable.ps
  monitored_processes = @selects.inject(processes) { |processes, selector| processes.select(&selector) }
  report({
    :service     => "aged-process-monitor",
    :state       => monitored_processes.count > 0 ? 'critical' : 'ok',
    :metric      => monitored_processes.count,
    :description => description(monitored_processes),
    :time        => Time.now.to_i
    })
end