create storable dump from vmstat
authorDobrica Pavlinusic <dpavlin@rot13.org>
Sun, 27 Jun 2010 16:47:45 +0000 (18:47 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Sun, 27 Jun 2010 16:47:45 +0000 (18:47 +0200)
It also supports arbitrary command before vmstat, for example:

  $ ./vmstat.pl ssh disk

will connect to disk and issue vmstat there

script/vmstat.pl [new file with mode: 0755]

diff --git a/script/vmstat.pl b/script/vmstat.pl
new file mode 100755 (executable)
index 0000000..f7c1703
--- /dev/null
@@ -0,0 +1,52 @@
+#!/usr/bin/perl
+
+use warnings;
+use strict;
+
+use Data::Dump qw(dump);
+use Storable;
+use Time::HiRes qw(time);
+
+$|=1;
+
+my $vmstat = 'vmstat 1';
+$vmstat = join(' ', @ARGV, $vmstat) if @ARGV;
+
+my $headers;
+my @last;
+
+sub emit {
+       warn dump @_;
+       Storable::store_fd $_[0], \*STDOUT 
+               if defined $_[0]->{item};
+}
+
+warn "# vmstat $vmstat\n";
+open(my $in, '-|', $vmstat);
+while(<$in>) {
+       chomp;
+       my @v = split(/\s+/, $_);
+       if ( ! $headers->{$#v} ) {
+               $headers->{$#v} = [ @v ];
+               warn "# headers ", dump $headers;
+               next;
+       }
+       emit { row => [ @v ] };
+       warn " $#v ",dump @v;
+       my $diff;
+       if ( @last ) {
+               $diff->[$_] = $last[$_] - $v[$_] foreach ( 0 .. $#v );
+               emit { diff => $diff };
+       }
+       @last = @v;
+
+       my $item;
+       my @header = @{ $headers->{$#v} };
+       foreach my $i ( 0 .. $#header ) {
+               $item->{ $header[$i] } = $v[$i];
+               $item->{ $header[$i] . '.diff' } = $diff->[$i];
+               $item->{t} = time();
+       }
+       emit { item => $item };
+
+}