HTTPのレスポンスをmuninで監視するためにプラグインをperlで作成しました。
監視できるのは、

  1. レスポンスの成功率:レスポンスの本文が指定した文字列が本文にあること
  2. 平均レスポンス秒:レスポンスの秒数
  3. 指定した秒数以上にレスポンスがかかっている率

のようなものが監視できます。

以下のような環境変数の設定が必ず必要です。
それ以外は、ソースをご参照ください。

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();

お仕事のご依頼・相談を承ります
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら

Leave a Reply

お仕事のご依頼・相談
この記事に関連するお仕事のご依頼やご相談をお待ちしております。 詳しくは、こちら
ソフトウェア&ライブラリ




ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
執筆書籍
本、雑誌等

WEB記事:CodeZine
執筆記事はこちら
カレンダー
2009年4月
« 3月   5月 »
 12345
6789101112
13141516171819
20212223242526
27282930  

カスタム検索
RSS
Add to Google < !–adsense–>
アーカイブ
カテゴリ
にほんブログ村 IT技術ブログへ