-
Hahn Axel (hahn) authoredHahn Axel (hahn) authored
check_ceph_io 3.55 KiB
#!/bin/bash
# ======================================================================
#
# Icinga/ Nagios Check
# CEPH IO (from "ceph status")
#
# ----------------------------------------------------------------------
#
# REQUIREMENTS:
# - ceph and sudo permissions on it
#
# SYNTAX:
# - check_ceph_io
# No parameter required
#
# ----------------------------------------------------------------------
# 2023-05-09 v1.0 <axel.hahn@unibe.ch>
# 2023-05-10 v1.1 <axel.hahn@unibe.ch> fix for small transfer rates in B/s
# 2023-05-10 v1.2 <axel.hahn@unibe.ch> add tests
# 2023-05-11 v1.3 <axel.hahn@unibe.ch> handle ceph status without io data in output
# 2023-07-27 v1.4 <axel.hahn@unibe.ch> update help page
# ======================================================================
. $(dirname $0)/inc_pluginfunctions
self_APPVERSION=1.4
function showHelp(){
local _self; _self=$(basename $0)
cat <<EOF
$( ph.showImlHelpHeader )
Show cheph IO as read and written bytes per second.
This check sends performance data.
SYNTAX:
$_self
OPTIONS:
-h or --help show this help.
-t [STRING] test a value; for debugging purposes
Without a string internally stored values will be tested
EXAMPLE:
$_self
no parameters; normal usage to get the ceph io data
$_self -t
Run a few builtin tests
$_self -t " client: 255 B/s rd, 0 op/s rd, 0 op/s wr"
Test a given string
EOF
}
# --- check param -h
case "$1" in
"--help"|"-h")
showHelp
exit 0
;;
*)
esac
if [ "$1" = "-t" ]; then
# Snippets for testing:
# TEST: client: 13 KiB/s rd, 1.1 MiB/s wr, 130 op/s rd, 137 op/s wr
# TEST: client: 8.9 KiB/s rd, 887 KiB/s wr, 138 op/s rd, 140 op/s wr
# TEST: client: 255 B/s rd, 85 B/s wr, 0 op/s rd, 0 op/s
# TEST: client: 255 B/s rd, 0 op/s rd, 0 op/s wr
# TEST: no line with client
if [ -z "$2" ]; then
echo; echo ">>>>>>>>>> TESTS"; echo
grep '# TEST: ' $0 | grep -v grep | cut -f 2- -d ':' | while read -r teststring
do
echo "--- test string [$teststring]"
$0 -t "$teststring"
echo; echo; echo
done
exit 0
else
CEPHIO="$2"
fi
else
# --- check required tools
ph.require ceph
# --- get output of ceph
if ! CEPHOUT=$( sudo ceph status 2>&1 ); then
ph.setStatus "unknown"
ph.status "no data"
echo "There is no output from 'sudo ceph status'."
echo "No ceph here or no sudo permissions on ceph command?"
echo "$CEPHOUT"
fi
CEPHIO=$( echo "$CEPHOUT" | grep "client:")
fi
if [ -n "${CEPHOUT}${CEPHIO}" ]; then
CEPHDATA=$( echo "${CEPHIO}" | cut -f 2 -d ':' )
SEG_R=$( echo "${CEPHDATA}" | cut -f 1 -d "," | grep "rd" | awk '{ print $1 " " $2 }')
SEG_W=$( echo "${CEPHDATA}" | cut -f 2 -d "," | grep "wr" | awk '{ print $1 " " $2 }')
# remark:
# - the sed transforms "NN KiB/s" --> "NN KB" (cut "i")
# - the tr is for small values "NN B/s" and removes "s"
IO_READ=$( echo "${SEG_R}" | sed -E "s#([0-9]*) (.).(.).*#\1\2\3#g" | tr -d 's')
IO_WRITE=$( echo "${SEG_W}" | sed -E "s#([0-9]*) (.).(.).*#\1\2\3#g" | tr -d 's')
test -z "$CEPHIO" && CEPHIO="'ceph status' successful - but there are no io data in output."
test -z "$IO_READ" && IO_READ="0"
test -z "$IO_WRITE" && IO_WRITE="0"
ph.status "$( echo "${CEPHIO}" | cut -f 2 -d ":" )"
ph.perfadd "cephio-read" "$IO_READ" "" ""
ph.perfadd "cephio-write" "$IO_WRITE" "" ""
fi
ph.exit