Blame tools/plot/fio2gnuplot

Packit Service 0d30d9
#! /usr/libexec/platform-python
Packit Service 0e769b
# Note: this script is python2 and python3 compatible.
Packit Service 0e769b
#
Packit Service 0e769b
#  Copyright (C) 2013 eNovance SAS <licensing@enovance.com>
Packit Service 0e769b
#  Author: Erwan Velu  <erwan@enovance.com>
Packit Service 0e769b
#
Packit Service 0e769b
#  The license below covers all files distributed with fio unless otherwise
Packit Service 0e769b
#  noted in the file itself.
Packit Service 0e769b
#
Packit Service 0e769b
#  This program is free software; you can redistribute it and/or modify
Packit Service 0e769b
#  it under the terms of the GNU General Public License version 2 as
Packit Service 0e769b
#  published by the Free Software Foundation.
Packit Service 0e769b
#
Packit Service 0e769b
#  This program is distributed in the hope that it will be useful,
Packit Service 0e769b
#  but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 0e769b
#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 0e769b
#  GNU General Public License for more details.
Packit Service 0e769b
#
Packit Service 0e769b
#  You should have received a copy of the GNU General Public License
Packit Service 0e769b
#  along with this program; if not, write to the Free Software
Packit Service 0e769b
#  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit Service 0e769b
Packit Service 0e769b
from __future__ import absolute_import
Packit Service 0e769b
from __future__ import print_function
Packit Service 0e769b
import os
Packit Service 0e769b
import fnmatch
Packit Service 0e769b
import sys
Packit Service 0e769b
import getopt
Packit Service 0e769b
import re
Packit Service 0e769b
import math
Packit Service 0e769b
import shutil
Packit Service 0e769b
from six.moves import map
Packit Service 0e769b
from six.moves import range
Packit Service 0e769b
Packit Service 0e769b
def find_file(path, pattern):
Packit Service 0e769b
	fio_data_file=[]
Packit Service 0e769b
	# For all the local files
Packit Service 0e769b
	for file in os.listdir(path):
Packit Service 0e769b
		# If the file matches the glob
Packit Service 0e769b
		if fnmatch.fnmatch(file, pattern):
Packit Service 0e769b
			# Let's consider this file
Packit Service 0e769b
			fio_data_file.append(file)
Packit Service 0e769b
Packit Service 0e769b
	return fio_data_file
Packit Service 0e769b
Packit Service 0e769b
def generate_gnuplot_script(fio_data_file,title,gnuplot_output_filename,gnuplot_output_dir,mode,disk_perf,gpm_dir):
Packit Service 0e769b
	if verbose: print("Generating rendering scripts")
Packit Service 0e769b
	filename=gnuplot_output_dir+'mygraph'
Packit Service 0e769b
	temporary_files.append(filename)
Packit Service 0e769b
	f=open(filename,'w')
Packit Service 0e769b
Packit Service 0e769b
	# Plotting 3D or comparing graphs doesn't have a meaning unless if there is at least 2 traces
Packit Service 0e769b
	if len(fio_data_file) > 1:
Packit Service 0e769b
		f.write("call \'%s/graph3D.gpm\' \'%s' \'%s\' \'\' \'%s\' \'%s\'\n" % (gpm_dir,title,gnuplot_output_filename,gnuplot_output_filename,mode))
Packit Service 0e769b
Packit Service 0e769b
		# Setting up the compare files that will be plot later
Packit Service 0e769b
		compare=open(gnuplot_output_dir + 'compare.gnuplot','w')
Packit Service 0e769b
		compare.write('''
Packit Service 0e769b
set title '%s'
Packit Service 0e769b
set terminal png size 1280,1024
Packit Service 0e769b
set ytics axis out auto
Packit Service 0e769b
set key top left reverse
Packit Service 0e769b
set xlabel "Time (Seconds)"
Packit Service 0e769b
set ylabel '%s'
Packit Service 0e769b
set yrange [0:]
Packit Service 0e769b
set style line 1 lt 1 lw 3 pt 3 linecolor rgb "green"
Packit Service 0e769b
'''% (title,mode))
Packit Service 0e769b
		compare.close()
Packit Service 0e769b
		#Copying the common file for all kind of graph (raw/smooth/trend)
Packit Service 0e769b
		compare_raw_filename="compare-%s-2Draw" % (gnuplot_output_filename)
Packit Service 0e769b
		compare_smooth_filename="compare-%s-2Dsmooth" % (gnuplot_output_filename)
Packit Service 0e769b
		compare_trend_filename="compare-%s-2Dtrend" % (gnuplot_output_filename)
Packit Service 0e769b
Packit Service 0e769b
		shutil.copy(gnuplot_output_dir+'compare.gnuplot',gnuplot_output_dir+compare_raw_filename+".gnuplot")
