您的位置:首页 > 移动开发 > IOS开发

nagios插件之监控路况RTTI返回值(模拟车机发起)

2013-09-28 12:42 381 查看
先把perl的帖上,节后用c再写一遍,替换该内容

#!/usr/bin/perl -w

require LWP::UserAgent;
use threads;
use threads::shared;
use warnings;
use strict;
use POSIX;
use Getopt::Long;
use Time::HiRes qw(time usleep);

my @cities;
my @lat_nl;	# north limit;
my @lat_sl;	# south limit;
my @long_el;	# east limit;
my @long_wl;	# west limit;

my $o_host="11x.x.x.x";
my $o_baseurl="/bmw/gateway/index.do";
my $o_port=80;

my $o_bbl = "boundingbox.csv";
my $o_output = "stress_test_output.csv";

my $o_tcars=5;
my $o_treqs=20;
my $o_interval=1.0;

my $o_timeout=15;
my $o_perf=undef;
my $o_warn=undef;
my $o_crit=undef;

my $magic=0.03089619;
my $magic_factor=1.5;

my $o_speed=600;
my $o_help="To_be_changed";

my $timediff=0;

my @time_table		:shared;
my @error_table		:shared;
my @length_table	:shared;
my @g_res_table		:shared;
#my @g_lat_table		:shared;
#my @g_lng_table		:shared;

sub exit_with_error{
print $_[0];				# message
if (defined($o_perf)){
print "| 'timediff'=$timediff","s;$o_warn;$o_crit;0;30";
}
print "\n";
exit($_[1]);
}

sub print_helpmessage()
{
print "
Cennavi TPEG Loadtest tool.
Version: 0.3

Usage: ./cennavi_stresstest [-H <host>] [-p <port>] [-t <timeout>] [-b <baseurl>] [-a <initial latitude>] [-n <initial longitude>] [-T <total number of cars> -R <total number of requests>] [-i <interval between requests from a car>] [-h]

Options:
-H, --hostname
Hostname or IP address of the target host
-p, --port
TCP port of the target host
-b, --base_url
Base url used to query the target host. Has to start with a \"\/\".
-f, --file
The file that stores the coordination of the bounding boxes. Default to boundingbox.csv in the current folder.
-T, --total_cars
Total number of cars to emulate
-R, --total_reqs
Total number of requests to send.
-I, --interval
The interval between 2 requests for an individual car.
-o, --output
The file where detailed information will be logged. Default to stress_test_output.csv in the current folder.
-h, --help
Print this help message.

Notes:
- The coordination file has to be a well formatted csv file.
- If the total number of requests cannot be divided by total number of cars, you may get slightly in-accurate information. This will be fixed in the future.
- Requests generated from each individual car are sychronized. The next request will only be sent out after the previous one gets its response. If the previous request takes more than \"interval\" to finish, then the next request is sent out immediately. If the previous request takes less than \"interval\" to finish, then the script will hold the next request till the interval is reached.
- For this version, we can emulate 10^6 cars in parallel at most.
"
}

sub print_helpmessage_exit()
{
print_helpmessage();
exit(0);
}

sub rand_between
{
return	int(rand($_[1] - $_[0])*0.2 + ($_[0]+$_[1])/2);
}

sub min_max_sum {
my(@number_array) = @{$_[0]};
my $min = $number_array[0];
my $max = $number_array[0];
my $sum = 0;

my $num=undef;
foreach $num (@number_array) {
if ($min > $num){
$min = $num;}
if ($max < $num){
$max = $num;}
$sum += $num;
}
return ($min, $max, $sum);
}

