lib/beaker/perf.rb in beaker-4.42.0 vs lib/beaker/perf.rb in beaker-5.0.0
- old
+ new
@@ -1,23 +1,22 @@
module Beaker
# The Beaker Perf class. A single instance is created per Beaker run.
class Perf
-
PERF_PACKAGES = ['sysstat']
# SLES does not treat sysstat as a service that can be started
- PERF_SUPPORTED_PLATFORMS = /amazon|debian|ubuntu|redhat|centos|oracle|scientific|fedora|el|eos|cumulus|opensuse|sles/
- PERF_START_PLATFORMS = /amazon|debian|ubuntu|redhat|centos|oracle|scientific|fedora|el|eos|cumulus/
+ PERF_SUPPORTED_PLATFORMS = /debian|ubuntu|redhat|centos|oracle|scientific|fedora|el|eos|cumulus|opensuse|sles/
+ PERF_START_PLATFORMS = /debian|ubuntu|redhat|centos|oracle|scientific|fedora|el|eos|cumulus/
# Create the Perf instance and runs setup_perf_on_host on all hosts if --collect-perf-data
# was used as an option on the Baker command line invocation. Instances of this class do not
# hold state and its methods are helpers for remotely executing tasks for performance data
# gathering with sysstat/sar
#
# @param [Array<Host>] hosts All from the configuration
# @param [Hash] options Options to alter execution
# @return [void]
- def initialize( hosts, options )
+ def initialize(hosts, options)
@hosts = hosts
@options = options
@logger = options[:logger]
@perf_timestamp = Time.now
@hosts.map { |h| setup_perf_on_host(h) }
@@ -29,41 +28,39 @@
def setup_perf_on_host(host)
@logger.perf_output("Setup perf on host: " + host)
# Install sysstat if required
if PERF_SUPPORTED_PLATFORMS.match?(host['platform'])
PERF_PACKAGES.each do |pkg|
- if not host.check_for_package pkg
- host.install_package pkg
- end
+ host.install_package pkg if not host.check_for_package pkg
end
else
@logger.perf_output("Perf (sysstat) not supported on host: " + host)
end
if /debian|ubuntu|cumulus/.match?(host['platform'])
@logger.perf_output("Modify /etc/default/sysstat on Debian and Ubuntu platforms")
host.exec(Command.new('sed -i s/ENABLED=\"false\"/ENABLED=\"true\"/ /etc/default/sysstat'))
elsif /opensuse|sles/.match?(host['platform'])
@logger.perf_output("Creating symlink from /etc/sysstat/sysstat.cron to /etc/cron.d")
- host.exec(Command.new('ln -s /etc/sysstat/sysstat.cron /etc/cron.d'),:acceptable_exit_codes => [0,1])
+ host.exec(Command.new('ln -s /etc/sysstat/sysstat.cron /etc/cron.d'), :acceptable_exit_codes => [0, 1])
end
if @options[:collect_perf_data]&.include?('aggressive')
@logger.perf_output("Enabling aggressive sysstat polling")
if /debian|ubuntu/.match?(host['platform'])
host.exec(Command.new('sed -i s/5-55\\\/10/*/ /etc/cron.d/sysstat'))
- elsif /amazon|centos|el|fedora|oracle|redhat|scientific/.match?(host['platform'])
+ elsif /centos|el|fedora|oracle|redhat|scientific/.match?(host['platform'])
host.exec(Command.new('sed -i s/*\\\/10/*/ /etc/cron.d/sysstat'))
end
end
- if PERF_START_PLATFORMS.match?(host['platform']) # SLES doesn't need this step
- host.exec(Command.new('service sysstat start'))
- end
+ return unless PERF_START_PLATFORMS.match?(host['platform']) # SLES doesn't need this step
+
+ host.exec(Command.new('service sysstat start'))
end
# Iterate over all hosts, calling get_perf_data
# @return [void]
- def print_perf_info()
+ def print_perf_info
@perf_end_timestamp = Time.now
@hosts.map { |h| get_perf_data(h, @perf_timestamp, @perf_end_timestamp) }
end
# If host is a supported (ie linux) platform, generate a performance report
@@ -72,13 +69,11 @@
# @param [Time] perf_end The ending time for the SAR report
# @return [void] The report is sent to the logging output
def get_perf_data(host, perf_start, perf_end)
@logger.perf_output("Getting perf data for host: " + host)
if PERF_SUPPORTED_PLATFORMS.match?(host['platform']) # All flavours of Linux
- if not @options[:collect_perf_data]&.include?('aggressive')
- host.exec(Command.new("sar -A -s #{perf_start.strftime("%H:%M:%S")} -e #{perf_end.strftime("%H:%M:%S")}"),:acceptable_exit_codes => [0,1,2])
- end
+ host.exec(Command.new("sar -A -s #{perf_start.strftime('%H:%M:%S')} -e #{perf_end.strftime('%H:%M:%S')}"), :acceptable_exit_codes => [0, 1, 2]) if not @options[:collect_perf_data]&.include?('aggressive')
if (defined? @options[:graphite_server] and not @options[:graphite_server].nil?) and
(defined? @options[:graphite_perf_data] and not @options[:graphite_perf_data].nil?)
export_perf_data_to_graphite(host)
end
else
@@ -90,35 +85,35 @@
# @param [Host] host The host we are working with
# @return [void] The report is sent to the logging output
def export_perf_data_to_graphite(host)
@logger.perf_output("Sending data to Graphite server: " + @options[:graphite_server])
- data = JSON.parse(host.exec(Command.new("sadf -j -- -A"),:silent => true).stdout)
+ data = JSON.parse(host.exec(Command.new("sadf -j -- -A"), :silent => true).stdout)
hostname = host['vmhostname'].split('.')[0]
data['sysstat']['hosts'].each do |host|
host['statistics'].each do |poll|
timestamp = DateTime.parse(poll['timestamp']['date'] + ' ' + poll['timestamp']['time']).to_time.to_i
poll.keys.each do |stat|
case stat
- when 'cpu-load-all'
- poll[stat].each do |s|
- s.keys.each do |k|
- next if k == 'cpu'
+ when 'cpu-load-all'
+ poll[stat].each do |s|
+ s.keys.each do |k|
+ next if k == 'cpu'
- socket = TCPSocket.new(@options[:graphite_server], 2003)
- socket.puts "#{@options[:graphite_perf_data]}.#{hostname}.cpu.#{s['cpu']}.#{k} #{s[k]} #{timestamp}"
- socket.close
- end
- end
-
- when 'memory'
- poll[stat].keys.each do |s|
socket = TCPSocket.new(@options[:graphite_server], 2003)
- socket.puts "#{@options[:graphite_perf_data]}.#{hostname}.memory.#{s} #{poll[stat][s]} #{timestamp}"
+ socket.puts "#{@options[:graphite_perf_data]}.#{hostname}.cpu.#{s['cpu']}.#{k} #{s[k]} #{timestamp}"
socket.close
end
+ end
+
+ when 'memory'
+ poll[stat].keys.each do |s|
+ socket = TCPSocket.new(@options[:graphite_server], 2003)
+ socket.puts "#{@options[:graphite_perf_data]}.#{hostname}.memory.#{s} #{poll[stat][s]} #{timestamp}"
+ socket.close
+ end
end
end
end
end
end