Packit Service 0e769b
		shutil.copy(gnuplot_output_dir+'compare.gnuplot',gnuplot_output_dir+compare_smooth_filename+".gnuplot")
Packit Service 0e769b
		shutil.copy(gnuplot_output_dir+'compare.gnuplot',gnuplot_output_dir+compare_trend_filename+".gnuplot")
Packit Service 0e769b
		temporary_files.append(gnuplot_output_dir+compare_raw_filename+".gnuplot")
Packit Service 0e769b
		temporary_files.append(gnuplot_output_dir+compare_smooth_filename+".gnuplot")
Packit Service 0e769b
		temporary_files.append(gnuplot_output_dir+compare_trend_filename+".gnuplot")
Packit Service 0e769b
Packit Service 0e769b
		#Setting up a different output filename for each kind of graph
Packit Service 0e769b
		compare_raw=open(gnuplot_output_dir+compare_raw_filename + ".gnuplot",'a')
Packit Service 0e769b
		compare_raw.write("set output '%s.png'\n" % compare_raw_filename)
Packit Service 0e769b
		compare_smooth=open(gnuplot_output_dir+compare_smooth_filename+".gnuplot",'a')
Packit Service 0e769b
		compare_smooth.write("set output '%s.png'\n" % compare_smooth_filename)
Packit Service 0e769b
		compare_trend=open(gnuplot_output_dir+compare_trend_filename+".gnuplot",'a')
Packit Service 0e769b
		compare_trend.write("set output '%s.png'\n" % compare_trend_filename)
Packit Service 0e769b
Packit Service 0e769b
		# Let's plot the average value for all the traces
Packit Service 0e769b
		global_disk_perf = sum(disk_perf, [])
Packit Service 0e769b
		global_avg  = average(global_disk_perf)
Packit Service 0e769b
		compare_raw.write("plot %s w l ls 1 ti 'Global average value (%.2f)'" % (global_avg,global_avg));
Packit Service 0e769b
		compare_smooth.write("plot %s w l ls 1 ti 'Global average value (%.2f)'" % (global_avg,global_avg));
Packit Service 0e769b
		compare_trend.write("plot %s w l ls 1 ti 'Global average value (%.2f)'" % (global_avg,global_avg));
Packit Service 0e769b
Packit Service 0e769b
		pos=0
Packit Service 0e769b
		# Let's create a temporary file for each selected fio file
Packit Service 0e769b
		for file in fio_data_file:
Packit Service 0e769b
			tmp_filename = "gnuplot_temp_file.%d" % pos
Packit Service 0e769b
Packit Service 0e769b
		# Plotting comparing graphs doesn't have a meaning unless if there is at least 2 traces
Packit Service 0e769b
		if len(fio_data_file) > 1:
Packit Service 0e769b
			# Adding the plot instruction for each kind of comparing graphs
Packit Service 0e769b
			compare_raw.write(",\\\n'%s' using 2:3 with linespoints title '%s'" % (tmp_filename,fio_data_file[pos]))
Packit Service 0e769b
			compare_smooth.write(",\\\n'%s' using 2:3 smooth csplines title '%s'" % (tmp_filename,fio_data_file[pos]))
Packit Service 0e769b
			compare_trend.write(",\\\n'%s' using 2:3 smooth bezier title '%s'" % (tmp_filename,fio_data_file[pos]))
Packit Service 0e769b
Packit Service 0e769b
		png_file=file.replace('.log','')
Packit Service 0e769b
		raw_filename = "%s-2Draw" % (png_file)
Packit Service 0e769b
		smooth_filename = "%s-2Dsmooth" % (png_file)
Packit Service 0e769b
		trend_filename = "%s-2Dtrend" % (png_file)
Packit Service 0e769b
		avg  = average(disk_perf[pos])
Packit Service 0e769b
		f.write("call \'%s/graph2D.gpm\' \'%s' \'%s\' \'%s\' \'%s\' \'%s\' \'%s\' \'%s\' \'%f\'\n" % (gpm_dir,title,tmp_filename,fio_data_file[pos],raw_filename,mode,smooth_filename,trend_filename,avg))
Packit Service 0e769b
		pos = pos +1
Packit Service 0e769b
Packit Service 0e769b
	# Plotting comparing graphs doesn't have a meaning unless if there is at least 2 traces
Packit Service 0e769b
	if len(fio_data_file) > 1:
Packit Service 0e769b
		os.remove(gnuplot_output_dir+"compare.gnuplot")
Packit Service 0e769b
		compare_raw.close()
Packit Service 0e769b
		compare_smooth.close()
Packit Service 0e769b
		compare_trend.close()
Packit Service 0e769b
	f.close()
Packit Service 0e769b
Packit Service 0e769b
def generate_gnuplot_math_script(title,gnuplot_output_filename,mode,average,gnuplot_output_dir,gpm_dir):
Packit Service 0e769b
	filename=gnuplot_output_dir+'mymath';
