Differences

This shows you the differences between two versions of the page.

Link to this comparison view

tech:nagios:plugin_http_metrics [2018/05/03 06:27]
tech:nagios:plugin_http_metrics [2018/05/03 06:27] (current)
Line 1: Line 1:
 +====== Nagios Plugin - Metrics from HTTP Log ======
 +File: http_stat
 +<code bash>
 +#!/bin/bash
 +#
 +# Get Metrics from Apache log 
 +# Written by Senthil Nathan
 +# Last Modified: June 1st 2017
 +#
 +# Usage: ./http_stat -f access_log_file -g search_pattern -w Count Warn -c Count Critical
 +#
 +# Description:​ Get metrics from apache access log from 2 minutes ago
 +#
 +# This plugin is to check the lines generated by the log in the previous 2 minutes
 +# Assumes apache log time stamp of format "​%d/​%b/​%Y:​%H:​%M"​
 +# E.g. 08/​Dec/​2015:​10:​55:​15
 +#
 +# Output:
 +#
 +#  Count is OK/​Warning/​Critical|'​$themetric'​=xxxxxx;​nnnnnn;​mmmmmm;​0
 +#
 +# Examples:
 +#
 +#   Warn if total access count / minute > 10000
 +#   ​Critical if total access count > 20000
 +#   ​http_stat -f /​opt/​apache2/​HTTPServer12/​logs/​rts1prd-app_access_log -w 10000 -c 20000
 +#
 +#   ​http_stat -f /​opt/​apache2/​HTTPServer12/​logs/​rts1prd-app_access_log -g pos -G pdf -wa 12000 -ca 14000 -wr 250000 -cr 400000 -wh2 12000 -ch2 14000 -wh3 700 -ch3 1000 -wh4 50 -ch4 75 -wh5 10 -ch5 15
 +#
 +#
 +PROGNAME=`/​bin/​basename $0`
 +PROGPATH=`echo $0 | sed -e '​s,​[\\/​][^\\/​][^\\/​]*$,,'​`
 +REVISION="​1.0"​
 +#
 +. $PROGPATH/​utils.sh
 +#
 +finalstat=$STATE_UNKNOWN
 +
 +check_root()
 +{
 +    # make sure script is running as root
 +    if [ `whoami` != root ]; then
 +        echo "​UNKNOWN:​ please make sure script is running as root"
 +        exit $STATE_UNKNOWN
 +    fi
 +}
 +
 +print_usage() {
 +    echo "​Usage:​ $PROGNAME -f <access log file path>
 +                           -wa <warning access count> -ca <​critical access count> -ma <min access count>
 +                           -wr <warning response time> -cr <​critical response time>
 +                           -wh2 <warning access count> -ch2 <​critical access count>
 +                           -wh3 <warning access count> -ch3 <​critical access count>
 +                           -wh4 <warning access count> -ch4 <​critical access count>
 +                           -wh5 <warning access count> -ch5 <​critical access count>"​
 +    echo "​Usage:​ $PROGNAME --help"​
 +    echo "​Usage:​ $PROGNAME --version"​
 +}
 +
 +print_revision() {
 +    echo "​Program:​ $PROGNAME"​
 +    echo "​Version:​ $REVISION"​
 +}
 +
 +print_help() {
 +    print_revision
 +    echo ""​
 +    print_usage
 +    echo ""​
 +    echo "Check total access log count 2 minutes for Nagios"​
 +    echo ""​
 +}
 +
 +# Check user is root (not required)
 +#check_root
 +
 +# Make sure the correct number of command line
 +# arguments have been supplied
 +
 +if [ $# -lt 1 ]; then
 +    print_usage
 +    exit $STATE_UNKNOWN
 +fi
 +
 +# Grab the command line arguments
 +
 +thegrep=""​
 +declare -i theminia=10
 +exitstatus=$STATE_WARNING #default
 +while test -n "​$1";​ do
 +    case "​$1"​ in
 +        --help)
 +            print_help
 +            exit $STATE_OK
 +            ;;
 +        -h)
 +            print_help
 +            exit $STATE_OK
 +            ;;
 +        --version)
 +            print_revision
 +            exit $STATE_OK
 +            ;;
 +        -V)
 +            print_revision
 +            exit $STATE_OK
 +            ;;
 +        -ca) # Critical Access Counts
 +            thecrita=$2
 +            shift
 +            ;;
 +        -wa)
 +            thewarna=$2
 +            shift
 +            ;;
 +        -ma)
 +            theminia=$2
 +            shift
 +            ;;
 +        -cr) # Critical Response Time
 +            thecritr=$2
 +            shift
 +            ;;
 +        -wr)
 +            thewarnr=$2
 +            shift
 +            ;;
 +        -ch2) # Critical HTTP Status Code 2xx
 +            thecrit2=$2
 +            shift
 +            ;;
 +        -wh2)
 +            thewarn2=$2
 +            shift
 +            ;;
 +        -ch3) # Critical HTTP Status Code 3xx
 +            thecrit3=$2
 +            shift
 +            ;;
 +        -wh3)
 +            thewarn3=$2
 +            shift
 +            ;;
 +        -ch4) # Critical HTTP Status Code 4xx
 +            thecrit4=$2
 +            shift
 +            ;;
 +        -wh4)
 +            thewarn4=$2
 +            shift
 +            ;;
 +        -ch5) # Critical HTTP Status Code 5xx
 +            thecrit5=$2
 +            shift
 +            ;;
 +        -wh5)
 +            thewarn5=$2
 +            shift
 +            ;;
 +        -f)
 +            thefile=$2
 +            shift
 +            ;;
 +        --filename)
 +            thefile=$2
 +            shift
 +            ;;
 +        -G)
 +            thegrep="​$thegrep | grep -v $2 "
 +            shift
 +            ;;
 +        --Grep)
 +            thegrep="​$thegrep | grep -v $2 "
 +            shift
 +            ;;
 +        -g)
 +            thegrep="​$thegrep | grep $2 "
 +            shift
 +            ;;
 +        --grep)
 +            thegrep="​$thegrep | grep $2 "
 +            shift
 +            ;;
 +        *)
 +            echo "​Unknown argument: $1"
 +            print_usage
 +            exit $STATE_UNKNOWN
 +            ;;
 +    esac
 +    shift
 +done
 +
 +# Validate arguments
 +if [ -z $thecritr ] || [ -z $thewarnr ] || [ -z $thecrita ] || [ -z $thewarna ] || \
 +   [ -z $thecrit2 ] || [ -z $thewarn2 ] || [ -z $thecrit3 ] || [ -z $thewarn3 ] || \
 +   [ -z $thecrit4 ] || [ -z $thewarn4 ] || [ -z $thecrit5 ] || [ -z $thewarn5 ] ; then
 +  print_usage
 +  exit $STATE_UNKNOWN
 +fi
 +if [ -z $thefile ]; then
 +  print_usage
 +  exit $STATE_UNKNOWN
 +fi
 +
 +# Check begins here
 +
 +#
 +PMIN=`date --date '-2 min' +"​%d/​%b/​%Y:​%H:​%M"​`
 +declare -i accesscount=0
 +declare -i responsetime
 +declare -i http2cnt=0 http3cnt=0 http4cnt=0 http5cnt=0
 +#
 +#​THE_CMD="​grep $PMIN $thefile $thegrep | wc -l"
 +#​accesscount=`eval $THE_CMD`
 +THE_CMD="​grep $PMIN $thefile $thegrep|awk '{ sum += \$11; n++ } END { if (n > 0) printf(\"​%d\",​ sum / n); }'"​
 +responsetime=`eval $THE_CMD`
 +THE_CMD="​grep $PMIN $thefile $thegrep|awk '​{print int(\$9/​100)}'​|sort|uniq -c"
 +IFS=$'​\n'​
 +for output in `eval $THE_CMD`; do
 +  http_count=`echo $output|awk '​{print $1}'`
 +  accesscount=$((accesscount + http_count))
 +  http_stats=`echo $output|awk '​{print $2}'`
 +  if [ $http_stats -eq 2 ]; then
 +    http2cnt=$http_count
 +  elif [ $http_stats -eq 3 ]; then
 +    http3cnt=$http_count
 +  elif [ $http_stats -eq 4 ]; then
 +    http4cnt=$http_count
 +  elif [ $http_stats -eq 5 ]; then
 +    http5cnt=$http_count
 +  fi
 +done
 +
 +infostr=""​
 +if [ $accesscount -lt $thewarna ]; then
 +  infostr="​$infostr Access Count is OK."
 +  outa=$STATE_OK
 +else
 +  if [ $accesscount -ge $thecrita ]; then
 +    infostr="​$infostr Access Count is Critical."​
 +    outa=$STATE_CRITICAL
 +  elif [ $accesscount -ge $thewarna ]; then
 +    infostr="​$infostr Access Count is Warning."​
 +    outa=$STATE_WARNING
 +  fi
 +fi
 +#
 +if [ $responsetime -lt $thewarnr ]; then
 +  infostr="​$infostr Response Time is OK."
 +  outr=$STATE_OK
 +else
 +  if [ $responsetime -ge $thecritr ]; then
 +    infostr="​$infostr Response Time is Critical."​
 +    outr=$STATE_CRITICAL
 +  elif [ $responsetime -ge $thewarnr ]; then
 +    infostr="​$infostr Response Time is Warning."​
 +    outr=$STATE_WARNING
 +  fi
 +fi
 +#
 +if [ $http2cnt -lt $thewarn2 ]; then
 +  infostr="​$infostr HTTP 2xx Count is OK."
 +  out2=$STATE_OK
 +else
 +  if [ $http2cnt -ge $thecrit2 ]; then
 +    infostr="​$infostr HTTP 2xx Count is Critical."​
 +    out2=$STATE_CRITICAL
 +  elif [ $http2cnt -ge $thewarn2 ]; then
 +    infostr="​$infostr HTTP 2xx Count is Warning."​
 +    out2=$STATE_WARNING
 +  fi
 +fi
 +#
 +if [ $http3cnt -lt $thewarn3 ]; then
 +  infostr="​$infostr HTTP 3xx Count is OK."
 +  out3=$STATE_OK
 +else
 +  if [ $http3cnt -ge $thecrit3 ]; then
 +    infostr="​$infostr HTTP 3xx Count is Critical."​
 +    out3=$STATE_CRITICAL
 +  elif [ $http3cnt -ge $thewarn3 ]; then
 +    infostr="​$infostr HTTP 3xx Count is Warning."​
 +    out3=$STATE_WARNING
 +  fi
 +fi
 +#
 +if [ $http4cnt -lt $thewarn4 ]; then
 +  infostr="​$infostr HTTP 4xx Count is OK."
 +  out4=$STATE_OK
 +else
 +  if [ $http4cnt -ge $thecrit4 ]; then
 +    infostr="​$infostr HTTP 4xx Count is Critical."​
 +    out4=$STATE_CRITICAL
 +  elif [ $http4cnt -ge $thewarn4 ]; then
 +    infostr="​$infostr HTTP 4xx Count is Warning."​
 +    out4=$STATE_WARNING
 +  fi
 +fi
 +#
 +if [ $http5cnt -lt $thewarn5 ]; then
 +  infostr="​$infostr HTTP 5xx Count is OK."
 +  out5=$STATE_OK
 +else
 +  if [ $http5cnt -ge $thecrit5 ]; then
 +    infostr="​$infostr HTTP 5xx Count is Critical."​
 +    out5=$STATE_CRITICAL
 +  elif [ $http5cnt -ge $thewarn5 ]; then
 +    infostr="​$infostr HTTP 5xx Count is Warning."​
 +    out5=$STATE_WARNING
 +  fi
 +fi
 +
 +if [ $outa -eq $STATE_CRITICAL ] || [ $outr -eq $STATE_CRITICAL ] || [ $out5 -eq $STATE_CRITICAL ] || \
 +   [ $out2 -eq $STATE_CRITICAL ] || [ $out3 -eq $STATE_CRITICAL ] || [ $out4 -eq $STATE_CRITICAL ]; then
 +     ​finalstat=$STATE_CRITICAL
 +elif [ $outa -eq $STATE_WARNING ] || [ $outr -eq $STATE_WARNING ] || [ $out5 -eq $STATE_WARNING ] || \
 +     [ $out2 -eq $STATE_WARNING ] || [ $out3 -eq $STATE_WARNING ] || [ $out4 -eq $STATE_WARNING ]; then
 +     ​finalstat=$STATE_WARNING
 +else
 +     ​finalstat=$STATE_OK
 +fi
 +
 +# If the Minimum Access Count is not reached then force OK!
 +if [ $accesscount -lt $theminia ]; then
 +     ​infostr="​Access count is below min required ${theminia}. Forcing OK. $infostr"​
 +     ​finalstat=$STATE_OK
 +fi
 +
 +outstrh_a="​Access Count=${accesscount}"​
 +outstrh_r="​Response Time=${responsetime}us"​
 +outstrh_2="​HTTP 2xx Count=${http2cnt}"​
 +outstrh_3="​HTTP 3xx Count=${http3cnt}"​
 +outstrh_4="​HTTP 4xx Count=${http4cnt}"​
 +outstrh_5="​HTTP 5xx Count=${http5cnt}"​
 +
 +outstrp_a="'​Access Count'​=${accesscount};​${thewarna};​${thecrita};​0"​
 +outstrp_r="'​Response Time'​=${responsetime}us;​${thewarnr};​${thecritr};​0"​
 +outstrp_2="'​HTTP 2xx Count'​=${http2cnt};​${thewarn2};​${thecrit2};​0"​
 +outstrp_3="'​HTTP 3xx Count'​=${http3cnt};​${thewarn3};​${thecrit3};​0"​
 +outstrp_4="'​HTTP 4xx Count'​=${http4cnt};​${thewarn4};​${thecrit4};​0"​
 +outstrp_5="'​HTTP 5xx Count'​=${http5cnt};​${thewarn5};​${thecrit5};​0"​
 +
 +infostr=`echo $infostr|sed 's/^ //'`
 +echo "​$infostr $outstrh_a $outstrh_r $outstrh_2 $outstrh_3 $outstrh_4 $outstrh_5|$outstrp_a $outstrp_r $outstrp_2 $outstrp_3 $outstrp_4 $outstrp_5"​
 +
 +#echo "​$themetric Check Unknown"​
 +
 +exit $finalstat
 +</​code>​
  

QR Code
QR Code tech:nagios:plugin_http_metrics (generated for current page)