extract disk and network from running kvm instances
authorDobrica Pavlinusic <dpavlin@rot13.org>
Wed, 7 Dec 2016 07:16:30 +0000 (08:16 +0100)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Wed, 7 Dec 2016 07:16:30 +0000 (08:16 +0100)
gnt-monitor [new file with mode: 0755]

diff --git a/gnt-monitor b/gnt-monitor
new file mode 100755 (executable)
index 0000000..c8df02c
--- /dev/null
@@ -0,0 +1,55 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use autodie;
+
+my $DEBUG = $ENV{DEBUG} || 0;
+my $INFLUX = 'http://10.60.0.89:8186/write';
+
+my $hostname = `hostname -s`;
+chomp $hostname;
+
+use Data::Dump;
+sub XXX { $DEBUG ? warn "XXX ",Data::Dump::dump( @_ ) : {} };
+
+my $stat;
+
+foreach my $glob ( glob '/var/run/ganeti/instance-disks/*' ) {
+       my ( $instance, $disk ) = split(/:/,$glob,2);
+       my $dev = readlink $glob;
+       $instance =~ s{^.*/}{};
+       $dev =~ s{^.*dev/}{};
+       $stat->{$instance}->{disk}->[$disk]->{dev} = $dev;
+       open( my $fh, '<', "/sys/class/block/$dev/stat" );
+       my $v = <$fh>; chomp $v; $v =~ s/^\s+//;
+       my @s = split(/\s+/, $v );
+       # https://www.kernel.org/doc/Documentation/block/stat.txt
+       $stat->{$instance}->{disk}->[$disk]->{read_io} = $s[0];
+       $stat->{$instance}->{disk}->[$disk]->{read_bytes} = $s[2] * 512;
+       $stat->{$instance}->{disk}->[$disk]->{read_wait} = $s[3];
+       $stat->{$instance}->{disk}->[$disk]->{write_io} = $s[4];
+       $stat->{$instance}->{disk}->[$disk]->{write_bytes} = $s[6] * 512;
+       $stat->{$instance}->{disk}->[$disk]->{write_wait} = $s[7];
+}
+
+foreach my $instance ( glob '/var/run/ganeti/kvm-hypervisor/nic/*' ) {
+       foreach my $nic ( glob "$instance/*" ) {
+               open(my $fh, '<', "$nic");
+               my $dev = <$fh>;
+               $nic =~ s{^.*/}{};
+XXX $nic;
+               $instance =~ s{^.*/}{};
+               $stat->{$instance}->{nic}->[$nic]->{dev} = $dev;
+               my $vlan = readlink "/sys/class/net/$dev/master";
+               $vlan =~ s/^.*br//;
+               $stat->{$instance}->{nic}->[$nic]->{vlan} = $vlan;
+               foreach my $f (qw( rx_bytes tx_bytes rx_packets tx_packets )) {
+                       open( my $fh, '<', "/sys/class/net/$dev/statistics/$f" );
+                       my $v = <$fh>; chomp $v;
+                       $stat->{$instance}->{nic}->[$nic]->{$f} = $v;
+               }
+       }
+}
+
+XXX $stat;
+