#!/bin/sh
# ########################################################################
# This program is part of $PROJECT_NAME$
# License: GPL License (see COPYING)
# Authors:
# Baron Schwartz, Ben Mildren
# Depends-on: table with ts column, e.g. table written by pt-deadlock-logger
# ########################################################################
# ########################################################################
# Redirect STDERR to STDOUT; Nagios doesn't handle STDERR.
# ########################################################################
exec 2>&1
# ########################################################################
# Set up constants, etc.
# ########################################################################
STATE_OK=0
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3
STATE_DEPENDENT=4
# ########################################################################
# Run the program.
# ########################################################################
main() {
# Get options
for o; do
case "${o}" in
-c) shift; OPT_CRIT="${1}"; shift; ;;
--defaults-file) shift; OPT_DEFT="${1}"; shift; ;;
-H) shift; OPT_HOST="${1}"; shift; ;;
-i) shift; OPT_INTERVAL="${1}"; shift; ;;
-l) shift; OPT_USER="${1}"; shift; ;;
-L) shift; OPT_LOPA="${1}"; shift; ;;
-p) shift; OPT_PASS="${1}"; shift; ;;
-P) shift; OPT_PORT="${1}"; shift; ;;
-S) shift; OPT_SOCK="${1}"; shift; ;;
-t) shift; OPT_TIMESTAMP="${1}"; shift; ;;
-T) shift; OPT_TABLE="${1}"; shift; ;;
-w) shift; OPT_WARN="${1}"; shift; ;;
-x) shift; OPT_TARGET="${1}"; shift; ;;
--version) grep -A2 '^=head1 VERSION' "$0" | tail -n1; exit 0 ;;
--help) perl -00 -ne 'm/^ Usage:/ && print' "$0"; exit 0 ;;
-*) echo "Unknown option ${o}. Try --help."; exit 1; ;;
esac
done
OPT_WARN=${OPT_WARN:-12}
OPT_CRIT=${OPT_CRIT:-60}
OPT_INTERVAL=${OPT_INTERVAL:-1}
OPT_TARGET="${OPT_TARGET:-deadlocks}"
if [ -e '/etc/nagios/mysql.cnf' ]; then
OPT_DEFT="${OPT_DEFT:-/etc/nagios/mysql.cnf}"
fi
if is_not_sourced; then
if [ -n "$1" ]; then
echo "WARN spurious command-line options: $@"
exit 1
fi
fi
if [ "${OPT_TARGET}" == "kills" ]; then
OPT_TABLE="${OPT_TABLE:-percona.kill_log}"
OPT_TIMESTAMP="${OPT_TIMESTAMP:-timestamp}"
elif [ "${OPT_TARGET}" == "fkerrors" ]; then
OPT_TABLE="${OPT_TABLE:-percona.foreign_key_errors}"
OPT_TIMESTAMP="${OPT_TIMESTAMP:-ts}"
else
OPT_TABLE="${OPT_TABLE:-percona.deadlocks}"
OPT_TIMESTAMP="${OPT_TIMESTAMP:-ts}"
fi
LEVEL=$(mysql_exec "SELECT COUNT(*) FROM ${OPT_TABLE} WHERE ${OPT_TIMESTAMP} >= NOW() - INTERVAL ${OPT_INTERVAL}*60 SECOND")
if [ $? = 0 ]; then
NOTE="${LEVEL:-UNKNOWN} ${OPT_TARGET} in last ${OPT_INTERVAL} minutes"
if [ "${LEVEL:-0}" -gt "${OPT_CRIT}" ]; then
NOTE="CRIT $NOTE"
elif [ "${LEVEL:-0}" -gt "${OPT_WARN}" ]; then
NOTE="WARN $NOTE"
else
NOTE="OK $NOTE"
fi
# Build the common perf data output for graph trending
PERFDATA="${OPT_TARGET}=${LEVEL:-0};${OPT_WARN};${OPT_CRIT};0;"
NOTE="$NOTE | $PERFDATA"
else
NOTE="UNK could not count ${OPT_TARGET}"
fi
echo $NOTE
}
# ########################################################################
# Execute a MySQL command.
# ########################################################################
mysql_exec() {
mysql ${OPT_DEFT:+--defaults-file="${OPT_DEFT}"} \
${OPT_LOPA:+--login-path="${OPT_LOPA}"} \
${OPT_HOST:+-h"${OPT_HOST}"} ${OPT_PORT:+-P"${OPT_PORT}"} \
${OPT_USER:+-u"${OPT_USER}"} ${OPT_PASS:+-p"${OPT_PASS}"} \
${OPT_SOCK:+-S"${OPT_SOCK}"} -ss -e "$1"
}
# ########################################################################
# Determine whether this program is being executed directly, or sourced/included
# from another file.
# ########################################################################
is_not_sourced() {
[ "${0##*/}" = "pmp-check-mysql-ts-count" ] || [ "${0##*/}" = "bash" -a "$_" = "$0" ]
}
# ########################################################################
# Execute the program if it was not included from another file.
# This makes it possible to include without executing, and thus test.
# ########################################################################
if is_not_sourced; then
OUTPUT=$(main "$@")
EXITSTATUS=$STATE_UNKNOWN
case "${OUTPUT}" in
UNK*) EXITSTATUS=$STATE_UNKNOWN; ;;
OK*) EXITSTATUS=$STATE_OK; ;;
WARN*) EXITSTATUS=$STATE_WARNING; ;;
CRIT*) EXITSTATUS=$STATE_CRITICAL; ;;
esac
echo "${OUTPUT}"
exit $EXITSTATUS
fi
# ############################################################################
# Documentation
# ############################################################################
: <<'DOCUMENTATION'
=pod
=head1 NAME
pmp-check-mysql-ts-count - Generic alert based on pmp-check-mysql-deadlocks to count number of rows written in the last interval.
=head1 SYNOPSIS
Usage: pmp-check-mysql-ts-count [OPTIONS]
Options:
-c CRIT Critical threshold; default 60.
--defaults-file FILE Only read mysql options from the given file.
Defaults to /etc/nagios/mysql.cnf if it exists.
-H HOST MySQL hostname.
-i INTERVAL Interval over which to count, in minutes; default 1.
-l USER MySQL username.
-L LOGIN-PATH Use login-path to access MySQL (with MySQL client 5.6).
-p PASS MySQL password.
-P PORT MySQL port.
-S SOCKET MySQL socket file.
-t TIMESTAMP The name of the timestamp column to be monitored; default ts.
-T TABLE The database.table to be monitored; default percona.deadlocks.
-w WARN Warning threshold; default 12.
-x TARGET Metric monitored; default deadlocks.
Other options: kills, fkerrors.
--help Print help and exit.
--version Print version and exit.
Options must be given as --option value, not --option=value or -Ovalue.
Use perldoc to read embedded documentation with more details.
=head1 DESCRIPTION
This Nagios plugin looks at a table and counts the number of rows since the
last interval, and alerts if this exceeds the threshold. This could be the
table referenced by pt-deadlock-logger, pt-kill, pt-fk-error-logger, or a
custom table supplied.
Default behaviour is the same as pmp-check-mysql-deadlocks, can also specify
target to be C or C to monitor default tables created by pt-kill
or pt-fk-error-logger respectively, or supply custom metric and table.
=head1 PRIVILEGES
This plugin executes the following commands against MySQL:
=over
=item *
C