check_haproxy
Monitoring plugin to check HAProxy with Icinga, Nagios and other compatible monitoring solutions
check_haproxy Nagios Check Script
This is a Nagios plugin to check the status of HAProxy over a socket connection (by default, /var/run/haproxy.sock) and parse the statistics to ensure that it is operating within accepted limits, as per the defaults, or as set for each frontend/backend.
Usage
check_haproxy [--defaults (defaults)] [--overrides (override 1)]
[--overrides (override 2)] [--overrides (override n)]
[--[no]frontends] [--[no]backends] [--[no]servers]
[--socket (path)] [--help]
-f, --[no]frontends
Enable/disable checks for the frontends in HAProxy (that they're marked as OPEN and the session limits haven't been reached).
-b, --[no]backends
Enable/disable checks for the backends in HAProxy (that they have the required quorum of servers, and that the session limits haven't been reached).
-s, --[no]servers
Enable/disable checks for the servers in HAProxy (that they haven't reached the limits for the sessions or for queues).
-D, --defaults (defaults)
Set/Override the defaults which will be applied to all checks (unless specifically set by --overrides). Takes the form:
{u,d,x},{svr_warn},{svr_crit},{sess_warn},{sess_crit}
Each of these is optional, but the positioning is important. To fully override, set (for example):
u,10,5,.25,0.5
which means:
u
: Check for servers up (u
) or servers down (d
), or disable all checks on that particular frontend/backend (x
).10
: WARNING if less than 10 servers are up, or if at least that many servers are down.5
: CRITICAL if less than 5 servers are available, or if at least that many have gone away..25
: WARNING if more any frontend, backend, or individual server has gone over 25% of it's maximum allowed sessions (or any queue for any server on the backend is at least 25% full).0.5
: CRITICAL for the same reasons as previous, but we've reached 50% of these levels.
To override only some of these values from the pre-set defaults
(u,5,2,.75,.9
), simply leave the others as empty, for example: ,10,7
will
leave checks as up, but increase the server WARN/CRIT to 10/7. or to switch to
use down, use d,
, or off with x
.
Each number has two meanings:
less than 1
: Where any number is less than (but not equal to) 1, then the value is understood as a percentage of the available servers or session limits. If you have 20 servers and set a threshold of .25 then that would mean 5 servers either up or down.greater than, or equal to 1
: Where any number is greater than, or equal to, 1, then this is a fixed value. By setting 5 you are hard-coding the number of servers or sessions, regardless of the limit or number available to HAProxy.
The code does not alter this limit if it is greater than the available
servers or sessions so there are situations where the alert may not trigger.
For example, in the event of down
being the trigger and the number of servers
is less than the Warning or Critical thresholds, the error may never trigger.
It is generally better to use up
and percentage values where you are going
to have a flexible number of backends.
-O, --overrides (override)
Override the defaults for a particular frontend or backend, in the form
name:override
, where override
is the same format as --defaults
above. For
example, to override the frontend called "api" and allow that to increase to
limits of 15/10 for WARN/CRIT, use api:,15,10
. Add as many as you like by
specifing the flag multiple times:
--overrides api:,15,10 --overrides assets:d,2,5 --overrides webmail:u,3,2
-S, --socket /path/to/socket
Path to the socket check_haproxy
should connect to (requires read/write
permissions and must be at least user level; no operator or admin privileges
needed).
Icinga2 configuration
Copy check_haproxy.icinga2.conf
to the icinga2 zone and define a new service for all Linux hosts with vars.haproxy
, for example:
apply Service "Haproxy stats" {
import "generic-service"
check_command = "haproxy"
vars.haproxy_socket = "/var/run/haproxy/admin.sock"
vars.haproxy_default = "d,1,1,75,90"
command_endpoint = host.vars.client_endpoint
assign where host.vars.client_endpoint && host.vars.os == "Linux" && host.vars.haproxy
}
Licence
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, or (at your option) any later version.
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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.