Archive for the ‘Munin’ Category
HTTPのレスポンスをmuninで監視するためにプラグインをperlで作成しました。
監視できるのは、
- レスポンスの成功率:レスポンスの本文が指定した文字列が本文にあること
- 平均レスポンス秒:レスポンスの秒数
- 指定した秒数以上にレスポンスがかかっている率
のようなものが監視できます。
以下のような環境変数の設定が必ず必要です。
それ以外は、ソースをご参照ください。
| URL | カンマ区切りで設定すれば、複数のURLがチェックできます。 |
|---|---|
| USER_AGENTS | リクエストするときのUser-Agent カンマ区切りで複数していできます。 |
また、成功率、失敗率などを出しますが、分母は
(URLの数) × (User-Agent) になります。
#!/usr/bin/perl -w
use strict;
use Switch '__';
use Time::HiRes;
use Sys::Syslog;
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://localhost/check.php";
my $TIMEOUT = exists $ENV{'TIMEOUT'} ? $ENV{'TIMEOUT'} : 10;
my $WARNSEC = exists $ENV{'WARNSEC'} ? $ENV{'WARNSEC'} : 1;
my $USER_AGENTS = exists $ENV{'USER_AGENTS'} ? $ENV{'USER_AGENTS'} : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";
my $CHECK_STR = exists $ENV{'CHECK_STR'} ? $ENV{'CHECK_STR'} : "OK";
if(exists $ARGV[0] and $ARGV[0] eq "autoconf"){
print "yes\n";
exit;
}
if(exists $ARGV[0] and $ARGV[0] eq "config"){
## 設定
print "graph_title HTTP status check \n";
print "graph_scale no\n";
print "graph_vlabel time(msec) or percent\n";
print "graph_category HTTP\n";
print "success.label OK(percent)\n";
print "success.max 100\n";
print "success.min 0\n";
print "failure.label NG(percent)\n";
print "failure.max 100\n";
print "failure.min 0\n";
print "warn.label slow response(percent) ($WARNSEC sec ) \n";
print "warn.max 100\n";
print "warn.min 0\n";
print "time.label cost ( msec ) \n";
print "time.min 0\n";
exit;
}
sub checkHTTP{
(my $url,my $userAgent,my $timeout) = @_;
my $browser = LWP::UserAgent->new(timeout => $timeout);
my $res = $browser->request(HTTP::Request->new('GET',$url,[User_Agent => $userAgent]));
return $res;
}
my $success = 0;
my $failure = 0;
my $warn = 0;
my $try = 0;
my $total = 0;
my $cost = 0;
my $browser;
openlog("MUNIN_AGENT_HTTP","pid","local0");
my @AGENTS = split(',',$USER_AGENTS);
my @URLS = split(',',$URL);
foreach my $_url (@URLS){
foreach my $ua (@AGENTS){
my $st = Time::HiRes::time();
my $ok = 0;
my $cnt = 0;
$try++;
while($ok == 0){
#syslog("crit","%s","check $_url - $ua");
my $res = &checkHTTP($_url,$ua,$TIMEOUT);
if($res->is_success){
my $et = Time::HiRes::time();
$cost = $et - $st;
$total = $total + $cost;
$ok = 1;
if($res->content =~ /$CHECK_STR/i){
if($cost > 1 ){
$warn++;
}
$success++;
}
else{
syslog("crit","%s","Content check error $_url - $ua");
$failure++;
}
}
else{
# エラーコードは・・・
my $c = $res->code;
# 再度実行する
$cnt++;
sleep(2);
if($cnt > 2){
# 諦める
syslog("crit","%s","Can't connect $_url - $ua [ STATUS:$c ] ");
$ok = 1;
$failure++;
}
}
}
}
}
if($success > 1 ){
$total = $total / $success;
$total = $total * 1000;
}
$success = $success / $try * 100;
$failure = $failure / $try * 100;
print "success.value $success\n";
print "warn.value $warn\n";
print "failure.value $failure\n";
print "time.value $total\n";
closelog();

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";

