diff --git a/feed_graphite_sys.pl b/feed_graphite_sys.pl new file mode 100644 index 0000000..7c44806 --- /dev/null +++ b/feed_graphite_sys.pl @@ -0,0 +1,236 @@ +#!/usr/bin/perl + +use strict; +use IO::Socket; +use Data::Dumper; + +my $graphitehost = "graphite.open6hosting.com"; +my $port = "2003"; +my $hostname = "o6hsmartos16"; +my $grupo = "joyent"; + +my %ipmistatus = ( + "CPU_Temp" => "cpu_temp", + "CPU_Temperature" => "cpu_temp", + "CPU1_Temperature" => "cpu_temp", + "+12V_" => "12v", + "12V" => "12v", + "12V_" => "12v", + "CPU_FAN1" => "cpu_fan1", + "CPU_FAN1_" => "cpu_fan1", + "FAN1" => "cpu_fan1", + "FAN1_" => "cpu_fan1", +); + +my %mdbstatus = ( + "Kernel_" => "kernel", + "Boot_pages" => "boot_pages", + "ZFS_File_Data_" => "zfs_file", + "Anon_" => "anon", + "Exec_and_libs_" => "exec_and_libs", + "Page_cache" => "page_cache", + "Free_(cachelist)" => "free_cachelist", + "Free_(freelist)" => "free_freelist", +); + +# create Socket +my $socket = IO::Socket::INET -> new +( + PeerAddr => $graphitehost, + PeerPort => $port, + Proto => "tcp", + Type => SOCK_STREAM +) or die "Couldn't connect to $graphitehost:$port: $@ \n"; + +# enviaremos algo asi +# print $socket "$grupo.$hostname.vfsstat.read_s $estructura{read_s} $time\n"; +sub enviadatos ($$$$) +{ + my $hash = shift; + my $socket = shift; + my $tabla = shift; + my $tiempo = shift; + + while ( my ( $keys, $values ) = each %{$hash} ) + { + print $socket "$grupo.$hostname.$tabla.$keys ${$hash}{$keys} $tiempo\n"; + } +} + + +######## +# +# iostat +# +######## + + +# numero de dispositivos +my $devices = `zpool list -v | grep -c "c[0-9]*" | tr -d '\n'`; + +# r/s w/s kr/s kw/s read_t write_t +# iostat -xzr 10 2 +# device,r/s,w/s,kr/s,kw/s,wait,actv,svc_t,%w,%b +# sd1,27.9,0.0,111.5,0.0,0.0,0.7,24.6,0,45 +my $captura = `iostat -xr 15 2 | awk -F, '\$1 ~ /^sd[0-8]|blkdev/ { print \$1,\$2,\$3,\$4,\$5,\$7,\$8,\$9,\$10 }' | tail -n$devices`; + +my @fields = split(" ", $captura); +my @wcfields = @fields; + +my %estructura; +my $disco; + +foreach (@fields) +{ + if ( $_ =~ /^sd[0-9]|blkdev[0-9]/ ) + { + $disco = $_; + shift @wcfields; + $estructura{$disco}{r_s} = shift @wcfields; + $estructura{$disco}{w_s} = shift @wcfields; + $estructura{$disco}{kr_s} = shift @wcfields; + $estructura{$disco}{kw_s} = shift @wcfields; + if ( $estructura{$disco}{kr_s} > 0 && $estructura{$disco}{r_s} > 0 ) + { + $estructura{$disco}{ars} = $estructura{$disco}{kr_s} / $estructura{$disco}{r_s}; + } + if ( $estructura{$disco}{kw_s} > 0 && $estructura{$disco}{w_s} > 0 ) + { + $estructura{$disco}{awrs} = $estructura{$disco}{kw_s} / $estructura{$disco}{w_s}; + } + $estructura{$disco}{actv} = shift @wcfields; + $estructura{$disco}{svc_t} = shift @wcfields; + $estructura{$disco}{w} = shift @wcfields; + $estructura{$disco}{b} = shift @wcfields; + } +} + +my $time = time(); + +foreach $disco (keys %estructura) +{ + &enviadatos (\%{ $estructura{$disco} }, $socket, "iostat.$disco", $time); +} + + +######## +# +# ziostat +# +######## + + +# numero de zonas +my $zonas = `vmadm list -H state=running | wc -l | tr -d '\n'`; + +$captura = `ziostat -Z -r 15 2 | awk -F, '\$1 ~ /^[0-9]/ { print \$7,\$1,\$2,\$3,\$4,\$5,\$6 }' | tail -n$zonas`; + +@fields = split(" ", $captura); +@wcfields = @fields; + +my %ziostat; +my $uuid; + +foreach (@fields) +{ + if ( $_ =~ /.*[a-z].*/ ) + { + $uuid = $_; + shift @wcfields; + $ziostat{$uuid}{r_s} = shift @wcfields; + $ziostat{$uuid}{kr_s} = shift @wcfields; + $ziostat{$uuid}{actv} = shift @wcfields; + $ziostat{$uuid}{wsvc_t} = shift @wcfields; + $ziostat{$uuid}{asvc_t} = shift @wcfields; + $ziostat{$uuid}{b} = shift @wcfields; + } +} + +$time = time(); + +foreach $uuid (keys %ziostat) +{ + &enviadatos (\%{ $ziostat{$uuid} }, $socket, "ziostat.$uuid", $time); +} + + +######## +# +# zonememstat +# +######## + +my $memcommand = `zonememstat -H | awk '{ print \$1,\$2,\$4,\$5,\$6 }'`; + +my %zonememstat; +my @memfields = split(" ", $memcommand); +my @wcmemfields = @memfields; +my $memuuid; + + +foreach (@memfields) +{ + if ( $_ =~ /^([a-z0-9]{8}-|global)/ ) { + $memuuid = $_; + shift @wcmemfields; + $zonememstat{$memuuid}{rss} = shift @wcmemfields; + $zonememstat{$memuuid}{nover} = shift @wcmemfields; + $zonememstat{$memuuid}{pout} = shift @wcmemfields; + $zonememstat{$memuuid}{swap} = shift @wcmemfields; + } +} + +my $memtime = time(); + +foreach my $uuid (keys %zonememstat) +{ + &enviadatos ( \%{ $zonememstat{$uuid} }, $socket, "zonememstat.$uuid", $memtime ); +} + +######## +# +# cerramos el descriptor +# +######## + +shutdown($socket,2); + +######## +# +# collect IPMI sensors +# +######## + +my $ipmicommand = "ipmitool sdr list | sed 's/|//g' | sed 's/ /_/' | awk '\$1 ~ /CPU_Temp/ || \$1 ~ /CPU1_Temp/ || \$1 ~ /CPU_FAN1/ || \$1 ~ /^FAN1/ || \$1 ~ /12V/ { print \$1,\$2 }'"; + +open(IPMI, "$ipmicommand |") or die("Could not execute '$ipmicommand': $!"); + +while () { + my ($k, $v) = (m/([\+\w\d]*).*?(\d+(?:\.\d+)?)/); + next unless ($k); + if (exists $ipmistatus{$k} ) { + system("echo -n '$grupo.$hostname.ipmi.$ipmistatus{$k} $v $time' | nc -w 0 $graphitehost $port"); + } +} + +close (IPMI); + +######## +# +# collect memstat mdb data +# +######## + +my $mdbcommand = "mdb -ke '::memstat' | sed 's/ZFS File Data/ZFS_File_Data/' | sed 's/Exec and libs/Exec_and_libs/' | sed 's/ /_/' | awk '{ print \$1,\$3 }'"; + +open(MEMSTAT, "$mdbcommand |") or die("Could not execute '$mdbcommand': $!"); + +while () { + my ($k, $v) = (m/([\w_()]+)\s+?(\d+)?/); + next unless ($k); + if (exists $mdbstatus{$k} ) { + system("echo '$grupo.$hostname.memstat.$mdbstatus{$k} $v $time' | nc -w 0 $graphitehost $port"); + } +} + +close (MEMSTAT); diff --git a/zonebackuptozone.sh b/zonebackuptozone.sh index 523effa..e1d4371 100755 --- a/zonebackuptozone.sh +++ b/zonebackuptozone.sh @@ -72,6 +72,10 @@ create_snap() send_snap () { DATASET=$1 + echo "Deleting dataset ${DATASET} on ${BACKUPZ}..." + ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ zfs destroy -r zones/${IDBACKUPZ}/data/${SOURCEGZ}/${DATASET} + check_err + echo "done." echo "Sending snapshot to ${BACKUPZ}..." zfs send zones/${DATASET}@`date +%Y%m%d` | ssh -i /usbkey/ssh/id_rsa -p 2221 $BACKUPZ zfs receive -F zones/${IDBACKUPZ}/data/${SOURCEGZ}/${DATASET} check_err