added cpu usage % and show just changes
[gnt-info] / gnt-monitor
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4 use autodie;
5 use POSIX;
6
7 my $DEBUG = $ENV{DEBUG} || 0;
8 my $INFLUX = 'http://10.60.0.89:8186/write';
9
10 my $hostname = `hostname -s`;
11 chomp $hostname;
12
13 use Data::Dump;
14 sub XXX { $DEBUG ? warn "XXX ",Data::Dump::dump( @_ ) : {} };
15
16 my $stat;
17 my $last;
18
19 while(1) {
20
21 foreach my $instance ( glob '/var/run/ganeti/kvm-hypervisor/pid/*' ) {
22
23         open(my $fh, '<', $instance);
24         my $pid = <$fh>; chomp $pid;
25
26         $instance =~ s{^.*/}{};
27
28         my $vcpu = $last->{$instance}->{vcpu};
29
30         if ( ! $vcpu ) {
31                 foreach my $fd ( glob "/proc/$pid/fd/*" ) {
32                         $vcpu++ if -l $fd && readlink($fd) =~ m/kvm-vcpu/;
33                 }
34
35                 $last->{$instance}->{vcpu} = $vcpu;
36         }
37
38         # https://www.kernel.org/doc/Documentation/filesystems/proc.txt
39         open($fh, '<', "/proc/$pid/stat");
40         my $line = <$fh>; chomp $line;
41         my $gtime = (split(/\s+/,$line))[42]; # guest time of the task in jiffies
42
43         if ( my $last_gtime = $last->{$instance}->{gtime} ) {
44                 my $clock_ticks = POSIX::sysconf( &POSIX::_SC_CLK_TCK ); # clock ticks per second
45
46                 my $cpu = ( ( $gtime - $last_gtime ) * 100 ) / ( $clock_ticks * $vcpu );
47                 $stat->{$instance}->{cpu} = $cpu;
48         }
49
50         $last->{$instance}->{gtime} = $gtime;
51 }
52                 
53
54 foreach my $glob ( glob '/var/run/ganeti/instance-disks/*' ) {
55         my ( $instance, $disk ) = split(/:/,$glob,2);
56         my $dev = readlink $glob;
57         $instance =~ s{^.*/}{};
58         $dev =~ s{^.*dev/}{};
59         open( my $fh, '<', "/sys/class/block/$dev/stat" );
60         my $v = <$fh>; chomp $v; $v =~ s/^\s+//;
61         my @s = split(/\s+/, $v );
62         # https://www.kernel.org/doc/Documentation/block/stat.txt
63         my $d = {
64                 read_io => $s[0],
65                 read_bytes => $s[2] * 512,
66                 read_wait => $s[3],
67                 write_io => $s[4],
68                 write_bytes => $s[6] * 512,
69                 write_wait => $s[7],
70         };
71         if ( my $l = $last->{$instance}->{disk}->[$disk] ) {
72                 my $delta;
73                 $delta->{$_} = $d->{$_} - $l->{$_} foreach keys %$d;
74                 $stat->{$instance}->{disk}->[$disk] = $delta;
75         }
76         $last->{$instance}->{disk}->[$disk] = $d;
77         $stat->{$instance}->{disk}->[$disk]->{dev} = $dev;
78
79 }
80
81 foreach my $instance ( glob '/var/run/ganeti/kvm-hypervisor/nic/*' ) {
82         foreach my $nic ( glob "$instance/*" ) {
83                 open(my $fh, '<', $nic);
84                 my $dev = <$fh>;
85                 $nic =~ s{^.*/}{};
86                 $instance =~ s{^.*/}{};
87                 $stat->{$instance}->{nic}->[$nic]->{dev} = $dev;
88                 my $vlan = readlink "/sys/class/net/$dev/master";
89                 $vlan =~ s/^.*br//;
90                 $stat->{$instance}->{nic}->[$nic]->{vlan} = $vlan;
91
92                 my $d;
93
94                 foreach my $f (qw( rx_bytes tx_bytes rx_packets tx_packets )) {
95                         open( my $fh, '<', "/sys/class/net/$dev/statistics/$f" );
96                         my $v = <$fh>; chomp $v;
97                         $d->{$f} = $v;
98                 }
99                 if ( my $l = $last->{$instance}->{nic}->[$nic] ) {
100                         $stat->{$instance}->{nic}->[$nic]->{$_} = $d->{$_} - $l->{$_} foreach keys %$d;
101                 }
102                 $last->{$instance}->{nic}->[$nic] = $d;
103
104         }
105 }
106
107 XXX $stat;
108 #XXX $last;
109
110 sleep 1;
111 } #/while
112