[Pkg-nagios-changes] [pkg-nagios-plugins-contrib] 02/04: Add check_haproxy_stats.

Bernd Zeimetz bernd at bzed.de
Mon Mar 16 13:28:39 UTC 2015


This is an automated email from the git hooks/post-receive script.

bzed pushed a commit to branch master
in repository pkg-nagios-plugins-contrib.

commit b41594fe8e537b8fc4a510dd9058d30e21d62ec6
Author: Bernd Zeimetz <bernd at bzed.de>
Date:   Mon Mar 16 14:26:02 2015 +0100

    Add check_haproxy_stats.
---
 check_haproxy_stats/Makefile               |  12 ++
 check_haproxy_stats/check_haproxy_stats.pl | 225 +++++++++++++++++++++++++++++
 check_haproxy_stats/control                |   7 +
 check_haproxy_stats/copyright              |  13 ++
 4 files changed, 257 insertions(+)

diff --git a/check_haproxy_stats/Makefile b/check_haproxy_stats/Makefile
new file mode 100644
index 0000000..c074838
--- /dev/null
+++ b/check_haproxy_stats/Makefile
@@ -0,0 +1,12 @@
+#/usr/bin/make -f
+
+PLUGIN := check_haproxy_stats
+CLEANEXTRAFILES := $(PLUGIN)
+
+
+include ../common.mk
+
+check_haproxy_stats: check_haproxy_stats.pl
+	cp $< $@
+
+
diff --git a/check_haproxy_stats/check_haproxy_stats.pl b/check_haproxy_stats/check_haproxy_stats.pl
new file mode 100644
index 0000000..9698f78
--- /dev/null
+++ b/check_haproxy_stats/check_haproxy_stats.pl
@@ -0,0 +1,225 @@
+#!/usr/bin/env perl 
+# vim: se et ts=4:
+
+#
+# Copyright (C) 2012, Giacomo Montagner <giacomo at entirelyunlike.net>
+# 
+# This program is free software; you can redistribute it and/or modify it 
+# under the same terms as Perl 5.10.1. 
+# For more details, see http://dev.perl.org/licenses/artistic.html
+# 
+# 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.
+#
+
+our $VERSION = "1.0.1";
+
+# CHANGELOG:
+#   1.0.0   - first release
+#   1.0.1   - fixed empty message if all proxies are OK
+#
+
+use strict;
+use warnings;
+use 5.010.001;
+use File::Basename qw/basename/;
+use IO::Socket::UNIX;
+use Getopt::Long;
+
+sub usage {
+    my $me = basename $0;
+    print <<EOU;
+NAME
+    $me - check haproxy stats for errors, using UNIX socket interface
+
+SYNOPSIS
+    $me [OPTIONS]
+
+DESCRIPTION
+    Get haproxy statistics via UNIX socket and parse information searching for errors.
+
+    OPTIONS
+    -c, --critical
+        Set critical threshold for sessions number (chacks current number of sessions
+        against session limit, if enforced) to the specified percentage.
+        If no session limit (slim) was specified for the given proxy, this option has
+        no effect.
+
+    -d, --dump
+        Just dump haproxy stats and exit;
+
+    -h, --help
+        Print this message.
+
+    -p, --proxy
+        Check only named proxies, not every one. Use comma to separate proxies
+        in list.
+
+    -s, --sock, --socket
+        Use named UNIX socket instead of default (/var/run/haproxy.sock)
+
+    -w, --warning
+        Set warning threshold for sessions number to the specified percentage (see -c)
+
+CHECKS AND OUTPUT
+    $me checks every proxy (or the named ones, if -p was given) 
+    for status. It returns an error if any of the checked FRONTENDs is not OPEN, 
+    any of the checked BACKENDs is not UP, or any of the checkes servers is not UP;
+    $me reports any problem it found. 
+
+EXAMPLES
+    $me -s /var/spool/haproxy/sock
+        Use /var/spool/haproxy/sock to communicate with haproxy.
+
+    $me -p proxy1,proxy2 -w 60 -c 80
+        Check only proxies named "proxy1" and "proxy2", and set sessions number 
+        thresholds to 60% and 80%.
+
+AUTHOR
+    Written by Giacomo Montagner
+
+REPORTING BUGS
+    Please report any bug to bugs\@entirelyunlike.net
+
+COPYRIGHT
+    Copyright (C) 2012 Giacomo Montagner <giacomo\@entirelyunlike.net>. 
+    $me is distributed under GPL and the Artistic License 2.0
+
+SEE ALSO
+    Check out online haproxy documentation at <http://haproxy.1wt.eu/>
+    
+EOU
+}
+
+my %check_statuses = (
+    UNK     => "unknown",
+    INI     => "initializing",
+    SOCKERR => "socket error",
+    L4OK    => "layer 4 check OK",
+    L4CON   => "connection error",
+    L4TMOUT => "layer 1-4 timeout",
+    L6OK    => "layer 6 check OK",
+    L6TOUT  => "layer 6 (SSL) timeout",
+    L6RSP   => "layer 6 protocol error",
+    L7OK    => "layer 7 check OK",
+    L7OKC   => "layer 7 conditionally OK",
+    L7TOUT  => "layer 7 (HTTP/SMTP) timeout",
+    L7RSP   => "layer 7 protocol error",
+    L7STS   => "layer 7 status error",
+);
+
+my @status_names = (qw/OK WARNING CRITICAL UNKNOWN/);
+
+# Defaults
+my $swarn = 80.0;
+my $scrit = 90.0;
+my $sock  = "/var/run/haproxy.sock";
+my $dump;
+my $proxy;
+my $help;
+
+# Read command line
+Getopt::Long::Configure ("bundling");
+GetOptions (
+    "c|critical=i"    => \$scrit,
+    "d|dump"          => \$dump,
+    "h|help"          => \$help,
+    "p|proxy=s"       => \$proxy,
+    "s|sock|socket=s" => \$sock, 
+    "w|warning=i"     => \$swarn,
+);
+
+# Want help?
+if ($help) {
+    usage;
+    exit 3;
+}
+
+# Connect to haproxy socket and get stats
+my $haproxy = new IO::Socket::UNIX (
+    Peer => $sock,
+    Type => SOCK_STREAM,
+);
+die "Unable to connect to haproxy socket: $@" unless $haproxy;
+print $haproxy "show stat\n" or die "Print to socket failed: $!";
+
+# Dump stats and exit if requested
+if ($dump) {
+    while (<$haproxy>) {
+        print;
+    }
+    exit 0;
+}
+
+# Get labels from first output line and map them to their position in the line
+my $labels = <$haproxy>;
+chomp($labels);
+$labels =~ s/^# // or die "Data format not supported."; 
+my @labels = split /,/, $labels;
+{ 
+    no strict "refs";
+    my $idx = 0;
+    map { $$_ = $idx++ } @labels;
+}
+
+# Variables I will use from here on:
+our $pxname;
+our $svname;
+our $status;
+
+my @proxies = split ',', $proxy if $proxy;
+my $exitcode = 0;
+my $msg;
+my $checked = 0;
+while (<$haproxy>) {
+    chomp;
+    next if /^[[:space:]]*$/;
+    my @data = split /,/, $_;
+    if (@proxies) { next unless grep {$data[$pxname] eq $_} @proxies; };
+
+    # Is session limit enforced? 
+    our $slim;
+    if ($data[$slim]) {
+        # Check current session # against limit
+        our $scur;
+        my $sratio = $data[$scur]/$data[$slim];
+        if ($sratio >= $scrit || $sratio >= $swarn) {
+            $exitcode = $sratio >= $scrit ? 2 : 
+                $exitcode < 2 ? 1 : $exitcode;
+            $msg .= sprintf "%s:%s sessions: %.2f%%; ", $data[$pxname], $data[$svname], $sratio;
+        }
+    }
+
+    # Check of BACKENDS
+    if ($data[$svname] eq 'BACKEND') {
+        if ($data[$status] ne 'UP') {
+            $msg .= sprintf "BACKEND: %s is %s; ", $data[$pxname], $data[$status];
+            $exitcode = 2;
+        }
+    # Check of FRONTENDS
+    } elsif ($data[$svname] eq 'FRONTEND') {
+        if ($data[$status] ne 'OPEN') {
+            $msg .= sprintf "FRONTEND: %s is %s; ", $data[$pxname], $data[$status];
+            $exitcode = 2;
+        }
+    # Check of servers
+    } else {
+        if ($data[$status] ne 'UP') {
+            next if $data[$status] eq 'no check';   # Ignore server if no check is configured to be run
+            $exitcode = 2;
+            our $check_status;
+            $msg .= sprintf "server: %s:%s is %s", $data[$pxname], $data[$svname], $data[$status];
+            $msg .= sprintf " (check status: %s)", $check_statuses{$data[$check_status]} if $check_statuses{$data[$check_status]};
+            $msg .= "; ";
+        }
+    }
+    ++$checked;
+}
+
+unless ($msg) {
+    $msg = @proxies ? sprintf("checked proxies: %s", join ', ', sort @proxies) : "checked $checked proxies.";
+}
+say "Check haproxy $status_names[$exitcode] - $msg";
+exit $exitcode;
+
diff --git a/check_haproxy_stats/control b/check_haproxy_stats/control
new file mode 100644
index 0000000..595d483
--- /dev/null
+++ b/check_haproxy_stats/control
@@ -0,0 +1,7 @@
+Homepage: http://exchange.nagios.org/directory/Plugins/Clustering-and-High-2DAvailability/check_haproxy_stats-2Epl/details
+Watch: http://exchange.nagios.org/components/com_mtree/attachment.php?link_id=4089&cf_id=24 VERSION = "([0-9.]+)"
+Version: 1.0.1
+Uploaders: Bernd Zeimetz <bzed at debian.org>
+Description: check haproxy via admin socket
+ Different from check_haproxy this plugin is able to check
+ haproxy via the unix admin socket.
diff --git a/check_haproxy_stats/copyright b/check_haproxy_stats/copyright
new file mode 100644
index 0000000..1efcc91
--- /dev/null
+++ b/check_haproxy_stats/copyright
@@ -0,0 +1,13 @@
+Copyright (C) 2012, Giacomo Montagner <giacomo at entirelyunlike.net>
+
+This program is free software; you can redistribute it and/or modify it 
+under the same terms as Perl 5.10.1. 
+For more details, see http://dev.perl.org/licenses/artistic.html
+
+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.
+
+On Debian systems a copy of the Artistic license can be found
+in /usr/share/common-licenses/Artistic.
+

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-nagios/pkg-nagios-plugins-contrib.git



More information about the Pkg-nagios-changes mailing list