Refs #5499: Working on Varnish Plugin

This commit is contained in:
Florian Asche 2014-06-05 14:14:11 +02:00
parent f3d4b09b2a
commit c4a2b32bda
6 changed files with 1113 additions and 154 deletions

View File

@ -0,0 +1,438 @@
###############################################################################
# Copyright 2005-2013 MERETHIS
# Centreon is developped by : Julien Mathis and Romain Le Merlus under
# GPL Licence 2.0.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation ; either version 2 of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <http://www.gnu.org/licenses>.
#
# Linking this program statically or dynamically with other modules is making a
# combined work based on this program. Thus, the terms and conditions of the GNU
# General Public License cover the whole combination.
#
# As a special exception, the copyright holders of this program give MERETHIS
# permission to link this program with independent modules to produce an timeelapsedutable,
# regardless of the license terms of these independent modules, and to copy and
# distribute the resulting timeelapsedutable under terms of MERETHIS choice, provided that
# MERETHIS also meet, for each linked independent module, the terms and conditions
# of the license of that module. An independent module is a module which is not
# derived from this program. If you modify this program, you may extend this
# exception to your version of the program, but you are not obliged to do so. If you
# do not wish to do so, delete this exception statement from your version.
#
# For more information : contact@centreon.com
# Author : Florian Asche <info@florian-asche.de>
#
####################################################################################
package apps::varnish::mode::client;
use base qw(centreon::plugins::mode);
use centreon::plugins::misc;
use centreon::plugins::statefile;
use Digest::MD5 qw(md5_hex);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
"hostname:s" => { name => 'hostname' },
"remote" => { name => 'remote' },
"ssh-option:s@" => { name => 'ssh_option' },
"ssh-path:s" => { name => 'ssh_path' },
"ssh-command:s" => { name => 'ssh_command', default => 'ssh' },
"timeout:s" => { name => 'timeout', default => 30 },
"sudo" => { name => 'sudo' },
"command:s" => { name => 'command', default => 'varnishstat' },
"command-path:s" => { name => 'command_path', default => '/usr/bin/' },
"command-options:s" => { name => 'command_options', default => ' -1 ' },
"command-options2:s" => { name => 'command_options2', default => ' 2>&1' },
"warning-conn:s" => { name => 'warning_conn', default => '' },
"critical-conn:s" => { name => 'critical_conn', default => '' },
"warning-unhealthy:s" => { name => 'warning_unhealthy', default => '' },
"critical-unhealthy:s" => { name => 'critical_unhealthy', default => '' },
"warning-busy:s" => { name => 'warning_busy', default => '' },
"critical-busy:s" => { name => 'critical_busy', default => '' },
"warning-fail:s" => { name => 'warning_fail', default => '' },
"critical-fail:s" => { name => 'critical_fail', default => '' },
"warning-reuse:s" => { name => 'warning_reuse', default => '' },
"critical-reuse:s" => { name => 'critical_reuse', default => '' },
"warning-toolate:s" => { name => 'warning_toolate', default => '' },
"critical-toolate:s" => { name => 'critical_toolate', default => '' },
"warning-recycle:s" => { name => 'warning_recycle', default => '' },
"critical-recycle:s" => { name => 'critical_recycle', default => '' },
"warning-retry:s" => { name => 'warning_retry', default => '' },
"critical-retry:s" => { name => 'critical_retry', default => '' },
});
$self->{statefile_value} = centreon::plugins::statefile->new(%options);
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (($self->{perfdata}->threshold_validate(label => 'warning-conn', value => $self->{option_results}->{warning_conn})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-conn threshold '" . $self->{option_results}->{warning_conn} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-conn', value => $self->{option_results}->{critical_conn})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-conn threshold '" . $self->{option_results}->{critical_conn} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-unhealthy', value => $self->{option_results}->{warning_unhealthy})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-unhealthy threshold '" . $self->{option_results}->{warning_unhealthy} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-unhealthy', value => $self->{option_results}->{critical_unhealthy})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-unhealthy threshold '" . $self->{option_results}->{critical_unhealthy} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-busy', value => $self->{option_results}->{warning_busy})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-busy threshold '" . $self->{option_results}->{warning_busy} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-busy', value => $self->{option_results}->{critical_busy})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-busy threshold '" . $self->{option_results}->{critical_busy} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-fail', value => $self->{option_results}->{warning_fail})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-fail threshold '" . $self->{option_results}->{warning_fail} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-fail', value => $self->{option_results}->{critical_fail})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-fail threshold '" . $self->{option_results}->{critical_fail} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-reuse', value => $self->{option_results}->{warning_reuse})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-reuse threshold '" . $self->{option_results}->{warning_reuse} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-reuse', value => $self->{option_results}->{critical_reuse})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-reuse threshold '" . $self->{option_results}->{critical_reuse} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-toolate', value => $self->{option_results}->{warning_toolate})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-toolate threshold '" . $self->{option_results}->{warning_toolate} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-toolate', value => $self->{option_results}->{critical_toolate})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-toolate threshold '" . $self->{option_results}->{critical_toolate} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-recycle', value => $self->{option_results}->{warning_recycle})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-recycle threshold '" . $self->{option_results}->{warning_recycle} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-recycle', value => $self->{option_results}->{critical_recycle})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-recycle threshold '" . $self->{option_results}->{critical_recycle} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-retry', value => $self->{option_results}->{warning_retry})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-retry threshold '" . $self->{option_results}->{warning_retry} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-retry', value => $self->{option_results}->{critical_retry})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-retry threshold '" . $self->{option_results}->{critical_retry} . "'.");
$self->{output}->option_exit();
}
$self->{statefile_value}->check_options(%options);
}
#my $stdout = '
#backend_conn 13746 0.00 Backend conn. success
#backend_unhealthy 0 0.00 Backend conn. not attempted
#backend_busy 0 0.00 Backend conn. too many
#backend_fail 0 0.00 Backend conn. failures
#backend_reuse 0 0.00 Backend conn. reuses
#backend_toolate 0 0.00 Backend conn. was closed
#backend_recycle 0 0.00 Backend conn. recycles
#backend_retry 0 0.00 Backend conn. retry
#';
sub getdata {
my ($self, %options) = @_;
my $stdout = centreon::plugins::misc::execute(output => $self->{output},
options => $self->{option_results},
sudo => $self->{option_results}->{sudo},
command => $self->{option_results}->{command},
command_path => $self->{option_results}->{command_path},
command_options => $self->{option_results}->{command_options} . $self->{option_results}->{command_options2});
#print $stdout;
foreach (split(/\n/, $stdout)) {
#client_conn 7390867 1.00 Client connections
# - Symbolic entry name
# - Value
# - Per-second average over process lifetime, or a period if the value can not be averaged
# - Descriptive text
if (/^(.\S*)\s*([0-9]*)\s*([0-9.]*)\s(.*)$/i) {
#print "FOUND: " . $1 . "=" . $2 . "\n";
$self->{result}->{$1} = $2;
};
};
};
sub run {
my ($self, %options) = @_;
$self->getdata();
$self->{statefile_value}->read(statefile => 'cache_apps_varnish' . '_' . $self->{mode} . '_' . (defined($self->{option_results}->{name}) ? md5_hex($self->{option_results}->{name}) : md5_hex('all')));
$self->{result}->{last_timestamp} = time();
my $old_timestamp = $self->{statefile_value}->get(name => 'last_timestamp');
my $old_backend_conn = $self->{statefile_value}->get(name => 'backend_conn');
my $old_backend_unhealthy = $self->{statefile_value}->get(name => 'backend_unhealthy');
my $old_backend_busy = $self->{statefile_value}->get(name => 'backend_busy');
my $old_backend_fail = $self->{statefile_value}->get(name => 'backend_fail');
my $old_backend_reuse = $self->{statefile_value}->get(name => 'backend_reuse');
my $old_backend_toolate = $self->{statefile_value}->get(name => 'backend_toolate');
my $old_backend_recycle = $self->{statefile_value}->get(name => 'backend_recycle');
my $old_backend_retry = $self->{statefile_value}->get(name => 'backend_retry');
$self->{statefile_value}->write(data => $self->{result});
if (!defined($old_timestamp) || !defined($old_backend_conn)) {
$self->{output}->output_add(severity => 'OK',
short_msg => "Buffer creation...");
$self->{output}->display();
$self->{output}->exit();
}
# Set 0 if Cache > Result
$old_backend_conn = 0 if ($old_backend_conn > $self->{result}->{backend_conn} );
$old_backend_unhealthy = 0 if ($old_hitpass > $self->{result}->{backend_unhealthy});
$old_backend_busy = 0 if ($old_miss > $self->{result}->{backend_busy});
$old_backend_fail = 0 if ($old_miss > $self->{result}->{backend_fail});
$old_backend_reuse = 0 if ($old_miss > $self->{result}->{backend_reuse});
$old_backend_toolate = 0 if ($old_miss > $self->{result}->{backend_toolate});
$old_backend_recycle = 0 if ($old_miss > $self->{result}->{backend_recycle});
$old_backend_retry = 0 if ($old_miss > $self->{result}->{backend_retry});
# Calculate
my $delta_time = $self->{result}->{last_timestamp} - $old_timestamp;
$delta_time = 1 if ($delta_time == 0); # One seconds ;)
my $backend_conn = ($self->{result}->{backend_conn} - $old_backend_conn) / $delta_time;
my $backend_unhealthy = ($self->{result}->{backend_unhealthy} - $old_backend_unhealthy) / $delta_time;
my $backend_busy = ($self->{result}->{backend_busy} - $old_backend_busy) / $delta_time;
my $backend_fail = ($self->{result}->{backend_fail} - $old_backend_fail) / $delta_time;
my $backend_reuse = ($self->{result}->{backend_reuse} - $old_backend_reuse) / $delta_time;
my $backend_toolate = ($self->{result}->{backend_toolate} - $old_backend_toolate) / $delta_time;
my $backend_recycle = ($self->{result}->{backend_recycle} - $old_backend_recycle) / $delta_time;
my $backend_retry = ($self->{result}->{backend_retry} - $old_backend_retry) / $delta_time;
my $exit1 = $self->{perfdata}->threshold_check(value => $backend_conn, threshold => [ { label => 'critical-conn', 'exit_litteral' => 'critical' }, { label => 'warning-conn', exit_litteral => 'warning' } ]);
my $exit2 = $self->{perfdata}->threshold_check(value => $backend_unhealthy, threshold => [ { label => 'critical-unhealthy', 'exit_litteral' => 'critical' }, { label => 'warning-unhealthy', exit_litteral => 'warning' } ]);
my $exit3 = $self->{perfdata}->threshold_check(value => $backend_busy, threshold => [ { label => 'critical-busy', 'exit_litteral' => 'critical' }, { label => 'warning-busy', exit_litteral => 'warning' } ]);
my $exit4 = $self->{perfdata}->threshold_check(value => $backend_fail, threshold => [ { label => 'critical-fail', 'exit_litteral' => 'critical' }, { label => 'warning-fail', exit_litteral => 'warning' } ]);
my $exit5 = $self->{perfdata}->threshold_check(value => $backend_reuse, threshold => [ { label => 'critical-reuse', 'exit_litteral' => 'critical' }, { label => 'warning-reuse', exit_litteral => 'warning' } ]);
my $exit6 = $self->{perfdata}->threshold_check(value => $backend_toolate, threshold => [ { label => 'critical-toolate', 'exit_litteral' => 'critical' }, { label => 'warning-toolate', exit_litteral => 'warning' } ]);
my $exit7 = $self->{perfdata}->threshold_check(value => $backend_recycle, threshold => [ { label => 'critical-recycle', 'exit_litteral' => 'critical' }, { label => 'warning-recycle', exit_litteral => 'warning' } ]);
my $exit8 = $self->{perfdata}->threshold_check(value => $backend_retry, threshold => [ { label => 'critical-retry', 'exit_litteral' => 'critical' }, { label => 'warning-retry', exit_litteral => 'warning' } ]);
my $exit = $self->{output}->get_most_critical(status => [ $exit1, $exit2, $exit3, $exit4, $exit5, $exit6, $exit7, $exit8 ]);
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Backend conn. success: %.2f
Backend conn. not attempted: %.2f
Backend conn. too many: %.2f
Backend conn. failures: %.2f
Backend conn. reuses: %.2f
Backend conn. was closed: %.2f
Backend conn. recycles: %.2f
Backend conn. retry: %.2f ",
$backend_conn,
$backend_unhealthy,
$backend_busy,
$backend_fail,
$backend_reuse,
$backend_toolate,
$backend_recycle,
$backend_retry,
));
$self->{output}->perfdata_add(label => "backend_conn",
value => $backend_conn,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-conn'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-conn'),
min => 0
);
$self->{output}->perfdata_add(label => "backend_unhealthy",
value => $backend_unhealthy,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-unhealthy'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-unhealthy'),
min => 0
);
$self->{output}->perfdata_add(label => "backend_busy",
value => $backend_busy,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-busy'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-busy'),
min => 0
);
$self->{output}->perfdata_add(label => "backend_fail",
value => $backend_fail,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-fail'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-fail'),
min => 0
);
$self->{output}->perfdata_add(label => "backend_reuse",
value => $backend_reuse,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-reuse'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-reuse'),
min => 0
);
$self->{output}->perfdata_add(label => "backend_toolate",
value => $backend_toolate,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-toolate'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-toolate'),
min => 0
);
$self->{output}->perfdata_add(label => "backend_recycle",
value => $backend_recycle,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-recycle'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-recycle'),
min => 0
);
$self->{output}->perfdata_add(label => "backend_retry",
value => $backend_retry,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-retry'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-retry'),
min => 0
);
$self->{output}->display();
$self->{output}->exit();
};
1;
__END__
=head1 MODE
Check Varnish Cache with varnishstat Command
This Mode Checks:
- Backend conn. success
- Backend conn. not attempted
- Backend conn. too many
- Backend conn. failures
- Backend conn. reuses
- Backend conn. was closed
- Backend conn. recycles
- Backend conn. unused
=over 8
=item B<--remote>
If you dont run this script locally, if you wanna use it remote, you can run it remotely with 'ssh'.
=item B<--hostname>
Hostname to query (need --remote).
=item B<--ssh-option>
Specify multiple options like the user (example: --ssh-option='-l=centreon-engine' --ssh-option='-p=52').
=item B<--command>
Varnishstat Binary Filename (Default: varnishstat)
=item B<--command-path>
Directory Path to Varnishstat Binary File (Default: /usr/bin/)
=item B<--command-options>
Parameter for Binary File (Default: ' -1 ')
=item B<--warning-conn>
Warning Threshold for Backend conn. success
=item B<--critical-conn>
Critical Threshold for Backend conn. success
=item B<--warning-unhealthy>
Warning Threshold for Backend conn. not attempted
=item B<--critical-unhealthy>
Critical Threshold for Backend conn. not attempted
=item B<--warning-busy>
Warning Threshold for Backend conn. too many
=item B<--critical-busy>
Critical Threshold for Backend conn. too many
=item B<--warning-fail>
Warning Threshold for Backend conn. failures
=item B<--critical-fail>
Critical Threshold for Backend conn. failures
=item B<--warning-reuse>
Warning Threshold for Backend conn. reuses
=item B<--critical-reuse>
Critical Threshold for Backend conn. reuses
=item B<--warning-toolate>
Warning Threshold for Backend conn. was closed
=item B<--critical-toolate>
Critical Threshold for Backend conn. was closed
=item B<--warning-recycle>
Warning Threshold for Backend conn. recycles
=item B<--critical-recycle>
Critical Threshold for Backend conn. recycles
=item B<--warning-retry>
Warning Threshold for Backend conn. retry
=item B<--critical-retry>
Critical Threshold for Backend conn. retry
=back
=cut

