Archive for 2009/4/7
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();

