#! /usr/bin/perl
# Show disk wait times from FreeBSD gstat program
# anders@fupp.net, 2007-09-23

$ENV{PATH} = "/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin";

$gstatcmd="gstat -b";
if ($< != 0) {
	$gstatcmd = "sudo " . $gstatcmd;
}

if ($ARGV[0] eq "autoconf") {
	print "yes\n";
} elsif ($ARGV[0] eq "config") {
	print "graph_title Disk wait time\n";
	print "graph_vlabel milliseconds\n";
	print "graph_category disk\n";
	print "graph_info This graph shows the average wait time in milliseconds for reads and writes, per 30 seconds with data from gstat (GEOM stat) in FreeBSD\n";
	print "graph_args --base 1000 -l 0\n";

	@parts = ();
	foreach $gline (`$gstatcmd`) {
		chomp($gline);
		if ($gline =~ /\s+\d+\s+\d+\s+\d+\s+\d+\s+([0-9\.]+)\s+\d+\s+\d+\s+([0-9\.]+)\s+[0-9\.]+\|\s+(\w+)/) {
			$part = $3;

			# Do not show c labels
			next if ($part =~ /c$/);
			# Only show real labels
			next if ($part !~ /[a-z]+\d+(s\d+|)[abcdefgh]/);

			push(@parts, $part);
		}
	}

	print "graph_order";
	foreach $part (sort(@parts)) {
		print " " . $part . "_msr";
		print " " . $part . "_msw";
	}
	print "\n";

	foreach $part (sort(@parts)) {
		print $part . "_msr.label $part (read)\n";
		print $part . "_msr.type GAUGE\n";
		print $part . "_msr.graph yes\n";
		print $part . "_msw.label $part (write)\n";
		print $part . "_msw.type GAUGE\n";
		print $part . "_msw.graph yes\n";
	}
} else {
	foreach $gline (`cat /var/tmp/gstat.dat`) {
		chomp($gline);
		if ($gline =~ /\s+\d+\s+\d+\s+\d+\s+\d+\s+([0-9\.]+)\s+\d+\s+\d+\s+([0-9\.]+)\s+[0-9\.]+\|\s+(\w+)/) {
			$msr = $1;
			$msw = $2;
			$part = $3;

			# Do not show c labels
			next if ($part =~ /c$/);
			# Only show real labels
			next if ($part !~ /[a-z]+\d+(s\d+|)[abcdefgh]/);

			print $part . "_msr.value $msr\n";
			print $part . "_msw.value $msw\n";
		}
	}
}