View File

@ -76,29 +76,29 @@ sub check_options {
$self->SUPER::init(%options);
if (($self->{perfdata}->threshold_validate(label => 'warning-hit', value => $self->{option_results}->{warning_hit})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning_hit} . "'.");
$self->{output}->add_option_msg(short_msg => "Wrong warning-hit threshold '" . $self->{option_results}->{warning_hit} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-hit', value => $self->{option_results}->{critical_hit})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical_hit} . "'.");
$self->{output}->add_option_msg(short_msg => "Wrong critical-hit threshold '" . $self->{option_results}->{critical_hit} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-hitpass', value => $self->{option_results}->{warning_hitpass})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-bytes threshold '" . $self->{option_results}->{warning_hitpass} . "'.");
$self->{output}->add_option_msg(short_msg => "Wrong warning-hitpass threshold '" . $self->{option_results}->{warning_hitpass} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-hitpass', value => $self->{option_results}->{critical_hitpass})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-bytes threshold '" . $self->{option_results}->{critical_hitpass} . "'.");
$self->{output}->add_option_msg(short_msg => "Wrong critical-hitpass threshold '" . $self->{option_results}->{critical_hitpass} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-miss', value => $self->{option_results}->{warning_miss})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-access threshold '" . $self->{option_results}->{warning_miss} . "'.");
$self->{output}->add_option_msg(short_msg => "Wrong warning-miss threshold '" . $self->{option_results}->{warning_miss} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-miss', value => $self->{option_results}->{critical_miss})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-access threshold '" . $self->{option_results}->{critical_miss} . "'.");
$self->{output}->add_option_msg(short_msg => "Wrong critical-miss threshold '" . $self->{option_results}->{critical_miss} . "'.");
$self->{output}->option_exit();
}
@ -106,14 +106,9 @@ sub check_options {
}
#my $stdout = '
#client_conn 7287199 1.00 Client connections accepted
#client_drop 0 0.00 Connection dropped, no sess/wrk
#client_req 24187 0.00 Client requests received
#cache_hit 69941 0.00 Cache hits
#cache_hitpass 10 0.00 Cache hits for pass
#cache_miss 16746 0.00 Cache misses
#backend_conn 13746 0.00 Backend conn. success
#backend_unhealthy 0 0.00 Backend conn. not attempted
#';
sub getdata {
@ -217,6 +212,10 @@ __END__
=head1 MODE
Check Varnish Cache with varnishstat Command
This Mode Checks:
- Cache hits
- Cache hits for pass
- Cache misses
=over 8
@ -248,10 +247,6 @@ Parameter for Binary File (Default: ' -1 ')
Warning Threshold for Cache Hits
=item B<--warning-hit>
Warning Threshold for Cache Hits
=item B<--critical-hit>
Critical Threshold for Cache Hits

View File

@ -33,7 +33,7 @@
#
####################################################################################
package apps::varnish::mode::cache;
package apps::varnish::mode::connections;
use base qw(centreon::plugins::mode);
use centreon::plugins::misc;
@ -59,12 +59,12 @@ sub new {
"command-path:s" => { name => 'command_path', default => '/usr/bin/' },
"command-options:s" => { name => 'command_options', default => ' -1 ' },
"command-options2:s" => { name => 'command_options2', default => ' 2>&1' },
"warning-hit:s" => { name => 'warning-hit', default => '' },
"critical-hit:s" => { name => 'critical-hit', default => '' },
"warning-hitpass:s" => { name => 'warning-hitpass', default => '' },
"critical-hitpass:s" => { name => 'critical-hitpass', default => '' },
"warning-miss:s" => { name => 'warning-miss', default => '' },
"critical-miss:s" => { name => 'critical-miss', default => '' },
"warning-hit:s" => { name => 'warning_hit', default => '' },
"critical-hit:s" => { name => 'critical_hit', default => '' },
"warning-hitpass:s" => { name => 'warning_hitpass', default => '' },
"critical-hitpass:s" => { name => 'critical_hitpass', default => '' },
"warning-miss:s" => { name => 'warning_miss', default => '' },
"critical-miss:s" => { name => 'critical_miss', default => '' },
});
$self->{statefile_value} = centreon::plugins::statefile->new(%options);
@ -75,30 +75,30 @@ sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (($self->{perfdata}->threshold_validate(label => 'warning-hit', value => $self->{option_results}->{warning-hit})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning threshold '" . $self->{option_results}->{warning-hit} . "'.");
if (($self->{perfdata}->threshold_validate(label => 'warning-conn', value => $self->{option_results}->{warning_conn})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-conn threshold '" . $self->{option_results}->{warning_conn} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-hit', value => $self->{option_results}->{critical-hit})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical threshold '" . $self->{option_results}->{critical-hit} . "'.");
if (($self->{perfdata}->threshold_validate(label => 'critical-conn', value => $self->{option_results}->{critical_conn})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-conn threshold '" . $self->{option_results}->{critical_conn} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-hitpass', value => $self->{option_results}->{warning_hitpass})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-bytes threshold '" . $self->{option_results}->{warning_hitpass} . "'.");
if (($self->{perfdata}->threshold_validate(label => 'warning-drop', value => $self->{option_results}->{warning_drop})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-drop threshold '" . $self->{option_results}->{warning_drop} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-hitpass', value => $self->{option_results}->{critical_hitpass})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-bytes threshold '" . $self->{option_results}->{critical_hitpass} . "'.");
if (($self->{perfdata}->threshold_validate(label => 'critical-drop', value => $self->{option_results}->{critical_drop})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-drop threshold '" . $self->{option_results}->{critical_drop} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-miss', value => $self->{option_results}->{warning_miss})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-access threshold '" . $self->{option_results}->{warning_miss} . "'.");
if (($self->{perfdata}->threshold_validate(label => 'warning-req', value => $self->{option_results}->{warning_req})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-req threshold '" . $self->{option_results}->{warning_req} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-miss', value => $self->{option_results}->{critical_miss})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-access threshold '" . $self->{option_results}->{critical_miss} . "'.");
if (($self->{perfdata}->threshold_validate(label => 'critical-req', value => $self->{option_results}->{critical_req})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-req threshold '" . $self->{option_results}->{critical_req} . "'.");
$self->{output}->option_exit();
}
@ -109,11 +109,6 @@ sub check_options {
#client_conn 7287199 1.00 Client connections accepted
#client_drop 0 0.00 Connection dropped, no sess/wrk
#client_req 24187 0.00 Client requests received
#cache_hit 17941 0.00 Cache hits
#cache_hitpass 10 0.00 Cache hits for pass
#cache_miss 16746 0.00 Cache misses
#backend_conn 13746 0.00 Backend conn. success
#backend_unhealthy 0 0.00 Backend conn. not attempted
#';
sub getdata {
@ -135,7 +130,7 @@ sub getdata {
# - Descriptive text
if (/^(.\S*)\s*([0-9]*)\s*([0-9.]*)\s(.*)$/i) {
#print "FOUND: " . $2 . "\n";
#print "FOUND: " . $1 . "=" . $2 . "\n";
$self->{result}->{$1} = $2;
};
};
@ -149,12 +144,12 @@ sub run {
$self->{statefile_value}->read(statefile => 'cache_apps_varnish' . '_' . $self->{mode} . '_' . (defined($self->{option_results}->{name}) ? md5_hex($self->{option_results}->{name}) : md5_hex('all')));
$self->{result}->{last_timestamp} = time();
my $old_timestamp = $self->{statefile_value}->get(name => 'last_timestamp');
my $old_cache_hit = $self->{statefile_value}->get(name => 'cache_hit');
my $old_hitpass = $self->{statefile_value}->get(name => 'cache_hitpass');
my $old_miss = $self->{statefile_value}->get(name => 'cache_miss');
my $old_client_conn = $self->{statefile_value}->get(name => 'client_conn');
my $old_client_drop = $self->{statefile_value}->get(name => 'client_drop');
my $old_client_req = $self->{statefile_value}->get(name => 'client_req');
$self->{statefile_value}->write(data => $self->{result});
if (!defined($old_timestamp) || !defined($old_cache_hit)) {
if (!defined($old_timestamp) || !defined($old_client_conn)) {
$self->{output}->output_add(severity => 'OK',
short_msg => "Buffer creation...");
$self->{output}->display();
@ -162,46 +157,50 @@ sub run {
}
# Set 0 if Cache > Result
$old_cache_hit = 0 if ($old_cache_hit > $self->{result}->{cache_hit}->{value} );
$old_cache_hitpass = 0 if ($old_hitpass > $self->{result}->{cache_hitpass}->{value});
$old_cache_miss = 0 if ($old_miss > $self->{result}->{cache_miss}->{value});
$old_client_conn = 0 if ($old_client_conn > $self->{result}->{client_conn} );
$old_client_drop = 0 if ($old_hitpass > $self->{result}->{client_drop});
$old_client_req = 0 if ($old_miss > $self->{result}->{client_req});
# Calculate
my $delta_time = $self->{result}->{last_timestamp} - $old_timestamp;
$delta_time = 1 if ($delta_time == 0); # One seconds ;)
my $cache_hit = ($self->{result}->{cache_hit}->{value} - $old_cache_hit) / $delta_time;
my $cache_hitpass = ($self->{result}->{cache_hitpass}->{value} - $old_cache_hitpass) / $delta_time;
my $cache_miss = ($self->{result}->{cache_}->{value} - $old_cache_miss) / $delta_time;
my $client_conn = ($self->{result}->{client_conn} - $old_client_conn) / $delta_time;
my $client_drop = ($self->{result}->{client_drop} - $old_client_drop) / $delta_time;
my $client_req = ($self->{result}->{client_req} - $old_client_req) / $delta_time;
my $exit1 = $self->{perfdata}->threshold_check(value => $cache_hit, threshold => [ { label => 'critical-hit', 'exit_litteral' => 'critical' }, { label => 'warning-hit', exit_litteral => 'warning' } ]);
my $exit2 = $self->{perfdata}->threshold_check(value => $cache_hitpass, threshold => [ { label => 'critical-hitpass', 'exit_litteral' => 'critical' }, { label => 'warning-hitpass', exit_litteral => 'warning' } ]);
my $exit3 = $self->{perfdata}->threshold_check(value => $cache_miss, threshold => [ { label => 'critical-miss', 'exit_litteral' => 'critical' }, { label => 'warning-miss', exit_litteral => 'warning' } ]);
#print $old_client_conn . "\n";
#print $self->{result}->{client_conn} . "\n";
#print $client_conn . "\n";
my $exit1 = $self->{perfdata}->threshold_check(value => $client_conn, threshold => [ { label => 'critical-conn', 'exit_litteral' => 'critical' }, { label => 'warning-conn', exit_litteral => 'warning' } ]);
my $exit2 = $self->{perfdata}->threshold_check(value => $client_drop, threshold => [ { label => 'critical-drop', 'exit_litteral' => 'critical' }, { label => 'warning-drop', exit_litteral => 'warning' } ]);
my $exit3 = $self->{perfdata}->threshold_check(value => $client_req, threshold => [ { label => 'critical-req', 'exit_litteral' => 'critical' }, { label => 'warning-req', exit_litteral => 'warning' } ]);
my $exit = $self->{output}->get_most_critical(status => [ $exit1, $exit2, $exit3 ]);
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Cache Hits: %.2f Cache Hits for pass: %.2f Cache misses: %.2f ",
$cache_hit,
$cache_hitpass,
$cache_miss,
short_msg => sprintf("Client connections accepted: %.2f Connection dropped, no sess/wrk: %.2f Client requests received: %.2f ",
$client_conn,
$client_drop,
$client_req,
));
$self->{output}->perfdata_add(label => "cache_hit",
value => $cache_hit,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-hit'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-hit'),
$self->{output}->perfdata_add(label => "client_conn",
value => $client_conn,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-conn'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-conn'),
min => 0
);
$self->{output}->perfdata_add(label => "cache_hitpass",
value => $cache_hitpass,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-hitpass'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-hitpass'),
$self->{output}->perfdata_add(label => "client_drop",
value => $client_drop,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-drop'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-drop'),
min => 0
);
$self->{output}->perfdata_add(label => "cache_miss",
value => $cache_miss,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-miss'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-miss'),
$self->{output}->perfdata_add(label => "client_req",
value => $client_req,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-req'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-req'),
min => 0
);
@ -217,9 +216,25 @@ __END__
=head1 MODE
Check Varnish Cache with varnishstat Command
This Mode Checks:
- Client connections accepted
- Connection dropped, no sess
- Client requests received
=over 8
=item B<--remote>
If you dont run this script locally, if you wanna use it remote, you can run it remotely with 'ssh'.
=item B<--hostname>
Hostname to query (need --remote).
=item B<--ssh-option>
Specify multiple options like the user (example: --ssh-option='-l=centreon-engine' --ssh-option='-p=52').
=item B<--command>
Varnishstat Binary Filename (Default: varnishstat)
@ -232,33 +247,29 @@ Directory Path to Varnishstat Binary File (Default: /usr/bin/)
Parameter for Binary File (Default: ' -1 ')
=item B<--warning-hit>
=item B<--warning-conn>
Warning Threshold for Cache Hits
Warning Threshold for Client connections accepted
=item B<--warning-hit>
=item B<--critical-conn>
Warning Threshold for Cache Hits
Critical Threshold for Client connections accepted
=item B<--critical-hit>
=item B<--warning-drop>
Critical Threshold for Cache Hits
Warning Threshold for Connection dropped, no sess/wrk
=item B<--warning-hitpass>
=item B<--critical-drop>
Warning Threshold for Cache hits for Pass
Critical Threshold for Connection dropped, no sess/wrk
=item B<--critical-hitpass>
=item B<--warning-req>
Critical Threshold for Cache hits for Pass
Warning Threshold for Client requests received
=item B<--warning-miss>
=item B<--critical-req>
Warning Threshold for Cache Misses
=item B<--critical-miss>
Critical Threshold for Cache Misses
Critical Threshold for Client requests received
=back

View File

@ -0,0 +1,573 @@
###############################################################################
# Copyright 2005-2013 MERETHIS
# Centreon is developped by : Julien Mathis and Romain Le Merlus under
# GPL Licence 2.0.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation ; either version 2 of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <http://www.gnu.org/licenses>.
#
# Linking this program statically or dynamically with other modules is making a
# combined work based on this program. Thus, the terms and conditions of the GNU
# General Public License cover the whole combination.
#
# As a special exception, the copyright holders of this program give MERETHIS
# permission to link this program with independent modules to produce an timeelapsedutable,
# regardless of the license terms of these independent modules, and to copy and
# distribute the resulting timeelapsedutable under terms of MERETHIS choice, provided that
# MERETHIS also meet, for each linked independent module, the terms and conditions
# of the license of that module. An independent module is a module which is not
# derived from this program. If you modify this program, you may extend this
# exception to your version of the program, but you are not obliged to do so. If you
# do not wish to do so, delete this exception statement from your version.
#
# For more information : contact@centreon.com
# Author : Florian Asche <info@florian-asche.de>
#
####################################################################################
package apps::varnish::mode::client;
use base qw(centreon::plugins::mode);
use centreon::plugins::misc;
use centreon::plugins::statefile;
use Digest::MD5 qw(md5_hex);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
$self->{version} = '1.0';
$options{options}->add_options(arguments =>
{
"hostname:s" => { name => 'hostname' },
"remote" => { name => 'remote' },
"ssh-option:s@" => { name => 'ssh_option' },
"ssh-path:s" => { name => 'ssh_path' },
"ssh-command:s" => { name => 'ssh_command', default => 'ssh' },
"timeout:s" => { name => 'timeout', default => 30 },
"sudo" => { name => 'sudo' },
"command:s" => { name => 'command', default => 'varnishstat' },
"command-path:s" => { name => 'command_path', default => '/usr/bin/' },
"command-options:s" => { name => 'command_options', default => ' -1 ' },
"command-options2:s" => { name => 'command_options2', default => ' 2>&1' },
"warning-head:s" => { name => 'warning_head', default => '' },
"critical-head:s" => { name => 'critical_head', default => '' },
"warning-length:s" => { name => 'warning_length', default => '' },
"critical-length:s" => { name => 'critical_length', default => '' },
"warning-chunked:s" => { name => 'warning_chunked', default => '' },
"critical-chunked:s" => { name => 'critical_chunked', default => '' },
"warning-eof:s" => { name => 'warning_eof', default => '' },
"critical-eof:s" => { name => 'critical_eof', default => '' },
"warning-bad:s" => { name => 'warning_bad', default => '' },
"critical-bad:s" => { name => 'critical_bad', default => '' },
"warning-close:s" => { name => 'warning_close', default => '' },
"critical-close:s" => { name => 'critical_close', default => '' },
"warning-oldhttp:s" => { name => 'warning_oldhttp', default => '' },
"critical-oldhttp:s" => { name => 'critical_oldhttp', default => '' },
"warning-zero:s" => { name => 'warning_zero', default => '' },
"critical-zero:s" => { name => 'critical_zero', default => '' },
"warning-failed:s" => { name => 'warning_failed', default => '' },
"critical-failed:s" => { name => 'critical_failed', default => '' },
"warning-1xx:s" => { name => 'warning_1xx', default => '' },
"critical-1xx:s" => { name => 'critical_1xx', default => '' },
"warning-204:s" => { name => 'warning_204', default => '' },
"critical-204:s" => { name => 'critical_204', default => '' },
"warning-304:s" => { name => 'warning_304', default => '' },
"critical-304:s" => { name => 'critical_304', default => '' },
});
$self->{statefile_value} = centreon::plugins::statefile->new(%options);
return $self;
}
sub check_options {
my ($self, %options) = @_;
$self->SUPER::init(%options);
if (($self->{perfdata}->threshold_validate(label => 'warning-head', value => $self->{option_results}->{warning_head})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-head threshold '" . $self->{option_results}->{warning_head} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-head', value => $self->{option_results}->{critical_head})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-head threshold '" . $self->{option_results}->{critical_head} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-length', value => $self->{option_results}->{warning_length})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-length threshold '" . $self->{option_results}->{warning_length} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-length', value => $self->{option_results}->{critical_length})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-length threshold '" . $self->{option_results}->{critical_length} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-chunked', value => $self->{option_results}->{warning_chunked})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-chunked threshold '" . $self->{option_results}->{warning_chunked} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-chunked', value => $self->{option_results}->{critical_chunked})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-chunked threshold '" . $self->{option_results}->{critical_chunked} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-eof', value => $self->{option_results}->{warning_eof})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-eof threshold '" . $self->{option_results}->{warning_eof} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-eof', value => $self->{option_results}->{critical_eof})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-eof threshold '" . $self->{option_results}->{critical_eof} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-bad', value => $self->{option_results}->{warning_bad})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-bad threshold '" . $self->{option_results}->{warning_bad} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-bad', value => $self->{option_results}->{critical_bad})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-bad threshold '" . $self->{option_results}->{critical_bad} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-close', value => $self->{option_results}->{warning_close})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-close threshold '" . $self->{option_results}->{warning_close} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-close', value => $self->{option_results}->{critical_close})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-close threshold '" . $self->{option_results}->{critical_close} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-oldhttp', value => $self->{option_results}->{warning_oldhttp})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-oldhttp threshold '" . $self->{option_results}->{warning_oldhttp} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-oldhttp', value => $self->{option_results}->{critical_oldhttp})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-oldhttp threshold '" . $self->{option_results}->{critical_oldhttp} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-zero', value => $self->{option_results}->{warning_zero})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-zero threshold '" . $self->{option_results}->{warning_zero} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-zero', value => $self->{option_results}->{critical_zero})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-zero threshold '" . $self->{option_results}->{critical_zero} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-failed', value => $self->{option_results}->{warning_failed})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-failed threshold '" . $self->{option_results}->{warning_failed} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-failed', value => $self->{option_results}->{critical_failed})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-failed threshold '" . $self->{option_results}->{critical_failed} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-1xx', value => $self->{option_results}->{warning_1xx})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-1xx threshold '" . $self->{option_results}->{warning_1xx} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-1xx', value => $self->{option_results}->{critical_1xx})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-1xx threshold '" . $self->{option_results}->{critical_1xx} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-204', value => $self->{option_results}->{warning_204})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-204 threshold '" . $self->{option_results}->{warning_204} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-204', value => $self->{option_results}->{critical_204})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-204 threshold '" . $self->{option_results}->{critical_204} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'warning-304', value => $self->{option_results}->{warning_304})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong warning-304 threshold '" . $self->{option_results}->{warning_304} . "'.");
$self->{output}->option_exit();
}
if (($self->{perfdata}->threshold_validate(label => 'critical-304', value => $self->{option_results}->{critical_304})) == 0) {
$self->{output}->add_option_msg(short_msg => "Wrong critical-304 threshold '" . $self->{option_results}->{critical_304} . "'.");
$self->{output}->option_exit();
}
$self->{statefile_value}->check_options(%options);
}
#my $stdout = '
#fetch_head 0 0.00 Fetch head
#fetch_length 13742 0.00 Fetch with Length
#fetch_chunked 0 0.00 Fetch chunked
#fetch_eof 0 0.00 Fetch EOF
#fetch_bad 0 0.00 Fetch had bad headers
#fetch_close 0 0.00 Fetch wanted close
#fetch_oldhttp 0 0.00 Fetch pre HTTP/1.1 closed
#fetch_zero 0 0.00 Fetch zero len
#fetch_failed 0 0.00 Fetch failed
#fetch_1xx 0 0.00 Fetch no body (1xx)
#fetch_204 0 0.00 Fetch no body (204)
#fetch_304 0 0.00 Fetch no body (304)
#';
sub getdata {
my ($self, %options) = @_;
my $stdout = centreon::plugins::misc::execute(output => $self->{output},
options => $self->{option_results},
sudo => $self->{option_results}->{sudo},
command => $self->{option_results}->{command},
command_path => $self->{option_results}->{command_path},
command_options => $self->{option_results}->{command_options} . $self->{option_results}->{command_options2});
#print $stdout;
foreach (split(/\n/, $stdout)) {
#client_conn 7390867 1.00 Client connections
# - Symbolic entry name
# - Value
# - Per-second average over process lifetime, or a period if the value can not be averaged
# - Descriptive text
if (/^(.\S*)\s*([0-9]*)\s*([0-9.]*)\s(.*)$/i) {
#print "FOUND: " . $1 . "=" . $2 . "\n";
$self->{result}->{$1} = $2;
};
};
};
sub run {
my ($self, %options) = @_;
$self->getdata();
$self->{statefile_value}->read(statefile => 'cache_apps_varnish' . '_' . $self->{mode} . '_' . (defined($self->{option_results}->{name}) ? md5_hex($self->{option_results}->{name}) : md5_hex('all')));
$self->{result}->{last_timestamp} = time();
my $old_timestamp = $self->{statefile_value}->get(name => 'last_timestamp');
my $old_fetch_head = $self->{statefile_value}->get(name => 'fetch_head');
my $old_fetch_length = $self->{statefile_value}->get(name => 'fetch_length');
my $old_fetch_chunked = $self->{statefile_value}->get(name => 'fetch_chunked');
my $old_fetch_eof = $self->{statefile_value}->get(name => 'fetch_eof');
my $old_fetch_bad = $self->{statefile_value}->get(name => 'fetch_bad');
my $old_fetch_close = $self->{statefile_value}->get(name => 'fetch_close');
my $old_fetch_oldhttp = $self->{statefile_value}->get(name => 'fetch_oldhttp');
my $old_fetch_zero = $self->{statefile_value}->get(name => 'fetch_zero');
my $old_fetch_failed = $self->{statefile_value}->get(name => 'fetch_failed');
my $old_fetch_1xx = $self->{statefile_value}->get(name => 'fetch_1xx');
my $old_fetch_204 = $self->{statefile_value}->get(name => 'fetch_204');
my $old_fetch_304 = $self->{statefile_value}->get(name => 'fetch_304');
$self->{statefile_value}->write(data => $self->{result});
if (!defined($old_timestamp) || !defined($old_fetch_head)) {
$self->{output}->output_add(severity => 'OK',
short_msg => "Buffer creation...");
$self->{output}->display();
$self->{output}->exit();
}
# Set 0 if Cache > Result
$old_fetch_head = 0 if ($old_fetch_head > $self->{result}->{fetch_head} );
$old_fetch_length = 0 if ($old_hitpass > $self->{result}->{fetch_length});
$old_fetch_chunked = 0 if ($old_miss > $self->{result}->{fetch_chunked});
$old_fetch_eof = 0 if ($old_miss > $self->{result}->{fetch_eof});
$old_fetch_bad = 0 if ($old_miss > $self->{result}->{fetch_bad});
$old_fetch_close = 0 if ($old_miss > $self->{result}->{fetch_close});
$old_fetch_oldhttp = 0 if ($old_miss > $self->{result}->{fetch_oldhttp});
$old_fetch_zero = 0 if ($old_miss > $self->{result}->{fetch_zero});
$old_fetch_failed = 0 if ($old_miss > $self->{result}->{fetch_failed});
$old_fetch_1xx = 0 if ($old_miss > $self->{result}->{fetch_1xx});
$old_fetch_204 = 0 if ($old_miss > $self->{result}->{fetch_204});
$old_fetch_304 = 0 if ($old_miss > $self->{result}->{fetch_304});
# Calculate
my $delta_time = $self->{result}->{last_timestamp} - $old_timestamp;
$delta_time = 1 if ($delta_time == 0); # One seconds ;)
my $fetch_head = ($self->{result}->{fetch_head} - $old_fetch_head) / $delta_time;
my $fetch_length = ($self->{result}->{fetch_length} - $old_fetch_length) / $delta_time;
my $fetch_chunked = ($self->{result}->{fetch_chunked} - $old_fetch_chunked) / $delta_time;
my $fetch_eof = ($self->{result}->{fetch_eof} - $old_fetch_eof) / $delta_time;
my $fetch_bad = ($self->{result}->{fetch_bad} - $old_fetch_bad) / $delta_time;
my $fetch_close = ($self->{result}->{fetch_close} - $old_fetch_close) / $delta_time;
my $fetch_oldhttp = ($self->{result}->{fetch_oldhttp} - $old_fetch_oldhttp) / $delta_time;
my $fetch_zero = ($self->{result}->{fetch_zero} - $old_fetch_zero) / $delta_time;
my $fetch_failed = ($self->{result}->{fetch_failed} - $old_fetch_failed) / $delta_time;
my $fetch_1xx = ($self->{result}->{fetch_1xx} - $old_fetch_1xx) / $delta_time;
my $fetch_204 = ($self->{result}->{fetch_204} - $old_fetch_204) / $delta_time;
my $fetch_304 = ($self->{result}->{fetch_304} - $old_fetch_304) / $delta_time;
my $exit1 = $self->{perfdata}->threshold_check(value => $fetch_head, threshold => [ { label => 'critical-head', 'exit_litteral' => 'critical' }, { label => 'warning-head', exit_litteral => 'warning' } ]);
my $exit2 = $self->{perfdata}->threshold_check(value => $fetch_length, threshold => [ { label => 'critical-length', 'exit_litteral' => 'critical' }, { label => 'warning-length', exit_litteral => 'warning' } ]);
my $exit3 = $self->{perfdata}->threshold_check(value => $fetch_chunked, threshold => [ { label => 'critical-chunked', 'exit_litteral' => 'critical' }, { label => 'warning-chunked', exit_litteral => 'warning' } ]);
my $exit4 = $self->{perfdata}->threshold_check(value => $fetch_eof, threshold => [ { label => 'critical-eof', 'exit_litteral' => 'critical' }, { label => 'warning-eof', exit_litteral => 'warning' } ]);
my $exit5 = $self->{perfdata}->threshold_check(value => $fetch_eof, threshold => [ { label => 'critical-eof', 'exit_litteral' => 'critical' }, { label => 'warning-eof', exit_litteral => 'warning' } ]);
my $exit6 = $self->{perfdata}->threshold_check(value => $fetch_close, threshold => [ { label => 'critical-close', 'exit_litteral' => 'critical' }, { label => 'warning-close', exit_litteral => 'warning' } ]);
my $exit7 = $self->{perfdata}->threshold_check(value => $fetch_oldhttp, threshold => [ { label => 'critical-oldhttp', 'exit_litteral' => 'critical' }, { label => 'warning-oldhttp', exit_litteral => 'warning' } ]);
my $exit8 = $self->{perfdata}->threshold_check(value => $fetch_zero, threshold => [ { label => 'critical-zero', 'exit_litteral' => 'critical' }, { label => 'warning-zero', exit_litteral => 'warning' } ]);
my $exit9 = $self->{perfdata}->threshold_check(value => $fetch_failed, threshold => [ { label => 'critical-failed', 'exit_litteral' => 'critical' }, { label => 'warning-failed', exit_litteral => 'warning' } ]);
my $exit10 = $self->{perfdata}->threshold_check(value => $fetch_1xx, threshold => [ { label => 'critical-1xx', 'exit_litteral' => 'critical' }, { label => 'warning-1xx', exit_litteral => 'warning' } ]);
my $exit11 = $self->{perfdata}->threshold_check(value => $fetch_204, threshold => [ { label => 'critical-204', 'exit_litteral' => 'critical' }, { label => 'warning-204', exit_litteral => 'warning' } ]);
my $exit12 = $self->{perfdata}->threshold_check(value => $fetch_304, threshold => [ { label => 'critical-304', 'exit_litteral' => 'critical' }, { label => 'warning-304', exit_litteral => 'warning' } ]);
my $exit = $self->{output}->get_most_critical(status => [ $exit1, $exit2, $exit3, $exit4, $exit5, $exit6, $exit7, $exit8, $exit9, $exit10, $exit11, $exit12 ]);
$self->{output}->output_add(severity => $exit,
short_msg => sprintf("Fetch head: %.2f
Fetch with Length: %.2f
Fetch chunked: %.2f
Fetch EOF: %.2f
Fetch had bad headers: %.2f
Fetch wanted close: %.2f
Fetch pre HTTP/1.1 closed: %.2f
Fetch zero len: %.2f
Fetch failed: %.2f
Fetch no body (1xx): %.2f
Fetch no body (204): %.2f
Fetch no body (304): %.2f ",
$fetch_head,
$fetch_length,
$fetch_chunked,
$fetch_eof,
$fetch_bad,
$fetch_close,
$fetch_oldhttp,
$fetch_zero,
$fetch_failed,
$fetch_1xx,
$fetch_204,
$fetch_304,
));
$self->{output}->perfdata_add(label => "fetch_head",
value => $fetch_head,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-head'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-head'),
min => 0
);
$self->{output}->perfdata_add(label => "fetch_length",
value => $fetch_length,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-length'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-length'),
min => 0
);
$self->{output}->perfdata_add(label => "fetch_chunked",
value => $fetch_chunked,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-chunked'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-chunked'),
min => 0
);
$self->{output}->perfdata_add(label => "fetch_eof",
value => $fetch_eof,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-eof'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-eof'),
min => 0
);
$self->{output}->perfdata_add(label => "fetch_bad",
value => $fetch_bad,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-bad'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-bad'),
min => 0
);
$self->{output}->perfdata_add(label => "fetch_close",
value => $fetch_close,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-close'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-close'),
min => 0
);
$self->{output}->perfdata_add(label => "fetch_oldhttp",
value => $fetch_oldhttp,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-oldhttp'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-oldhttp'),
min => 0
);
$self->{output}->perfdata_add(label => "fetch_zero",
value => $fetch_zero,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-zero'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-zero'),
min => 0
);
$self->{output}->perfdata_add(label => "fetch_failed",
value => $fetch_failed,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-failed'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-failed'),
min => 0
);
$self->{output}->perfdata_add(label => "fetch_1xx",
value => $fetch_1xx,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-1xx'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-1xx'),
min => 0
);
$self->{output}->perfdata_add(label => "fetch_204",
value => $fetch_204,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-204'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-204'),
min => 0
);
$self->{output}->perfdata_add(label => "fetch_304",
value => $fetch_304,
warning => $self->{perfdata}->get_perfdata_for_output(label => 'warning-304'),
critical => $self->{perfdata}->get_perfdata_for_output(label => 'critical-304'),
min => 0
);
$self->{output}->display();
$self->{output}->exit();
};
1;
__END__
=head1 MODE
Check Varnish Cache with varnishstat Command
This Mode Checks:
- Fetch head
- Fetch with Length
- Fetch chunked
- Fetch EOF
- Fetch had bad headers
- Fetch wanted close
- Fetch pre HTTP/1.1 closed
- Fetch zero len
- Fetch failed
- Fetch no body (1xx)
- Fetch no body (204)
- Fetch no body (304)
=over 8
=item B<--remote>
If you dont run this script locally, if you wanna use it remote, you can run it remotely with 'ssh'.
=item B<--hostname>
Hostname to query (need --remote).
=item B<--ssh-option>
Specify multiple options like the user (example: --ssh-option='-l=centreon-engine' --ssh-option='-p=52').
=item B<--command>
Varnishstat Binary Filename (Default: varnishstat)
=item B<--command-path>
Directory Path to Varnishstat Binary File (Default: /usr/bin/)
=item B<--command-options>
Parameter for Binary File (Default: ' -1 ')
=item B<--warning-head>
Warning Threshold for Fetch head
=item B<--critical-head>
Critical Threshold for Fetch head
=item B<--warning-length>
Warning Threshold for Fetch with Length
=item B<--critical-length>
Critical Threshold for Fetch with Length
=item B<--warning-chunked>
Warning Threshold for Fetch chunked
=item B<--critical-chunked>
Critical Threshold for Fetch chunked
=item B<--warning-eof>
Warning Threshold for Fetch EOF
=item B<--critical-eof>
Critical Threshold for Fetch EOF
=item B<--warning-bad>
Warning Threshold for Fetch had bad headers
=item B<--critical-bad>
Critical Threshold for Fetch had bad headers
=item B<--warning-close>
Warning Threshold for Fetch wanted close
=item B<--critical-close>
Critical Threshold for Fetch wanted close
=item B<--warning-oldhttp>
Warning Threshold for Fetch pre HTTP/1.1 closed
=item B<--critical-oldhttp>
Critical Threshold for Fetch pre HTTP/1.1 closed
=item B<--warning-zero>
Warning Threshold for Fetch zero len
=item B<--critical-zero>
Critical Threshold for Fetch zero len
=item B<--warning-failed>
Warning Threshold for Fetch failed
=item B<--critical-failed>
Critical Threshold for Fetch failed
=item B<--warning-1xx>
Warning Threshold for Fetch no body (1xx)
=item B<--critical-1xx>
Critical Threshold for Fetch no body (1xx)
=item B<--warning-204>
Warning Threshold for Fetch no body (204)
=item B<--critical-204>
Critical Threshold for Fetch no body (204)
=item B<--warning-304>
Warning Threshold for Fetch no body (304)
=item B<--critical-304>
Critical Threshold for Fetch no body (304)
=back
=cut

