JSON Parsing Nagios Script

Reading Time: 2 minutes

Parsing JSON in Bash is never usually the best idea but sometimes it may be necessary or preferred. Here’s a nice easy script which uses the ‘jq’ command to perform JSON parsing in Bash.

imgres

Let’s imagine you have the following JSON which is outputted by a stats gathering process:

{"web_rate":1,"db_rate":2,"php_rate":2}

Parsing that in Bash by writing some regex’s etc is perfecting possible but there’s an infinitely easier way. Welcome to ‘jq’. Let’s see it in action.

In Ubuntu, simply install ‘jq’ with Apt:

sudo apt-get install jq

The following example is a script written for Nagios which will parse JSON from a file and extract the bits is needs.

For bonus points, spot the nifty use of ‘date’ to work out if the file has been modified within $UPDATERATE

 

[code language="bash"]
#!/bin/bash

############################################

WARN_WEB="20"
CRIT_WEB="40"
WARN_DB="20"
CRIT_DB="40"
WARN_PHP="20"
CRIT_PHP="40"
FILE="/var/www/html/rates/reqrate.txt"
UPDATERATE="2"

############################################

JQ="/usr/bin/jq"
EXIT=0
MODTIME=$(date -r $FILE +%s)
TIME=$(date +%s)
DIFF=$(($TIME - $MODTIME))
RATE_WEB=$($JQ .web_rate $FILE)
RATE_DB=$($JQ .db_rate $FILE)
RATE_PHP=$($JQ .php_rate $FILE)


if [ $DIFF -gt $UPDATERATE ]
 then
 echo "ERROR: File Not Updating ($DIFF seconds old)"
 exit 2
fi

for SERVICE in WEB DB PHP ; do
 RATE=RATE_$SERVICE
 WARN=WARN_$SERVICE
 CRIT=CRIT_$SERVICE
 if [ ${!RATE} -ge ${!WARN} ] && [ ${!RATE} -lt ${!CRIT} ]
 then
 echo -n "WARN: $SERVICE Rate >= ${!WARN} (${!RATE}) "
 if  [$EXIT -lt 2 ] ; then EXIT="1" ; fi
 elif [ ${!RATE} -ge ${!CRIT} ]
 then
 echo -n "CRIT: $SERVICE Rate >= ${!CRIT} (${!RATE}) "
 EXIT="2"
 else
 echo -n "OK: $SERVICE (${!RATE}) "
 fi
done

exit $EXIT
[/code]