#!/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