File: //usr/local/bin/zabbix/ceph-status.sh
#!/bin/bash
ceph_bin="/usr/bin/ceph"
rados_bin="/usr/bin/rados"
# Initialising variables
# See: http://ceph.com/docs/master/rados/operations/pg-states/
creating=0
active=0
clean=0
down=0
replay=0
splitting=0
scrubbing=0
degraded=0
inconsistent=0
peering=0
repair=0
recovering=0
backfill=0
waitBackfill=0
incomplete=0
stale=0
remapped=0
# Get data
pginfo=$(echo -n " pgmap $($ceph_bin pg stat)" | sed -n "s/.*pgmap/pgmap/p")
pgtotal=$(echo $pginfo | cut -d':' -f2 | sed 's/[^0-9]//g')
pgstats=$(echo $pginfo | cut -d':' -f3 | cut -d';' -f1| sed 's/ /\\ /g')
pggdegraded=$(echo $pginfo | sed -n '/degraded/s/.* degraded (\([^%]*\)%.*/\1/p')
if [[ "$pggdegraded" == "" ]]
then
pggdegraded=0
fi
# unfound (0.004%)
pgunfound=$(echo $pginfo | cut -d';' -f2|sed -n '/unfound/s/.*unfound (\([^%]*\)%.*/\1/p')
if [[ "$pgunfound" == "" ]]
then
pgunfound=0
fi
# write kbps B/s
rdbps=$(echo $pginfo | sed -n '/pgmap/s/.* \([0-9]* .\?\)B\/s rd.*/\1/p' | sed -e "s/K/*1000/ig;s/M/*1000*1000/i;s/G/*1000*1000*1000/i;s/E/*1000*1000*1000*1000/i" | bc)
if [[ "$rdbps" == "" ]]
then
rdbps=0
fi
# write kbps B/s
wrbps=$(echo $pginfo | sed -n '/pgmap/s/.* \([0-9]* .\?\)B\/s wr.*/\1/p' | sed -e "s/K/*1000/ig;s/M/*1000*1000/i;s/G/*1000*1000*1000/i;s/E/*1000*1000*1000*1000/i" | bc)
if [[ "$wrbps" == "" ]]
then
wrbps=0
fi
# ops
ops=$(echo $pginfo | sed -n '/pgmap/s/.* \([0-9]*\) op\/s.*/\1/p')
if [[ "$ops" == "" ]]
then
ops=0
fi
# Explode array
IFS=', ' read -a array <<< "$pgstats"
for element in "${array[@]}"
do
element=$(echo "$element" | sed 's/^ *//g')
# Get elements
number=$(echo $element | cut -d' ' -f1)
data=$(echo $element | cut -d' ' -f2)
# Agregate data
if [ "$(echo $data | grep creating | wc -l)" == 1 ]
then
creating=$(echo $creating+$number|bc)
fi
if [ "$(echo $data | grep active | wc -l)" == 1 ]
then
active=$(echo $active+$number|bc)
fi
if [ "$(echo $data | grep clean | wc -l)" == 1 ]
then
clean=$(echo $clean+$number|bc)
fi
if [ "$(echo $data | grep down | wc -l)" == 1 ]
then
down=$(echo $down+$number|bc)
fi
if [ "$(echo $data | grep replay | wc -l)" == 1 ]
then
replay=$(echo $replay+$number|bc)
fi
if [ "$(echo $data | grep splitting | wc -l)" == 1 ]
then
splitting=$(echo $splitting+$number|bc)
fi
if [ "$(echo $data | grep scrubbing | wc -l)" == 1 ]
then
scrubbing=$(echo $scrubbing+$number|bc)
fi
if [ "$(echo $data | grep degraded | wc -l)" == 1 ]
then
degraded=$(echo $degraded+$number|bc)
fi
if [ "$(echo $data | grep inconsistent | wc -l)" == 1 ]
then
inconsistent=$(echo $inconsistent+$number|bc)
fi
if [ "$(echo $data | grep peering | wc -l)" == 1 ]
then
peering=$(echo $peering+$number|bc)
fi
if [ "$(echo $data | grep repair | wc -l)" == 1 ]
then
repair=$(echo $repair+$number|bc)
fi
if [ "$(echo $data | grep recovering | wc -l)" == 1 ]
then
recovering=$(echo $recovering+$number|bc)
fi
if [ "$(echo $data | grep backfill | wc -l)" == 1 ]
then
backfill=$(echo $backfill+$number|bc)
fi
if [ "$(echo $data | grep "wait-backfill" | wc -l)" == 1 ]
then
waitBackfill=$(echo $waitBackfill+$number|bc)
fi
if [ "$(echo $data | grep incomplete | wc -l)" == 1 ]
then
incomplete=$(echo $incomplete+$number|bc)
fi
if [ "$(echo $data | grep stale | wc -l)" == 1 ]
then
stale=$(echo $stale+$number|bc)
fi
if [ "$(echo $data | grep remapped | wc -l)" == 1 ]
then
remapped=$(echo $remapped+$number|bc)
fi
done
ceph_osd_count=$($ceph_bin osd dump |grep "^osd"| wc -l)
function ceph_osd_up_percent()
{
OSD_DOWN=$($ceph_bin osd dump |grep "^osd"| awk '{print $1 " " $2 " " $3}'|grep up|wc -l)
COUNT=$(echo "scale=2; $OSD_DOWN*100/$ceph_osd_count" |bc)
if [[ "$COUNT" != "" ]]
then
echo $COUNT
else
echo "0"
fi
}
function ceph_osd_in_percent()
{
OSD_DOWN=$($ceph_bin osd dump |grep "^osd"| awk '{print $1 " " $2 " " $3}'|grep in|wc -l)
COUNT=$(echo "scale=2; $OSD_DOWN*100/$ceph_osd_count" | bc)
if [[ "$COUNT" != "" ]]
then
echo $COUNT
else
echo "0"
fi
}
function ceph_mon_get_active()
{
ACTIVE=$($ceph_bin status|sed -n '/monmap/s/.* \([0-9]*\) mons.*/\1/p')
if [[ "$ACTIVE" != "" ]]
then
echo $ACTIVE
else
echo 0
fi
}
# Return the value
case $1 in
health)
status=$($ceph_bin health | awk '{print $1}')
case $status in
HEALTH_OK)
echo 1
;;
HEALTH_WARN)
echo 2
;;
HEALTH_ERR)
echo 3
;;
*)
echo -1
;;
esac
;;
rados_total)
$rados_bin df | grep "total space"| awk '{print $3}'
;;
rados_used)
$rados_bin df | grep "total used"| awk '{print $3}'
;;
rados_free)
$rados_bin df | grep "total avail"| awk '{print $3}'
;;
mon)
ceph_mon_get_active
;;
count)
echo $ceph_osd_count
;;
up)
ceph_osd_up_percent
;;
"in")
ceph_osd_in_percent
;;
degraded_percent)
echo $pggdegraded
;;
pgtotal)
echo $pgtotal
;;
creating)
echo $creating
;;
active)
echo $active
;;
clean)
echo $clean
;;
down)
echo $down
;;
replay)
echo $replay
;;
splitting)
echo $splitting
;;
scrubbing)
echo $scrubbing
;;
degraded)
echo $degraded
;;
inconsistent)
echo $inconsistent
;;
peering)
echo $peering
;;
repair)
echo $repair
;;
recovering)
echo $recovering
;;
backfill)
echo $backfill
;;
waitBackfill)
echo $waitBackfill
;;
incomplete)
echo $incomplete
;;
stale)
echo $stale
;;
remapped)
echo $remapped
;;
ops)
echo $ops
;;
wrbps)
echo $wrbps
;;
rdbps)
echo $rdbps
;;
esac