#!/usr/bin/perl # # 2007-06-01 Zoltan HERPAI # # Credits goes for: # Adam Crews for his xen_cpu plugin # Mario Manno for his xen_traffic_all plugin # # Script to monitor the I/O usage of Xen domains # Version 0.1 # #%# family=auto #%# capabilities=autoconf # Location of xm tools $XM = '/usr/sbin/xm'; $XMTOP = '/usr/sbin/xentop'; # we cache xm list for 5 min for perfomance reasons system('((find /var/lib/munin/plugin-state/xm_list.state -mmin -5 2>&1 | grep -qE \'^\/var\/lib\/munin\/plugin-state\/xm_list\.state$\') && [ `cat /var/lib/munin/plugin-state/xm_list.state | wc -l` -gt 1 ]) || /usr/sbin/xm list | grep -v "^Name .* ID" > /var/lib/munin/plugin-state/xm_list.state'); system('((find /var/lib/munin/plugin-state/xm_top.state -mmin -5 2>&1 | grep -qE \'^\/var\/lib\/munin\/plugin-state\/xm_top\.state$\') && [ `cat /var/lib/munin/plugin-state/xm_top.state | wc -l` -gt 1 ]) || /usr/sbin/xentop -b -i1 | grep -E "^ " > /var/lib/munin/plugin-state/xm_top.state'); # ah, parameters coming in if ( defined($ARGV[0])) { if ($ARGV[0] eq 'config') { $arg = 'config'; } if ($ARGV[0] eq 'autoconf') { $arg = 'autoconf'; } if ( $arg eq 'autoconf' ) { if ( -e $XM && -e $XMTOP ) { print "yes\n"; exit 0; } else { print "no ($XM and/or $XMTOP not found\n"; exit 0; } } if ( $arg eq 'config' ) { %cnf = ( 'graph_title' => 'Xen Domain I/O usage', 'graph_args' => '--base 1024 -l 0', 'graph_vlabel' => 'read (-), write (+)', 'graph_category' => 'xen', 'graph_info' => 'Display the I/O operations for each domain', ); @domains = `cat /var/lib/munin/plugin-state/xm_list.state | grep -v 'Domain-0'`; foreach $domain ( @domains ) { ($dom, undef) = split(/\s/, $domain); $dom =~ s/[-.]/_/g; $cnf{ $dom.'RD' . '.label' } = 'read'; $cnf{ $dom.'RD' . '.type' } = 'COUNTER'; $cnf{ $dom.'RD' . '.graph' } = 'no'; $cnf{ $dom.'RD' . '.cdef' } = $dom.'RD,8,*'; $cnf{ $dom.'WR' . '.label' } = $dom; $cnf{ $dom.'WR' . '.type' } = 'COUNTER'; $cnf{ $dom.'WR' . '.negative' } = $dom.'RD'; $cnf{ $dom.'WR' . '.cdef' } = $dom.'WR,8,*'; if ( "$cnt" == "0" ) { $cnf { "$dom" . '.draw' } = 'AREA'; } $cnt++; } foreach $key ( sort(keys(%cnf)) ) { print "$key $cnf{$key}\n"; } exit 0; } } # No args, get rolling my @stats = `cat /var/lib/munin/plugin-state/xm_top.state | grep -v 'Domain-0'`; # remove the first line shift(@stats); my %vals; undef(%vals); foreach my $domain (@stats) { # trim the leading whitespace $domain =~ s/^\s+//; my @tmp = split(/\s+/, $domain); # we need to change - and . to _ or things get weird with the graphs # some decent quoting would probably fix this, but this works for now $tmp[0] =~ s/[-.]/_/g; $domname = $tmp[0]; $domname =~ s/[-.]/_/g; $vbdrd = $tmp[14]; $vbdwr = $tmp[15]; $vals{$domname."RD"}{'value'} = $vbdrd; $vals{$domname."WR"}{'value'} = $vbdwr; } foreach $key ( sort(keys(%vals)) ) { print "$key.value " . ($vals{$key}{'value'}) . "\n"; }