|
|
|
@@ -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 (<IPMI>) { |
|
|
|
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 (<MEMSTAT>) { |
|
|
|
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); |