Explorar el Código

add a new plug-in that checks network interface stats

Jon Schipp hace 12 años
padre
commit
ce7c0ae146
Se han modificado 1 ficheros con 160 adiciones y 0 borrados
  1. 160 0
      check_pps.sh

+ 160 - 0
check_pps.sh

@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+# Author: Jon Schipp
+
+########
+# Examples:
+
+# 1.) Return critical if there's more than 10k PPS
+# $ ./check_pps.sh -i eth0 -w 8000 -c 10000  -p
+#
+# 2.) Return critical if there's more than 1m BPS
+# $ ./check_pps.sh -i eth0 -w 500000 -c 1000000 -b
+#
+# 2.) Return critical if we've reach 70% of the NIC's line-rate capacity
+# $ ./check_pps.sh -i eth0 -w 50 -c 70 -r
+#
+
+# Nagios Exit Codes
+OK=0
+WARNING=1
+CRITICAL=2
+UNKNOWN=3
+
+usage()
+{
+cat <<EOF
+
+Nagios plug-in that calculates receiving PPS, BPS, and percentage of line-rate (LR)
+from Linux kernel statistics by reading from procfs and reports if above a given threshold.
+
+      Options:
+
+      -i 		Network interface
+      -p 		Use PPS as criteria
+      -b		Use BPS as criteria
+      -r		Use percentage of line-rate as criteria
+      -t <int>		Time interval in seconds (def: 1)
+      -w <int>		Warning threshold
+      -c <int>		Critical threshold
+
+EOF
+}
+
+argcheck() {
+if [ $ARGC -lt $1 ]; then
+	echo "Please specify an argument!, try $0 -h for more information"
+        exit 1
+fi
+}
+
+get_network_data() {
+
+		# Get speed of NIC
+		speed=$(cat /sys/class/net/$INT/speed)
+
+		# Get number of packets for interface
+		rxppsold=$(awk "/$INT/ "'{ print $3 }' /proc/net/dev)
+		txppsold=$(awk "/$INT/ "'{ print $11 }' /proc/net/dev)
+
+		# Get number of bytes for interface
+		rxbytesold=$(awk "/$INT/ "'{ print $2 }' /proc/net/dev)
+		txbytesold=$(awk "/$INT/ "'{ print $10 }' /proc/net/dev)
+
+		sleep $INTERVAL
+
+		# Get number of packets for interface again and subtract from old
+		rxppsnew=$(awk -v rxppsold="$rxppsold" "/$INT/ "'{ \
+			rxppsnew = $3; print rxppsnew - rxppsold }' /proc/net/dev)
+		txppsnew=$(awk -v txppsold="$txppsold" "/$INT/ "'{ \
+			txppsnew = $11; print txppsnew - txppsold }' /proc/net/dev)
+
+		# Get number of bytes for interface again and subtract from old
+		rxbytesnew=$(awk -v rxbytesold="$rxbytesold" "/$INT/ "'{ \
+			rxbytesnew = $2; print rxbytesnew - rxbytesold }' /proc/net/dev)
+		txbytesnew=$(awk -v txbytesold="$txbytesold" "/$INT/ "'{ \
+			txbytesnew = $10; print txbytesnew - txbytesold }' /proc/net/dev)
+
+		# Calculate percentage of line-rate from number of bytes per second.
+		rxlinerate=$(echo "$rxbytesnew / 125000 / $speed * 100" | bc -l)
+		txlinerate=$(echo "$txbytesnew / 125000 / $speed * 100" | bc -l)
+
+		# Format line-rate values by truncating after the 1000th decimal place.
+		rxlr=$(printf "%1.3f" $rxlinerate)
+		txlr=$(printf "%1.3f" $txlinerate)
+		rxlrint=$(printf "%.0f" $rxlinerate)
+		txlrint=$(printf "%.0f" $txlinerate)
+
+		# Print the results
+		echo -e "Int: ${INT} | [RX] PPS: ${rxppsnew} | BPS: ${rxbytesnew} | % of LR: $rxlr -- [TX] PPS: ${txppsnew} | BPS: $txbytesnew | % of LR: $txlr"
+}
+
+threshold_calculation() {
+if [ $1 -gt $CRIT ]; then
+	exit $CRITICAL
+elif [ $1 -gt $WARN ]; then
+	exit $WARNING
+else
+	exit $OK
+fi
+}
+
+PPS=0
+BPS=0
+LINERATE=0
+INTERVAL=1
+WARN=0
+CRIT=0
+ARGC=$#
+
+# Print warning and exit if less than n arguments specified
+argcheck 1
+
+# option and argument handling
+while getopts "hi:c:w:t:pbr" OPTION
+do
+     case $OPTION in
+         h)
+             usage
+             exit
+             ;;
+         i)
+	     INT=$OPTARG
+	     ;;
+         p)
+	     PPS=1
+	     ;;
+         b)
+	     BPS=1
+	     ;;
+         r)
+	     LINERATE=1
+	     ;;
+	 t)
+	     INTERVAL=$OPTARG
+	     ;;
+	 c)
+	     CRIT=$OPTARG
+	     ;;
+	 w)
+	     WARN=$OPTARG
+	     ;;
+	 *)
+	     exit $UNKNOWN
+             ;;
+     esac
+done
+
+get_network_data
+
+if [ $PPS -eq 1  ]; then
+	threshold_calculation $rxppsnew
+elif [ $BPS -eq 1 ]; then
+	threshold_calculation $rxbytesnew
+elif [ $LINERATE -eq 1 ]; then
+	threshold_calculation $rxlrint
+else
+	echo "Error: Criteria required!"
+	exit $UNKNOWN
+fi
+