Packit Service 0e769b
	temporary_files.append(filename)
Packit Service 0e769b
	f=open(filename,'a')
Packit Service 0e769b
	f.write("call \'%s/math.gpm\' \'%s' \'%s\' \'\' \'%s\' \'%s\' %s\n" % (gpm_dir,title,gnuplot_output_filename,gnuplot_output_filename,mode,average))
Packit Service 0e769b
	f.close()
Packit Service 0e769b
Packit Service 0e769b
def compute_aggregated_file(fio_data_file, gnuplot_output_filename, gnuplot_output_dir):
Packit Service 0e769b
	if verbose: print("Processing data file 2/2")
Packit Service 0e769b
	temp_files=[]
Packit Service 0e769b
	pos=0
Packit Service 0e769b
Packit Service 0e769b
	# Let's create a temporary file for each selected fio file
Packit Service 0e769b
	for file in fio_data_file:
Packit Service 0e769b
		tmp_filename = "%sgnuplot_temp_file.%d" % (gnuplot_output_dir, pos)
Packit Service 0e769b
		temp_files.append(open(tmp_filename,'r'))
Packit Service 0e769b
		pos = pos +1
Packit Service 0e769b
Packit Service 0e769b
	f = open(gnuplot_output_dir+gnuplot_output_filename, "w")
Packit Service 0e769b
	temporary_files.append(gnuplot_output_dir+gnuplot_output_filename)
Packit Service 0e769b
	index=0
Packit Service 0e769b
	# Let's add some information
Packit Service 0e769b
	for tempfile in temp_files:
Packit Service 0e769b
		    f.write("# Disk%d was coming from %s\n" % (index,fio_data_file[index]))
Packit Service 0e769b
		    f.write(tempfile.read())
Packit Service 0e769b
		    f.write("\n")
Packit Service 0e769b
		    tempfile.close()
Packit Service 0e769b
		    index = index + 1
Packit Service 0e769b
	f.close()
Packit Service 0e769b
Packit Service 0e769b
def average(s): return sum(s) * 1.0 / len(s)
Packit Service 0e769b
Packit Service 0e769b
def compute_temp_file(fio_data_file,disk_perf,gnuplot_output_dir, min_time, max_time):
Packit Service 0e769b
	end_time=max_time
Packit Service 0e769b
	if end_time == -1:
Packit Service 0e769b
		end_time="infinite"
