Archive for the ‘Munin’ Category

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

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

RSS
Add to Google

カスタム検索
ソフトウェア&ライブラリ


ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
カレンダー
2010年8月
« 7月    
 1
2345678
9101112131415
16171819202122
23242526272829
3031  
アーカイブ
にほんブログ村 IT技術ブログへ