bin/riemann-proc in riemann-tools-1.0.0 vs bin/riemann-proc in riemann-tools-1.1.0

- old
+ new

@@ -1,109 +1,115 @@ #!/usr/bin/env ruby -Process.setproctitle($0) +# frozen_string_literal: true +Process.setproctitle($PROGRAM_NAME) + # Reports running process count to riemann. -require File.expand_path('../../lib/riemann/tools', __FILE__) +require File.expand_path('../lib/riemann/tools', __dir__) -class Riemann::Tools::Proc - include Riemann::Tools +module Riemann + module Tools + class Proc + include Riemann::Tools - opt :proc_regex, "regular expression that matches the process to be monitored", type: :string, :default => ".*" - opt :proc_min_critical, "running process count minimum", :default => 0 - opt :proc_max_critical, "running process count maximum", :default => 65536 + opt :proc_regex, 'regular expression that matches the process to be monitored', type: :string, default: '.*' + opt :proc_min_critical, 'running process count minimum', default: 0 + opt :proc_max_critical, 'running process count maximum', default: 65_536 - def initialize - @limits = { :critical => { :min => opts[:proc_min_critical], :max => opts[:proc_max_critical] } } + def initialize + @limits = { critical: { min: opts[:proc_min_critical], max: opts[:proc_max_critical] } } - abort "FATAL: specify a process regular expression, see --help for usage" unless opts[:proc_regex] + abort 'FATAL: specify a process regular expression, see --help for usage' unless opts[:proc_regex] - ostype = `uname -s`.chomp.downcase - puts "WARNING: OS '#{ostype}' not explicitly supported. Falling back to Linux" unless ostype == "linux" - @check = method :linux_proc - end + ostype = `uname -s`.chomp.downcase + puts "WARNING: OS '#{ostype}' not explicitly supported. Falling back to Linux" unless ostype == 'linux' + @check = method :linux_proc + end - def alert(service, state, metric, description) - report( - :service => service.to_s, - :state => state.to_s, - :metric => metric.to_f, - :description => description - ) - end + def alert(service, state, metric, description) + report( + service: service.to_s, + state: state.to_s, + metric: metric.to_f, + description: description, + ) + end - def linux_proc - process = opts[:proc_regex] - found = `ps axo pid=,rss=,vsize=,state=,cputime=,lstart=,command= | grep '#{process}' | grep -v grep | grep -v riemann-proc` - running = found.count("\n") - if running > @limits[:critical][:max] or running < @limits[:critical][:min] - alert "proc count/#{process}", :critical, running, "process #{process} is running #{running} instances.\n" - else - alert "proc count/#{process}", :ok, running, "process #{process} is running #{running} instances.\n" - end - # Iterate on all the lines and create an entry for the following metrics: - # - # process/<pid>-<start-time>/rss - # process/<pid>-<start-time>/vsize - # process/<pid>-<start-time>/running - # process/<pid>-<start-time>/cputime - # - # description should contain the command itself. - # value should be either process RSS, VSIZE, or 1 if running - # state is always unknown for the moment - # - ps_regex = /([0-9]+)[ ]+([0-9]+)[ ]+([0-9]+)[ ]+([A-Z])[ ]+([0-9:.]+)[ ]+[A-Za-z]{3}[ ]+([A-Za-z]{3}[ ]{1,2}[0-9]+ [0-9:]+ [0-9]+)[ ]+(.*)/ - found.each_line do |line| - m = ps_regex.match(line) - if not m.nil? - pid, rss, vsize, state, cputime, start, command = m.captures - start_s = DateTime.parse(start, "Mmm DD HH:MM:ss YYYY").to_time.to_i - cputime_s = DateTime.parse(cputime, "%H:%M:%S") - cputime_seconds = (cputime_s.hour * 3600) + (cputime_s.minute * 60) + cputime_s.second - running = 0 - case state[0] - when "R" - state_s = "ok" - running = 1 - when "S" - state_s = "ok" - when "I" - state_s = "warning" - when "T", "U", "Z" - state_s = "critical" + def linux_proc + process = opts[:proc_regex] + found = `ps axo pid=,rss=,vsize=,state=,cputime=,lstart=,command= | grep '#{process}' | grep -v grep | grep -v riemann-proc` + running = found.count("\n") + if (running > @limits[:critical][:max]) || (running < @limits[:critical][:min]) + alert "proc count/#{process}", :critical, running, "process #{process} is running #{running} instances.\n" else - state_s = "unknown" + alert "proc count/#{process}", :ok, running, "process #{process} is running #{running} instances.\n" end - report( - :service => "proc #{pid}-#{start_s}/rss", - :state => state_s.to_s, - :metric => rss.to_f, - :description => command, - ) - report( - :service => "proc #{pid}-#{start_s}/vsize", - :state => state_s.to_s, - :metric => vsize.to_f, - :description => command, - ) - report( - :service => "proc #{pid}-#{start_s}/running", - :state => state_s.to_s, - :metric => running.to_f, - :description => command, - ) - report( - :service => "proc #{pid}-#{start_s}/cputime", - :state => state_s.to_s, - :metric => cputime_seconds, - :description => command, - ) + # Iterate on all the lines and create an entry for the following metrics: + # + # process/<pid>-<start-time>/rss + # process/<pid>-<start-time>/vsize + # process/<pid>-<start-time>/running + # process/<pid>-<start-time>/cputime + # + # description should contain the command itself. + # value should be either process RSS, VSIZE, or 1 if running + # state is always unknown for the moment + # + ps_regex = /([0-9]+) +([0-9]+) +([0-9]+) +([A-Z]) +([0-9:.]+) +[A-Za-z]{3} +([A-Za-z]{3} {1,2}[0-9]+ [0-9:]+ [0-9]+) +(.*)/ + found.each_line do |line| + m = ps_regex.match(line) + next if m.nil? + + pid, rss, vsize, state, cputime, start, command = m.captures + start_s = DateTime.parse(start, 'Mmm DD HH:MM:ss YYYY').to_time.to_i + cputime_s = DateTime.parse(cputime, '%H:%M:%S') + cputime_seconds = (cputime_s.hour * 3600) + (cputime_s.minute * 60) + cputime_s.second + running = 0 + case state[0] + when 'R' + state_s = 'ok' + running = 1 + when 'S' + state_s = 'ok' + when 'I' + state_s = 'warning' + when 'T', 'U', 'Z' + state_s = 'critical' + else + state_s = 'unknown' + end + report( + service: "proc #{pid}-#{start_s}/rss", + state: state_s.to_s, + metric: rss.to_f, + description: command, + ) + report( + service: "proc #{pid}-#{start_s}/vsize", + state: state_s.to_s, + metric: vsize.to_f, + description: command, + ) + report( + service: "proc #{pid}-#{start_s}/running", + state: state_s.to_s, + metric: running.to_f, + description: command, + ) + report( + service: "proc #{pid}-#{start_s}/cputime", + state: state_s.to_s, + metric: cputime_seconds, + description: command, + ) + end end - end - end - def tick - @check.call + def tick + @check.call + end + end end end Riemann::Tools::Proc.run