Instantly share code, notes, and snippets.

Embed
What would you like to do?
Read from Nagios perfdata file and send bulk data to Loggly as JSON
#!/bin/bash
## nagios2loggly.sh
## Andy Mayhew <andy@loggly.com>
##
## Read from Nagios perfdata file and send bulk data.
##
## Setup as parallel performance data processor.
## Create /etc/nagios3/conf.d/nagios2loggly.cfg
## define command{
## command_name perfdata-to-loggly
## command_line /bin/echo -e "$LASTSERVICECHECK$||$HOSTNAME$||$SERVICEDESC$||$SERVICEOUTPUT$||$SERVICEPERFDATA$||$SERVICESTATE$" >> /var/spool/nagios2loggly/perfdata.log
## }
##
## Edit nagios.cfg:
## service_perfdata_command=perfdata-to-loggly
##
## Create cronjob in /etc/cron.d/nagios2loggly
## * * * * * nagios /usr/lib/nagios/loggly/nagios2loggly.sh
##
token="[YOUR-TOKEN-HERE]"
tag="nagios"
logfile="/tmp/nagios2loggly.log"
DEBUG=1
NAGIOSFILE="/var/spool/nagios2loggly/perfdata.log"
TMPFILE="/var/spool/nagios2loggly/perfdata.json"
if [ ${DEBUG} -ne 0 ]; then
echo `date` "Processing start." >> ${logfile}
fi
## Move the current data log out of the way so Nagios doesn't write
## to it while we are reading.
mv ${NAGIOSFILE} ${NAGIOSFILE}.$$
## Primary loop
while read line; do
dtmp=`echo $line | cut -f1 -d\|`
datetime=`date -d @${dtmp} -u +%Y-%m-%dT%H:%M:%SZ`
source=`echo $line | cut -f3 -d\|`
service=`echo $line | cut -f5 -d\|`
value=`echo $line | cut -f9 -d\| | sed -e's/\= /\=/g'`
status=`echo $line | cut -f11 -\d\|`
## If there is performance data, then add it to the records
message="{ \"timestamp\": \"${datetime}\", \"hostname\": \"${source}\", \"service\": \"${service}\", \"status\": \"${status}\""
pdata=()
if [ ! -z "${value}" ]; then
count=0
for i in $value; do
rtmp=`echo $i | cut -f1 -d\;`
rname=`echo $rtmp | cut -f1 -d\=`
rvalue=`echo $rtmp | cut -f2 -d\= | sed -e's/[^0-9\.]*//g'`
rvalue=`printf "%0.2f" ${rvalue}`
if [ ! -z "${rvalue}" ]; then
if [ -z ${#pdata[@]} ]; then
pdata=("\"meter\": \"${rname}\", \"value\": ${rvalue}")
else
pdata=("${pdata[@]}" "\"meter\": \"${rname}\", \"value\": ${rvalue}")
fi
count=$((count+1))
fi
done
if [ ${#pdata[@]} -gt 0 ]; then
for (( i = 0; i < ${#pdata[@]}; i++ )); do
if [ ${DEBUG} -ne 0 ]; then
echo "Writing: ${message}, ${pdata[$i]} }" >> ${logfile}
fi
echo "${message}, ${pdata[$i]} }" >> ${TMPFILE}.$$
done
fi
fi
done < ${NAGIOSFILE}.$$
## Send the data
if [ ${DEBUG} -ne 0 ]; then
echo "Sending: ${TMPFILE}.$$" >> ${logfile}
curl -s -X POST -T ${TMPFILE}.$$ https://logs-01.loggly.com/bulk/${token}/tag/${tag} >> ${logfile}
else
curl -s -X POST -T ${TMPFILE}.$$ https://logs-01.loggly.com/bulk/${token}/tag/${tag} >/dev/null
fi
## clean up
if [ ${DEBUG} -ne 0 ]; then
echo `date` "Removing: ${NAGIOSFILE}.$$" >> ${logfile}
echo `date` "Removing: ${TMPFILE}.$$" >> ${logfile}
fi
rm -f ${TMPFILE}.$$
rm -f ${NAGIOSFILE}.$$
if [ ${DEBUG} -ne 0 ]; then
echo `date` "Processing end." >> ${logfile}
fi
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment