Skip to content

Instantly share code, notes, and snippets.

@bpaquet
Created February 9, 2016 16:58
Show Gist options
  • Save bpaquet/fba6d3f7629105b3ce6c to your computer and use it in GitHub Desktop.
Save bpaquet/fba6d3f7629105b3ce6c to your computer and use it in GitHub Desktop.
Monitoring jvm from collectd
#!/usr/bin/perl
use Getopt::Long;
use strict;
use warnings;
my $vm_name = "";
my $interval = 10;
GetOptions ("vm_name=s" => \$vm_name, "interval=i" => \$interval) or die 'Syntax error';
die 'Syntax error' unless $vm_name;
my $me = $$;
`ps axu | grep jvm-stats.pl | grep $vm_name | grep -v axu | grep -v $me | awk '{print \$2}' | xargs kill -TERM 2>&1 > /dev/null`;
`ps axu | grep jps | grep $vm_name | grep -v axu | awk '{print \$2}' | xargs kill -TERM 2>&1 > /dev/null`;
my $pid = 0;
$SIG{TERM} = sub {
if ($pid) {
`kill -TERM $pid`;
}
exit 0;
};
sub trim {
my $s = shift;
$s =~ s/^\s+|\s+$//g;
return $s;
};
my $host = trim(`hostname`);
my $name = lc($vm_name);
while(1) {
my $process = trim(`jps | grep $vm_name | awk '{print \$1}'` || '');
if (length($process) > 0) {
`ps axu | grep jstat | grep $process | grep -v axu | awk '{print \$2}' | xargs kill -TERM 2>&1 > /dev/null`;
$pid = open(OUT, "jstat -gc $process ${interval}s |");
my $first_line = <OUT>;
while (my $line = <OUT>) {
my $time = trim(`date +%s`);
# S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
my ($s0c, $s1c, $s0u, $s1u, $ec, $eu, $oc, $ou, $pc, $pu, $ygc, $ygct, $fgc, $fgct, $gct) = map { trim($_) } split(/\s+/, trim($line));
$fgc = int($fgc);
$fgct = int($fgct);
$ygc = int($ygc);
$ygct = int($ygct);
$fgct = $fgct * 1000;
$ygct = $ygct * 1000;
$pc = $pc * 1000;
$pu = $pu * 1000;
$oc = $oc * 1000;
$ou = $ou * 1000;
$ec = $ec * 1000;
$eu = $eu * 1000;
$s0c = $s0c * 1000;
$s0u = $s0u * 1000;
$s1c = $s1c * 1000;
$s1u = $s1u * 1000;
print "PUTVAL $host/jvm/counter-$name.gc $time:$fgc\n";
print "PUTVAL $host/jvm/counter-$name.gc_time $time:$fgct\n";
print "PUTVAL $host/jvm/counter-$name.ygc $time:$ygc\n";
print "PUTVAL $host/jvm/counter-$name.ygc_time $time:$ygct\n";
print "PUTVAL $host/jvm/gauge-$name.perm_capacity interval=$interval N:$pc\n";
print "PUTVAL $host/jvm/gauge-$name.perm_size interval=$interval N:$pu\n";
print "PUTVAL $host/jvm/gauge-$name.old_capacity interval=$interval N:$oc\n";
print "PUTVAL $host/jvm/gauge-$name.old_size interval=$interval N:$ou\n";
print "PUTVAL $host/jvm/gauge-$name.eden_capacity interval=$interval N:$ec\n";
print "PUTVAL $host/jvm/gauge-$name.eden_size interval=$interval N:$eu\n";
print "PUTVAL $host/jvm/gauge-$name.survivor0_capacity interval=$interval N:$s0c\n";
print "PUTVAL $host/jvm/gauge-$name.survivor0_size interval=$interval N:$s0u\n";
print "PUTVAL $host/jvm/gauge-$name.survivor1_capacity interval=$interval N:$s1c\n";
print "PUTVAL $host/jvm/gauge-$name.survivor1_size interval=$interval N:$s1u\n";
}
}
sleep($interval);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment