#!/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);