sub check_options {
Getopt::Long::Configure("bundling");
GetOptions(
'H:s'   => \$o_host,		'hostname:s'	=> \$o_host,
'p:i'   => \$o_port,   		'port:i'	=> \$o_port,
#		'l:s'	=> \$o_login,		'login:s'	=> \$o_login,
#		'x:s'	=> \$o_passwd,		'passwd:s'	=> \$o_passwd,
'F:s'	=> \$o_bbl,		'file:s'	=> \$o_bbl,
'f'	=> \$o_perf,		'perf'		=> \$o_perf,
't:i'   => \$o_timeout,       	'timeout:i'     => \$o_timeout,
'b:s'	=> \$o_baseurl,		'base_url:s'	=> \$o_baseurl,
'w:i'	=> \$o_warn,		'warn:i'	=> \$o_warn,
'c:i'	=> \$o_crit,		'critical:i'	=> \$o_crit,
'h:s'	=> \$o_help,		'help:s'	=> \$o_help
);

}

################################################################################
#################################### Main ######################################
################################################################################

check_options();
if ($o_help ne "To_be_changed"){

print_helpmessage_exit();

}

if($o_tcars > $o_treqs) {
print "You ought to have more requests than cars\n";
exit(0);
}

if($o_tcars >= 1000000 || $o_tcars<=0) {
print "Sorry, that exceeds my capacity.\n";
exit(127);
}

if ($o_baseurl =~ m/^\//){
}
else{
$o_baseurl="/".$o_baseurl;
}

############################################################################
# Read the location of the bounding boxes from the configuration file.
############################################################################

my $suc = open BOXFILE, "<", $o_bbl;
if ($suc){
while(<BOXFILE>) {
#chomp;
#push @cities, $_;
my $line = $_;
#if ($line =~ //){					# file content validation, will be done in the future.
my @rec=split /,/, $line;
chomp @rec;
push (@cities, $rec[0]);
push (@lat_nl, floor($rec[1] * (2**32) /360));
push (@long_wl, ceil($rec[2] * (2**32) /360));
push (@lat_sl, ceil($rec[3] * (2**32) /360));
push (@long_el, floor($rec[4]* (2**32)/360));
}
}else {
die "Cannot open config file!\n";
}
close BOXFILE;

my $drive_id=sprintf('%06s',int(rand()*1000));
$drive_id ="0000000000H".$drive_id;
my $city_id=int(rand($#cities));

my $cur_lat = rand_between($lat_sl[$city_id],$lat_nl[$city_id]);
my $cur_lat = rand_between($lat_sl[$city_id],$lat_nl[$city_id]);
my $des_lat = rand_between($lat_sl[$city_id],$lat_nl[$city_id]);
my $cur_lng = rand_between($long_wl[$city_id], $long_el[$city_id]);
my $des_lng = rand_between($long_wl[$city_id], $long_el[$city_id]);

my $target_url="http://$o_host$o_baseurl?DriveID=$drive_id&Decoding_Feat=&Clat=$cur_lat&Dlat=$des_lat&TP_SID=&OP=gtm&Vers=1112.05.07.00&Guidance=KD&Velocity=0&TReq=&Clon=$cur_lng&Dlon=$des_lng&Bearing=&TP_Apps=TEC-TFP";

my $regex="\<TransportFrame .+\\>\\S*\<\/TransportFrame\>";

my $ua = LWP::UserAgent->new;
$ua->timeout($o_timeout);
$ua->env_proxy;

my $content=undef;
my $start_time=time();
my $response = $ua->get($target_url);
my $end_time=time();
$timediff=$end_time - $start_time;
$content=$response->decoded_content();
my $l_len = length($content);

#print $target_url;
#print "\n";
#print $content;
#print "\n";
#

if ($timediff<$o_timeout){

if ($response->is_success) {
if($content =~ m/$regex/){
if ($timediff<=$o_warn) {
exit_with_error("timediff: $timediff sec: OK",0);
}else{
if ($timediff <= $o_crit) {
exit_with_error("timediff: $timediff sec: WARNING",1);
}
}
#OK;
} else {
exit_with_error("Unknown Content: $content : CRITICAL"."\nDriveID: $drive_id \nCityID: $city_id\n$cur_lat\n$cur_lng\n$des_lat\n$des_lng\n", 2);
}

}else {
exit_with_error("Server error: $response->status_line : CRITICAL",2);
}
}
else{
exit_with_error("timediff: $timediff sec: CRITICAL",2);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: