From 85de49d8ec24e230cf3f47dadde4145a4d6e5a21 Mon Sep 17 00:00:00 2001 From: Salt Date: Sun, 3 Oct 2021 15:45:46 -0500 Subject: [PATCH] Add check_cpu_stats plugin --- check_cpu_stats | 192 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100755 check_cpu_stats diff --git a/check_cpu_stats b/check_cpu_stats new file mode 100755 index 0000000..5ba9703 --- /dev/null +++ b/check_cpu_stats @@ -0,0 +1,192 @@ +#!/bin/bash + +# 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 St, Fifth Floor, Boston, MA 02110-1301 USA + +PROGNAME=`basename $0` +VERSION="Version 1.0," +AUTHOR="2009, Mike Adolphs (http://www.matejunkie.com/)" + +ST_OK=0 +ST_WR=1 +ST_CR=2 +ST_UK=3 + +interval=1 + +print_version() { + echo "$VERSION $AUTHOR" +} + +print_help() { + print_version $PROGNAME $VERSION + echo "" + echo "$PROGNAME is a Nagios plugin to monitor CPU utilization. It makes" + echo "use of /proc/stat and calculates it through Jiffies rather than" + echo "using another frontend tool like iostat or top." + echo "When using optional warning/critical thresholds all values except" + echo "idle are aggregated and compared to the thresholds. There's" + echo "currently no support for warning/critical thresholds for specific" + echo "usage parameters." + echo "" + echo "$PROGNAME [-i/--interval] [-w/--warning] [-c/--critical]" + echo "" + echo "Options:" + echo " --interval|-i)" + echo " Defines the pause between the two times /proc/stat is being" + echo " parsed. Higher values could lead to more accurate result." + echo " Default is: 1 second" + echo " --warning|-w)" + echo " Sets a warning level for CPU user. Default is: off" + echo " --critical|-c)" + echo " Sets a critical level for CPU user. Default is: off" + exit $ST_UK +} + +while test -n "$1"; do + case "$1" in + --help|-h) + print_help + exit $ST_UK + ;; + --version|-v) + print_version $PROGNAME $VERSION + exit $ST_UK + ;; + --interval|-i) + interval=$2 + shift + ;; + --warning|-w) + warn=$2 + shift + ;; + --critical|-c) + crit=$2 + shift + ;; + *) + echo "Unknown argument: $1" + print_help + exit $ST_UK + ;; + esac + shift +done + +val_wcdiff() { + if [ ${warn} -gt ${crit} ] + then + wcdiff=1 + fi +} + +get_cpuvals() { + tmp1_cpu_user=`grep -m1 '^cpu' /proc/stat|awk '{print $2}'` + tmp1_cpu_nice=`grep -m1 '^cpu' /proc/stat|awk '{print $3}'` + tmp1_cpu_sys=`grep -m1 '^cpu' /proc/stat|awk '{print $4}'` + tmp1_cpu_idle=`grep -m1 '^cpu' /proc/stat|awk '{print $5}'` + tmp1_cpu_iowait=`grep -m1 '^cpu' /proc/stat|awk '{print $6}'` + tmp1_cpu_irq=`grep -m1 '^cpu' /proc/stat|awk '{print $7}'` + tmp1_cpu_softirq=`grep -m1 '^cpu' /proc/stat|awk '{print $8}'` + tmp1_cpu_total=`expr $tmp1_cpu_user + $tmp1_cpu_nice + $tmp1_cpu_sys + \ +$tmp1_cpu_idle + $tmp1_cpu_iowait + $tmp1_cpu_irq + $tmp1_cpu_softirq` + + sleep $interval + + tmp2_cpu_user=`grep -m1 '^cpu' /proc/stat|awk '{print $2}'` + tmp2_cpu_nice=`grep -m1 '^cpu' /proc/stat|awk '{print $3}'` + tmp2_cpu_sys=`grep -m1 '^cpu' /proc/stat|awk '{print $4}'` + tmp2_cpu_idle=`grep -m1 '^cpu' /proc/stat|awk '{print $5}'` + tmp2_cpu_iowait=`grep -m1 '^cpu' /proc/stat|awk '{print $6}'` + tmp2_cpu_irq=`grep -m1 '^cpu' /proc/stat|awk '{print $7}'` + tmp2_cpu_softirq=`grep -m1 '^cpu' /proc/stat|awk '{print $8}'` + tmp2_cpu_total=`expr $tmp2_cpu_user + $tmp2_cpu_nice + $tmp2_cpu_sys + \ +$tmp2_cpu_idle + $tmp2_cpu_iowait + $tmp2_cpu_irq + $tmp2_cpu_softirq` + + diff_cpu_user=`echo "${tmp2_cpu_user} - ${tmp1_cpu_user}" | bc -l` + diff_cpu_nice=`echo "${tmp2_cpu_nice} - ${tmp1_cpu_nice}" | bc -l` + diff_cpu_sys=`echo "${tmp2_cpu_sys} - ${tmp1_cpu_sys}" | bc -l` + diff_cpu_idle=`echo "${tmp2_cpu_idle} - ${tmp1_cpu_idle}" | bc -l` + diff_cpu_iowait=`echo "${tmp2_cpu_iowait} - ${tmp1_cpu_iowait}" | bc -l` + diff_cpu_irq=`echo "${tmp2_cpu_irq} - ${tmp1_cpu_irq}" | bc -l` + diff_cpu_softirq=`echo "${tmp2_cpu_softirq} - ${tmp1_cpu_softirq}" \ +| bc -l` + diff_cpu_total=`echo "${tmp2_cpu_total} - ${tmp1_cpu_total}" | bc -l` + + cpu_user=`echo "scale=2; (1000*${diff_cpu_user}/${diff_cpu_total}+5)/10" \ +| bc -l | sed 's/^\./0./'` + cpu_nice=`echo "scale=2; (1000*${diff_cpu_nice}/${diff_cpu_total}+5)/10" \ +| bc -l | sed 's/^\./0./'` + cpu_sys=`echo "scale=2; (1000*${diff_cpu_sys}/${diff_cpu_total}+5)/10" \ +| bc -l | sed 's/^\./0./'` + cpu_idle=`echo "scale=2; (1000*${diff_cpu_idle}/${diff_cpu_total}+5)/10" \ +| bc -l | sed 's/^\./0./'` + cpu_iowait=`echo "scale=2; (1000*${diff_cpu_iowait}/${diff_cpu_total}+5)\\ +/10" | bc -l | sed 's/^\./0./'` + cpu_irq=`echo "scale=2; (1000*${diff_cpu_irq}/${diff_cpu_total}+5)/10" \ +| bc -l | sed 's/^\./0./'` + cpu_softirq=`echo "scale=2; (1000*${diff_cpu_softirq}/${diff_cpu_total}\\ ++5)/10" | bc -l | sed 's/^\./0./'` + cpu_total=`echo "scale=2; (1000*${diff_cpu_total}/${diff_cpu_total}+5)\\ +/10" | bc -l | sed 's/^\./0./'` + cpu_usage=`echo "(${cpu_user}+${cpu_nice}+${cpu_sys}+${cpu_iowait}+\\ +${cpu_irq}+${cpu_softirq})/1" | bc` +} + +do_output() { + output="user: ${cpu_user}, nice: ${cpu_nice}, sys: ${cpu_sys}, \ +iowait: ${cpu_iowait}, irq: ${cpu_irq}, softirq: ${cpu_softirq} \ +idle: ${cpu_idle}" +} + +do_perfdata() { + perfdata="'user'=${cpu_user} 'nice'=${cpu_nice} 'sys'=${cpu_sys} \ +'softirq'=${cpu_softirq} 'iowait'=${cpu_iowait} 'irq'=${cpu_irq} \ +'idle'=${cpu_idle}" +} + +if [ -n "$warn" -a -n "$crit" ] +then + val_wcdiff + if [ "$wcdiff" = 1 ] + then + echo "Please adjust your warning/critical thresholds. The warning\\ +must be lower than the critical level!" + exit $ST_UK + fi +fi + +get_cpuvals +do_output +do_perfdata + +if [ -n "$warn" -a -n "$crit" ] +then + if [ "$cpu_usage" -ge "$warn" -a "$cpu_usage" -lt "$crit" ] + then + echo "WARNING - ${output} | ${perfdata}" + exit $ST_WR + elif [ "$cpu_usage" -ge "$crit" ] + then + echo "CRITICAL - ${output} | ${perfdata}" + exit $ST_CR + else + echo "OK - ${output} | ${perfdata}" + exit $ST_OK + fi +else + echo "OK - ${output} | ${perfdata}" + exit $ST_OK +fi