7 my $DEBUG = $ENV{DEBUG} || 0;
8 my $INFLUX = 'http://10.60.0.89:8186/write';
10 my $hostname = `hostname -s`;
14 sub XXX { $DEBUG ? warn "XXX ",Data::Dump::dump( @_ ) : {} };
21 foreach my $instance ( glob '/var/run/ganeti/kvm-hypervisor/pid/*' ) {
23 open(my $fh, '<', $instance);
24 my $pid = <$fh>; chomp $pid;
26 $instance =~ s{^.*/}{};
28 my $vcpu = $last->{$instance}->{vcpu};
31 foreach my $fd ( glob "/proc/$pid/fd/*" ) {
32 $vcpu++ if -l $fd && readlink($fd) =~ m/kvm-vcpu/;
35 $last->{$instance}->{vcpu} = $vcpu;
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
43 if ( my $last_gtime = $last->{$instance}->{gtime} ) {
44 my $clock_ticks = POSIX::sysconf( &POSIX::_SC_CLK_TCK ); # clock ticks per second
46 my $cpu = ( ( $gtime - $last_gtime ) * 100 ) / ( $clock_ticks * $vcpu );
47 $stat->{$instance}->{cpu} = $cpu;
50 $last->{$instance}->{gtime} = $gtime;
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{^.*/}{};
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
65 read_bytes => $s[2] * 512,
68 write_bytes => $s[6] * 512,
71 if ( my $l = $last->{$instance}->{disk}->[$disk] ) {
73 $delta->{$_} = $d->{$_} - $l->{$_} foreach keys %$d;
74 $stat->{$instance}->{disk}->[$disk] = $delta;
76 $last->{$instance}->{disk}->[$disk] = $d;
77 $stat->{$instance}->{disk}->[$disk]->{dev} = $dev;
81 foreach my $instance ( glob '/var/run/ganeti/kvm-hypervisor/nic/*' ) {
82 foreach my $nic ( glob "$instance/*" ) {
83 open(my $fh, '<', $nic);
86 $instance =~ s{^.*/}{};
87 $stat->{$instance}->{nic}->[$nic]->{dev} = $dev;
88 my $vlan = readlink "/sys/class/net/$dev/master";
90 $stat->{$instance}->{nic}->[$nic]->{vlan} = $vlan;
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;
99 if ( my $l = $last->{$instance}->{nic}->[$nic] ) {
100 $stat->{$instance}->{nic}->[$nic]->{$_} = $d->{$_} - $l->{$_} foreach keys %$d;
102 $last->{$instance}->{nic}->[$nic] = $d;