Packit Service 0e769b
	if verbose: print("Processing data file 1/2 with %s
Packit Service 0e769b
	files=[]
Packit Service 0e769b
	temp_outfile=[]
Packit Service 0e769b
	blk_size=0
Packit Service 0e769b
	for file in fio_data_file:
Packit Service 0e769b
		files.append(open(file))
Packit Service 0e769b
		pos = len(files) - 1
Packit Service 0e769b
		tmp_filename = "%sgnuplot_temp_file.%d" % (gnuplot_output_dir,pos)
Packit Service 0e769b
		temporary_files.append(tmp_filename)
Packit Service 0e769b
		gnuplot_file=open(tmp_filename,'w')
Packit Service 0e769b
		temp_outfile.append(gnuplot_file)
Packit Service 0e769b
		gnuplot_file.write("#Temporary file based on file %s\n" % file)
Packit Service 0e769b
		disk_perf.append([])
Packit Service 0e769b
Packit Service 0e769b
	shall_break = False
Packit Service 0e769b
	while True:
Packit Service 0e769b
		current_line=[]
Packit Service 0e769b
		nb_empty_files=0
Packit Service 0e769b
		nb_files=len(files)
Packit Service 0e769b
		for myfile in files:
Packit Service 0e769b
			s=myfile.readline().replace(',',' ').split()
Packit Service 0e769b
			if not s:
Packit Service 0e769b
				nb_empty_files+=1
Packit Service 0e769b
				s="-1, 0, 0, 0".replace(',',' ').split()
Packit Service 0e769b
Packit Service 0e769b
			if (nb_empty_files == nb_files):
Packit Service 0e769b
				shall_break=True
Packit Service 0e769b
				break;
Packit Service 0e769b
Packit Service 0e769b
			current_line.append(s);
Packit Service 0e769b
Packit Service 0e769b
		if shall_break == True:
Packit Service 0e769b
			break
Packit Service 0e769b
Packit Service 0e769b
		last_time = -1
Packit Service 0e769b
		index=-1
Packit Service 0e769b
		perfs=[]
Packit Service 0e769b
		for line in enumerate(current_line):
Packit Service 0e769b
			# Index will be used to remember what file was featuring what value
Packit Service 0e769b
			index=index+1
Packit Service 0e769b
Packit Service 0e769b
			time, perf, x, block_size = line[1]
Packit Service 0e769b
			if (blk_size == 0):
Packit Service 0e769b
				try:
Packit Service 0e769b
					blk_size=int(block_size)
Packit Service 0e769b
				except:
Packit Service 0e769b
					print("Error while reading the following line :")
Packit Service 0e769b
					print(line)
Packit Service 0e769b
					sys.exit(1);
Packit Service 0e769b
Packit Service 0e769b
			# We ignore the first 500msec as it doesn't seems to be part of the real benchmark
Packit Service 0e769b
			# Time < 500 usually reports BW=0 breaking the min computing
Packit Service 0e769b
			if (min_time == 0):
Packit Service 0e769b
				min_time==0.5
Packit Service 0e769b
Packit Service 0e769b
			# Then we estimate if the data we got is part of the time range we want to plot
Packit Service 0e769b
			if ((float(time)>(float(min_time)*1000)) and ((int(time) < (int(max_time)*1000)) or max_time==-1)):
Packit Service 0e769b
					disk_perf[index].append(int(perf))
Packit Service 0e769b
					perfs.append("%d %s %s"% (index, time, perf))
Packit Service 0e769b
Packit Service 0e769b
		# If we reach this point, it means that all the traces are coherent
Packit Service 0e769b
		for p in enumerate(perfs):
Packit Service 0e769b
			index, perf_time,perf = p[1].split()
Packit Service 0e769b
			temp_outfile[int(index)].write("%s %.2f %s\n" % (index, float(float(perf_time)/1000), perf))
Packit Service 0e769b
Packit Service 0e769b
Packit Service 0e769b
	for file in files:
Packit Service 0e769b
		file.close()
Packit Service 0e769b
	for file in temp_outfile:
Packit Service 0e769b
                file.close()
Packit Service 0e769b
	return blk_size
Packit Service 0e769b
Packit Service 0e769b
def compute_math(fio_data_file, title,gnuplot_output_filename,gnuplot_output_dir,mode,disk_perf,gpm_dir):
Packit Service 0e769b
	if verbose: print("Computing Maths")
Packit Service 0e769b
	global_min=[]
Packit Service 0e769b
	global_max=[]
Packit Service 0e769b
	average_file=open(gnuplot_output_dir+gnuplot_output_filename+'.average', 'w')
Packit Service 0e769b
	min_file=open(gnuplot_output_dir+gnuplot_output_filename+'.min', 'w')
Packit Service 0e769b
	max_file=open(gnuplot_output_dir+gnuplot_output_filename+'.max', 'w')
Packit Service 0e769b
	stddev_file=open(gnuplot_output_dir+gnuplot_output_filename+'.stddev', 'w')
Packit Service 0e769b
	global_file=open(gnuplot_output_dir+gnuplot_output_filename+'.global','w')
Packit Service 0e769b
	temporary_files.append(gnuplot_output_dir+gnuplot_output_filename+'.average')
Packit Service 0e769b
	temporary_files.append(gnuplot_output_dir+gnuplot_output_filename+'.min')
Packit Service 0e769b
	temporary_files.append(gnuplot_output_dir+gnuplot_output_filename+'.max')
Packit Service 0e769b
	temporary_files.append(gnuplot_output_dir+gnuplot_output_filename+'.stddev')
Packit Service 0e769b
	temporary_files.append(gnuplot_output_dir+gnuplot_output_filename+'.global')
Packit Service 0e769b
Packit Service 0e769b
	min_file.write('DiskName %s\n' % mode)
Packit Service 0e769b
	max_file.write('DiskName %s\n'% mode)
Packit Service 0e769b
	average_file.write('DiskName %s\n'% mode)
Packit Service 0e769b
	stddev_file.write('DiskName %s\n'% mode )
Packit Service 0e769b
	for disk in range(len(fio_data_file)):
Packit Service 0e769b
#		print disk_perf[disk]
Packit Service 0e769b
		min_file.write("# Disk%d was coming from %s\n" % (disk,fio_data_file[disk]))
Packit Service 0e769b
		max_file.write("# Disk%d was coming from %s\n" % (disk,fio_data_file[disk]))
Packit Service 0e769b
		average_file.write("# Disk%d was coming from %s\n" % (disk,fio_data_file[disk]))
Packit Service 0e769b
		stddev_file.write("# Disk%d was coming from %s\n" % (disk,fio_data_file[disk]))
Packit Service 0e769b
		avg  = average(disk_perf[disk])
Packit Service 0e769b
		variance = [(x - avg)**2 for x in disk_perf[disk]]
Packit Service 0e769b
		standard_deviation = math.sqrt(average(variance))
Packit Service 0e769b
#		print "Disk%d [ min=%.2f max=%.2f avg=%.2f stddev=%.2f \n" % (disk,min(disk_perf[disk]),max(disk_perf[disk]),avg, standard_deviation)
Packit Service 0e769b
		average_file.write('%d %d\n' % (disk, avg))
Packit Service 0e769b
		stddev_file.write('%d %d\n' % (disk, standard_deviation))
Packit Service 0e769b
		local_min=min(disk_perf[disk])
Packit Service 0e769b
		local_max=max(disk_perf[disk])
Packit Service 0e769b
		min_file.write('%d %d\n' % (disk, local_min))
Packit Service 0e769b
		max_file.write('%d %d\n' % (disk, local_max))
Packit Service 0e769b
		global_min.append(int(local_min))
Packit Service 0e769b
		global_max.append(int(local_max))
Packit Service 0e769b
Packit Service 0e769b
	global_disk_perf = sum(disk_perf, [])
Packit Service 0e769b
	avg  = average(global_disk_perf)
Packit Service 0e769b
	variance = [(x - avg)**2 for x in global_disk_perf]
Packit Service 0e769b
	standard_deviation = math.sqrt(average(variance))
Packit Service 0e769b
Packit Service 0e769b
	global_file.write('min=%.2f\n' % min(global_disk_perf))
Packit Service 0e769b
	global_file.write('max=%.2f\n' % max(global_disk_perf))
Packit Service 0e769b
	global_file.write('avg=%.2f\n' % avg)
Packit Service 0e769b
	global_file.write('stddev=%.2f\n' % standard_deviation)
Packit Service 0e769b
	global_file.write('values_count=%d\n' % len(global_disk_perf))
Packit Service 0e769b
	global_file.write('disks_count=%d\n' % len(fio_data_file))
Packit Service 0e769b
	#print "Global [ min=%.2f max=%.2f avg=%.2f stddev=%.2f \n" % (min(global_disk_perf),max(global_disk_perf),avg, standard_deviation)
Packit Service 0e769b
Packit Service 0e769b
	average_file.close()
Packit Service 0e769b
	min_file.close()
Packit Service 0e769b
	max_file.close()
Packit Service 0e769b
	stddev_file.close()
Packit Service 0e769b
	global_file.close()
Packit Service 0e769b
	try:
Packit Service 0e769b
		os.remove(gnuplot_output_dir+'mymath')
Packit Service 0e769b
	except:
Packit Service 0e769b
		True
Packit Service 0e769b
Packit Service 0e769b
	generate_gnuplot_math_script("Average values of "+title,gnuplot_output_filename+'.average',mode,int(avg),gnuplot_output_dir,gpm_dir)
Packit Service 0e769b
	generate_gnuplot_math_script("Min values of "+title,gnuplot_output_filename+'.min',mode,average(global_min),gnuplot_output_dir,gpm_dir)
Packit Service 0e769b
	generate_gnuplot_math_script("Max values of "+title,gnuplot_output_filename+'.max',mode,average(global_max),gnuplot_output_dir,gpm_dir)
Packit Service 0e769b
	generate_gnuplot_math_script("Standard Deviation of "+title,gnuplot_output_filename+'.stddev',mode,int(standard_deviation),gnuplot_output_dir,gpm_dir)
Packit Service 0e769b
Packit Service 0e769b
def parse_global_files(fio_data_file, global_search):
Packit Service 0e769b
	max_result=0
Packit Service 0e769b
	max_file=''
Packit Service 0e769b
	for file in fio_data_file:
Packit Service 0e769b
		f=open(file)
Packit Service 0e769b
		disk_count=0
Packit Service 0e769b
		search_value=-1
Packit Service 0e769b
Packit Service 0e769b
		# Let's read the complete file
Packit Service 0e769b
		while True:
Packit Service 0e769b
			try:
Packit Service 0e769b
				# We do split the name from the value
Packit Service 0e769b
				name,value=f.readline().split("=")
Packit Service 0e769b
			except:
Packit Service 0e769b
				f.close()
Packit Service 0e769b
				break
Packit Service 0e769b
			# If we ended the file
Packit Service 0e769b
			if not name:
Packit Service 0e769b
				# Let's process what we have
Packit Service 0e769b
				f.close()
Packit Service 0e769b
				break
Packit Service 0e769b
			else:
Packit Service 0e769b
				# disks_count is not global_search item
Packit Service 0e769b
				# As we need it for some computation, let's save it
Packit Service 0e769b
				if name=="disks_count":
Packit Service 0e769b
					disks_count=int(value)
Packit Service 0e769b
Packit Service 0e769b
				# Let's catch the searched item
Packit Service 0e769b
				if global_search in name:
Packit Service 0e769b
					search_value=float(value)
Packit Service 0e769b
Packit Service 0e769b
		# Let's process the avg value by estimated the global bandwidth per file
Packit Service 0e769b
		# We keep the biggest in memory for reporting
Packit Service 0e769b
		if global_search == "avg":
Packit Service 0e769b
			if (disks_count > 0) and (search_value != -1):
Packit Service 0e769b
				result=disks_count*search_value
Packit Service 0e769b
				if (result > max_result):
Packit Service 0e769b
					max_result=result
Packit Service 0e769b
					max_file=file
Packit Service 0e769b
	# Let's print the avg output
Packit Service 0e769b
	if global_search == "avg":
Packit Service 0e769b
		print("Biggest aggregated value of %s was %2.f in file %s\n" % (global_search, max_result, max_file))
Packit Service 0e769b
	else:
Packit Service 0e769b
		print("Global search %s is not yet implemented\n" % global_search)
Packit Service 0e769b
Packit Service 0e769b
def render_gnuplot(fio_data_file, gnuplot_output_dir):
Packit Service 0e769b
	print("Running gnuplot Rendering")
Packit Service 0e769b
	try:
Packit Service 0e769b
		# Let's render all the compared files if some
Packit Service 0e769b
		if len(fio_data_file) > 1:
Packit Service 0e769b
			if verbose: print(" |-> Rendering comparing traces")
Packit Service 0e769b
			os.system("cd %s; for i in *.gnuplot; do gnuplot $i; done" % gnuplot_output_dir)
Packit Service 0e769b
		if verbose: print(" |-> Rendering math traces")
Packit Service 0e769b
		os.system("cd %s; gnuplot mymath" % gnuplot_output_dir)
Packit Service 0e769b
		if verbose: print(" |-> Rendering 2D & 3D traces")
Packit Service 0e769b
		os.system("cd %s; gnuplot mygraph" % gnuplot_output_dir)
Packit Service 0e769b
Packit Service 0e769b
		name_of_directory="the current"
Packit Service 0e769b
		if gnuplot_output_dir != "./":
Packit Service 0e769b
			name_of_directory=gnuplot_output_dir
Packit Service 0e769b
		print("\nRendering traces are available in %s directory" % name_of_directory)
Packit Service 0e769b
		global keep_temp_files
Packit Service 0e769b
		keep_temp_files=False
Packit Service 0e769b
	except:
Packit Service 0e769b
		print("Could not run gnuplot on mymath or mygraph !\n")
Packit Service 0e769b
		sys.exit(1);
Packit Service 0e769b
Packit Service 0e769b
def print_help():
Packit Service 0e769b
    print('fio2gnuplot -ghbiodvk -t <title> -o <outputfile> -p <pattern> -G <type> -m <time> -M <time>')
Packit Service 0e769b
    print()
Packit Service 0e769b
    print('-h --help                           : Print this help')
Packit Service 0e769b
    print('-p <pattern> or --pattern <pattern> : A glob pattern to select fio input files')
Packit Service 0e769b
    print('-b           or --bandwidth         : A predefined pattern for selecting *_bw.log files')
Packit Service 0e769b
    print('-i           or --iops              : A predefined pattern for selecting *_iops.log files')
Packit Service 0e769b
    print('-g           or --gnuplot           : Render gnuplot traces before exiting')
Packit Service 0e769b
    print('-o           or --outputfile <file> : The basename for gnuplot traces')
Packit Service 0e769b
    print('                                       - Basename is set with the pattern if defined')
Packit Service 0e769b
    print('-d           or --outputdir <dir>   : The directory where gnuplot shall render files')
Packit Service 0e769b
    print('-t           or --title <title>     : The title of the gnuplot traces')
Packit Service 0e769b
    print('                                       - Title is set with the block size detected in fio traces')
Packit Service 0e769b
    print('-G           or --Global <type>     : Search for <type> in .global files match by a pattern')
Packit Service 0e769b
    print('                                       - Available types are : min, max, avg, stddev')
Packit Service 0e769b
    print('                                       - The .global extension is added automatically to the pattern')
Packit Service 0e769b
    print('-m           or --min_time <time>   : Only consider data starting from <time> seconds (default is 0)')
Packit Service 0e769b
    print('-M           or --max_time <time>   : Only consider data ending before <time> seconds (default is -1 aka nolimit)')
Packit Service 0e769b
    print('-v           or --verbose           : Increasing verbosity')
Packit Service 0e769b
    print('-k           or --keep              : Keep all temporary files from gnuplot\'s output dir')
Packit Service 0e769b
Packit Service 0e769b
def main(argv):
Packit Service 0e769b
    mode='unknown'
Packit Service 0e769b
    pattern=''
Packit Service 0e769b
    pattern_set_by_user=False
Packit Service 0e769b
    title='No title'
Packit Service 0e769b
    gnuplot_output_filename='result'
Packit Service 0e769b
    gnuplot_output_dir='./'
Packit Service 0e769b
    gpm_dir="/usr/share/fio/"
Packit Service 0e769b
    disk_perf=[]
Packit Service 0e769b
    run_gnuplot=False
Packit Service 0e769b
    parse_global=False
Packit Service 0e769b
    global_search=''
Packit Service 0e769b
    min_time=0
Packit Service 0e769b
    max_time=-1
Packit Service 0e769b
    global verbose
Packit Service 0e769b
    verbose=False
Packit Service 0e769b
    global temporary_files
Packit Service 0e769b
    temporary_files=[]
Packit Service 0e769b
    global keep_temp_files
Packit Service 0e769b
    keep_temp_files=True
Packit Service 0e769b
    force_keep_temp_files=False
Packit Service 0e769b
Packit Service 0e769b
    if not os.path.isfile(gpm_dir+'math.gpm'):
Packit Service 0e769b
        gpm_dir="/usr/local/share/fio/"
Packit Service 0e769b
        if not os.path.isfile(gpm_dir+'math.gpm'):
Packit Service 0e769b
            print("Looks like fio didn't get installed properly as no gpm files found in '/usr/share/fio' or '/usr/local/share/fio'\n")
Packit Service 0e769b
            sys.exit(3)
Packit Service 0e769b
Packit Service 0e769b
    try:
Packit Service 0e769b
        opts, args = getopt.getopt(argv[1:],"ghkbivo:d:t:p:G:m:M:",['bandwidth', 'iops', 'pattern', 'outputfile', 'outputdir', 'title', 'min_time', 'max_time', 'gnuplot', 'Global', 'help', 'verbose','keep'])
Packit Service 0e769b
    except getopt.GetoptError:
Packit Service 0e769b
        print("Error: One of the options passed to the cmdline was not supported")
Packit Service 0e769b
        print("Please fix your command line or read the help (-h option)")
Packit Service 0e769b
        sys.exit(2)
Packit Service 0e769b
Packit Service 0e769b
    for opt, arg in opts:
Packit Service 0e769b
        if opt in ("-b", "--bandwidth"):
Packit Service 0e769b
            pattern='*_bw.log'
Packit Service 0e769b
        elif opt in ("-i", "--iops"):
Packit Service 0e769b
            pattern='*_iops.log'
Packit Service 0e769b
        elif opt in ("-v", "--verbose"):
Packit Service 0e769b
            verbose=True
Packit Service 0e769b
        elif opt in ("-k", "--keep"):
Packit Service 0e769b
            #User really wants to keep the temporary files
Packit Service 0e769b
            force_keep_temp_files=True
Packit Service 0e769b
        elif opt in ("-p", "--pattern"):
Packit Service 0e769b
            pattern_set_by_user=True
Packit Service 0e769b
            pattern=arg
Packit Service 0e769b
            pattern=pattern.replace('\\','')
Packit Service 0e769b
        elif opt in ("-o", "--outputfile"):
Packit Service 0e769b
            gnuplot_output_filename=arg
Packit Service 0e769b
        elif opt in ("-d", "--outputdir"):
Packit Service 0e769b
            gnuplot_output_dir=arg
Packit Service 0e769b
            if not gnuplot_output_dir.endswith('/'):
Packit Service 0e769b
                gnuplot_output_dir=gnuplot_output_dir+'/'
Packit Service 0e769b
            if not os.path.exists(gnuplot_output_dir):
Packit Service 0e769b
                os.makedirs(gnuplot_output_dir)
Packit Service 0e769b
        elif opt in ("-t", "--title"):
Packit Service 0e769b
            title=arg
Packit Service 0e769b
        elif opt in ("-m", "--min_time"):
Packit Service 0e769b
            min_time=arg
Packit Service 0e769b
        elif opt in ("-M", "--max_time"):
Packit Service 0e769b
            max_time=arg
Packit Service 0e769b
        elif opt in ("-g", "--gnuplot"):
Packit Service 0e769b
            run_gnuplot=True
Packit Service 0e769b
        elif opt in ("-G", "--Global"):
Packit Service 0e769b
            parse_global=True
Packit Service 0e769b
            global_search=arg
Packit Service 0e769b
        elif opt in ("-h", "--help"):
Packit Service 0e769b
            print_help()
Packit Service 0e769b
            sys.exit(1)
Packit Service 0e769b
Packit Service 0e769b
    # Adding .global extension to the file
Packit Service 0e769b
    if parse_global==True:
Packit Service 0e769b
        if not gnuplot_output_filename.endswith('.global'):
Packit Service 0e769b
            pattern = pattern+'.global'
Packit Service 0e769b
Packit Service 0e769b
    fio_data_file=find_file('.',pattern)
Packit Service 0e769b
    if len(fio_data_file) == 0:
Packit Service 0e769b
        print("No log file found with pattern %s!" % pattern)
Packit Service 0e769b
        # Try numjob log file format if per_numjob_logs=1
Packit Service 0e769b
        if (pattern == '*_bw.log'):
Packit Service 0e769b
            fio_data_file=find_file('.','*_bw.*.log')
Packit Service 0e769b
        if (pattern == '*_iops.log'):
Packit Service 0e769b
            fio_data_file=find_file('.','*_iops.*.log')
Packit Service 0e769b
        if len(fio_data_file) == 0:
Packit Service 0e769b
            sys.exit(1)
Packit Service 0e769b
        else:
Packit Service 0e769b
            print("Using log file per job format instead")
Packit Service 0e769b
    else:
Packit Service 0e769b
        print("%d files Selected with pattern '%s'" % (len(fio_data_file), pattern))
Packit Service 0e769b
Packit Service 0e769b
    fio_data_file=sorted(fio_data_file, key=str.lower)
Packit Service 0e769b
    for file in fio_data_file:
Packit Service 0e769b
        print(' |-> %s' % file)
Packit Service 0e769b
        if "_bw.log" in file :
Packit Service 0e769b
            mode="Bandwidth (KB/sec)"
Packit Service 0e769b
        if "_iops.log" in file :
Packit Service 0e769b
            mode="IO per Seconds (IO/sec)"
Packit Service 0e769b
    if (title == 'No title') and (mode != 'unknown'):
Packit Service 0e769b
        if "Bandwidth" in mode:
Packit Service 0e769b
            title='Bandwidth benchmark with %d fio results' % len(fio_data_file)
Packit Service 0e769b
        if "IO" in mode:
Packit Service 0e769b
            title='IO benchmark with %d fio results' % len(fio_data_file)
Packit Service 0e769b
Packit Service 0e769b
    print()
Packit Service 0e769b
    #We need to adjust the output filename regarding the pattern required by the user
Packit Service 0e769b
    if (pattern_set_by_user == True):
Packit Service 0e769b
        gnuplot_output_filename=pattern
Packit Service 0e769b
        # As we do have some glob in the pattern, let's make this simpliest
Packit Service 0e769b
        # We do remove the simpliest parts of the expression to get a clear file name
Packit Service 0e769b
        gnuplot_output_filename=gnuplot_output_filename.replace('-*-','-')
Packit Service 0e769b
        gnuplot_output_filename=gnuplot_output_filename.replace('*','-')
Packit Service 0e769b
        gnuplot_output_filename=gnuplot_output_filename.replace('--','-')
Packit Service 0e769b
        gnuplot_output_filename=gnuplot_output_filename.replace('.log','')
Packit Service 0e769b
        # Insure that we don't have any starting or trailing dash to the filename
Packit Service 0e769b
        gnuplot_output_filename = gnuplot_output_filename[:-1] if gnuplot_output_filename.endswith('-') else gnuplot_output_filename
Packit Service 0e769b
        gnuplot_output_filename = gnuplot_output_filename[1:] if gnuplot_output_filename.startswith('-') else gnuplot_output_filename
Packit Service 0e769b
        if (gnuplot_output_filename == ''):
Packit Service 0e769b
            gnuplot_output_filename='default'
Packit Service 0e769b
Packit Service 0e769b
    if parse_global==True:
Packit Service 0e769b
        parse_global_files(fio_data_file, global_search)
Packit Service 0e769b
    else:
Packit Service 0e769b
        blk_size=compute_temp_file(fio_data_file,disk_perf,gnuplot_output_dir,min_time,max_time)
Packit Service 0e769b
        title="%s @ Blocksize = %dK" % (title,blk_size/1024)
Packit Service 0e769b
        compute_aggregated_file(fio_data_file, gnuplot_output_filename, gnuplot_output_dir)
Packit Service 0e769b
        compute_math(fio_data_file,title,gnuplot_output_filename,gnuplot_output_dir,mode,disk_perf,gpm_dir)
Packit Service 0e769b
        generate_gnuplot_script(fio_data_file,title,gnuplot_output_filename,gnuplot_output_dir,mode,disk_perf,gpm_dir)
Packit Service 0e769b
Packit Service 0e769b
        if (run_gnuplot==True):
Packit Service 0e769b
            render_gnuplot(fio_data_file, gnuplot_output_dir)
Packit Service 0e769b
Packit Service 0e769b
        # Shall we clean the temporary files ?
Packit Service 0e769b
        if keep_temp_files==False and force_keep_temp_files==False:
Packit Service 0e769b
            # Cleaning temporary files
Packit Service 0e769b
            if verbose: print("Cleaning temporary files")
Packit Service 0e769b
            for f in enumerate(temporary_files):
Packit Service 0e769b
                if verbose: print(" -> %s"%f[1])
Packit Service 0e769b
                try:
Packit Service 0e769b
                    os.remove(f[1])
Packit Service 0e769b
                except:
Packit Service 0e769b
                    True
Packit Service 0e769b
Packit Service 0e769b
#Main
Packit Service 0e769b
if __name__ == "__main__":
Packit Service 0e769b
    sys.exit(main(sys.argv))