
munin_tomcat_threads
tomcatのスレッドを監視しておかしなスレッドがたまっていないか調べる必要がでてきた。
そこで、muninで監視するスクリプトを見つけたが、ちょっとちがったのと、個別のスレッドの状態までは確認できなかったので、自作しました。
ただ、perlがよくわからんので、そこはまねっこです。
use strict;
use Switch '__';
my $ret = undef;
if(!eval "require LWP::UserAgent;") {
$ret = "LWP::UserAgent not found";
}
if(!eval "require XML::LibXML;") {
$ret .= "XML::Simple not found";
}
my $URL = exists $ENV{'url'} ? $ENV{'url'} : "http://%s:%s\@127.0.0.1:%d/manager/status?XML=true";
my $PORT = exists $ENV{'ports'} ? $ENV{'ports'} : 8080;
my $USER = exists $ENV{'user'} ? $ENV{'user'} : "user";
my $PASSWORD = exists $ENV{'password'} ? $ENV{'password'} : "password";
my $TIMEOUT = exists $ENV{'timeout'} ? $ENV{'timeout'} : 30;
my $CONNECTOR = exists $ENV{'connector'} ? $ENV{'connector'} : "jk-8009";
my $url = sprintf $URL, $USER, $PASSWORD, $PORT;
if(exists $ARGV[0] and $ARGV[0] eq "autoconf") {
if($ret) {
print "no ($ret)\n";
exit 1;
}
my $au = LWP::UserAgent->new(timeout => $TIMEOUT);
my $repsonse = $au->request(HTTP::Request->new('GET',$url));
if($repsonse->is_success and $repsonse->content =~ /<status>.*< \/status>/im) {
print "yes\n";
exit 0;
} else {
print "no (no tomcat status)\n";
exit 1;
}
}
if(exists $ARGV[0] and $ARGV[0] eq "config") {
print "graph_title Tomcat current threads ($CONNECTOR) \n";
print "graph_args --base 1000 -l 0\n";
print "graph_vlabel current thread / count \n";
print "graph_category tomcat\n";
print "parse.label Parse and prepare request \n";
print "parse.max 150\n";
print "parse.min 0\n";
print "service.label Service\n";
#print "service.type DERIVE\n";
print "service.max 150\n";
print "service.min 0\n";
print "finishing.label Finishing\n";;
print "finishing.max 150\n";
print "finishing.min 0\n";
print "ready.label Ready \n";
print "ready.max 150\n";
print "ready.min 0\n";
print "keepalive.label Keepalive\n";
print "keepalive.max 150\n";
print "keepalive.min 0\n";
exit 0;
}
my $ua = LWP::UserAgent->new(timeout => $TIMEOUT);
my $response = $ua->request(HTTP::Request->new('GET',$url));
my $xml = XML::LibXML->new->parse_string($response->content);
my $pNum = 0;
my $sNum = 0;
my $fNum = 0;
my $rNum = 0;
my $kNum = 0;
my @nodeList = $xml->getElementsByTagName('connector');
foreach my $conn (@nodeList){
my $name = $conn->getAttribute('name');
if($name eq $CONNECTOR){
my @workers = $conn->getElementsByTagName('worker');
foreach my $worker (@workers){
my $stage = $worker->getAttribute("stage");
switch ($stage){
case 'P' { $pNum++; }
case 'S' { $sNum++; }
case 'F' { $fNum++; }
case 'R' { $rNum++; }
case 'K' { $kNum++; }
else { }
}
}
}
}
print "parse.value $pNum\n";
print "service.value $sNum\n";
print "finishing.value $fNum\n";
print "ready.value $rNum\n";
print "keepalive.value $kNum\n";



Hi, nice post. I have been thinking about this topic,so thanks for sharing. I will definitely be subscribing to your blog.