#! /usr/bin/perl
# anders@fupp.met, 2008-02-16
# graph number of syscalls and context switches in FreeBSD, parsing output from
# vmstat command
#

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

sub printvalues {
	# Get the values from the vmstat command
	foreach $vml (`sysctl vm.stats`) {
		if ($vml =~ /([\w\.]+): (\d+)/) {
			$values{"$1"} = $2;
		}
	}

	print "soft.value " . $values{"vm.stats.sys.v_soft"} . "\n";
	print "intr.value " . $values{"vm.stats.sys.v_intr"} . "\n";
	print "swtch.value " . $values{"vm.stats.sys.v_swtch"} . "\n";
	print "trap.value " . $values{"vm.stats.sys.v_trap"} . "\n";
	print "syscall.value " . $values{"vm.stats.sys.v_soft"} . "\n";
	print "vmfaults.value " . $values{"vm.stats.vm.v_vm_faults"} . "\n";
}

sub printconfig {
	print "graph_title VM faults\n";
	print "graph_vlabel n\n";
	print "graph_category system\n";
	print "graph_info This graph shows the number of VM faults, as an average per second over the last 5 seconds. Explaination of the labels: soft=software interrupts, intr=hardware interrupts, syscall=syscalls, swtch=context switches, trap=traps, faults=VM faults.\n";

	print "swtch.label swtch\n";
	print "swtch.type DERIVE\n";
	print "swtch.graph yes\n";
	print "swtch.min 0\n";
	print "swtch.draw AREA\n";

	print "soft.label soft\n";
	print "soft.type DERIVE\n";
	print "soft.graph yes\n";
	print "soft.min 0\n";
	print "soft.draw STACK\n";

	print "intr.label intr\n";
	print "intr.type DERIVE\n";
	print "intr.graph yes\n";
	print "intr.min 0\n";
	print "intr.draw STACK\n";

	print "trap.label trap\n";
	print "trap.type DERIVE\n";
	print "trap.graph yes\n";
	print "trap.min 0\n";
	print "trap.draw STACK\n";

	print "syscall.label syscall\n";
	print "syscall.type DERIVE\n";
	print "syscall.graph yes\n";
	print "syscall.min 0\n";
	print "syscall.draw STACK\n";

	print "vmfaults.label vmfaults\n";
	print "vmfaults.type DERIVE\n";
	print "vmfaults.graph yes\n";
	print "vmfaults.min 0\n";
	print "vmfaults.draw STACK\n";
}

if ($ARGV[0] eq "autoconf") {
	print "yes\n";
} elsif ($ARGV[0] eq "config") {
	printconfig;
} else {
	printvalues;
}