View File

@ -47,9 +47,17 @@ sub new {
$self->{version} = '0.1';
%{$self->{modes}} = (
'cache' => 'apps::varnish::mode::cache',
'client' => 'apps::varnish::mode::client',
'backend' => 'apps::varnish::mode::backend',
'connections' => 'apps::varnish::mode::connections',
'cache' => 'apps::varnish::mode::cache',
'backend' => 'apps::varnish::mode::backend',
'fetch' => 'apps::varnish::mode::fetch',
'workers' => 'apps::varnish::mode::workers',
'shm' => 'apps::varnish::mode::shm',
'sm' => 'apps::varnish::mode::sm',
'sma' => 'apps::varnish::mode::sma',
'sms' => 'apps::varnish::mode::sms',
'hcb' => 'apps::varnish::mode::hcb',
'esi' => 'apps::varnish::mode::esi',
);
return $self;

View File

@ -1,66 +0,0 @@
###############################################################################
# Copyright 2005-2013 MERETHIS
# Centreon is developped by : Julien Mathis and Romain Le Merlus under
# GPL Licence 2.0.
#
# This program is free software; you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free Software
# Foundation ; either version 2 of the License.
#
# This program is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE. See the GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along with
# this program; if not, see <http://www.gnu.org/licenses>.
#
# Linking this program statically or dynamically with other modules is making a
# combined work based on this program. Thus, the terms and conditions of the GNU
# General Public License cover the whole combination.
#
# As a special exception, the copyright holders of this program give MERETHIS
# permission to link this program with independent modules to produce an executable,
# regardless of the license terms of these independent modules, and to copy and
# distribute the resulting executable under terms of MERETHIS choice, provided that
# MERETHIS also meet, for each linked independent module, the terms and conditions
# of the license of that module. An independent module is a module which is not
# derived from this program. If you modify this program, you may extend this
# exception to your version of the program, but you are not obliged to do so. If you
# do not wish to do so, delete this exception statement from your version.
#
# For more information : contact@centreon.com
# Author : Florian Asche <info@florian-asche.de>
#
####################################################################################
package apps::varnish::plugin;
use strict;
use warnings;
use base qw(centreon::plugins::script_simple);
sub new {
my ($class, %options) = @_;
my $self = $class->SUPER::new(package => __PACKAGE__, %options);
bless $self, $class;
# $options->{options} = options object
$self->{version} = '0.1';
%{$self->{modes}} = (
'cache' => 'apps::varnish::mode::cache',
'client' => 'apps::varnish::mode::client',
'backend' => 'apps::varnish::mode::backend',
);
return $self;
}
1;
__END__
=head1 PLUGIN DESCRIPTION
Check Varnish with Local Command or with SSH
=cut